解讀高德納:最偉大計算機程序員是如何誕生的
計算機編程是一種藝術形式,就如同人們譜寫詩歌和音樂。 ——高德納(Donald E.Knuth)
高德納(Donald Ervin Knuth,1938 年 1 月 10 日-),出生于密爾沃基,美國著名計算機科學家,斯坦福大學計算機系榮譽退休教授。高德納教授被譽為現代計算機科學的鼻祖,在計算機科學及數學領域發表了 多部具廣泛影響的論文和著作。 高德納最為人知的事跡是,他是《計算機程序設計藝術》 (The Art of Computer Programming)的作者。此書是計算機科學界最受高度敬重的參考書籍之一。他創造了算法分析的領域,在數個理論計算機科學的分支做出基石一般的貢 獻,此外還是排版軟件 TEX 和字體設計系統 Metafont 的發明人。 高德納的英文名直譯為唐納德·歐文·克努斯(Knuth 發音為/knu?θ/[1]),“高德納”這個中文名字是 1977 年他訪問中國之前所取的,命名者是儲楓(姚期智的夫人,計算機科學家)。
高德納真的只是一個人么?他一生發表了 150 余篇論文,提出了領域內最重要的三個算法。他的經典巨著(如今在寫第四卷)《計算機程序設計藝術》對整個行業進行了綜述,同時也提出了原創的研究見解。這 本書的前幾卷已經誕生了中文、日語、俄語和匈牙利語等多個版本。在三十多年的研究生涯中,他還找時間創造出功能強大的排版印刷軟件系統,以便進行多樣化的 寫作,主題包括古巴比倫算法和《圣經》詩篇,甚至還有小說。在“業余時間”里,他喜歡彈奏自已設計的管風琴。
高德納和妻子在斯坦福大學家中,面前是他自己設計的管風琴,1975 年(斯坦福大學新聞出版服務中心提供)
在其職業生涯中,高德納受到了公眾廣泛的贊譽和褒獎,包括 1974 年獲得計算機科學界的最高榮譽圖靈獎,1979 年獲得吉米·卡特總統頒發的美國國家科學獎章。然而高德納以一種超然的態度面對這些榮譽。當年的圖靈獎杯如今已被他當做了盛放水果的果盤。
高德納的音樂世界及他的第一篇出版物
高德納于 1938 年出生于密爾沃基。他的父親是克努斯家族的第一位大學生,最開始是小學教師,后來在一所路德教會高中教簿記學。每周日他還在教堂彈奏管風琴。高德納繼承了他父親對音樂和教育的理解,尤其是語言風格。
我最感興趣的東西恰恰是老師們擅長的。我們在語句分析圖方面進行了扎實的訓練。下課后總有一堆人湊在一起分析詩歌中的語句,其樂融融。
作為校報的編輯,高德納發明了填字游戲 。他至今仍記得當年在詞海中尋找合適題目的樂趣。從小時候起,高德納就開始贏得榮譽。8 年級時,一家糖果生產商贊助了一次比賽,要求選手用其品牌“Ziegler’s Giant Bar”(齊格勒巨型棒棒糖)中的字母組成新的單詞,組成單詞數量最多者獲勝。小高德納決定嘗試一把。
我找出了大概 4500 個單詞,還沒有用撇號。如果用撇號我會找到更多。比賽裁判給出的“官方”單詞表上只有 2500 個。
他贏得了自己的第一份獎勵:一臺電視機(在當時屬于奢侈品)以及足夠整個學校享用的齊格勒棒棒糖。上高中之后,高德納又獲得了西屋科學天才獎的 提名,理由是他的“普茨比度量衡體系”。高德納以他日后研究生涯中標志性的細心和準確,定義了一系列基本單位,例如長度單位普茨比 (第 26 期 MAD 雜志的厚度)、“麻煩程度”單位 MAD(即 48 件事的麻煩程度)以及能量的基本單位 whatmeworry 。1957 年 6 月,MAD 漫畫雜志花 25 美金買下了這篇作品,使之成為了高德納等身著作中的第一篇出版物。不過,他在高中時期最關注的既不是寫作也不是科普,而是音樂。
當時我認為上大學時應該會主修音樂專業。一開始我吹薩克斯,后來樂隊的低音號手出了事故,我又開始吹低音號。我為樂隊編了一首曲子,把當時熱門電視劇的主題曲都加了進去——《法網恢恢》 、胡迪·都迪秀還有百利發乳的廣告音樂。我那時可不懂什么版權保護法。
高德納的計算機之路
1956 年,高德納有生以來第一次接觸到了計算機,那是一臺 IBM 650,Fortran 之前的機器。他通宵不眠地鉆研使用手冊,并且自學了基本編程。
我們從 IBM 得到的手冊上面有一些編程的案例,而我發現自己的方法比上面介紹的好得多。所以我猜自己可能有些天賦。其實我不知道的是幾乎所有人都能對那些程序加以改進——當時的相關書籍都很差勁。我開始學習計算機時,正是巴科斯忙于 Fortran 的時候。
高德納的第一個程序是把數分解為素數的乘積,另一個程序則是教計算機玩井字棋 。不過這些都只是小打小鬧而已。1958 年他為凱斯校籃球隊編寫了一個程序,根據命中率、搶斷、失誤等數據為每位球員評分。球隊教練非常欣賞這套程序,宣稱球隊在聯賽奪冠也有它的一份功勞。《新 聞周刊》專門為該程序寫了一篇報道,IBM 也在公司宣傳冊上刊登了高德納與 650 機的合影。 高德納被計算機的無所不能深深地吸引住了。事實證明計算機甚至也符合他對音樂的興趣。 數學是一種模式的科學。音樂也是模式。計算機科學在進行抽象、建立模式等方面同樣有很多作為。我認為,計算機科學與其他領域最大的區別就在于它不斷的躍變 ——從微觀角度上升到宏觀視角。
有許多職業的產生是有明確的需要,人們要找到解決重要問題的方法,比如醫學方面的職業。而像計算機科學這樣的職業之所以存在,是我們從小形成的思維結構所決定的。
如果你碰巧屬于某2% 的人,那么你就會自然而然地被計算機吸引而產生共鳴。正是思維方式將我們與其他人區分開來。最終,我意識到自己是一位計算機科學家。
1960 年,高德納以最優異成績從凱斯理工學院畢業,而且校方打破慣例,投票決定同時授予他數學碩士學位。隨后他前往加州理工學院,3 年后獲得數學博士學位。他寫了一篇關于組合幾何學的論文“有限半視場及射影平面”。
1963 年畢業后,高德納以數學系助理教授的身份加入了加州理工學院教研組,仍然繼續追隨著對計算機的興趣。自 1960 年起他就擔任了布勞斯公司的顧問。布勞斯公司(后合并為優利系統)是當時計算機產業的領跑者,與艾茲赫爾·戴克斯徹等杰出人物保持著密切的聯系。
高德納在布勞斯的工作內容包括硬件和軟件設計,尤其是對新發明的 Algol 60 編程語言提供支持。這份工作讓他有機會與戴克斯徹當面認識,分享彼此對編譯的共同愛好。戴克斯徹和J. A. 祖內維德在 1960 年 8 月已經實現了第一個 Algol 60 編譯器。
我們見了面,并一直保持書信來往。他最大的長處在于永不妥協的審美品味,我呢,總是意志不堅,搖擺不定。如果他對我說他喜歡我做的某件事,那么他就是真的喜歡;如果他說不喜歡,那么就是真的不喜歡。所以我視他為難得的諍友。
在那個時侯,數學和計算機科學之間存在著巨大的鴻溝。在寫程序時,你必須來回調整,直到自己認為它能順利運行。利用數學對程序進行證明——這在當時是一個非常激進的概念,所有人都認為不可能。戴克斯徹的確是計算機程序驗證方面最偉大的先驅之一。
巨著《計算機程序設計藝術》的誕生
1962 年 1 月,Addison-Wesley 出版社找到當時還是學生的高德納,邀請他為編譯器這一新生領域寫一本書。同年夏他啟動了這項計劃,到 1963 年秋,他開始讓自己在加州理工的學生試讀初稿,以測試效果。
到了 1966 年,我已經手寫了 3000 頁的草稿,開始用打字機把它們打出來。我比較了手書和打印頁面的文字大小,估計這個 3000 頁會減少到 700 頁。但是出版社說我錯了,比率應該是 1 比1。經過瘋狂的會議討論,我們定下了一個計劃:出一個七卷冊的系列叢書。
在 1966 年,舉一人之力就可以了解整個計算機科學領域。但是它一直在不斷成長壯大。我已經盡全力跟上它的步伐。而現在我發現第 4 卷(關于組合算法)一卷馬上就要超過 2000 頁——第 4A、4B 和 4C 卷,估計能在 2003 年完成。
一個新科博士,挑戰如此包羅萬象的典籍,本就是一件驚人的事,但它得到的反應卻更加驚人:《計算機程序設計藝術》的前三卷成了 20 世紀 70 年代初教科書的首選,至今仍頻頻被用于參考書。它們之所以一直受到追捧,正是因為高德納對待課題一絲不茍的態度。對提及的每一個理論,書中都會巨細無遺地 討論所有細節。在解釋某個算法后,高德納還會再給出一個程序實例——目的是確保讀者不會產生誤解。書中嚴謹與機智并舉,而且盡力展現每一條理念下蘊藏的美 感。正如紐約大學的編譯器設計師埃德·施恩伯格所言:“戴克斯徹教我們分辨是非,高德納教我們分辨好壞。”
由小故事探究最偉大的計算機程序員如何誕生的
民間故事中一直把高德納視作為有史以來最偉大的計算機程序員。我們不妨參考以下艾倫·凱所講的軼事。
當我在斯坦福大學從事 AI 項目時(20 世紀 60 年代末),每個感恩節我們都會與在灣區做研究項目的人們進行一次編程競賽。獎品是一只火雞。 麥卡錫為競賽出題。高德納參加的那一年,他一舉拿下了兩個獎項:程序調試所用的時間最少、算法執行效率最高。而且他用的是所有參賽者中最爛的系統,叫做 Wilbur 系統,只能遠程批處理。可以說他把所有人都打得屁滾尿流。然后他們問他:“你怎么這么牛?”他回答說:“我學編程的時候,一天能摸 5 分鐘計算機就不錯了。想讓程序跑起來,就必須寫得沒有錯誤。所以編程就像在石頭上雕刻一樣,必須小心翼翼。我就是這樣學編程的。”
本文摘自:《奇思妙想:15 位計算機天才及其重大發現》