Go vs java
本文作为观看周志明老师云原生时代的Java 的观后感,夹带很多私货(个人吐槽),讲的不一定对,毕竟我也是个菜鸡。
一、java的危机与变革
个人一直觉得go就因为协程、启动快(提前编译好而不是用vm)、运行时overhead小(因为没vm,下载体积、运行时占用内存cpu等资源少)这点feature就重造一门语言、要求应用层程序员重建整个软件生态是件很扯的事情:就为了这点事就重造整个生态?编译器专家们找个生态庞大的语言(比如java)重写编译器不就行了?再说了Java程序员没协程照样写并发,没协程又不会死,大不了用kotlin+java混合编程写协程,就这么个小feature也值得发动全世界程序员的力量重造整个生态?
今天看了周老师的分享,感觉很有意思,大意是说今天java面临的危机是设计java时的基础假设和云时代(容器调度时代)对软件的要求不搭,导致添加“容器亲和”的新功能时难做兼容。
譬如,Java 总体上是面向大规模、长时间的服务端应用而设计的,严(luō)谨(suō)的语法利于约束所有人写出较一致的代码
以前java设计时的假设是大应用、长时间运行,而当今时代变了,讲究的是一堆小应用、随时快速重启,讲究容器亲和(启动快,体积小,runtime infra占资源小)
而对于java牛逼的“write once,run anywhere”,别的语言基于容器技术也差不多能解决/绕过这个问题
今天java想实现协程、实现启动快(提前编译好、不用vm)也简单,但想对老生态兼容贼难。
个人理解,这也导致了java虽然先发制人几十年,但几年间被别的语言钻了漏子、打出了差异化故事
不过官方规划了几个项目,力求做兼容的同时加上这么几个容器亲和feature:
项目详细介绍见分享。
二、重新造生态虽然扯,但对于造新轮子的公司、个人却是机会
造个兼容历史生态的java新平台属实困难,是各位程序语言大师的任务;相比之下造个新语言、重新造生态就简单太多了,发动全世界的程序员、堆人堆体力就可以解决问题,每个普通程序员都能参与其中。
后者虽然不够优雅,但对每个造新轮子的公司、程序员来说却是很好的机会:把其他语言生态中稳定成熟的轮子搬到go重新实现一遍,借着时代潮流做大影响力,甚是美哉。
三、“过阵子总有新语言”定律
这定律是我瞎编的……
软件系统设计的灵魂是取舍,怎么取舍要看需求,而需求是千变万化、每个场景每个时代都不一样的。因此时代变化、需求变化后,取舍的逻辑发生变化,总会有新语言借机打差异化故事。面对同一个问题,新语言能做出新时代的取舍,但是老语言已经在几十年前做出过老时代的取舍,不好回头了。
java和go的故事就是一个很好的例子
四、go vs java详细对比
最后,记录下go vs java详细对比讨论:
https://talks.golang.org/2015/go-for-java-programmers.slide#13
https://www.youtube.com/watch?v=_c_tQ6_3cCg
image.png
image.png