← 所有文章

工程哲学:Grace Hopper,让计算机说人类的语言

Grace Hopper,美国海军少将与计算先驱

核心要点

  • Hopper 的全部哲学可以浓缩成一句话:让计算机说人类的语言,而绝不强迫人去说机器的语言。
  • 第一个编译器 A-0(1952 年)把翻译的负担压到了机器身上——在软件里自动完成一次,而不是让每一位程序员永远手工偿还。
  • 那段“纳秒电线”把延迟变成了一件实物:11.8 英寸,握在手里,于是浪费时间的代价不再抽象。
  • 在她看来,“我们一向都是这么做的”是语言中最危险的一句话——而她的每一项发明,都是对这句话的回应。

核心原则

“人类对变化有种过敏反应。他们总爱说:‘我们一向都是这么做的。’我努力对抗这一点。所以我的墙上挂着一只逆时针走的钟。” —— Grace Hopper1

这种性情,源自一个信念:应当让机器服务于人,而不是反过来。1953 年,编程还意味着为某台特定机器手工编写数字指令,Hopper 却提出,数据处理问题应当用英文词句来描述,把翻译的工作交给计算机来完成。管理层告诉她这做不到——计算机听不懂英语。2她其实并不是在说计算机懂英语,而是在主张:翻译的负担应当落在机器身上,在那里它可以被自动完成一次,而不该落在每一位程序员身上、永无止境地重复。这就是她全部的哲学:让计算机说人类的语言,而非相反。

七十年后的今天,我们很容易低估这在当时有多激进。当时普遍的假设是,编程是一门只属于能用机器思维去思考的人的玄奥手艺,而这就是这份工作天然的样子。Hopper 的回答是:这份工作的“天然样子”,不过是某个人当初做出的一个选择,此后再没人重新审视过——“我们一向都是这么做的”就这样固化成了一条物理定律。她整个职业生涯,都是对这种固化的拒绝:第一个编译器、第一门类英语的语言,以及一生都在教人们看清,他们所接受的那些限制其实并不真实。

反教条的锋芒与让技术普及的使命,是同一种本能的两面。抽象——让一个人用自己的语言表达意图,再由工具把它翻译到底层硬件——并不是叠加在编程之上的某种便利。对 Hopper 而言,它就是编程的意义所在:把机器向那些原本会被拒之门外的人敞开。2016 年奥巴马总统授予她总统自由勋章时,颁奖词说得很直白——她“发明了第一个编译器,让程序得以用日常语言书写,再翻译成计算机能够理解的形式”。3同样的信念,也支撑着这样一个主张:好的工具应当为使用它的人而优化,而非为运行它的机器而优化。

背景

Grace Brewster Murray Hopper 于 1906 年 12 月 9 日生于纽约市。4她 1928 年在瓦萨学院取得数学与物理学学士学位,随后在耶鲁大学获得硕士学位(1930 年)和数学博士学位(1934 年)——在她那一代,几乎没有哪位女性拥有数学博士学位。4整个 1930 年代,她都在瓦萨学院教授数学,而这个细节很重要:在成为程序员之前,她首先是一名教师,而那种把艰深的概念讲清楚的本能,从未离她而去。

1943 年 12 月,正值战时,她加入了美国海军后备役。海军起初颇有顾虑——她已经三十六岁,体重也远未达标——但她据理力争,终于通过。1944 年,她被分配到哈佛大学的军械计算项目,在 Howard H. Aiken 麾下成为 Harvard Mark I 最早的程序员之一。4Mark I 是一台占满整间屋子的机电式计算器;Hopper 参与撰写了它那本 561 页的手册《自动序列控制计算器操作手册》,多年间它都是讲解如何为这台机器编程的奠基性文本。4

Grace Hopper 工作场景,身旁堆满 UNIVAC 手册和一卷磁带

战后她退出现役,但仍留在后备役。1949 年,她加入 Eckert-Mauchly 计算机公司——不久后并入 Remington Rand——参与研制 UNIVAC I,美国第一台商用计算机。4正是在那里,她不再是把代码手工焊死在一台一次性的科研机器上,而是要把一件产品做得让普通企业都能用,她毕生的课题也因此聚焦成形。Aiken 给了她机器,UNIVAC 给了她客户。客户不会编程,而 Hopper 认定,这是计算机该去解决的问题,而非客户的问题。

工作

第一个编译器:A-0(1952 年)

到 1952 年,Hopper 已经构建出 A-0 系统,它被广泛认为是第一个编译器。5这个想法在事后看来简单得近乎令人难堪,在当时却是异端。程序员们积累了一批有用的子程序库,但要复用其中一个,你得把它的指令手工抄进自己的程序里,再费力地逐一修正每一个内存地址。Hopper 的 A-0 则让你用一个简短的调用号来引用每个子程序并传入它的参数;系统随后从磁带里把这些例程取出来,解析地址,组装成一个可运行的程序。5

较真的人会正确地指出,A-0 的功能更接近于我们今天所说的加载器或链接器,而不是现代的优化编译器。5这没错,也值得说明。但真正流传下来的,是那一跃的概念本身:程序可以是一份用便利符号写成的规格说明,而一段软件能把这份规格自动翻译成机器码。翻译从此成了机器的活儿。她本人对当初为何这么做的说法,在那段 UNIVAC 岁月的回忆里留存了下来:“我以前是个数学教授。那时我发现总有一些学生学不会数学。后来,我又接到一个任务,要让商人们能轻松地使用我们的计算机。”2此后的每一个编译器——任何人用高于裸机指令的语言写下的每一行代码——都是那个决定的后裔。

FLOW-MATIC 与通往 COBOL 之路

A-0 翻译的是符号。下一步,是让符号变成英语。1955 年到 1959 年间,Hopper 和她在 Remington Rand 的团队构建了 FLOW-MATIC,这是第一门用类英语语句、而非数学记号来表达操作的编程语言。6一段 FLOW-MATIC 程序里写着 INPUTCOMPAREMOVE 这样的命令——商人无需是数学家,也能读懂、并大致明白它们的意思。用她的话说,这是有意为之的工作:让那些永远不会用机器思维去思考的人,也能用上计算机。

FLOW-MATIC 直接催生了 COBOL。1959 年 CODASYL 委员会召集起来设计一门通用的面向商业的语言时,FLOW-MATIC 是当时最成熟的类英语数据处理语言,于是成了新标准的主要蓝本。6Hopper 被恰如其分地称为 COBOL 的概念上的“祖母”——她并非唯一作者,但正是她的工作与倡导,让一门类英语、与机器无关的商业语言成为可想象之事。而与机器无关,正是这里捆绑着的第二个激进想法:她极力主张,程序应当能在不同计算机之间移植,而非手工贴合某一台——这正是Unix 与 C 让“一次编写、到处移植”这一信念扬名的直系先祖。同一份代码、同一段英语,运行在它从未为之编写的机器上。COBOL 比它周围几乎所有东西都活得更久;几十年后,它仍在支撑着世界各国的银行与政府系统——这本身就是一个安静的佐证,证明一个围绕人类读者构建起来的想法有多么经久不衰。

纳秒:让延迟成为实物

Hopper 最著名的教学道具根本不是代码,而是一段电线。有一次,被问到卫星通信为何要花那么久时,她决意要把时间的代价做成一件人能握在手里的东西。她会发给大家一段段剪到 11.8 英寸长的电线——这是电在一纳秒(十亿分之一秒)内能传播的最大距离——于是一个抽象的延迟单位,就变成了你手心里的一件实物。7接着她会拿出一卷长达 984 英尺的线圈:她解释道,那就是一微秒。“我有时觉得,我们真该在每个程序员的桌子上方都挂一根,”她说,“好让他们知道,当他们挥霍掉一个个微秒时,究竟扔掉了什么。”7

1985 年,Grace Hopper 准将在讲台上发言

这段电线,与驱动编译器的,是同一种教师的本能,只是瞄准了另一堂课。编译器说的是:你不该为了使用机器,就被迫用机器的方式去思考。纳秒说的是:但你确实必须尊重机器的物理规律。延迟不再是幻灯片上的一个数字,而变成了一段信号必须实际跨越的长度,受光速支配;而你浪费掉的每一微秒,都是你毫无理由地让信号白跑的一段电线。这些电线如今陈列在史密森尼学会的美国国家历史博物馆里。8它们也几乎一字不差地等同于John Carmack 那句“光速糟透了”——只是早了四十年,而且是用铜做的。两者都把延迟那道坚硬的物理底线变成了你无法抽象掉、也无法搪塞过去的东西,因为你能看见它,或者握住它。

那只虫子,与反教条的性情

1947 年 9 月 9 日,Harvard Mark II——Aiken 的后继机器,正是 Hopper 所在团队负责的那台——的操作员们把一处故障追查到了卡在 70 号继电器 F 面板里的一只飞蛾。他们取出那只虫子,把它贴进了日志本,并写道:“首次发现真正意义上的 bug。”9那一页日志,连同那只飞蛾,如今由史密森尼学会收藏。8

这个故事的诚实版本很重要,因为 Hopper 把它讲得太精彩,反而让事实变得模糊了。飞蛾确有其事,日期也有据可查。但用 “bug” 指代工程故障,早在她之前很久就有了——远可追溯到 Thomas Edison 的年代——而那些操作员几乎可以肯定是在打趣,把他们早已熟知的那个工程术语,跟刚撬下来的那只真飞蛾凑成了双关。9而且据大多数记述,发现飞蛾的人甚至根本不是她。她所做的,是以其一贯的风采,把这则轶事以及 “bug” 和 “debugging” 这套词汇推广开来,直到它们成了这个领域的母语。9所以精确的归功应当是这样:她没有发明 “bug” 一词,多半也没有抓到那只飞蛾,但她让这个故事和这个词深入人心。这也是一种独特的贡献——又一次,是属于教师的贡献。

支撑这一切的性情,是一场对一切因袭假设的持久战。她墙上的钟逆时针走,是故意的,为的是证明:人人都当作铁律的那个约定俗成,在你决定造一个不一样的钟的那一刻起,就成了任意武断之物。1在 Hopper 看来,“我们一向都是这么做的”是语言里最危险的一句话——而编译器、类英语的语言、可移植的程序,以及你手中那段电线,全都是对它的回应。

方法

这套方法,在四十年间始终如一——军械计算、商用计算、语言设计,以及毕生的教学。

把翻译的负担挪到机器身上。她职业生涯里反复出现的动作,就是把当下每个人都靠手工去做的工作——解析地址、用数字操作码去思考、把代码贴合某台特定计算机——拿过来,在软件里自动完成一次。编译器是这个想法;FLOW-MATIC 是这个想法;与机器无关,也是这个想法。56

让人们说自己的语言。编程应当迁就用户当下的处境。商人应当能写下 MOVECOMPARE,而不必去背一套指令集。让技术更易用从来不是螺栓拧上去的功能;对 Hopper 而言,那正是工具之所以存在的全部理由。26

让抽象之物变得实在。当一个想法抽象到无从敬畏时——一纳秒、一个被浪费的微秒——就造一件实物,把这堂课硬塞进人心。那段电线是作为工程的教学法:你没法跟一件握在手里的东西争辩。7

不信“我们一向都是这么做的”。把因袭的惯例当成一个假说,而非一条定律。逆时针的钟,就是这套方法的实物化身:只要简单地换种做法,就证明了那个约束是任意武断的。1

求原谅,别求批准。“如果是个好主意,那就放手去做。道歉,要比征得许可容易得多,”她这样建议——这是对抗教条在操作层面的推论。(这一观念早于她,确切措辞在不同出处也各有出入,但海军和这个领域所记住的那个版本,是属于她的。)10你没法靠等那些押注在旧路上的人来为你祝福,而抵达抽象。

影响链

谁塑造了她

Howard Aiken 与 Harvard Mark I。Aiken 把第一台计算机和第一个硬骨头交到了 Hopper 手里,而她参与撰写的 Mark I 手册,逼着她严谨地去思考一台机器究竟是如何被指令的——这个问题,日后成了她毕生的事业。(直接影响)

美国海军。海军给了她体制、纪律,并最终给了她舞台;她断断续续身着戎装四十余年。军方对可靠、可重复、可传授的流程的需求,塑造了她的信念:编程必须被做成系统化、可迁移的,而非手艺人式的。(成形期影响)

她当数学教授的那些年。在机器之前,她教书。教师之问——我该如何把这件事讲得让一个还没像我这样思考的人也能领会?——正是编译器、类英语语言和那段电线的种子。(成形期影响)

她塑造了谁

每一门高级语言。编译器让用裸机码以外的任何方式编程成为可能。FORTRAN、COBOL,以及此后的一切,都立足于 A-0 所证明的前提:工具能把便利于人的符号翻译成机器指令。5

COBOL 与商用计算。作为 COBOL 概念上的“祖母”,Hopper 把类英语、与机器无关的编程交到了全世界企业的手中。这门语言至今仍支撑着世界上极大份额的金融与政府系统。6

把“让技术普及”当作编程的目标。最深的传承不是一门语言,而是一种立场:把机器向更多人敞开,本身就是这份工作,而非它的副产品。奥巴马的颁奖词——“我们要感谢 Grace Hopper,是她让数以百万计的更多人得以接触编程”——说的正是这个。3

贯穿始终的那条线

Yukihiro Matsumoto设计 Ruby,是为了优化程序员的幸福感——语言应当迁就人,而非人去迁就语言。这正是 Hopper 那句“让商人们能轻松地使用我们的计算机”在 1995 年的重述:让计算机说人类的语言在哲学上的直系继承人。John Carmack那句“光速糟透了”,是她那段纳秒电线被凝练成的一句话——两者都坚持,延迟是实在的,是一道你必须尊重、而非抽象掉的硬底线;她只是早了四十年抵达此处,并且把自己的版本用你能握住的铜做了出来。而Thompson 与 Ritchie的 Unix 和 C,被造出来正是为了让一个操作系统能够一次编写、到处移植,而非被焊死在单独一台机器上——这正是 Hopper 为 COBOL 所倡导的“与机器无关”在实践中的实现:同一个程序,运行在它从未为之编写的硬件上。(系列承接)

我从中汲取了什么

我一直记取的一课是:抽象不是你有闲工夫时才添上的奢侈品——它就是工作的全部。Hopper 在 1952 年审视编程,看出最难的那部分正由每一个触碰机器的人来承担,于是她把那份负担挪进了软件,让它只需偿付一次。这正是我如今在所造的每一样东西里都努力去做的动作:找出人们正在一遍又一遍手工去做的翻译工作,把它自动化进工具里。这个标准与质量是唯一的变量别无二致——问题从来不是“能不能训练一个人去忍受这个界面?”,而是“他们凭什么非得去忍受?”

在我如今所身处的世界里——智能体、工具循环、AI 系统——Hopper 的那两半都是承重的,而且它们恰恰以那种富有成效的方式相互拉扯。“让技术普及”那一半说的是:让人用自己的语言表达意图,再让系统把它翻译到机器所需的任何形式——这几乎一字不差地就是一个 LLM 工具调用层的所作所为,一个七十年后的、面向英语的编译器。“物理规律”那一半说的是:但别让抽象在代价问题上欺骗你;每一次模型调用都是一纳秒的电线,仅仅因为界面友好就把它们层层堆叠,正是你如何挥霍掉那些看不见的微秒的方式。而那种性情——逆时针的钟,对“我们一向都是这么做的”的拒绝——则是我最需要常伴左右的部分,因为这个领域总把它当下的种种惯例误认成定律。那个信念,即品味是一套技术系统、是你可以审视并加以改变的东西,而非一份你被动继承的传统——它一脉相承,从 1952 年的一个编译器,直通 2026 年的一个智能体框架。

常见问题

Grace Hopper 的工程哲学是什么?

Hopper 的核心信念是:应当让计算机服务于人,而非反过来——把人类意图翻译成机器指令的负担,理应放在软件里,自动完成一次,而不该落在每一位程序员身上、永无止境地重复。正是这一个信念,催生了第一个编译器(A-0,1952 年)和第一门类英语的编程语言(FLOW-MATIC),两者都旨在让那些不能、也不该被迫用机器思维去思考的人,也能用上计算机。256与这份“让技术普及”的使命相伴的,是一股不懈的反教条锋芒,凝结在她那句看法里:“我们一向都是这么做的”是语言中最危险的一句话。1

Grace Hopper 发明了什么?

她在 1952 年构建了 A-0 系统,它被广泛认为是第一个编译器,能把符号化的程序规格自动翻译成机器码。5随后她主导开发了 FLOW-MATIC(1955—1959 年),第一门使用类英语语句的编程语言,它成了 COBOL 的主要蓝本。6她被称为 COBOL 概念上的“祖母”,也是与机器无关的编程的倡导者。她在美国海军中晋升至少将军衔,1986 年以海军中年纪最长的现役军官身份退役,并于 2016 年身后获颁总统自由勋章;一艘海军驱逐舰 USS Hopper 以她命名。34

Grace Hopper 的“纳秒”电线是什么?

那是她最著名的教学工具:一段段剪到 11.8 英寸长的电线,即电在一纳秒(十亿分之一秒)内能传播的最大距离。她把它们发出去,好让一个抽象的延迟单位,变成你能握在手里的一件实物。7她用一卷代表一微秒的 984 英尺长线圈与之对比,告诉程序员们,这显示出“当他们挥霍掉一个个微秒时,究竟扔掉了什么”。7这堂课的寓意是:延迟并不抽象——它是信号必须跨越的一段实在的长度。这些电线如今陈列在史密森尼学会的美国国家历史博物馆里。8

“computer bug”这个词是 Grace Hopper 造的吗?

不是,而诚实的版本更耐人寻味。1947 年 9 月 9 日,Harvard Mark II 的操作员发现一只飞蛾卡在继电器里,把它贴进日志本,并写下“首次发现真正意义上的 bug”;那一页日志由史密森尼学会收藏。89但用 “bug” 指代工程故障,比那只飞蛾早了数十年——远在 Thomas Edison 的年代就已在用——而那些操作员几乎可以肯定是在拿一个他们早已熟知的术语打双关。据大多数记述,发现飞蛾的人并不是 Hopper 本人。她所做的,是把这则轶事以及 “bug” 和 “debugging” 这套词汇推广开来,直到它们成了这个领域的标准用语。9


来源


  1. Philip Schieber,“The Wit and Wisdom of Grace Hopper,” OCLC Newsletter,No. 167(1987 年 3 月/4 月)。“Humans are allergic to change. They love to say, ‘We’ve always done it this way.’ I try to fight that. That’s why I have a clock on my wall that runs counter-clockwise.” 另见 “Grace Hopper,” Wikiquote。 

  2. “FLOW-MATIC,” Wikipedia。Hopper 于 1953 年末提出,数据处理问题应当用英文关键词来表达;管理层起初斥之为不可行。“I used to be a mathematics professor. At that time I found there were a certain number of students who could not learn mathematics. I then was charged with the job of making it easy for businessmen to use our computers.” 

  3. 巴拉克·奥巴马总统,“Remarks by the President at Presentation of the Presidential Medal of Freedom,” 白宫,2016 年 11 月 22 日。“If Wright is flight and Edison is light, then Hopper is code.” “She invented the first compiler, which allowed programs to be written in regular language and then translated for computers to understand.” 

  4. “Grace Hopper,” Wikipedia。1906 年 12 月 9 日生于纽约市;1992 年 1 月 1 日逝世。瓦萨学院学士(1928 年);耶鲁大学数学硕士(1930 年)与数学博士(1934 年)。1943 年加入美国海军后备役;1944 年在 Howard Aiken 麾下被分配到 Harvard Mark I;参与撰写 Mark I 手册。1949 年加入 Eckert-Mauchly/Remington Rand,参与 UNIVAC I 的研制。晋升至少将;1986 年 8 月以海军中年纪最长的现役军官身份退役;USS Hopper(DDG-70)以她命名。 

  5. “A-0 System,” Wikipedia。由 Grace Hopper 于 1951—1952 年间为 UNIVAC I 编写;被广泛认为是第一个编译器,尽管它的功能更像加载器/链接器而非现代编译器——它接受以调用号及参数指定的子程序,并组装出可运行的机器码。其后是 A-1、A-2,并最终发展为 FLOW-MATIC。 

  6. “FLOW-MATIC,” Wikipedia。1955—1959 年间在 Hopper 主持下于 Remington Rand 开发;第一门用类英语语句表达操作的编程语言;1958—1959 年间达到生产可用;直接塑造了 COBOL(经由 1959 年的 CODASYL 工作),传承了文件组织、数据限定与程序分节结构。另见 “COBOL,” Wikipedia,关于 FLOW-MATIC 作为该语言主要蓝本的论述。 

  7. “Grace Hopper Explains the Nanosecond,” ratfactor,转录其演讲;以及 “Grace Hopper to Programmers: Mind Your Nanoseconds!,” High Scalability。一纳秒是 11.8 英寸的电线(电在十亿分之一秒内传播的最大距离);一微秒是一卷 984 英尺长的线圈。“I sometimes think we ought to hang one over every programmer’s desk… so they know what they’re throwing away when they throw away microseconds.” 

  8. “Nanoseconds Associated with Grace Hopper,” 以及 “Log Book With Computer Bug,” 史密森尼学会美国国家历史博物馆。那些 11.8 英寸的纳秒电线,以及 1947 年那页贴着飞蛾的 Mark II 日志,都在该馆的藏品之中。 

  9. “Bug (engineering),” Wikipedia,以及 “The First Use of ‘Bug’ in the Context of Computing,” HistoryofInformation.com。1947 年 9 月 9 日,Harvard Mark II 的操作员在 70 号继电器 F 面板里发现一只飞蛾,并记下“First actual case of bug being found”。用 “bug” 指代工程故障比这早了数十年(远至 Edison 的年代);Hopper 多半不是发现那只飞蛾的人,但她帮助推广了这则轶事以及 “bug” 和 “debug” 这两个词。另见 “The Bug in the Computer Bug Story,” JSTOR Daily。 

  10. “Grace Hopper,” Wikiquote。“If it’s a good idea, go ahead and do it. It’s much easier to apologize than it is to get permission.” 此语被广泛归于 Hopper(并被引用于美国海军《Chips》杂志 1986 年 7 月号);Wikiquote 指出其底层观念在 Hopper 之前就已见诸印刷品,因此措辞是人们所记住的她的版本,而想法本身则更为古老。归属讨论见:Quote Investigator。 

相关文章

工程哲学:Barbara Liskov,契约即类型

Barbara Liskov 让数据抽象成为一种编程基本要素:类型即它所恪守的契约,而子类型必须兑现其父类型作出的每一个承诺。

4 分钟阅读

工程哲学:Roberto Ierusalimschy

Roberto Ierusalimschy 围绕一个原则设计了 Lua——提供机制,而非政策——一门小巧、快速、可嵌入的语言,交给你的是操纵杆,而不是规则。

6 分钟阅读

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 分钟阅读