首页 › programming › 他只用单音节词,讲了四十七分钟

他只用单音节词,讲了四十七分钟

导语

1998年10月,温哥华,OOPSLA '98大会(面向对象编程、系统、语言与应用国际会议)。Guy L. Steele Jr. 走上讲台,这位参与设计 Scheme、执笔《Common Lisp: The Language》、后来与人合著《The Java Language Specification》的语言设计大师,做了一件让全场程序员毕生难忘的事:接下来的四十多分钟里,他几乎只用单音节词演讲。

不用 "syllable"(音节)这个词,因为它是双音节的,而他正被迫只能说单音节词。这不是行为艺术,也不是脱口秀包袱——这是一次以身试法的演示。他想让你亲身体会一件事:当你的词表太小,哪怕思想清楚,话也说不出口。而编程语言,就是程序员的词表。

二十八年过去,这门被反复引用的经典演讲《Growing a Language》非但没有过时,反而在 AI 时代显得更锋利了:当模型越来越会「遣词造句」,人类程序员的价值恰恰回到了 Steele 说的那件事上——把语言养大,先造词,再说话。这篇解读带你把这场神课逐层拆开。

视频背景卡片

项目 内容
视频标题 Growing a Language(Guy Steele, OOPSLA '98)
频道 YouTube 多个转载版本流传
时长 约47分钟
播放量 数十万+(多版本转载累计,单一口径未经官方证实)
核心主题 编程语言设计:语言必须能被用户「养大」

说明:这是1998年的经典演讲,YouTube 上有多个转载版本,各版本画质与播放量不同,可搜索标题直达。

核心内容拆解

1. 开场即行为艺术:把自己锁进小词表

演讲开始,Steele 说出那句被引用了二十多年的话(视频原话大意):「接下来我大部分话,都会只用单音节的词来说,为了说明一个观点。」然后他真的这么干了。他不能说「音节」,因为「syllable」有两个音节;他不能说「数量庞大的」,只能说「很多很多」;他想谈「有理数」,只能先绕着说「两个整数之比」。

前十几分钟,你会有一种奇妙的憋闷感——明明是顶级语言设计大师,讲起话来却像个刚学说话的孩子。这种憋闷感就是设计好的:你不是在听他讲,你是在替他感到词穷。等他熬到定义出第一个「复合词」(compound word),可以正常说出双音节词的那一刻,全场如释重负。那一刻你也瞬间懂了他的论点:词表每长大一点,表达力就跃迁一层。

(我的延伸)这个设计本质上是一次「受害者体验式教学」,和「考官让答辩学生全程用二手资料说话」是一个路数:不告诉你结论,让你自己长出结论。这也是它比任何一篇论文都传播得远的原因。

2. 语言是工具,词表就是思想的边界

Steele 的第一个正式论点是工具论(视频原话大意):编程语言是一个工具,而工具的好坏,要看它能不能让你把想说的话说清楚。自然语言如此——爱斯基摩语里关于雪的词很多,说雪就说得细;编程语言也如此——一门语言里如果没有「循环」这个词,你写每个程序都得自己手搓跳转。

他接着给出全篇的地基推理:你的思想受限于你能说出来的话。当你手里的语言词表很小时,你有两个选择:要么憋着换一种别扭的说法把想法揉碎了塞进去,要么放弃这个想法。而第二种,才是真正的损失——你没写出来的那个程序,没人知道它本可以存在。

(我的延伸)这和语言学里的萨丕尔-沃夫假说(语言决定思维)一脉相承,但 Steele 高明在于不争论假说真假,而是给程序员一个可操作的推论:看一门语言能不能帮你思考,就看它造新词的成本高不高。

3. 完备性是幻觉:设计者永远预见不到明天

那么正确的解法是不是把语言做得「什么都内置」?Steele 给了否定回答,这是全篇最关键的一步推理(视频原话大意):语言设计者不可能预见所有用户在未来所有领域的所有需求。你今天内置了数值计算,明天有人要做图形;你内置了图形,后天有人要写数据库。完备的词表不存在,因为需求的长尾无穷。

由此他推出真正的设计目标:与其追求「大而全」,不如追求「可生长」——把少数最基础、最通用的词做扎实(他称之为种子词),然后把语言设计成用户可以自己添加新词的形态。语言的宿命不该由设计者一个人写完,而应该留白给千千万万用户共同续写。

(我的延伸)这个思路放到今天就是「平台思维」的雏形:操作系统做不到的功能开放 API,编辑器造插件系统,数据库造扩展机制。Steele 在1998年讲的不是语言设计,是所有平台的通用宪法:你无法预见的,就为它留出接口。

4. 种子词与生长词:一条检验好语言的标准

可生长不是「能加东西」就完事。Steele 给出了一条极其苛刻的检验标准,我称之为「同权原则」(视频原话大意):用户自己造的新词,用起来必须和内建的种子词一样好。一样顺手的语法、一样清晰的报错、一样合格的文档、一样可以继续作为材料去造更新的词。

这条标准狠在哪?它直接判了一大批语言「不及格」。很多语言允许你定义函数、定义类,但新造的抽象用起来总是「矮人一头」:调用形式不同、错误信息不可读、不能参与语言的语法糖、无法无缝嵌进内建控制流。表面上是扩展机制,实际上是一等公民俱乐部的外卡选手。Steele 告诉你:凡是不满足同权原则的「扩展性」,都是打折的扩展性。

(我的延伸)用这条标准看今天:Rust 的 trait + 运算符重载允许你让自定义类型享受 a + b;Kotlin 的扩展函数让你像调用内建方法一样调用新方法;而 Lisp 家族的宏干脆让用户词汇直接长成新语法。它们的家族相似性,都是这条1998年的标准。

5. 那个扎心的 a.add(b):Java 的二等公民

演讲进行到中后段,Steele 拿出了一个至今仍在 Java 社区流传的扎心案例。他说(演示大意):在 Java 里,整数可以写 a + b,简洁漂亮;但当你需要精确计算、要用到「大数」类型时,你只能写 a.add(b), chained 起来就是 a.add(b).multiply(c) 这样的连环套。同样是「加法」,内置类型享受加号,用户类型只配调方法。

这个例子小到不能再小,但它精准命中了第4点那条标准:Java 的扩展机制没有让生长词与种子词同权。用户可以添加新类型,却不能给新类型配上与内建类型同等地位的算术表达。Steele 当时刚参与完 Java 语言规范的写作,这段批评因此更有分量——他是在拿自己参与建造的房子开刀。

(我的延伸)Java 后来的演进恰恰印证了这个批评的长期性:泛型(Java 5,2004)、自动装箱、Lambda(Java 8)一路补课,但运算符重载至今没有进 Java。一门语言当年种下的「不同权」,要用二十年去偿还利息。

6. 亲手种出一个新类型:有理数生长示范

光批评不够,Steele 在演讲后半段做了一次正面示范:他用受限的词表,一步一步定义出一个新类型——先定义「两个整数之比」,再定义最大公约数(gcd),然后定义约分、加法、乘法,最终你获得了一种全新的词汇——「有理数运算」,此后说话的难度骤降。复杂的思想,被新词汇瞬间压扁成一句短话。

这个示范的精妙在于:它同时演示了「生长」的全过程——从种子词出发、组合出新词、新词再当材料造更新的词,滚雪球。这其实就是抽象的微观机制:每一层抽象都是一次「造词」,造词的红利是复利。

(我的延伸)这和 DDD(领域驱动设计)里「通用语言」(ubiquitous language)的主张殊途同归:项目里先和领域专家共同把业务词汇造出来,代码只是这些词汇的展开。好的代码库读起来像句子,差的代码库读起来像字符流,差别就在有没有人认真「养词」。

7. 两种哲学的分岔:堆料与生长

把全篇收拢,其实是两种语言设计哲学的对撞。一种是堆料哲学:设计者尽量多内置功能,用户要什么给什么,语言越长越胖,委员会越开越累,兼容包袱越背越重;另一种是生长哲学:设计者只保住种子词和生长机制,把无限的扩展权下放给用户,语言本体保持苗条,表达力却由整个社区共同生长。Steele 属于后者,毕竟他就是 Scheme 的共同作者——Scheme 教科书级的极小内核(连循环都是长出来的语法糖),正是生长哲学的巅峰之作。

(我的延伸——写于2026年)这个分岔至今没有终结,反而愈演愈烈:Go 公开拒绝运算符重载和宏,走堆料与克制之间的第三条路;Rust 把宏和 trait 做成公民权利;Swift、Kotlin 全面拥抱可生长语法。而 AI 时代给这场争论加了一个新变量:当大模型已经能熟练遣词造句,程序员的核心产出正在从「写句子」退到「造词表」——设计领域词汇、定义抽象边界、保证新词与旧词同权。Steele 在1998年讲的「先造词再说话」,可能是 AI 时代对人类程序员最实用的岗位描述。

知识结构图

flowchart TD
    A["语言是表达的工具"] --> B["词汇量决定表达力"]
    B --> C["单音节演示:亲尝词穷"]
    A --> D["设计者无法预见一切"]
    D --> E["完备内建是幻觉"]
    E --> F["出路:可生长的语言"]
    F --> G["种子词:内建基础"]
    F --> H["生长词:用户定义"]
    G --> I["同权检验标准"]
    H --> I
    I --> J["语法同等顺手"]
    I --> K["报错同等清晰"]
    I --> L["文档同等合格"]
    J --> M["反例:大数只能 a.add"]
    M --> N["生长词沦为二等公民"]
    F --> O["正例:有理数类型示范"]
    O --> P["新词把复杂压成短句"]
    P --> Q["词表复利:抽象造抽象"]

实战启示

看完这场神课,你能带走四条可以直接落地的行动指南:

第一,先造词,再写逻辑。 下次动手前,先扫一遍需求描述,把反复出现的业务概念列出来,逐一命名、封装成函数或类型——这就是在给项目的词表「长新词」。当词表长好了,主逻辑的代码会短得让你吃惊。

第二,用「同权三问」做代码评审。 每当你封装了一个新抽象,问三个问题:它调用起来的形式,和内建的东西一样自然吗?它出错时的信息,和内建的一样可读吗?它的文档,别人不看源码敢用吗?三问全过,才算长出了一个合格的词;只过一问,那只是把复杂度换了个地方藏起来。

第三,警惕「三行代码重复三次」。 同样的组合操作出现第三次,就是它在向你索要一个名字。造这个词不是洁癖,是在给未来的自己降低表达成本——抽象的红利是复利。

第四,AI 时代重新定位自己。 让模型写实现,你来定词表:接口叫什么、边界划在哪、哪些概念值得成为一等公民。句子可以外包,词汇表外包不得——那是系统可维护性的根,也是人类程序员最不容易被替代的那部分价值。

延伸学习路径

  1. SICP(《计算机程序的构造和解释》) — Steele 与 Sussman 创造 Scheme 的那条思想主线,「极小内核 + 无限生长」的原典:https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs
  2. Paul Graham《Beating the Averages》 — 把「语言表达力差距」讲成商业优势的经典随笔,与 Steele 互为注脚:https://paulgraham.com/avg.html
  3. Guy Steele 词条 — 了解他横跨 Scheme、Common Lisp、Java、Fortran 标准化的传奇履历:https://en.wikipedia.org/wiki/Guy_Steele
  4. Scheme 编程语言词条 — 生长哲学的巅峰实例,宏与同像性如何让用户词汇长成语法:https://en.wikipedia.org/wiki/Scheme_(programming_language)
  5. Rob Pike 演讲「Simplicity is Complicated」(YouTube 可搜) — 生长哲学的反方答辩:Go 为什么选择不长大,看完正反两面再站队。

一句话总结

这门语言设计神课用四十七分钟的「词穷」证明了一件事:好语言不是功能最多的语言,而是让每个用户都能把新词养成一等公民的语言——先造词,再说话,人如此,程序亦然。

参考来源

  1. Growing a Language — Guy Steele, OOPSLA '98 — 本文分析的核心视频
  2. Guy Steele - Wikipedia — 演讲者背景与语言设计履历
  3. Structure and Interpretation of Computer Programs - Wikipedia — Scheme 与生长哲学思想源头
  4. Beating the Averages — Paul Graham — 语言表达力与竞争优势
  5. Scheme (programming language) - Wikipedia — 极小内核与宏扩展机制

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入