造就 Rust 的无名英雄

作者:Brian / 译者&&编辑:张汉东

原文: https://brson.github.io/2021/05/02/rusts-most-unrecognized-contributor

Brian Anderson 之前是 Mozilla Research 的资深研究工程师,Rust 核心团队成员。从事 Rust 编程语言方面的工作 6 年,维护运行时和标准库,构建验证语言及其子系统的基础设施。Servo 浏览器的主要作者之一。Rust 以稳定著称,而 Brian 的使命就是让 Rust 成为最可靠的平台。于 2018 年加入了 PingCAP。


我认为 Rust 语言目前取得了巨大的成功。当我回想这一切发生的过往时,敬畏之心油然而生。因为必须做很多正确的事才能达到现在这个状态,在整个过程中,其实犯错的机会太多了。Rust 语言靠着一个又一个微小的奇迹,逐渐变成了它应该成为的样子。这些奇迹并不是偶然发生的,而是靠每一个真实的人创造的。这些真实的人,通过精心地策划来早就伟大。

有很多人为 Rust 的成长做出了贡献。这其中有一些对 Rust 的成功保驾护航的人,却几乎不被人所知。

开端:Mozilla 研究所

到2009年,Mozilla 通过与 Google 合作的搜索交易中积累了可观的资金储备。以我的理解,管理层认为是时候投资这笔钱了,公司进入了一个快速扩张的时期。

作为扩展的一部分,Mozilla 创建了一个新部门 Mozilla 研究所(Mozilla Research)。该部门的使命是,独立于 Firefox 产品之外,去尝试一些目标远大的想法,同时与计算机科学学术界建立联系。

Mozilla 研究所的第一个重要构想就是 Servo。然后就是 Rust 。

戴夫·赫尔曼(Dave Herman)是当时被任命领导该部门的人之一。

戴夫·赫尔曼(Dave Herman)何许人也?

戴夫·赫尔曼 是一名编程语言理论学者,也是一名宏专家(macrologist,超级喜欢宏的人),并且是 Mozilla 在ECMAScript 委员会上的代表之一。

他 和 创建 Rust 的工程师 格雷顿·霍尔( Graydon Hoare) 曾经在 ECMAScript 4 标准(已废弃)上合作过。

他俩都对创建编程语言有强烈的爱好。

除了 Servo,Rust 和 戴夫·赫尔曼之外,Mozilla 研究所的工作还有很多,但这在我们的故事之外。

我们要讲的是,戴夫·赫尔曼(Dave Herman)如何默默塑造 Rust 项目成果的故事。

戴夫对 Rust 的贡献

Rust 于 2010 年 6 月发布,但实际上它在 2009 年末就开始在 Mozilla 内部开发。关于这段 Rust 开发过往的唯一公开记录是在 graydon/rust-prehistory 仓库中。

Rust 从开发之初到 2010 年 6 月呈现给公众,只经历了短短六个月的冲刺。而 戴夫 就是攻克这项任务的成员之一。


#![allow(unused)]
fn main() {
~/rust-prehistory $ git shortlog -sn
  1156  Graydon Hoare
   163  Andreas Gal
   104  Dave Herman
    59  graydon@pobox.com
    55  Patrick Walton
    37  Graydon Hoare ext:(%22)
    13  Roy Frostig
     9  graydon@mozilla.com
     6  Brendan Eich
     5  Michael Bebenita
     1  Brian Campbell
}

此后,他将编码工作交给了 格雷顿 领导的成长中的 Rust 团队。但在接下来的这几年中,戴夫一直在办公室里。

那是,大多数为 Rust 工作的人都在同一间办公室。而 Rust 另一个重要人物 格雷顿 则是远程。戴夫 和 少数几名全职员工,以及一些轮换的实习生会定期聚集在Mozilla Mountain View 总部的某个小会议室的一张桌子旁。

我想象得到,他就像一个导师一样,依赖自己在 ECMAScript 上的经验以及基于自己对语言设计的兴趣,推动着团队到富有成效的方向前进。他从来没有以任何方式行使自己的权威,直到今天,也没有在 Rust 上为自己争取任何声望。

他几乎完全在幕后做出了自己的贡献,默默地发挥着他的影响力。

在那个会议室里发生的很多早期的争论,都是一些基础性争论。这些争论今天看过去似乎已经无关紧要了,诸如 “从函数返回的关键字是什么?” ,或,“如何安全地持有结构体字段的指针” 等琐碎事情。这些问题在今天来看显得太过遥远且无关紧要,但是,正因为他们这样的争论,让 Rust 语言不断地反复塑造和重塑,直到所有小问题都被解决成一个一致的整体。

戴夫 是会议室中少数几个具有真正的生产编程语言设计经验的人之一,如果没有他带领团队克服琐碎的语言设计障碍,Rust 肯定会一团糟。戴夫 的品味塑造了团队的品味,从而塑造了 Rust 语言。并且,大多数情况下,戴夫 对团队的决定感到满意。

尽管 戴夫 在所有早期的 Rust 设计主题中都有发言权,但是有一些主题深深捕获着他对 Rust 语言的兴趣,如果你完全了解 Rust,我猜你会熟悉这些主题:

  • 教学法(Pedagogy)。即,教学的方法。

    戴夫 具有学术背景,并且始终根据如何教授和理解设计的每一个决定来考虑。

  • 治理(Governance)。即,社区管理。

    Rust 从一开始就被设计为社区项目,我认为这在很大程度上受到 戴夫在语言标准机构工作经验的影响。 一直都存在这种设想,最成功的语言不是被谁拥有的,而是由一大批个人和公司合作设计的,所有这些都是各自兴趣和动机的叠加。

    因此,Rust 开发时所依据的流程在当时总是要尽可能地做到包容。 举一个例子,Rust最早的许多发展都记录在公开的会议记录中。 我几乎完全将这归因于 戴夫 的自律,并且要知道其中许多记录都是由他个人录制的。

    戴夫 最重要的 Rust 遗产可能就是培养一种语言社区。

  • 宏(Macro)

    如前所说,戴夫 是一名宏专家。他在宏(Macro)方面颇有造诣,并且有 Racket 语言背景。

    尽管主要由实习生(特别是 Paul Stansifer)实现,并得到 John Clements 的一些关键贡献,但由于 戴夫 的缘故,Rust 拥有强大而卫生的声明宏(macro_rules!)。

    尽管这并不是我所涉及的领域,但我记得他和保罗(Paul)花了很多时间讨论如何将传统 Lisp 式的卫生宏系统设计为Rust所在的类 C 的世界。

戴夫 参与的其他关键决策包括:

  • 将 Rust 语言从 语句式(statement)语言 转换为 表达式(expression)语言。
  • 聘请 Niko 设计 Rust 所有权系统。
  • 雇佣 Yehuda Katz 设计 Cargo。

除了这些明显的贡献之外,戴夫 在 Rust 中还扮演者另一个关键角色:在管理层极力拥护 Rust 。

在造就 Rust 的所有奇迹中,最伟大的也许是 Mozilla 的诸多付出。在 Rust 存在于 Mozilla 的整个时期(译注:现在已经移交 Rust 基金会),团队内部明显有一种该项目随时可能被取消的感觉。坚守 Rust 团队的 Brendan Eich离开Mozilla之后,尤其如此。这就是为什么必须围绕该语言建立一个强大的社区的原因之一。

戴夫 是公司内职位最高的 Rust 信徒。而且,他竭尽所能提倡 Rust 对公司使命的重要性,并且满足 Rust 的人员配备和资源。的确,我不清楚 戴夫 在管理角色上所要面对的一切,但这绝对是关键:他做到了让团队专注于 Rust 。

无论如何, Rust 总是人手不足。我记得当时对此很生气:我们如何在如此少的全职工程师的情况下与 Google 和 Apple 竞争?这个问题的答案,一半肯定是培养投资多元化的贡献者社区,但这是一个缓慢且不确定的过程。而这个问题答案的另一半要归功于 戴夫:实习生。Rust 通常拥有比全职员工更多的实习生,并且它们都是由 戴夫 雇佣的,戴夫 可以凭借他在学术界的诚信轻松招募 PL 人才。

一个值得赞赏的事实:Rust 主要由学生创建,其中许多人在 Mozilla 实习。

关于 Rust 设计的轶事

我想我应该说一些 戴夫 对 Rust 设计贡献的一些轶事,而第一个想到的就是他不同意团队的那些决定。这不是一个关于 戴夫 所作贡献的很好的案例,但也许仍然值得分享,并且是他如何在指导团队的同时也信任他们决定的一个例子。

至今仍难以记住确切的细节,但我印象最深的一幕:当我们引入了可变变量和不可变变量绑定之间的区别时,戴夫坚决不同意团队所做的决定。我们只是在决定要为每种语法使用什么语法,这很简单。 争论结束时,对于不可变和可变绑定分别有两个明显的选择:

  • letlet mut
  • letvar

第一个是我们目前已经采用的语法,第二个是直接从 JavaScript 中借鉴的,两者都有充分的理由。 当时的主要问题是,从 “较难” 还是 “较丑” 中选择一个更加合适的语法。语言设计师 强迫 程序员 键入两个关键字来创建可变绑定,潜移默化地去影响程序员,使得他们对引入可变性去做更多思考。

我记得 戴夫 不同意团队在这一方面的决定。 回想起来,我认为他不同意「严格限制用户选择编码模式」的原则,但我不确定。 我也仍然认为团队对此是正确的:额外的 mut注释不仅增加了一些额外的工作以增加变量的可变性,而且mut注释自然地扩展到 Rust 类型系统的其他区域,例如&mut引用。 而且,可变性的识别和管理已成为该语言的本质特征。

为成功奠定基础

我猜 戴夫 直接参与了Rust的设计于 2014 或 2015 年结束,Rust 社区中的大多数人甚至都没有意识到他的存在。

戴夫 没有创造出 Rust。

他仅向公共 Rust 仓库贡献了六次提交。他只在邮件列表上讲话了四次。

他所做的就是创建一个他认为可以为世界带来独特愿景的团队,并在该团队中巧妙地植入了一套价值观,这些价值观将使 Rust 能够超越 Mozilla 的边界,超越任何单独个体的参与和个性。

事实正是如此。

Rust 的成功有很多原因,其中有成千上万的贡献者,成千上万的微小奇迹汇聚成一个连贯的整体。

但是,微小的奇迹不会偶然变成大奇迹。