Go 语言应该是常用系统编程语言中最容易学的。先从主观角度说几个我亲身经历。再系统比较一下各种编程语言的学习难度。
第一个经历:Peacock 在腾讯
我从 2012年10月开始用 Go 开发工业系统,第一个作品是腾讯广告的 Peacock。那之前我用 C++ 已经十几年了,而学习 Go 语言只用了三天。用 Go 写第一个 prototype 只用了国庆假期。Peacock 的思路是比较复杂的,相关技术细节可以参见 https://zhuanlan.zhihu.com/p/20183518。这是基于我 2007 年开始在 Google 中国的工作(请看一份也许永远也不会完成的 tutorial)的一次大的升级。我当时在腾讯是一个广告技术团队的总监,要承担几十号人的项目安排和团队组织工作。如果不是因为有 Go 语言,Peacock 也许会是一个永远无法完成的工作。
在那个 prototyping 的长周末里,我曾试着用 C++ 和 Go 写 Peacock。虽然当时 Go 还没有发布 v1.0 版本,但是语法特点已经相对稳定,并且展示出相当程度上的代码简化的能力 —— 差不多 1000 行 C++ 代码用 300 行 Go。
虽然当时我们团队有40多人,但是面对一个探索性、风险大的项目,很多同学还是更愿意做对优化广告指标有直接作用的工作。愿意开发 Peacock 的除了我只有两个同事:赵学敏和孙振龙。我离开腾讯两年之后,当时的部门负责人 Ching Law 在 KDD 2016 的 keynote 里介绍了 Peacock。那时参与开发的同学们已经多了起来。不过大家应该想不到 Peacock 在一年半的开发时间里,只有三个主力贡献者。今天的中国互联网行业仍然是一个快速变化,业务压力很大的行业。工欲善其事必先利其器,要在业务压力中寻找一把利于新技术研发的利刃,语言的选择很重要。我开始学习 Go 的时候已经有十六年的 C++ 编程经验。但是学敏和振龙当时都刚毕业不久。他们也都是学习了三天之后,就能上手开发工业级别系统的。
第二个经历:DeepSpeech 2 在百度美研
2015 年我结束了一段声势浩大但不成功的硅谷创业经历,“上岸”加入百度研究院。在Andrew Ng 的团队做语音识别项目 DeepSpeech 2。这个系统当时被 MIT Tech Review 评为全球十大科技突破之一。直到今天,深度学习引擎的开发还是依赖 C++ 的。DeepSpeech 2 的训练系统也如此。不过当时有一位叫王鹤麟的同学,用 Go 语言写了 DeepSpeech 2 的手机端 inference library,令我印象和深刻。
用 Go 写手机端系统软件的好处是 —— 不分 Android 和 iOS,代码基本完全一样。王鹤麟也是当时百度硅谷研究院里最积极推广 Go 的同学。我还记得他的“广告语” 也是“学三天就能上手写程序”。
第三个经历:SQLFlow 在蚂蚁金服
2018年底,我离开百度,加入蚂蚁金服,在硅谷办公室工作。同时,我开始了 SQLFlow https://sqlflow.org/sqlflow 的 prototyping 工作。也是用的 Go 语言。不久,90 后同事杨扬也加入到这个项目里来。他读博士和之前的工作里都是用 C++。也是几天时间就学习了 Go,并且开始工作。随后陆续加入 SQLFlow 项目的同学们,也都是很快就上手了。
2019年5月 SQLFlow 开源之后,滴滴、Snapchat、Google 的朋友们也加入到贡献的行列中来。他们中也有很多之前是没有写过 Go 程序的,但是上手速度非常快。这也可以从 SQLFlow 在 Github 上的 Star 增长速率看出来。
说说编程语言的学习难度
一般任何一门学问,蕴含的逻辑越复杂,学习难度越大。在阐述这些逻辑的时候,我们会需要定义一些术语,把复杂的概念明确化。在编程语言里,reserved words 或者 keywords 就类似这样的术语。一般来说(不能绝对化),术语越多的语言,逻辑越复杂,学习起来越困难。
我把 Stackoverflow 上这个比较 Reserved keywords count by programming language? 图示化了一下。
大家可以看到 Go 语言的 keyword 数量比 C 还要少。但是了解 Go 的朋友们知道,Go 的语法描述能力非常强。用 Go 写程序不需要 thread pool,不需要自己创建和管理线程;用 go keyword可以发射 gourotines,而 Go runtime 来调度 goroutines。甚至 epoll 这样的操作系统功能调用都有 select + channel 来描述。按说 go/select/chan 都是新增的 keywords,为什么其 keyword 总数比 C 的还少?这里体现了语言设计者的智慧。
相比 C++ 和 Java,Go 的 keywords 数量就更少了。在 Google 工作过的同学们都记得 Google 的 C++ 和 Java style guide。洋洋洒洒一大摞,基本就是说这两种语言的“禁用”的部分。
Java 社区里很多同学们都读过《Design Pattern》(设计模式)。为什么要有设计模式?因为为了达成一个目的,可以有多种写法,选择其中公认比较好的写法,称之为“模式”。 —— 这不是脱了裤子放屁吗?为什么语言的设计,要导致一个事儿可以有多种写法?其实这是设计不够理想的结果。Peter Norvig 在他著名的文章 http://norvig.com/design-patterns 里说“Design patterns are bug reports against your programming language." 他也用详实的例子,展示了即使在人类最早的高级语言之一 Lisp 的设计里,也是不需要《Design Pattern》那本大书里展示的任何技巧的。
这也反衬出了为什么 Go 的设计被公认为比较精妙。这并不奇怪,因为当 Go 的设计者们开始琢磨这种语言的时候,他们已经因为 Unix、C、Plan 9、awk、grep 的发明是公认的顶级系统设计大师了,甚至已经获得了图领奖。这是他们璀璨的创造人生中的最富智慧的一次升华。在计算机科学发展历史上,好像还没有第二个类似情况下的语言发明故事。