最偉大的計算機程式設計師是如何誕生的?—解讀高德納

ituring發表於2013-03-27

  計算機程式設計是一種藝術形式,就如同人們譜寫詩歌和音樂。  ——高德納

  高德納(Donald Ervin Knuth,1938年1月10日-),出生於密爾沃基,美國著名電腦科學家,史丹佛大學計算機系榮譽退休教授。高德納教授被譽為現代電腦科學的鼻祖[來源請求],在電腦科學及數學領域發表了多部具廣泛影響的論文和著作。

  高德納最為人知的事蹟是,他是《計算機程式設計藝術》的作者。此書是電腦科學界最受高度敬重的參考書籍之一。他創造了演算法分析的領域,在數個理論電腦科學的分支做出基石一般的貢獻,此外還是排版軟體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位計算機天才及其重大發現》

相關文章