工作满一年的Java程序员怎么慢慢转为Go程序员?

几百万做 Java 的是不是傻子不太确定。

Rob Pike 那帮人绝不是傻子而且聪明绝顶,这很确定。

并发数、运行效率、内存、工具链、部署、DevOps 管理、对 coder 的心智要求,综合所有方面考虑 Java 是被 Go 完全碾压。

微服务 service mesh 这些领域现在所有最重要的基础设施几乎都是 Go 实现,少量新方案用Rust。区块链 Go 也是主力。

面过很多人,没有不懂 SSH 或 SSM 的,真没几个懂 Netty 的,能自己定协议,自己根据 RFC 解协议的更是一个都没有。

极限并发 Go 比不过 Netty,这也不是问题,因为 request 一旦进到内网后,内网服务器间根本就不走海量并发。而网关和接入侧的高并发,通过均衡分流和网关的微服务化也完全能简单搞定。

高并发只在几个点重要,而在整个体系里没这么重要,内部系统性能关键最重要的是做到低并发高吞吐,不要被忽悠。

java几个典型问题,内存太大,gc慢,没纤程,没指针。写server性能很强,没纤程作为client性能是推不上的。同等逻辑C/C++的内存峰值到了Java这能翻几十倍,做框架只为了实现回调就得interface满天飞。

现在Spring Cloud一大堆这种问题,Zuul当微服务网关,内存开小点1G往下压测分分钟给你oom要不就锁异常。网关pod死了,go写的k8 10ms内重新拉起了网络均衡,结果request路由到Zuul,Java系的Zuul 和 Spring boot还在重启1分钟,十几万个request fail,这坑还无药可救。客户不满意质问你这网关的HA搞得像个鬼啊,你能咋办,跟他说java就这尿性?

性能不说了,见过上 spring 架构师,要么不懂性能,要么不在乎性能,要么就是啥都明白玩政治的猴精。

常对年轻同事说,Java 不要再投资,不要浪费生命浪费智力。

为了个 Rest 不通或某个配置不对挖几十万 Spring boot、Eureka 源码纯粹是吃饱了闲的。

即使只为糊口也有更多更好的东西值得学。

revel,beego,iris,gin,hugo,caddy,  github 上 star 过万的 Go web 框架比比皆是,还不提一堆 7,8k star 的 router 类轻量框架。

加上 nsq,gokit,gorm, CockroachDB,groupcache,InfluxDB/Prometheus,Jaeger ,docker,consul/etcd,k8s,grafana  纯 Go 就能搞定大部分业务。

要性能?cgo 不够还有一堆 SIMD math 库,矩阵库。

写图形,有go-gl,go-sdl2 一堆 wrapper 库。

还没提一大堆工具,fzf,shadowsocks-go,cow,cobra,goreplay,hub。

区块链,go的,微服务,go的, MIT6.824,go的。

那些圣javaer爱学不学。

怎么转?

Google 的 GO for Java programmers

https://talks.golang.org/2015/go-for-java-programmers.slide#1

学语言最关键是要写东西,写对自己来说困难的系统,才能体会那些语言的细枝末节对工程整体质量和效率的影响。

学 Go 最好有 C 的底子,有 C++ 底子更好,否则难以深入和理解 Go 的很多取舍。

初学者能弄懂 Go 的基础概念就行:指针,接口,Struct,Array,Slice,接口和Slice的底层结构。

然后学会基本的文件读写,对象序列化、反序列化,JSON 和对象的互转。

用 Go 写 Rest 和静态 Web 服务器,压测。

用现成框架再实现 Rest 和静态 Web 服务器,压测。

普通业务到这层已经够用,再深入就是要理解各类理论,理解DB,踩各种坑。

不够快的再自己造轮子。

用得不爽的自己造轮子。

然后你就再也不会去写 Java 了。

学习曲线 Go 远远低于 Java,同等智力写性能高又稳定的 Java 一定是远难过 Go。

学习底层,Go 远远好于 Java,代码少容易懂,没那么多变态模式加层层封装,简单粗暴,也比 C 好读很多。

网络编程例外,Netty 比 Go 更适合学习。Netty 更传统更中正更容易懂,架构更贴 OSI 模型。

带着学 C 的心态学 Go,Go 不是 Java 的替代品,它适合做的远比 Java 多。

上面是个玩具渲染器,做过两个版,C++/Go。都不特殊优化的情况下,Go 的执行效率和C++差不多,内存基本接近,开发大概快3-4倍,代码量少1/3。

Go 能简单解决很多问题,也有很多限制:没泛型、没操作符重载、没 union。

发明者认为无歧义、代码字面和潜在逻辑的一致性远比代码精干更重要。

Go 不是银弹,写Math写矩阵写容器类代码难看至极,极限并发不是最高,极限性能很多API和C版差距还不小,C库调用成本还远高于C++,Rust。

但 Go 的最大优势是能简单解决很多简单问题,开发效率和执行效率还足够好,如没历史负担,最适合列装简单业务的团队。

内存碾压Java是否太过,这个可以自己验证,很长时间不碰Java了,也没完全对等的用同样逻辑比Java和Go,这个就是经验加感觉的瞎掰。

下面是 Go 和 C++,C#(XNALara_XPS)的内存对比:

Go 和 C++ 内存接近,和 C# 差距在6-7倍上下。C# 这个应用空载起底是32M。

Go 58M(main), C++ 50M(main.exe), C# 370M(XPS)

加载更大的模型,Go 和 C++ 内存接近,和 C# 差距到了11倍

Go 86M(main), C++77M(main.exe), C# 971M(XPS)

上面的模型:https://mega.nz/#!VExh1bwK!TrKRocsUG5yLPiiQYzW2fgopWskMCmZptxPu6MHcD-k

[18:23:24.727] load: F:/bak.mr.freeze/Generic_Item.mesh.ascii

[18:23:26.051] upload texture: Mr_Freeze_Torso_D.png 3.0102ms

30M文本+150M png

1.3秒 读完+解析+png解码+upload到显卡,参考附的log。

自负Java能力的接近这个再喷。

java高级架构进阶群:779792048

猜你喜欢

转载自blog.csdn.net/zuiyingong6567/article/details/80232575