俗话说,历史虽然不会重演,但总是惊人的相似!
如果您想创建一门成功的编程语言(或者至少了解该如何做),那么向其他有这方面经验的人学习是非常有价值的。 在《Go Time》第 100 期中,Rob Pike 和 Robert Griesemer(Go 的两位创建者)一起探讨了 Go语言的成功经验。
以下是 Rob Pike 在演出谈到的,该语言成功可能是做对了这 5 件事。
## 1、正式的语言规范
在介绍该项目的起源时,Rob 说:
> 在我们经过六个多月的头脑风暴和思想成形之后,我们做的第一件重要的事情,就是花了几个星期写了一份正式的语言规范,我认为这是项目成功的关键部分。
>
> 另外一件最重要的事情之一是, Ian Taylor(他也是Google的一员)看到了规范,并决定要为此编写一个编译器。 因此,有一天他走进我们的办公室,说:“哦,顺便说一句,我已经为您的语言编写了一个编译器。”这对于我们来说,真是一个令人惊喜的时刻。 当然,他已经成为团队的一员,并且他现在仍在为 Go 工作。
该规范引起了 Ian Lance Taylor 等工程师的最初兴趣。
(巧合的是,Ian 最近也在一些演讲中谈论他在 **泛型** 方面的工作。)
## 2、杀手锏应用
然而,Rob 说当时并没有重点考虑为什么要引入Docker 的,大概是为了使 Go 语言对系统程序员有吸引力?
是的,Docker 是我们的杀手级应用程序,因为它是用 Go 编写的,它运作良好,并且成为了现在所谓的云计算的核心……我们过去仅将其称为系统编程或服务器。事实上,只要有一项重要的技术是用 Go 语言写的,这就证明了它的用武之地。而且,我认为这实际上说明 Go 是一门非常好的语言。 这是我们在将语言整合在一起时所考虑的事情,尽管不是自己做的。
后来,Kubernetes 又出现了,这一次来自 Google。能够使用你的语言编写重要的软件,这是取得成功的一个重要部分。如果一门语言没有任何实际应用,那么它有多好就无关紧要了。
## 3、建立了一个开源社区
Rob 坦率地谈到了他们在开放源代码时所面临的挑战,这令人耳目一新。
> 我确实认为我们团队并未真正做好与开源社区进行交互的准备,这意味着什么?Ian 是我们中唯一一个在开源世界中待了很多时间的人,他在社区中做的事情比他应得的要多。
>
> 我们花了很长时间才了解成为开源社区的一部分意味着什么,拥有一个基本上由公司支付的项目,但是有很多开源贡献者……实际上,我们早期就有很多很棒的开源贡献的开发。 Windows 的移植工作就完全由外部贡献者完成,这真是太好了……社区的意见至关重要。
>
> 我认为有时人们会认为 Google 控制得太多,这是他们的观点,但是我不同意。我认为他们低估了团队听取开源社区所说的话,查阅所有 issue,很好地处理所有问题的能力……有时不是很好,但是后来都解决了。
>
> 当有成千上万人时,这是一个非常具有挑战性的事情,而现在,据说世界上有数百万的 Go 程序员。他们都对这件事有自己的看法,也知道如何去做,但也要确保您正确把握项目的灵魂——我认为对此没有任何简单的答案。我认为很多人都认为这很琐碎,而您只是接受了每个人想要的东西……但是那样的话您就不会拥有 Go,而您会拥有其他东西。这确实很棘手,很难平衡。
## 4、不轻易改变语言
咋一听,这有点违反直觉。 通常对于软件而言,延展性是一种美德,要避免僵化。但是,Rob 很好地解释了为什么像 Go 这样的编程语言这点如此重要。(大家都知道,2012 年 Go1 承诺的兼容性,7 年多过去了,一直保持着)
> 好吧,对我们来说,这点其实很难。 对于 Go1,我们刻意写下我们保证不做任何(不兼容的)更改。 这对于语言的成功至关重要,因为它使企业能够相信我们正在做的事情以及依赖我们的事情不会破坏他们的工作……而这使得进行更改变得更加困难。 我认为很多人不理解我们对合约的钟情。 尽管这是一个已有十年历史的项目,但我们并未破坏人们的计划。 这是一个令人难以置信的负担,但对于使我们到达现在的位置至关重要。
## 5、坚持自己的信仰
当 Jon Calhoun 问及社区反馈以及 Go 团队对变更的抵制如何影响这一点时,Rob 说:
> Go 的某些特性对它的成功至关重要,但人们不一定喜欢,我们对此直言不讳。我认为您提到的其中一个是未使用变量的编译错误。这很烦人——您忘记删除未使用的变量,程序就会出现编译错误。但对我们来说,这是 Go 语言出彩的地方,这就是使一种语言能够尽可能保证高质量的代码,虽然不能阻止你写“坏”代码,但我们试图告诉你……这样可以避免你的程序很慢,或者你的代码难以维护。
>
> 我认为真正使人抓狂的是,Go 不允许导入不使用的库。这对我们至关重要,因为我们花了很多时间来进行大量二进制文件的缓慢构建,确保你程序的依赖项完全是您所需要的,而不再是其他依赖项。这对我们至关重要,但对于很多人来说,每次你进行编辑并删除打印语句或类似内容时,编译器都会说“你没有使用这个库”。
>
> 后来,Brad 编写了一个名为 goimports 的东西,它是 gofmt 的变体,可以为您管理导入(import),并且几乎使该抱怨消失。通常,自动化可以消除很多烦恼。
以上就是 Rob Pike 认为 Go 语言成功的 5 件事。整个对话都很精彩,如果英语好,可以听听音频。
音频地址:https://changelog.com/gotime/100
本文原文地址:https://changelog.com/posts/5-things-rob-pike-attributes-to-gos-success
翻译:polaris
有疑问加站长微信联系(非本文作者)