2019年5月于深圳落笔。
2021年补充,写这篇文章已经过了两年,看起来那个时候有点年轻,主要吹捧 Golang 的,但后面的预言成真了,真的越来越多的公司用了,就业者也多起来了。但是,我强调一下,服务端开发工作语言不是问题的本质,你要全都会!哪里需要哪里学,重点还是在于广度和深度的技术积累。
JavaGolang
持有一种观点:
选择哪种计算机语言,在普通人的世界里,其实就是选择哪种谋生的技能和工具。虽然语言的本质并不同,但每次选择都有机会成本,就像你选择开四轮,六轮,还是八轮的汽车🚗,都有一个熟悉和填坑的过程,所以,有必要在职业生涯的前期选择一个可持久的工具,它足够地持久,不会被社会给边缘或淘汰。
我为什么不继续把Java作为主力语言我曾经做过一段时间的Java开发,而在做Java开发前我做过一段时间的PHP。
以前互联网应用不是很多,很多都是小型软件或者用户数不多的系统,比如一个面向业务的系统,一般不超过100人使用,这个时候都是单体架构,举个例子:
2012年-2014年左右,很多做ERP和CRM的外包公司或传统IT公司,他们面对企业用户,这个时候一般都是PHP或Java开发。
我们只讲Java,这时候叫JavaEE企业级开发,那时刚从servlet/jsp解放到struts/spring/hibernate,程序员的生产力提高,一般都是复制粘贴使用框架做报表系统。
我们大多数的时间都是在写前端js代码,Java功底其实要求并不高,因为很多企业已经自己积累了自己的框架,比如A公司有个A框架,B公司有个B框架,从一个公司到另一个公司,就要学习另一个框架,当然学习后就又是复制粘贴,员工可替代性特别强。这个时候,程序员朋友遇到什么问题呢,整个系统是一个单体架构,使用maven管理有一堆的模块,启动一个系统,时常编译半小时以上,巨卡无比,而且Java使用注解开发Web,而很多组件又经常升级,这个时候有什么问题呢,不敢轻易升级组件,因为升级后公司的框架就用不了了,程序员朋友遇到问题了,只能靠猜,因为百度到的注解已经是过时了,老技术的文档已经缺失或者不再维护。
而系统开发后,部署也是很粗暴的,直接数据库和应用程序都部署在一台机器,可满足几百个人的使用,政府机关或学校,比如选课系统一旦人多起来,就巨卡无比,这就是单体的缺点,但优点就是省运维,毕竟不要求高并发。
这个时候有大批的PHP,Java培训班,大把低等程序员培训后涌入市场,成为CURD复制粘贴机器人。而这时,前端发展也是Jquey+div一把梭,就业形势大好,一片红海。人才的要求相比现在,十分的低,很多人也赚了自己的第一桶金。
2015-至今 互联网发展迅速,很多做传统IT的人发现跟不上并发量了,所以从单体架构开始拆,拆成不同的系统,系统间互相通信。
因为技术发展很快,市面上出现了Spring框架,写得特别好,生态特别好,大家发现自己不用造轮子了,高兴的用起来,但仍然有些公司还是在用老框架,他们缺乏跟进。
后来微服务盛行,而阿里巴巴作为Java最多的使用者,内部孵化了Dubbo,大家就又跟上了,这个时候有很多软件工程方法轮出来了,一开始SOA,也就是面向服务的体系,把系统拆成一个个服务,然后服务间互相调用,后来换了一个词,叫微服务,这时框架生态高速发展,Sping Cloud出来了,养活了一堆程序员,不再需要从一个公司到另外一个公司要学新框架,你只要学会Sping Cloud,就可以找到工作!
技术的变革,导致了新的问题,Java人才的分化很严重。因为框架Spring Cloud的大统一,一部分人对该框架不需要多了解,就可以开始干活,类似于堆代码,对后期维护十分不利,因为框架太大,参考手册初学者很快就可以写出一个Web系统,但是缺乏细节或者计算机理论的理解,同样需要一遍又一遍面向百度编程。
但是,对于人才来说,Java是一门成熟生态蓬勃大语言,只要努力专研,就可以去阿里巴巴那样的公司,阿里巴巴的成功证明了Java是一门好语言。可以选择Java,前提是招到好人才,而好人才都在阿里系。目前杭州估计是对Java程序员需求最多的城市。Java生态大,导致了入门难度高,精通难,而且编译运维部署都需要专业的学习,招到好的人才可以说很难。
我为什么选择Golang来工作因为我做的是服务端开发,所以一直在微服务,中间件的场景来回地折腾。对于高性能场景来说,Java已经不能满足了,要上C++。
分析一下Java,Golang和微服务:
Java是一门生态完善的语言,从业者多,而且历史悠久,目前稳稳地在原地不动。Golang目前生态正在完善,已经达到高潮,愈演愈烈。
微服务本身是不受语言限制的,你可以使用Java,Python,Golang开发不同的服务,然后服务和服务直接互相调用。有些服务是业务型服务,对性能要求低,所以可以用Java/Python写,但有些对性能高的服务都用C/C++写,尤其是大公司产品里面,从上至下分为业务服务,中间件服务,基础底层服务。
因为C/C++固有的特征,导致20年也不能说你精通,人才难得,这些人才都在腾讯里面,没错,腾讯是使用C/C++最多的公司。
写C/C++也是很麻烦的,所以谷歌Google公司请个几个设计编程语言的大佬,设计了Golang,它像C,但去除了一些难以理解,不好的东西,2009年Golang诞生,到现在已经十年了,它是谷歌的儿子,天生优越,谷歌是互联网公司No1的公司。
Golang为什么会火起来,一开始是谷歌的宣传,Golang被称为云计算的语言,为云计算性能而生。
后来是因为Docker的出现,他开始被人关注,后来就离不开它了。
软件开发的最高技术荣耀就是架构设计,架构就是分配资源,说白了就是运维,开发工程师做久了就变成了运维开发工程师,Docker出现了,它可以使运维更容易,它是Golang写的,后来监控系统,日志系统,很多开源运维工具都是Golang写的,软件开发好了就要运维,运维就需要工具,这下子火起来了,后来更火的是,比特币和区块链出来了,恰好,区块链的各种合约都是Golang开发的。再后来,k8s出来了,这是资源编排系统,极大解放运维生产力,它也是Golang开发的。
Golang成为了云计算必备的,取代那些以前需要C/C++才能做的事。
但是,语言并没什么不同,这不是问题,好的程序员,一般都会使用各种语言,根据不同的微服务,选型不同的编程语言。
我们可以看看目前不同公司的编程人才分布:
- 百度,大部分组用C/C++/PHP写业务(历史遗留问题),少部分组用Java。现在少部分将PHP变成Golang,但基本不转。
- 腾讯,大部分用C++(历史遗留问题),小部分用Java(边缘项目),现在也在将C++变成C++/Golang,估计Golang是大趋势。
- 知乎,大部分用Python,已经大量迁移到Golang,基本迁移完。
- B站,同知乎。
- 美团,滴滴全线Golang。
- 瓜子二手车全线Golang。
- 直播行业,虎牙,映客直播全线Golang。
- 字节跳动全线Golang,旗下有抖音等。
- 阿里巴巴,业务线全线Java,而Golang只应用于基础架构部门,比如阿里云。对于淘宝,飞猪等产品业务为主的,还是Java。
- 酷狗音乐,业务线Java,看起来受腾讯影响,正在动摇切换语言。
以上切换Golang作为开发的公司,都会挖其他语言的人才,他们支持换语言,比如字节跳动,大量招人,我们欢迎各位Java大佬换语言。
所以,由于目前各大 大公司,Golang居多,势必会抢夺Java人才的阵营,所以以后Java/Golang/C++混合人才会增多。
为什么大公司会换语言,因为Golang开发速度快,简单,直接,性能好,很多服务估计都会用Go开发,这样容易维护。
Golang语言是一个趋势,但是公司选型还是看人才的组成,一般受限于公司招人的困难度,但很多时候还是因为人性使然,你更熟悉什么语言,就用什么语言。
在小一点的公司里面更多受限于技术总监会什么语言。我上家公司就是用Golang,后来空降一个Java的技术总监,他觉得Java更好,于是公司切换语言,导致一批Golang员工流失,而他又从外面招聘一批Java员工。
考虑公司切换编程语言的代价,这也是各大 大公司最大考虑,参考知乎换语言的成功,证明Golang确实会更节约成本,所以它,这家公司做了一些妥协和变化,换了语言。
我觉得业务服务可以用Golang开发,基础架构服务也可以用Golang开发,Docker/K8S又是原生Golang,所以用Golang开发比较好。大数据处理,清洗这些非业务服务的离线数据仓库挖掘与分析,可以用Java,因为大数据和Java更密切。
对于优秀的后端,语言不是关键,关键在于他愿不愿意转语言。而Go工程师的人才,更多在于人才市场的需求,比如腾讯全线Golang了,那么你不转语言你就找不到工作。比如以前C#,Ruby很多工程师,因为很多公司转语言了,他们就失业了。
就深圳市场来说,Golang是一个趋势,而Golang从业者,大部分从PHP,Python或Java/C++转进,这些人可能质量更高,因为一个不愿意转语言的人是很狭隘,竞争力很低的。
当然,如果在杭州,Java比较好,因为阿里的影响,Java人才会更多。
现在写业务微服务,Golang都已经很成熟了,更容易开发和打包,然后部署到容器里面,虽然Java也可以部署到容器,但是占用资源略高,编译也是编译成字节码,而不是二进制,性能会略低但占用资源多(因为Spring Cloud框架大统一的问题,大量引入冗余,而这部分冗余消耗了真正需要的部分性能和资源)。
现在开发APP或者系统技术栈一般都是:
- Java/Golang/Python编程语言开发的微服务,语言不是问题。
- Redis,内存数据库,用处:分布式Session和分布式缓存。
- Elasticsearch,检索引擎,用处:搜索,监控日志分析,著名的ELK。
- MySQL/PostgreSQL,关系型数据库,用处:对事务有要求的业务,存在较强关联性的数据,如支付,订单。
- Mongo,非关系型数据库,用处:存储海量非结构化数据,关联性较弱的数据,如新闻,文章。
- RabbitMQ等各种MQ,消息队列,用处:服务间消息通讯,异步通知,类似于一个中转消息信箱。
- Kafka,缓存消息队列,用处:缓存等待处理的数据,主要应用于服务处理不过来的情况,等同于MQ,但更偏向缓存海量数据。
- Hadoop/Hbase ,列式大数据库,用处:做数据仓库使用,一般是离线数据,从Mysql或Mongo定期ETL到此。
- Docker/K8s,服务运维部署。
- 其他的监控告警组件,如prometheus等。
可以说业界整套流程都已经很成熟了。
选择Golang和Java都可以,但如果选择Java,某些服务组件开发不排除需要使用C++。而Golang的另外一个好处,它支持Cgo,可以原生使用C/C++的函数库,Java作为字节码语言,就显得复杂了。
所以,作为服务端开发,我是推荐主流的编程语言都要会。
但作为新手来说,入手 Golang/C++ 是一个不错的起点。