首页 › programming › 语言生长神课:单音节的演讲

语言生长神课:单音节的演讲,讲透了程序员最缺的能力

一、这条视频为什么值得读

在编程世界的“神课”谱系里,有一场演讲的地位极其特殊:它几乎不讲任何代码细节,却在近三十年里被无数程序员、语言设计者和工程管理者反复引用——Guy L. Steele Jr. 在 OOPSLA 1998 大会上的主题演讲 《Growing a Language》(生长一门语言)。

它的开场是一场“行为艺术”:这位参与创造 Scheme、主编过 Java 语言规范的大师,给自己立了一条残酷规矩——接下来一段时间只许说单音节英文词。每想用一个多音节词,他必须先用已经“买下”的短词,把这个长词当众定义出来。观众在最初十几分钟里看着他笨拙地“词穷”,然后恍然大悟:他不是在玩文字游戏,他是在让所有人亲口尝一尝——当你手里的语言不够用时,那种寸步难行是什么滋味。

这条视频值得读三层:一层是语言设计的底层哲学(语言为什么必须能“生长”);一层是真实的历史验证(Java 泛型迟到的十年,完美兑现了这场演讲的预言);还有一层是每个工程师都能带走的实操方法——如何在团队里“养词表”,让代码自己长出领域语言。

二、视频基本信息

项目 内容
原题 Growing a Language
中文译名 《生长一门语言》
演讲人 Guy L. Steele Jr.(Scheme 联合创造者、《Common Lisp the Language》作者、Java 语言规范主编之一)
场合 OOPSLA 1998 大会主题演讲(面向对象编程、系统、语言与应用国际会议)
年份 1998 年秋
时长 约 50 分钟
观看方式 YouTube 检索 "Guy Steele Growing a Language" 可见多个完整录像版本
数据注记 本次写作环境无法联网核验具体上传频道与播放量,此类实时数据略去,请以 YouTube 检索结果为准

说明:这是一场 1998 年的老演讲,但它是编程语言设计领域公认的“必读神课”,Steele 本人在 1999 年将其整理成同名论文,发表于学术期刊《Higher-Order and Symbolic Computation》,全文可查。本文围绕该演讲展开深度解读。

三、核心主张拆解:一场演讲的五个乐章

1. 开场装置:先让你尝一口“词穷”

Steele 上台后久久不说一个“长词”。他要表达"language"(三音节)这个概念时,只能绕着弯子说"a way to say things"。想要"define"?先定义"de-fine"是什么。这种笨拙是精心设计的:如果你使用的语言里没有某个词,你就必须用已有的词把它造出来——造词是要付利息的。

观众很快意识到,这不正是程序员每天面对的处境吗?你的编程语言、你的代码库、你的团队黑话,就是你全部的“词表”。词表不够用的时候,你要么忍受啰嗦和重复,要么自己造词——而一门语言是否允许你优雅地造词,恰恰是 Steele 想谈的全部。

这个开场的高明之处在于:他没有先给论点再举例,他让论点直接发生在观众身上。这是教学设计的顶级示范——媒介即讯息。

2. 词就是抽象:一门语言的核心资产是什么

装置铺完后,Steele 抛出正题:编程语言本质上是一套“词”(词汇/抽象)的组合系统。变量、函数、类型、宏,都是不同粒度的“词”。程序员的工作,就是把业务里的概念翻译成语言里现成的词;当现成的词不够用,就去定义新词——写一个函数,建一个抽象,造一种 DSL。

于是他给出全场的核心主张:一门好的语言,必须把“生长能力”设计进去。语言设计者不可能预知所有领域——你无法在设计时就知道用户明天要写的是游戏、报表还是操作系统。既然预见不了,唯一不会过时的设计,就是把“加新词的能力”本身做成一等公民,让用户能把语言生长得贴合自己的领域。

他反复强调一个动词的分量:是 grow(生长),不是 design(一次性设计)。设计是设计者的事,生长是所有使用者的事。

3. 反面教材:不能生长的 Java,痛在何处

1998 年的 Java 正当红,但 Steele ——作为 Java 语言规范的编著者之一——当众拆自家的台:Java 当时没有泛型(generics)。

他想演示写一个“能装任何类型元素的容器”或者“能排序任何类型数组”的函数,结果处处碰壁:你只能声明装 Object 的容器,取出来时手动强制转型;装错了类型,编译器一声不吭,错误拖到运行时才炸。更难堪的是,这些泛型设施用户自己加不上去——Java 的语言机制没有给使用者留下生长点。设计小组没来得及做的功能,全世界的程序员只能干等。

这里有一层辛辣的讽刺:连 Steele 这种级别的设计者,在自己参编的语言面前也是“用户”。他用亲身处境证明:当语言不能生长时,用户是被动的;设计者的远见是有上限的,而上限迟早会卡住你的喉咙。

(耐人寻味的巧合是:就在同一届 OOPSLA '98 上,Bracha、Odersky、Stoutamire、Wadler 发表了 GJ 论文《Making the Future Safe for the Past》,正是这套“把泛型加进 Java”的方案,日后成为 Java 5 泛型的蓝本——2004 年,Java 终于长出了这个“新词”,距 Steele 的演讲整整六年。)

4. 生长机制图谱:从 Lisp 宏到模板与泛型

什么样的机制能让语言生长?Steele 带观众快速巡视了几个谱系:

演讲后半段,他还展示了自己的新构想(这次演讲其实是他日后主导 Fortress 语言的序曲):高性能计算领域需要的数学记法,应当由“可生长的语言”来承载,而不是等标准委员会十年磨一剑。

5. 结尾:思想的大厦,与词的流通

演讲的结尾,Steele 引用了 Fred Brooks《人月神话》里那段著名的话——程序员如同诗人,工作的对象几乎就是纯粹的思想材料,他凭借想象力,在空气中建造城堡,而他的材料是如此轻盈,如此易于修改和重构。

然后他补上了自己的落点:要让更多人能把思想变成程序,就要让更多人拥有造词、用词、分享词的能力。语言生长从来不是一个人的事——一个新词(一个抽象、一个库、一种记法)只有在共同体中流通起来,被文档、被标准、被社区公认,才算真正“长进”了语言。

这也是整场演讲最容易被忽略的一层:它表面谈语言设计,底色却是工程师共同体的知识治理——你生长出来的词,能不能让别人也用起来?

四、知识与理论溯源:这场演讲背后的真实谱系

1. Scheme 与“Lambda 论文”(1975-1979)。Steele 与 Gerald Jay Sussman 于 1975 年在 MIT 人工智能实验室创造 Scheme(见当年的 AI Memo 349《SCHEME: An Interpreter for Extended Lambda Calculus》)。随后两人写下著名的“Lambda 论文”系列,其中《Lambda: The Ultimate GOTO》(1977)论证了过程调用本质上可以编译成跳转,直接催生了 Steele 1978 年的硕士论文 Rabbit——一个把 Scheme 编译成高效机器码的编译器。“用户的代码可以成为语言的一部分”,这条信念从那时就埋下了。

2. Java 泛型史实。演讲对 Java 缺泛型的批评有严格的事实支撑:GJ 编译器方案(OOPSLA '98 发表)被 Sun 采纳演化,Java 5 于 2004 年正式引入泛型(采用类型擦除实现);核心作者 Gilad Bracha 后续推动了相关规范化,Martin Odersky 则转身创造了 Scala(2003 年前后发布)——把“生长性”推向极致的另一条路。Steele 的预言不是蒙的,是被官方路线图逐条兑现的。

3. 宏系统的理论问题。“生长机制”并非免费午餐。1986 年 Kohlbecker、Friedman、Duba、Haynes 发表的《Hygienic Macro Expansion in Lisp》提出了“卫生宏”概念,解决了宏展开时的变量捕获问题——这正是后来 Scheme 标准采纳 hygienic macro 的理论基础。演讲 enthusiasm 背后,学术界对宏的“卫生难题”早有系统性回应。

4. 思想谱系的两翼。Steele 的主张站在一条长线的延长线上:Alan Kay 的 Smalltalk/Dynabook 构想(软件应当由可组合的消息单元构成)、Richard Gabriel 的《Worse is Better》(1991,简单的、可生长的设计往往胜过完备的设计)。而它的对立面同样源远流长:Rich Hickey 在 Strange Loop 2011 的《Simple Made Easy》里正告世人—— indiscriminate 的“组合”与“生长”会让复杂度暗中复合(complecting),简单才是稀缺品。理解这场演讲最好的方式,是把它放回这场持续至今的“生长派 vs 简单派”论战之中。

5. 与领域驱动设计的暗合。Eric Evans 2003 年的《Domain-Driven Design》提出“统一语言(Ubiquitous Language)”:团队必须把业务词汇沉淀成代码与对话共用的词表。这与 Steele 的“养词”哲学在软件工程层面互为镜像——一个管语言设计,一个管代码库治理。

五、批判性审查:哪些主张站得住,哪些要打折

证据充分的部分:

存在争议或需打折的部分:

六、认知提升与实用启示

1. 学语言,先摸清它的“生长点”。 下次学一门新语言,别只背语法,先回答四个问题:它能加新词吗(函数/类型/宏)?新词能和旧词无缝共存吗(还是隔一层怪异的仪式)?工具链认得新词吗(补全、跳转、重构还灵吗)?团队里其他人读得懂你的新词吗?这四问比“哪个语言排行榜第一”有价值得多。

2. 把领域词表“养”进代码库。 Steele 的哲学落到日常工程,就是 DDD 说的统一语言:让业务里的概念直接长成代码里的名字。电商系统里的“拆单”、风控里的“穿透”,如果一个概念在需求文档、飞书讨论和代码里是同一个函数名,你的代码库就成了一门“会自己生长的语言”;反之,文档说一回事、代码是另一回事,词表的汇率每天都在崩。造词之后别忘了分享——没有文档和评审共识的“新词”,只是个人方言。

3. 选型时,看“生长的治理”而不只看功能列表。 评估一门语言/框架,看三件事:扩展机制是否一等公民(宏、泛型、插件协议);社区有没有成熟的“长词流程”(PEP、RFC、提案文化);以及——被所有人忽略的——有没有修剪机制(淘汰提案、废弃流程)。只会长不剪的语言和团队,最后都会被自己的词表压垮。

七、一张图看懂演讲的论证结构

flowchart TD
    A[困境:词不够用] --> B[装置:只说单音节词]
    B --> C[主张:语言要能生长]
    C --> D[机制:宏、泛型、元编程]
    C --> E[反例:Java缺泛型之痛]
    D --> F[代价:工具链与可读性]
    E --> G[验证:2004泛型落地]
    F --> H[平衡:增长也要修剪治理]
    G --> H
    H --> I[启示:在共同体里养词表]

八、延伸阅读

  1. Steele, "Growing a Language", Higher-Order and Symbolic Computation, 1999 — 演讲的期刊版论文,结构更完整,结尾同样引用 Brooks 的人月神话段落;可在 Google Scholar 检索标题免费获取全文。
  2. Paul Graham, "Beating the Averages"(2001) — 提出"Blub 悖论",与 Steele 的“语言生长论”同属“语言表达力决定思维上限”一脉,也继承了同样的争议,对读最佳。

参考来源

  1. YouTube 检索入口:Guy Steele Growing a Language — 演讲完整录像的多个上传版本检索入口
  2. Wikipedia: Guy L. Steele Jr. — 演讲人生平:Scheme 联合创造者、Java 语言规范编著者、Fortress 主导者
  3. Wikipedia: Greenspun's tenth rule — “任何复杂的 C 程序里都藏着半个 Common Lisp”,文中引用的定律出处
  4. Paul Graham: Beating the Averages — Blub 悖论原文
  5. Wikipedia: Java version history — Java 5(2004)正式引入泛型的版本史实

本文由「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学通信知识星球海报-扫码加入