都2022年了,还在争论编程语言?
2021年最后一天,我在公众号发表了文章 《Dubbo为什么用Go重写》 ,在各个平台的阅读量和打开率都挺高,也有各位大佬纷纷转载,在这里也顺便感谢各位大佬。
虽然自己公众号没有开通留言,但我也会去看其他平台或转载文章的评论。
我发现大家的注意力更多的是在编程语言上,比如下面这些:
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b0a137cc16112752810c0b8f346b555a5cea6ea9d18c34c2f33d4f37639873693.jpg)
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4bc16ec39ad08383aa0f2941df7d99a1bfb11c4fafb93db2f382d0a266d9566999.jpg)
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b10a5a8fab34f2c37583df010faca061b8123b706a0c1c368a7b4a80696ff4da6.jpg)
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af98393f207245cbf6d4fc660a610e20fa03b43c1b3d7db382fea55c07016f5ea264336.jpg)
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4bcf3bdd0eba018be2c832c34c841ec66667be9b760da540921295849adbaf26f6.jpg)
看了这些评论想起了一个段子:
某女:你能让这个论坛的人都吵起来,我今晚就跟你走。
某软件工程师:PHP是最好的语言!
某论坛真的就炸锅了,各种吵架……
某女:服了你了,我们走吧,你想干啥都行。
某软件工程师:今天不行,我一定要说服他们,PHP必须是最好的语言…
——段子来源于网络
虽然是个段子,但我也想通了为什么这篇文章的打开率和阅读量如此之高。
文章有大段篇幅在说Java和Go语言,而编程语言之争历来都是程序员的谈资。
但这并不是我的本意,编程语言只是一个背景,可以有各种各样的理由选择一个语言,况且现实情况已是如此,所以后续的如何在Go和Java之间架起桥梁才是重点。
不过已经说到这里,也可以多扯一点,我自己是数学系毕业,所以大学也没怎么学编程语言,毕业时选了一个非常容易入门的语言,就是上面段子中的PHP。
后来大环境都是Java,所以也转了Java,一开始用Java写业务,后来做中间件,再后来跳槽来了现在的公司,也写起了Go。
如果非要评价Java和Go,我觉得Java的生态非常完备,有几乎所有互联网公司需要的解决方案,引用一篇文章里的话
我以为用Java适合做架构这事应该是常识了。
我解释一下吧:首先,小型的项目用什么语言都行,爱用什么用什么。
但是,真正的企业级架构就不一样了,其中并不仅仅只是 RESTful API 或 RPC,还有各种配套设施和控制系统。
比如:应用网关,服务发现、配置中心、健康检查、服务监控、服务治理(熔断、限流、幂等、重试、隔离、事务补偿)、Tracing监控、SOA/ESB、CQRS、EDA……
这些东西在非 Java 的技术栈体系内,很难看到全貌,Java 强大的生态环境,就是让你把注意力放到更高层次的架构和业务上来的。
另外千万不要觉得,整几个服务 RPC 一下,加个缓存,加个队列,就能叫架构,那只是系统集成罢了。
虽然这段话有些绝对,Go生态也在奋力追赶,但就目前的情况来看,确实是这样。
我也混迹在各个技术群里潜水,有一次看到一个群里在讨论Java的Spring框架,有个写Go的同学这么说:
Spring不就是个Web框架嘛
我觉得他对Java的了解太少了,Spring还真就不是一个Web框架,但我忍住了,没有反驳。
Go也有它的长处,比如协程调度模型、比如启动速度、内存占用等等。
你别小看 协程
(虽然Java也快有协程了,但离我们还有点远),它背后的显示出的是思想的转变,比如Go提倡 不要通过共享内存来通信,而应该通过通信来共享内存
,在Java中,基本就是通过共享内存来通信,这就导致一个问题,多线程访问共享内存必须加锁。
但Go中建议通过channel来通信,你可能会说,在Java中也有BlockQueue啊。还不一样,BlockQueue通信本质上还是对共享内容加锁,但Go的协程调度模型下,channel就可能实现 无锁 。
我记得在我刚工作那会,遇到一位前辈,当时我还在写PHP,他建议我可以尝试转Java,我当时说,语言不过是一个工具。
现在我觉得这句话是有毛病的,语言不光是一个工具,它也凝结了一些编程思想,比如PHP的进程模型,Java的线程模型,Go的协程模型。在这些模型下,你能做的事可能就不一样。
比如我在学Go的Benchmark的时候,就觉得Java的Benchmark要比Go实现的严谨不少,不愧是工业级语言。
又比如Go的协程调度,在IO密集型下,调度效率比Java优了不少。
再比如在协程调度模型的加持下,Go的对象池性能优于Java,channel效率比Java的BlockQueue高。
总之,我们在力所能及的范围尽可能地多了解其他语言,对比他们的异同,也许对你下次的技术选型就有一些启发。
这也是我第一次写这种主观性较强的文章,在此特地求一个 赞
+ 在看
,后面我也多 扯扯淡
。
搜索关注微信公众号"捉虫大师",回复关键字「Nacos」送你一本《Nacos架构与原理》电子书,Dubbo资料也在准备中,不想错过可以点个关注。
- 发现一个开源项目优化点,点进来就是你的了
- 灵感乍现!造了个与众不同的Dubbo注册中心扩展轮子
- 灵感乍现!造了个与众不同的Dubbo注册中心扩展轮子
- 眼见不一定为实:调用链HBase倾斜修复
- Go能实现AOP吗?
- Go能实现AOP吗?
- 踩了个DNS解析的坑,但我还是没想通
- 参与开源项目很难吗?
- Rust 真比 Go 好?Go 技术负责人痛斥虚假报道
- 祖传代码如何优化性能?
- 祖传代码如何优化性能?
- 技术十年
- 动图图解!怎么让goroutine跑一半就退出?
- 惨,给Go提的代码被批麻了
- 惨,给Go提的代码被批麻了
- 他强任他强,清风拂山岗
- 二十三张图带你从源码分析Spring Boot 启动流程
- 节假日该如何充电?
- 都2022年了,还在争论编程语言?
- 服务探活的五种方式