← 所有文章

工程哲學: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年在Vassar College取得數學與物理學士學位,隨後於耶魯取得碩士(1930年)與數學博士(1934年)——這個數學博士學位,在她那一代的女性中幾乎無人擁有。4整個1930年代她在Vassar教數學,而這個細節很重要:在成為程式設計師之前,她先是一位教師,而那種把艱深概念化為可理解之物的直覺,從未離開過她。

1943年12月,正值戰爭中期,她加入了美國海軍後備隊。海軍起初有些遲疑——她已三十六歲,體重又遠低於標準——但她硬是闖了過去,並於1944年被派往哈佛的軍械計算專案局(Bureau of Ordnance Computation Project),在Howard H. Aiken手下成為哈佛Mark I最早的程式設計師之一。4Mark I是一台占滿整個房間的機電式計算機;Hopper合著了它那本561頁的手冊《自動序列控制計算機操作手冊》(A Manual of Operation for the Automatic Sequence Controlled Calculator),多年來這都是教人如何為這台機器編寫程式的奠基文本。4

Grace Hopper工作中,周圍堆滿UNIVAC手冊與一卷磁帶

戰後她退出現役,但仍留在後備隊,並於1949年加入Eckert-Mauchly Computer Corporation——不久後併入Remington Rand——投入美國第一台商用電腦UNIVAC I的工作。4正是在那裡,她不再是把程式碼手工焊接到一台一次性的研究機器上,而是試圖讓一項產品能被普通企業使用,她生命的課題也由此聚焦成形。Aiken給了她機器,UNIVAC給了她客戶。客戶不會寫程式,而Hopper認定那是電腦該解決的問題,而非客戶該解決的問題。

主要工作

第一個編譯器:A-0(1952年)

到了1952年,Hopper已打造出A-0系統,普遍被認為是第一個編譯器。5這個構想事後看來簡單得近乎難堪,在當時卻是異端。程式設計師累積了一批批好用的副程式庫,但要重複使用其中一個,你得親手把它的指令抄進自己的程式,再費力地逐一修正每一個記憶體位址。Hopper的A-0則讓你改以一個簡短的呼叫編號來指涉每個副程式,並提供它的引數;系統接著從磁帶中取出這些常式、解析位址,組裝成一個可執行的程式。5

純粹主義者正確地指出,A-0的運作其實更像我們今天所稱的載入器(loader)或連結器(linker),而非現代的最佳化編譯器。5這沒錯,也值得說明。但真正歷久不衰的,是那一躍的概念:程式可以是一份用便利符號寫成的規格說明,而一段軟體能自動把這份規格翻譯成機器碼。翻譯如今成了機器的工作。Hopper本人對於自己為何這麼做的說法,留存在她回憶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

Grace Hopper准將在講台上演說,1985年

這段電線,與驅動編譯器的,是同一種教師的直覺,只是瞄準了不同的一課。編譯器說的是:你不該為了使用機器,而非得用機器的方式思考。奈秒說的是:但你確實得尊重機器的物理。延遲不再是投影片上的一個數字,而成了一段訊號必須親身跨越、受光速所支配的長度,而每一個被浪費的微秒,都是你毫無理由地讓訊號白跑的一段電線。這些電線如今陳列在史密森尼學會的美國國家歷史博物館裡。8它們其實也幾乎一字不差地是John Carmack那句「光速爛透了」——只是早了四十年,並且由銅製成。兩者都把延遲那道嚴酷的物理下限,化為某種你無法抽象掉、也無法揮手帶過的東西,因為你看得見它,或握得住它。

那隻蟲與反教條的脾性

1947年9月9日,哈佛Mark II——Aiken的後繼機器,正是Hopper所屬的團隊——的操作員把一個故障追查到一隻卡在第70號繼電器、F面板裡的蛾。他們取出這隻昆蟲,用膠帶貼進日誌本,寫下:「首次發現實際的蟲(bug)案例。」9那一頁日誌,連同那隻仍黏附其上的蛾,如今由史密森尼學會典藏。8

這個故事的誠實版本很重要,因為Hopper說得太精彩,反倒把事實給模糊了。蛾是真的,日期也有文獻記載。但用「bug」指稱工程故障,遠在她之前就有了——早在Thomas Edison的年代就已通用——而那些操作員幾乎可以肯定是在玩雙關,把他們早已熟知的工程術語,和他們剛剛撬出來的那隻真實昆蟲湊在一起。9而且就多數記載而言,找到那隻蛾的人甚至不是Hopper。她所做的,是以其一貫的風采,把這則軼事、以及「bug」與「debugging」這套詞彙推廣開來,直到它們成為這個領域的母語。9所以精確的功勞應該這麼算:她沒有發明「bug」一詞,也很可能不是抓到那隻蛾的人,但她讓這則故事與這個詞深植人心。那是另一種貢獻——再一次,是屬於教師的貢獻。

支撐這一切的脾性,是一場對抗承襲假設的長期戰爭。她牆上那座時鐘逆時針走,是刻意為之的,用以證明:人人視為固定不變的成規,在你決定打造一座不一樣的鐘的那一刻,就顯露出它的隨意。1「我們一向都是這麼做的」在Hopper眼中是語言裡最危險的一句話——而編譯器、近似英文的語言、可移植的程式,以及你手中那段電線,全都是對它的反駁。

方法論

這套方法,貫穿了四十年始終如一——軍械計算、商用運算、語言設計,以及一輩子的教學。

把翻譯的重擔移到機器身上。她職業生涯反覆出現的一招,就是把每個人類此刻都在以手工進行的工作——解析位址、用數字運算碼思考、把程式碼硬塞進某一台特定電腦——拿來在軟體裡自動化一次。編譯器是這個構想;FLOW-MATIC是這個構想;與機器無關,也是這個構想。56

讓人能說自己的語言。程式設計應當在使用者所在之處與他們相會。商務人士應該能寫下MOVECOMPARE,而不必背誦一整套指令集。可及性從來不是事後栓到工具上的一項功能;對Hopper而言,它正是這項工具存在的全部理由。26

讓抽象化為實體。當一個概念抽象到難以令人尊重時——一個奈秒、一個被浪費的微秒——就打造一件實體物件,逼出那一課。電線是化為工程的教學法:你無法跟一件你正握在手裡的東西爭辯。7

不信任「我們一向都是這麼做的」。把承襲的成規當成一個假設,而非一條定律。那座逆時針的時鐘,是化為實物的方法論:只要乾脆地用不同的方式去做,就能證明那道限制其實是隨意的。1

寧求事後原諒,不求事前許可。「如果這是個好主意,就放手去做吧。道歉遠比取得許可容易得多,」她如此建言——這是對抗教條在操作層面的推論。(這種想法早於她,確切措辭在各個來源間也有出入,但海軍與這個領域所記得的那個版本,是她的。)10你無法靠著乾等那些既得利益於舊路的人來祝福,而抵達抽象化。

影響鏈

是誰形塑了她

Howard Aiken與哈佛Mark I。Aiken把她的第一台電腦、第一個難題交到她手中,而她合著的那本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年端詳程式設計,看見那艱難的部分正由每一個碰觸機器的人扛著,於是把那份重擔移進軟體,讓它只需被償付一次。那正是我如今在所建造的一切中試圖做出的一招:找出人類正在反覆以手工進行的翻譯工作,把它自動化進工具裡。標準和品質是唯一的變數如出一轍——問題從來不是「能不能訓練一個人去忍受這個介面?」,而是「他們究竟為什麼非得忍受不可?」

在我如今所建造的世界裡——代理(agents)、工具迴圈、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日,哈佛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 (March/April 1987). 「人類對改變過敏。他們最愛說:『我們一向都是這麼做的。』我努力對抗這一點。所以我牆上掛著一座逆時針走的時鐘。」另見 “Grace Hopper,” Wikiquote。 

  2. “FLOW-MATIC,” Wikipedia. Hopper於1953年底提議,將資料處理問題以英文關鍵字來表達;管理層起初斥之為不可行。「我以前是數學教授。當時我發現總有一定數量的學生學不會數學。後來我被交付了一項任務:讓商人能輕鬆使用我們的電腦。」 

  3. President Barack Obama, “Remarks by the President at Presentation of the Presidential Medal of Freedom,” The White House, November 22, 2016. 「如果說Wright代表飛行、Edison代表光明,那麼Hopper就代表程式碼。」「她發明了第一個編譯器,讓程式得以用一般語言書寫,再翻譯給電腦理解。」 

  4. “Grace Hopper,” Wikipedia. 1906年12月9日生於紐約市;1992年1月1日逝世。Vassar學士(1928年);耶魯數學碩士(1930年)與博士(1934年)。1943年加入美國海軍後備隊;1944年在Howard Aiken手下被派往哈佛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. 在Hopper主持下於Remington Rand開發,1955年至1959年;第一個以近似英文語句表達運算的程式語言;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英尺長的線圈。「我有時覺得我們應該在每個程式設計師的桌上掛一段……好讓他們知道,當他們揮霍掉微秒時,究竟扔掉了什麼。」 

  8. “Nanoseconds Associated with Grace Hopper,” 以及 “Log Book With Computer Bug,” Smithsonian National Museum of American History. 那些11.8英寸的奈秒電線,以及1947年那一頁黏著蛾的Mark II日誌,都在該館的館藏之中。 

  9. “Bug (engineering),” Wikipedia,以及 “The First Use of ‘Bug’ in the Context of Computing,” HistoryofInformation.com. 1947年9月9日,哈佛Mark II的操作員在第70號繼電器、F面板裡發現一隻蛾,並記下「首次發現實際的蟲(bug)案例」。用「bug」指稱工程故障,比這早了數十年(可追溯至Edison的年代);Hopper很可能不是找到那隻蛾的人,但她協助推廣了這則軼事以及「bug」和「debug」這兩個詞。另見 “The Bug in the Computer Bug Story,” JSTOR Daily。 

  10. “Grace Hopper,” Wikiquote. 「如果這是個好主意,就放手去做吧。道歉遠比取得許可容易得多。」廣泛歸於Hopper(並被引用於美國海軍《Chips》雜誌1986年7月號);Wikiquote指出其底層想法在Hopper之前即已見諸印刷,因此措辭是如人們所記得的她的版本,而構想則更為古老。歸屬討論:Quote Investigator. 

相關文章

工程哲學:Barbara Liskov,契約即型別

Barbara Liskov讓資料抽象成為程式設計的基本要素:型別就是它所信守的契約,而子型別必須兌現其父型別所許下的每一個承諾。

3 分鐘閱讀

工程哲學:Roberto Ierusalimschy

Roberto Ierusalimschy 圍繞一個原則設計了 Lua——提供機制,而非政策——一門小巧、快速、可嵌入的語言,交給您的是操縱桿,而不是規則。

4 分鐘閱讀

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 分鐘閱讀