2007 年 9 月,Rob Pike、Robert Griesemer 和 Ken Thompson 在 Google 办公室里讨论着什么。

在那个时代,GitHub 还不存在,企业的生产软件通常是用 C++ 或 Java 编写的,大多数计算机还没有多处理器。除了 Visual Studio 和 Eclipse,整个编程世界几乎没有可用的 IDE 和其他高级工具。

而相比编程语言的固步自封,包括计算机硬件在内的技术正在飞速发展,开发者对高效编译、高效执行和易于编程也提出了越来越高的要求。

比起在臃肿的语言上不断增加新特性,也许简化编程语言会是更大的进步。”Rob Pike 等人草拟着他们关于新语言的设想。几天后,一个名为 Go 的项目作为他们的业余爱好诞生了。

转眼十几年过去了,如今 Go 常居流行编程语言 Top10 榜单,而且是云计算领域的首选语言,也是区块链领域的第一语言。作为 Go 的缔造者及其发展的见证者,近日,Rob Pike 做客访谈节目,讲述了他心中 Go 最重要的五个成功品质。

在讲述项目起源时,Rob Pike 不由回想起了撰写编程规范的时光:

我们写规范只用了几周,但在那之前,我们进行了六个月的头脑风暴和大致构想。编写语言的正式规范是我们做的第一批重要工作之一,也许我们做的第一项重要工作。我认为这是 Go 成功的关键部分。

在这个过程中,最让我印象深刻的一件事是 Ian Taylor 加入了我们团队。

他当时也在 Google,因为看到了我们的规范草案,很感兴趣,所以有一天特意走办公室对我们说:“哦,顺便说一句,我已经为你们的语言编写了一个编译器。”Ian 现在还是团队的一员,仍在从事 Go 的研究。

一份正式的规范,也许能为你在项目早期吸引到同行工程师的兴趣。

在访谈中,Rob Pike 并没有分享他们是如何吸引 Docker 的,相反地,他认为能让编程语言对程序员们充满吸引力,才是成功的一大要素。

Docker 确实是我们的杀手级应用,因为它是用 Go 编写的,运行良好,而且是现在所谓的云计算的核心……过去我们把它叫做系统编程或服务器。

事实上,如果有一项重要技术是用 Go 写的,那就证明 Go 的初衷对很多程序员来说是合理的。尽管我们开发的时候并没有考虑到容器,但这个结果是符合我们整合语言时的设想的。

后来 Kubernetes 也出现了,这一次它来自 Google。

在衡量一种编程语言是否成功时,如果有一个重要软件是用这种语言编写的,那的确是个很重要的标准。毕竟如果一种语言没有任何落地成果,它无论有多好都会变得无关紧要。

在访谈中,Rob Pike 坦率地谈到了他们在开源这个问题上所面临的挑战,令人耳目一新。

现在回想,我认为当时团队确实没有准备好和开源社区接触。Ian 是我们中唯一一个在开源社区中有丰富经验的人,所以他在开源上承担了相当重的工作。我们花了很长时间才理解什么叫“开源社区的一部分”:有一个项目,它的开销由公司负担,但是有很多开源贡献者参与其中……

在项目早期,广大开源爱好者确实对 Go 做出了非常出色的贡献,比如 Windows 的移植完全是由外部贡献者完成的,这非常棒。社区的输入很关键。

但有时候人们会抱怨 Google 对 Go 管得太宽,这是他们的观点,我不敢苟同。我认为大家还是低估了团队在听取社区意见、阅读问题、处理问题上的能力。虽然有时候团队做得不太好,但我们之后就会马上改进。

这是一件很有挑战性的事,因为现在全球有数百万程序员在使用 Go,他们都有各自的意见和想法,众口难调。如何倾听,同时确保项目的“灵魂”始终正确——我不认为这是件简单的事

我想也许有很多人觉得这样的工作微不足道,只要按所有人的想法去做就好,但那样就不是 Go 了!这件事真的很棘手,很难平衡。

乍看之下,这有些违背直觉。因为对软件来说,灵活性、可塑性通常是优点,僵化是诅咒。然而,Rob 很好地解释了为什么这种反直觉设计对于像 Go 这样的编程语言如此重要。

我们把 Go 设计成很难改变,这是故意的。对于 Go 1,我们承诺不改变任何东西,这对语言的成功至关重要。

因为作为一种工业级语言,这让所有用 Go、依赖于 Go 的企业相信,我们所做的事不会对他们造成任何破坏,这也使改变 Go 变得更加困难。

大家或许很难想象我们有多热情地执着于这个承诺,Go 发展到现在已经十几年了,我们至今没有毁坏过一个程序。这是一个令人难以置信的负担,也是一份至关重要的坚持,是它把 Go 带到了今天的位置。

Go 的成功也离不开它自身的一些特点,坦白地说,很多人并不喜欢这些“特点”。

Go 什么地方最恼人?很多人会说未使用变量的编译错误:如果你忘记删除一个未使用的变量,程序就会编译错误。但对我们来说,这是为了保证代码的质量和可维护性。虽然我们不能阻止你写出糟糕的代码,但我们可以让它跑不快,甚至难以维护。

这还不是让人最抓狂的,我觉得更多人受不了 Go 不允许导入不使用的库。但这个特点对我们来说至关重要,因为我们花了很多时间来处理带有大量二进制文件的缓慢构建,以确保所有程序依赖项正是你需要的。当然,对开发者来说,每次都要被编译器提醒“你没有使用这个库”,确实挺烦人的。

为了平息众怒,Brad 写了一个叫 goimports 的东西,它是 gofmt 的变体,可以管理所有 import。通常情况下,自动化可以消除许多怨言。

一如既往,Rob Pike 的发言带着一股 Go 团队特有的“固执”。

今年 5 月,Go 社区的开发者们一齐发声,指责 Google 对 Go 控制过多,他们抱怨“Go 语言是 Google 的,而不是社区以及程序员的”。

开源贡献者投入了大量时间和精力到项目中,却因 Google 不愿接受被一票否决,眼看心血被白白浪费,许多开发者因此寒了心。

但也有人认为,Go 如今取得的成就有社区的贡献,但绝非社区主要驱动。

社区的意见太多了,所有人都声称是代表社区,但其中又有多少是大多数人的心声?如果只是单纯为了满足开发者,Go 不会有那么明确规划和方向。相反地,是 Google 为这个项目提供了核心团队人才,才支撑它走到现在。

无论持何种观点,大多数开发者都有一个共识:Go 有一支非常优秀的核心小团队,他们虽然有些“固执己见”,但对 Go 本身有着始终如一的发展理念。而此番 Rob Pike 的访谈,无疑是最好的佐证。

在可以预见的将来,Go 仍会在核心团队的把控下小步缓行。作为 Go 语言的使用者,你对 Go 的归属和未来又有什么想法呢?

https://changelog.com/posts/5-things-rob-pike-attributes-to-gos-success