工程哲学:松本行弘(Matz)

要点速览
- 为人而设计,而非为机器。 Matz把程序员的快乐当作目标函数,让账单由硅片来买单。每一处语法抉择,都先回答”读到它的人会有什么感受”,再去考虑”字节能跑多快”。
- 最小惊讶,是”我”的惊讶最小。 这条原则并非对初学者期待的民意调查,而是一位娴熟的作者把自己的挫败感降到最低,而衡量的时点是在你把 Ruby 学透”之后”。
- MINASWAN:文化是一种设计产出。 “Matz 友善,所以我们也友善”表明,一门语言的社区是可以设计的表面,而不只是语法下游的偶然产物。
- Ruby 是一种品味的不懈贯彻。 它的连贯来自融合——把 Perl、Smalltalk、Lisp、Ada、Eiffel 调和为单一的声音,而非委员会折中的平均值。
这条原则
“于我而言,人生的目的之一是获得快乐。程序员在能够专注于编程的创造性一面时,常常感到快乐,所以 Ruby 的设计就是为了让程序员幸福。” – Yukihiro Matsumoto1
大多数语言设计都为机器而优化:编译速度、内存布局、指令数量,全是硅片在意的东西。Matz 把优先次序颠倒过来。他认定键盘前的那个人才是真正重要的对象,而机器的职责就是服务于他。”机器应当服务于人,”他说,”程序员却常在不知不觉中服务于机器。让机器来服务你吧。”2
这里说的快乐是一条硬性的设计约束,而非披着工程外衣的软性情怀。如果人的快乐就是目标函数,那么每一处语法选择、每一个方法名、每一项默认值,都变成一个关于读写代码的人会有什么感受的问题,而非字节能跑多快。Matz 把这种取舍摆得明明白白、坦坦荡荡:Ruby 愿意花掉机器的周期,来换取程序员的舒适。同样的信念让品味成为一套结构性的系统,而非一种装饰——做事的人的体验成了承重的核心关切,而不是收尾时才补上的事后之举。
一个决定统辖了随后的一切:为人而设计,而非为机器。 语法、文化、社区箴言,全都位于它的下游。本文余下的篇幅,将追溯一个人对自身幸福的追求,如何固化为一种站得住脚的工程立场——以及为何”服务于人”原来与”服务于机器”一样严谨,而不是从后者的退缩。
来龙去脉
Yukihiro Matsumoto 于 1965 年 4 月 14 日生于日本大阪府,四岁起在鸟取长大。3 他形容自己是个语言迷——不是语言学家,而是个”编程”语言迷。直到高中毕业他都是自学成才的程序员,后来在筑波大学取得信息科学学位,并在那里的一个专攻编程语言与编译器的研究室工作。3 痴迷在先,Ruby 是它最终的产物。
他在 1993 年 2 月为 Ruby 命名——这个名字是在与同事石冢圭树的一次在线聊天中冒出来的,那时还没写下任何代码——随后用了好几年把它打造出来。13 动机源于不满。”我真的很想要一门纯正面向对象、又易于使用的脚本语言,”他解释道,”我四处找过,却找不到。”4 Perl 很强大,但在他的品味里算不上真正面向对象;Python 是面向对象的,但在他的品味里又不够令人愉悦。于是他造出了自己想用的语言。他在 1995 年 12 月 21 日发布了第一个公开版本。3
这个名字是个小玩笑。两人选定 Ruby 作为一种宝石,算是对 Perl 的致意——Ruby 部分上正是在回应那门语言。先有 pearl(珍珠),再有 ruby(红宝石):一个像增量升级一样命名的后继者。4 多年里,Ruby 主要是个日本本土现象,邮件列表和文档都是日文。全球性的突破来得更晚,且来自外部:David Heinemeier Hansson 在它之上构建了 Ruby on Rails,而 Rails 在 2000 年代中期把 Ruby 带向了世界其余各地。4 一个人为自身幸福而造的语言,成了一代人 Web 应用的底座。
这项工作
Ruby 的设计:快乐与最小惊讶原则

关于 Ruby 被引用最多的观念,便是”最小惊讶原则”——语言应当以你预期的方式行事,好让你把注意力放在问题上,而非工具上。Matz 认同这条原则,却纠正了一种常见的误读。”最小惊讶原则,意思是’我’的惊讶最小原则,”他说,”而且它指的是在你把 Ruby 学得非常透彻之后的最小惊讶原则。”5
那句纠正,把整套哲学浓缩在一句话里。他没有去调查程序员、再把他们的期待取个平均。他设计这门语言,是为了把”我”的挫败感降到最低,赌的是:一门让自己的作者——一位娴熟而苛刻的使用者——感到愉悦的语言,等到别人也达到娴熟时,同样会让他们愉悦。”我想把编程时自己的挫败感降到最低,所以我想把编程的力气也降到最低,”他说,”我想让自己在编程中获得乐趣。”5 Ruby 是一门扩展开来的私人语言。它的一致性不是委员会的一致性,而是一种品味不懈贯彻的一致性。
为人设计,而非为机器
Matz 把软件当作面向人的媒介,而非给硬件的一组指令。”别低估人的因素,”他说,”即便我们坐在计算机前,它们也是媒介。我们是在为人、与人一起工作。说到底,我们的大多数任务都与人有关。”5 他把这一点推到口号之外:在 Matz 看来,界面就是整个产品。”如果你的系统界面糟糕,没人会用它。所以系统的界面、它的表面——无论是面向用户还是面向其他机器——都极其重要。”2
随之而来的推论,是拒绝屈从于机器的偏好。被问及人与计算机的关系时,Matz 直言不讳:”我们是主人,它们是奴隶。”6 机器之所以存在,是为了服务于程序员的意图;一门逼着人像 CPU 那样思考的语言,把这层关系弄反了。Ruby 的块、它万物皆对象的模型、它易读的方法名——Array#each、Integer#times、String#upcase——无不耗费实现上的复杂度,好让表面读起来就像意图本身。
MINASWAN:文化作为一种设计产出
Ruby 最不寻常的产物不是某项特性,而是一条社区规范。Matz 以友善、耐心的举止闻名,这种气质蔓延成了一句箴言:MINASWAN——“Matz 友善,所以我们也友善。”7 在 Ruby 早期,每当邮件列表上的讨论变得火药味十足,社区成员便援引它来把氛围拉回更温和的基调。它不断传播,终于成了一种身份认同。8
大多数语言设计者错失的教训是:”文化”同样是一个设计表面。语言不止于它的语法——它是提出一个问题便能得到慷慨回答的体验,是读到一个作者在意你是否读懂的库的体验。Matz 设计了语法,又以身作则地设计了围绕它的社会姿态。一门为让程序员幸福而生的语言,养出了一个矢志友善的社区,因为驱动二者的是同一种价值——社区,就是把最小惊讶原则用在了人身上。
mruby:受限空间中的哲学
2012 年 4 月,Matz 把 mruby 开源——这是一个轻量、可嵌入的 Ruby 实现,专为运行在完整 Ruby 过于沉重之处而生:微控制器、嵌入式系统、消费电子设备。9 它符合 ISO/IEC 30170 Ruby 规范的一个子集,以一个带字节码编译器和虚拟机的小型解释器的形式发布,能像 Lua 那样嵌入 C 或 C++。10
mruby 之所以耐人寻味,恰恰在于它把这套哲学放到压力之下检验。当你只有几千字节的 RAM、再无周期可挥霍时,”为人而设计”还能存活吗?Matz 的答案是:保住 Ruby 的表现力,同时甩掉运行时的重量——把书写 Ruby 的快乐带到固件层,而不是逼着嵌入式开发者退回到 C。这场以人为本的赌注,即便在对它最不友好的地方也站住了脚。
这套方法
Matz 的方法,是把共情形式化为一种设计纪律。反复出现的动作,不是去问”对机器而言什么是正确的?”,而是问”那个人会有什么感受?”——然后无论这个答案要求多大的实现代价,都照付不误。
第二个动作是融合。Ruby 公然是衍生而来的:Perl 的实用主义与正则表达式、Smalltalk 的纯对象模型与消息传递、Lisp 的灵活性、Ada 和 Eiffel 的若干片段。4 Matz 并未发明新的范式。他从自己钦佩的语言里偷来最好的点子,再把它们调和成一种连贯的声音。鲜有设计者能施展那种品味——取用而非发明的纪律,以及让借来的零件相融而非相撞的更难的纪律。最小惊讶原则部分上是一种”内在”的一致性——一旦你学会 Ruby 的某个角落,下一个角落便会按头一个教给你的预期那样行事。
第三个动作,是对取舍的诚实。Matz 从不假装 Ruby 是快的那个选择,他直白地说出来,而不是一边标榜温情、一边悄悄为跑分而优化。代价真实而具体:因为 Ruby 里万物皆对象,连整数都是一等对象,算术也是通过向它发送 + 消息来完成,而非执行一条裸的机器指令。14 5.times 或 (1..n).map 的便利——把数字当作你可以与之对话的对象——其代价是分派与分配的开销,而 C 的 int 永远不会有这笔开销。Matz 选了清晰可读的表面,让运行时去承担这张账单,这正是那个被直白说出的赌注。
影响链条
塑造他的人
Larry Wall 与 Perl。 Ruby 继承了 Perl 务实、把事做成的禀性,以及它的正则表达式基因。Matz 本人就把 Ruby 定位为对 Perl 的回应——保留其实用性,修正他眼中所缺的真正面向对象。(直接影响)4
Smalltalk。 “万物”皆对象——整数、类、nil——而计算通过发送消息发生,这一信念来自 Smalltalk。它是 Ruby 对象模型中最深的结构性继承。(直接影响)4
Lisp、Ada 和 Eiffel。 Lisp 贡献了灵活性,以及语言应当向程序员弯腰的那种意识;Ada 和 Eiffel 贡献了语法与设计上的其他具体片段。Ruby 便是这场融合。(成型影响)4
他所塑造的人
Rails 时代的 Web。 Ruby on Rails 让 Ruby 成为一代创业公司的默认语言,并给”开发者幸福感”配上了商业论据:更幸福的程序员交付得更快,于是这门以人为本的语言不只靠手感、更靠经济账赢得了项目。
一代人的基准期待。 在 Ruby 之后,程序员开始期待语言是”令人愉悦”的——读来如散文,宽容,讨人喜欢。这份期待重塑了更新的语言若想被认真对待所必须跨过的门槛。
Crystal 与 Elixir。 Crystal 几乎原封不动地借用了 Ruby 的语法,同时通过 LLVM 后端编译为原生代码。11 José Valim 为 BEAM 打造的函数式语言 Elixir,把 Ruby 那种符合人体工学的禀性带入了并发的世界;对许多借来的构造,Valim 都归因于他”先前在 Ruby 上的背景”。12 Ruby 的美学,比它的运行时活得更久。(风格脉络)
贯穿始终的主线
这里有一种富有成效的张力。Matz 为人的幸福而优化,并坦承自己为此花掉了机器的周期。工程的另一极则为机器而优化——John Carmack 数着每一个周期,直到一帧塞进预算;Linus Torvalds 捍卫”好品味”——那种让特殊情形自行消失的数据结构。Carmack 和 Torvalds 问的是硬件配得上什么;Matz 问的是人配得上什么。两极都没有错。最好的系统活在二者之间的争论里——既要富有表现力到让人乐于书写,又要严谨到不至于冒犯机器。Matz 正是一个证明:”为人而设计”是一种正当而严谨的工程立场,而不只是一种安慰。(系列衔接)
我从中汲取的
我做开发者工具和 AI 智能体框架,而 Matz 的赌注正是我一再下的那一注:处在回路之中的人,才是真正重要的对象。一个编码智能体,正如一门编程语言,是人的意图与机器的执行之间的界面。如果它让你惊讶、与你较劲,或逼你像机器那样思考、而非思考问题本身,那它就失败了——无论其内部有多么精巧。内部之所以存在,全部意义就在于让体验对那个人而言清晰可读。这也正是我把表面保持诚实、把技术栈保持轻薄的原因——免构建宣言就是把最小惊讶原则用在了工具链上。正如 Matz 拒绝假装 Ruby 很快,我也宁愿对取舍诚实,而不去掩盖它:质量是唯一的变量,而程序员的幸福是质量的一部分,并不与之对立。
常见问题
Yukihiro Matsumoto 的工程哲学是什么?
Matz 设计编程语言,是为了人的幸福与生产力,而非机器的效率。他言明的宗旨是:”Ruby 的设计就是为了让程序员幸福。”1 他把程序员的体验——可读性、快乐、最小惊讶——当作首要的设计约束,并接受较慢的运行时,作为服务于此的诚实代价。”机器应当服务于人,”他说,”让机器来服务你吧。”2
Ruby 中的最小惊讶原则是什么?
它指的是语言应当以一位有经验的使用者所预期的方式行事,从而把摩擦降到最低。Matz 澄清说,它的意思是“‘我’的惊讶最小原则”——他设计 Ruby,是为了把自己作为娴熟使用者的挫败感降到最低,而且是”在你把 Ruby 学得非常透彻之后的最小惊讶原则”,并非头一天的初学者所感到的惊讶。5
MINASWAN 是什么意思?
MINASWAN 代表”Matz 友善,所以我们也友善”——这是从 Matsumoto 友善、耐心的举止中生长出来的 Ruby 社区箴言。早期的 Ruby 使用者援引它,在邮件列表上确立慷慨的基调,它便成了 Ruby 文化身份的一部分。78 它体现了这样一个观念:一门语言的社区本身就是一个设计表面。
哪些语言影响了 Ruby?
Ruby 是一场刻意的融合。它汲取了 Perl 的实用禀性与正则表达式、Smalltalk 的纯对象模型与消息传递、Lisp 的灵活性,以及 Ada 和 Eiffel 的若干元素。Matz 把自己钦佩的特性组合进一门连贯的语言,而非另创一种新范式。4
出处
-
Bill Venners, “The Philosophy of Ruby: A Conversation with Yukihiro Matsumoto, Part I.” Artima Developer, 2003 年 9 月 29 日。”于我而言,人生的目的之一是获得快乐……所以 Ruby 的设计就是为了让程序员幸福。” ↩↩
-
Bill Venners, “Matz on Craftsmanship: A Conversation with Yukihiro Matsumoto, Part III.” Artima Developer, 2003 年。”机器应当服务于人……让机器来服务你吧。”另及:界面作为系统的表面。 ↩↩↩
-
“Yukihiro Matsumoto.” Wikipedia。1965 年 4 月 14 日生于大阪府,四岁起在鸟取长大;筑波大学信息科学;首个 Ruby 版本于 1995 年 12 月 21 日发布;mruby(2012 年 4 月)。 ↩↩↩
-
Sinclair Target, “The Ruby Story.” Two-Bit History, 2017 年 11 月 19 日。始于 1993 年;”我真的很想要一门纯正面向对象、又易于使用的脚本语言”;与石冢圭树以宝石命名/向 Perl 致意;受 Perl、Smalltalk、Lisp、Ada、Eiffel 影响;”我希望看到 Ruby 帮助世界上每一位程序员变得高产、享受编程、获得幸福”;Rails 驱动的全球突破。 ↩↩↩↩↩↩↩↩
-
Bill Venners, “The Philosophy of Ruby, Part I.” Artima Developer, 2003 年。”最小惊讶原则,意思是’我’的惊讶最小原则”;”我想把编程时自己的挫败感降到最低”;”别低估人的因素……我们是在为人、与人一起工作。” ↩↩↩↩
-
“Yukihiro Matsumoto.” Wikiquote,引自 The Philosophy of Ruby, A Conversation with Yukihiro Matsumoto, Part I,Bill Venners,Artima Developer,2003 年。”我们是主人,它们是奴隶。” ↩
-
“Yukihiro Matsumoto.” Wikipedia。”Matz 的举止给 Ruby 社区带来了一句箴言:’Matz 友善,所以我们也友善’,通常缩写为 MINASWAN。” ↩↩
-
“MINASWAN.” Wiktionary。”Matz is nice and so we are nice”的首字母缩写;在 Ruby 早期作为社区基调规范的起源与用法。 ↩↩
-
“Mruby.” Wikipedia。mruby 于 2012 年 4 月在 Matsumoto 的主导下开源;面向受限环境的轻量、可嵌入实现;符合 ISO/IEC 30170 的一个子集。 ↩
-
“mruby – Lightweight Ruby.” mruby.org。可嵌入的解释器、字节码编译器(mrbc)与虚拟机;以类似 Lua 的方式嵌入 C/C++;符合 ISO/IEC 30170:2012。 ↩
-
“Crystal (programming language).” Wikipedia。”其语法受 Ruby 语言启发……通过 LLVM 后端编译为效率高得多的原生代码。” ↩
-
José Valim, “Elixir Design Goals.” elixir-lang.org, 2013 年 8 月 8 日。”鉴于我先前在 Ruby 上的背景,所添加的一些构造借自 Ruby 是自然而然的。”另及:Elixir 运行在 BEAM(Erlang VM)之上,见 “Elixir (programming language),” Wikipedia。 ↩
-
“Ruby (programming language).” Wikipedia。“‘Ruby’这个名字源于 1993 年 2 月 24 日 Matsumoto 与石冢圭树的一次在线聊天,那时还没有为这门语言写下任何代码。” ↩
-
“class Integer.” Ruby Core Reference。”一个 Integer 对象表示一个整数值。”诸如
self + other的算术运算符被记载为公有实例方法,这意味着整数算术是经由对象上的方法分派来完成的,而非一条裸的机器指令。 ↩