budshome (blog: 芽之家) shared the aphorism --
任何没有创新思路的求变与激进,都只不过是一场苍白无力的存生挣扎。 -- 佚名

[Rust] Rust 生态中,最不知名的贡献者和轶事

💥 内容涉及著作权,均归属作者本人。若非作者注明,默认欢迎转载:请注明出处,及相关链接。

Summary: Rust 语言和生态的成功,是许许多多的微小奇迹,汇聚而成的巨大奇迹。作者 Brian Anderson 回忆了 Rust 发布前的发展历程,致敬了使得 Rust 获得伟大成功,但个人却在 Rust 生态中不知名的 Dave Herman。他是 Mozilla 中代表 Rust 的最高层,对 Rust 的成功负有最大贡献的人之一,几乎完全没有得到承认,也没有试图要求过任何有关 Rust 的荣誉。

Topics: rust rust-贡献者 rust-轶事

大家五一假期愉快!

昨晚睡前无意识网络闲逛,看到了 Brian Anderson 于 2021 年 5 月 2 日 撰写的文章 Rust’s Most Unrecognized Contributor。文章或许存在争议,但文笔很棒,我们也可以多看多思:作为成年人,我们都晓得,任何伟大的背后,无一例外都沉积着丰厚的、但举足轻重的不知名,或者说默默无闻。笔者不由得希望将此文分享,共同向诸多先行者致敬。

以下为原文翻译——

我认为:Rust 语言是一个伟大的成功。当我回想起来的时候,我感到敬畏:有那么多的事情要去寻找正确的方向,才能驻足于我们现在的位置。有那么多的犯错机会,使得 Rust 语言经历了许多微小的奇迹,才变成现在的样子。然而,这些奇迹并不是偶然发生的:每一个奇迹都是由真实的个人创造的,而每个人的精心策划,才使得 Rust 成为伟大的技术。

有许多人,促成了 Rust 的成功。但是,对 Rust 的成功负有最大贡献的人之一,几乎完全没有得到承认。

Rust 起步于 Mozilla 研究院

2009 年,Mozilla 已经从与谷歌的利润丰厚的搜索交易中,积累了可观的现金储备。据我了解,Mozilla 管理层决定是时候投资这笔钱了,公司进入了快速扩张期。

作为扩张的一部分,Mozilla 创建了一个新的部门,Mozilla 研究院。这个部门的任务独立于 Firefox 产品,专注于尝试雄心勃勃的新想法。同时,与计算机科学相关学术界建立关系。

Mozilla 研究院的第一个大创意就是 Servo,或者说是 Rust。

当时,Mozilla 研究院的领导者之一是 Dave Herman

Dave Herman,何许人也?

Dave Herman 是一位程序设计语言理论家,也是一位宏学家(macrologist,超级热爱宏的人)。同时,他也是 Mozilla 在 ECMAScript 委员会的代表之一。他和创造 Rust 的工程师 Graydon Hoare,都曾合作开发过 ECMAScript 4 标准(遗憾的是,ECMAScript 4 后来被废弃了)。

他们都对创造新的编程语言,有很大的兴趣。

除了 Servo、Rust 和 Dave Herman,在 Mozilla 研究院还发生了很多事情,但我们今天不谈及。

我们聊一聊关于 Dave Herman 是如何悄悄地塑造 Rust 项目的故事。

Dave Herman 对 Rust 的贡献

虽然,Rust 是在 2010 年 6 月发布的,但实际上,Mozilla 内部的 Rust 工作是在 2009 年底开始的。唯一公开的 Rust 发展记录,存在于 Rust 史前(rust-prehistory)仓库。

在 2010 年 6 月之前的数月里,人们争相向公众展示 Rust。Dave Herman 就是其中之一:

~/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

此后,他将编码工作交给了 Graydon 领导的 Rust 团队。但后来几年的 Rust 开发中,Dave 一直在参与。

那时,大多数 Rust 语言的开发者,实际上都在同一个办公室工作(除了最著名的 Graydon,他远程工作)。他们经常聚集在 Mozilla 山景城(Mountain View)总部的某一个小会议室的桌子旁:一小群全职员工、一大群实习生,以及 Dave Herman。

我猜想,Dave Herman 认为自己是一个导师,根据自己使用 ECMAScript 的经验和自己对语言设计的兴趣,轻轻地推动团队朝着富有成效的方向发展。Dave Herman 从来没有以任何方式行使过权力,直到今天,他也没有试图要求过任何有关 Rust 的荣誉。

Dave Herman 几乎完全是在幕后做着贡献,温和地发挥自己的影响力。

在那个会议室里,有许多早期的基本辩论。当然,今天看来无关紧要的、琐碎的事情,比如:“从函数返回的关键字是什么?”;或者不那么琐碎的事情,比如:“你如何安全地持有一个指向结构体字段域的指针?”。那个时候的问题,今天觉得遥远而不重要,但那是因为当时这些问题被深入地讨论过。Rust 语言被反复地塑造、重塑,直到所有的小问题都被解决,形成一个一致的整体。在会议室里面,Dave 是为数不多的在设计真正的产品化编程语言方面有经验的人之一。如果没有 Dave 指导团队克服这些微不足道的语言设计障碍,Rust 肯定会一团糟。

Dave 的品味塑造了团队的品味,从而塑造了 Rust 语言。所以大部分时间,Dave 对团队的决定都很满意。

Dave 不止对所有早期的 Rust 设计主题有发言权。Rust 语言的关键设计中,Dave 所指导的有很多。如果你对 Rust 有了解,我想你会很熟悉这些设计主题:

  • 教授(Pedagogy),即 Rust 的“教学方法”。

Dave 有学术背景,总是根据如何教授和理解来考虑每一个 Rust 语言的设计决策。

  • 治理(Governance),以及社区管理。

Rust 从一开始就被设计成一个社区项目。我认为,在很大程度上,是受到了 Dave 个人经验的影响。人们一直认为:最成功的语言不是由一大群人和公司拥有的,而是由他们自己的兴趣和动机共同设计的。

正因如此,在 Rust 形成过程中的每个设计,在当时总被认为是合理的。举个例子,Rust 最早的发展过程,在公开的会议纪要中都有记载。我认为这几乎完全归功于 Dave 自己的纪律性。而且我知道,其中许多记录都是他亲自录制的。

把培养一种语言的社区放在首位,可能是 Dave 最大的遗产。

  • 宏(Macros)

如前所述,Dave 是一位宏学家(macrologist);他是宏方面的专家,有 Racket 语言背景。

译注:Racket 语言号称“面向‘语言’的程序设计语言”,在灵活的表达式方面非常有特色。但是,括号真的太多了。如下官网示例:

;; Using higher-order occurrence typing
(define-type SrN (U String Number))
(: tog ((Listof SrN) -> String))
(define (tog l)
  (apply string-append
         (filter string? l)))
(tog (list 5 "hello "
           1/2 "world" (sqrt -1)))

目前,NSF、微软、谷歌,以及 Mozilla 都对其有帮助。

尽管主要由实习生实现,特别是 Paul Stansifer,以及 John Clements 的一些重要贡献。但是,正因为 Dave,Rust 才拥有强大而健康(hygienic)的声明宏(macro_rules!)。

虽然,这完全不是我参与的领域,但我记得 Dave 和 Paul 花了很多时间讨论:如何在类 Lisp(Lispish)传统中设计健康的宏系统,使得 Rust 栖息于类 C 语言世界。

  • Dave 参与的其它关键决策包括:
    • 将 Rust 语言从语句语言转换为表达式语言;
    • 雇佣 Niko 设计 Rust 的所有权(ownership)系统;
    • 雇佣 Yehuda Katz 设计 Cargo;

除了这些显而易见的贡献之外,Dave 还在 Rust 中扮演了另一个重要角色:成为 Rust 团队在 Mozilla 管理层中的代言人。

在所有致使 Rust 成功的奇迹中,也许最伟大的是 Mozilla 为此付出了许多。但是,Rust 存在于 Mozilla 的整个期间中,Rust 团队有一种明显的感觉,即项目随时都可能被取消。尤其是当 Brendan Eich 离开 Mozilla 之时,情况更是如此。这就是为什么在语言上建立一个强大的社区如此必要的原因之一——时间会冲淡一切。

不过,Dave 是个 Rust 信徒,是代表 Rust 团队在 Mozilla 的最高职位。他竭尽所能宣传 Rust 对 Mozilla 使命般的重要性,以保持 Rust 的人员和资源配置。真的,我不知道 Dave 在管理岗位上处理了什么,但这绝对是关键所在——他为了让整个“球队”能够专注于 Rust。

不管怎样,Rust 总是人手不足。我记得当时对此非常愤怒:全职工程师却如此之少,我们怎么能与谷歌和苹果竞争?这个问题的一半答案当然是培养投资和多样化的贡献者社区,但这是一个缓慢和不确定的过程。解决这个问题的另一半答案还是要感谢 Dave:实习生,非常多的实习生。Rust 的实习生通常比全职员工多,他们是由 Dave 雇佣的。Dave 可以凭借自己在学术界的诚意,轻松招募 PL 人才。这也是 Mozilla 研究院的部分策略。

有一点值得赞赏的事实:Rust 主要是由学生建造的,他们中的许多人在 Mozilla 实习。

关于 Rust 设计的轶事

我觉得应该在此文中,包括一些关于 Dave 设计贡献的个人轶事。首先,想到的是他不同意团队的决定。因此,这不是 Dave 贡献的一个好例子,但也许仍然值得分享。这也是他如何指导团队,同时也相信团队决定的例子。

目前为止,我很难记住确切的细节,但我清楚地记得,有一次 Dave 肯定不同意团队做出的决定:那是在我们引入可变变量、不可变变量绑定之间的区别时。我们只是在决定何种语言使用何种语法,一件简单的事情。在辩论结束时,有两个明显的选择,分别是不可变绑定和可变绑定:

  • letlet mut
  • letvar

第一个选项是我们最终确定的结果,第二个直接借用 JavaScript,这两者都有很好的理由。目前的主要问题是:在两个选项中,选择合适的一种,选择“更难”,或者“更丑”。强制用户键入两个关键字(译注:即 let mut)来创建可变绑定,是语言设计者悄悄地影响程序员,以考虑引入可变性的额外因素。

我记得 Dave 不同意团队在这个问题上的决定。回想起来,我认同他不同意“体罚”用户选择编码模式的原则,但我记不清具体了。不过,我仍然认为团队在这一点上是正确的:额外的 mut,不仅增加了一些额外的工作来增加变量的可变性,而且 mut 自然地扩展到了 Rust 类型系统的其它领域,比如:&mut;而可变性的识别和管理,已经成为语言的一个决定性特征。

给成功以准备

Dave 对于 Rust 设计的直接参与,我想是在 2014 年或 2015 年结束的。可能在 Rust 社区的大多数人,都不晓得 Dave Herman 的存在。

Dave 并未创造 Rust。公开的 Rust 仓库中,他总共仅有 6 次提交(commit)。在邮件列表上,他也只有 4 次发言。

Dave 所做的,是创建一个团队,他相信这个团队能够向世界传递独特的愿景,并在这个团队中巧妙地植入一套价值观。Dave 使得 Rust 语言能够超越了 Mozilla 的边界,超越了任何个人的参与和个性。

事实正是如此。

Rust 成功的原因有很多,从成千上万的贡献者,数千个微小的奇迹,凝聚成一个有条理而一致连贯的整体。

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

谢谢您的阅读!


Rust 生态与实践

Related Articles

  1. [Rust] Rust 官方周报 395 期(2021-06-16)
  2. [Rust] Rust 1.53.0 明日发布,关键新特性一瞥
  3. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(3)- rhai 脚本、静态/资源文件、环境变量等
  4. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(2)- 获取并解析 GraphQL 数据
  5. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(1)- crate 选择及环境搭建
  6. [Rust] Rust 官方周报 394 期(2021-06-09)
  7. [Rust] Rust web 前端库/框架评测,以及和 js 前端库/框架的比较
  8. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(4)- 获取 GraphQL 数据并解析
  9. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(3)- 资源文件及小重构
  10. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 标准的 web 前端(2)- 组件和路由
  11. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 标准的 web 前端(1)- 起步及 crate 选择
  12. [Rust] Rust 官方周报 393 期(2021-06-02)
  13. [Rust] Rust 官方周报 392 期(2021-05-26)
  14. [Rust] Rust 中,对网址进行异步快照,并添加水印效果的实践
  15. [Rust] Rust 官方周报 391 期(2021-05-19)
  16. [Rust] Rust,风雨六载,砥砺奋进
  17. [Rust] 为什么我们应当将 Rust 用于嵌入式开发?
  18. [Rust] Rust 官方周报 390 期(2021-05-12)
  19. [Rust] Rust + Android 的集成开发设计
  20. [Rust] Rust 1.52.1 已正式发布,及其新特性详述
  21. [Rust] 让我们用 Rust 重写那些伟大的软件吧
  22. [Rust] Rust 1.52.0 已正式发布,及其新特性详述
  23. [Rust] Rust 官方周报 389 期(2021-05-05)
  24. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(4) - 变更服务,以及小重构
  25. [Rust] Rust 1.52.0 稳定版预发布测试中,关键新特性一瞥
  26. [Rust] Rust 生态中,最不知名的贡献者和轶事
  27. [Rust] Rust 基金会迎来新的白金会员:Facebook
  28. [Rust] Rustup 1.24.1 已官宣发布,及其新特性详述
  29. [Rust] Rust 官方周报 388 期(2021-04-28)
  30. [Rust] Rust 官方周报 387 期(2021-04-21)
  31. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(4)- 变更服务,以及第二次重构
  32. [Rust] Rustup 1.24.0 已官宣发布,及其新特性详述
  33. [Rust] basedrop:Rust 生态中,适用于实时音频的垃圾收集器
  34. [Rust] Rust 编译器团队对成员 Aaron Hill 的祝贺
  35. [Rust] Jacob Hoffman-Andrews 加入 Rustdoc 团队
  36. [机器人] 为什么应将 Rust 引入机器人平台?以及机器人平台的 Rust 资源推荐
  37. [Rust] rust-lang.org、crates.io,以及 docs.rs 的管理,已由 Mozilla 转移到 Rust 基金会
  38. [Rust] Rust 官方周报 386 期(2021-04-14)
  39. [Rust] Rust 编译器(Compiler)团队 4 月份计划 - Rust Compiler April Steering Cycle
  40. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(3) - 重构
  41. [Rust] 头脑风暴进行中:Async Rust 的未来熠熠生辉
  42. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(2) - 查询服务
  43. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务 - 起步及 crate 选择
  44. [Rust] Rust 2021 版本特性预览,以及工作计划
  45. [Rust] Rust 用在生产环境的 42 家公司
  46. [Rust] 构建最精简的 Rust Docker 镜像
  47. [Rust] Rust 官方周报 385 期(2021-04-07)
  48. [Rust] 使用 Rust 做异步数据采集的实践
  49. [Rust] Android 支持 Rust 编程语言,以避免内存缺陷
  50. [Rust] Android 平台基础支持转向 Rust
  51. [Rust] Android 团队宣布 Android 开源项目(AOSP),已支持 Rust 语言来开发 Android 系统本身
  52. [Rust] RustyHermit——基于 Rust 实现的下一代容器 Unikernel
  53. [Rust] Rustic:完善的纯粹 Rust 技术栈实现的国际象棋引擎,多平台支持(甚至包括嵌入式设备树莓派 Raspberry Pi、Buster)
  54. [Rust] Rust 迭代器(Iterator trait )的要诀和技巧
  55. [Rust] 使用 Rust 极致提升 Python 性能:图表和绘图提升 24 倍,数据计算提升 10 倍
  56. [Rust] 【2021-04-03】Rust 核心团队人员变动
  57. [Rust] Rust web 框架现状【2021 年 1 季度】
  58. [Rust] Rust 官方周报 384 期(2021-03-31)
  59. [Rust] Rust 中的解析器组合因子(parser combinators)
  60. [生活] 毕马威(KPMG)调查报告:人工智能的实际采用,在新冠疫情(COVID-19)期间大幅提升
  61. [Python] HPy - 为 Python 扩展提供更优秀的 C API
  62. [Rust] 2021 年,学习 Rust 的网络资源推荐(2)
  63. [Rust] 2021 年,学习 Rust 的网络资源推荐
  64. [生活] 况属高风晚,山山黄叶飞——彭州葛仙山露营随笔
  65. [Rust] Rust 1.51.0 已正式发布,及其新特性详述
  66. [Rust] 为 Async Rust 构建共享的愿景文档—— Rust 社区的讲“故事”,可获奖
  67. [Rust] Rust 纪元第 382 周最佳 crate:ibig 的实践,以及和 num crate 的比较
  68. [Rust] Rust 1.51.0 稳定版本改进介绍
  69. [Rust] Rust 中将 markdown 渲染为 html
  70. [生活] 国民应用 App 的用户隐私数据窥探
  71. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
  72. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(2)- 查询服务
  73. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(1)- 起步及 crate 选择
  74. [Rust] Rust 操控大疆可编程 tello 无人机

Topics

rust(73)

graphql(16)

rust-官方周报(12)

webassembly(9)

async-graphql(8)

rust-官方博客(8)

tide(7)

rust-web(7)

wasm(6)

this-week-in-rust(6)

yew(6)

mysql(5)

rbatis(5)

android(4)

actix-web(4)

mongodb(3)

json-web-token(3)

jwt(3)

cargo(3)

技术延伸(3)

trunk(3)

handlebars(3)

rhai(3)

用户隐私(2)

学习资料(2)

python(2)

ai(2)

人工智能(2)

postgresql(2)

rust-compiler(2)

rust-基金会(2)

rust-foundation(2)

rustup(2)

rust-toolchain(2)

rust-工具链(2)

rust-游戏开发(2)

rust-区块链(2)

graphql-client(2)

tello(1)

drone(1)

无人机(1)

隐私数据(1)

markdown(1)

html(1)

crate(1)

async(1)

异步(1)

旅游(1)

不忘生活(1)

葛仙山(1)

hpy(1)

python-扩展(1)

正则表达式(1)

解析器组合因子(1)

组合器(1)

regular-expression(1)

parser-combinator(1)

regex(1)

官方更新(1)

rust-工作招聘(1)

rust-技术资料(1)

rust-周最佳-crate(1)

rust-web-框架(1)

rust-web-framework(1)

rust-核心团队(1)

rust-core-team(1)

rust-language-team(1)

pyo3(1)

rust-python-集成(1)

python-性能改进(1)

迭代器(1)

iterator-trait(1)

国际象棋(1)

chess(1)

游戏引擎(1)

game-engine(1)

虚拟化(1)

unikernel(1)

rustyhermit(1)

linux(1)

virtualization(1)

sandboxing(1)

沙箱技术(1)

数据采集(1)

异步数据采集(1)

docker(1)

镜像(1)

生产环境(1)

rust-评价(1)

rust-2021-edition(1)

rust-2021-版本(1)

graphql-查询(1)

vision-doc(1)

愿景文档(1)

代码重构(1)

steering-cycle(1)

方向周期(1)

隐私声明(1)

机器人(1)

robotics(1)

rustdoc(1)

rust-编译器(1)

实时音频(1)

real-time-audio(1)

变更服务(1)

mutation(1)

查询服务(1)

query(1)

rust-贡献者(1)

rust-轶事(1)

rust-稳定版(1)

rust-预发布(1)

rust-测试(1)

安全编程(1)

可信计算(1)

安全代码(1)

secure-code(1)

rust-android-integrate(1)

rust-embedded(1)

rust-嵌入式(1)

rust-生产环境(1)

rust-2021(1)

rust-production(1)

网页快照(1)

网页截图(1)

水印效果(1)

图片水印(1)

rust-wasm(1)

yew-router(1)

css(1)

web-前端(1)

wasm-bindgen(1)

区块链(1)

blockchain(1)

surf(1)

dotenv(1)

标识符(1)

rust-1.53.0(1)

Elsewhere

- Open Source
  1. github/zzy
  2. github/sansx
- Awesome Blog
  1. Sansx's Studio
  2. 曙光磁铁的博客
- Learning & Studying
  1. Rust 学习资料 - 芽之家