高德納(Knuth)談計算機程序設計藝術(上)
英文原文:The Art of Computer Programming
高德納(D. E. Knuth)教授是備受尊崇的系列巨著《計算機程序設計藝術》(The Art of Computer Programming)和數十篇受到高度贊譽的計算機科學論文的作者。2011年6月,結束了在英國的書籍研討和系列演講的高德納教授,跟 BCS 編輯 Justin Richards 暢談了自己的人生和工作。
您最廣為人知的成就應該是《計算機程序設計藝術》系列著作了。1999年,這個系列被美國科學家(American Scientist)期刊評選為20世紀最重要的12部理學專著之一。這個系列最初是如何創作出來的?您是如何看待美國科學家期刊的這一評價呢?
這系列書籍大約從1960年代開始創作。那時候,因為沒有合適的資源,所以大家都在重新發明一些已有的東西。我一直都很喜歡寫作,在學校參與報紙和雜志的工作,認為自己是一個作家。我意識到,需要有人記錄下所有已經發表而我們正在遺忘的優秀思想。
這又要回溯到最初的年代,當時真正研究計算技術的人很可能還不到一千個。我沒有把這看作將要影響世界的事情,但仍然覺得這些很酷的資料是值得認真整理的。
那時候,我就考慮還有什么人合適寫作這樣的書籍。我能想到的每個人,他們都很可能只會關注自己所研究的那個領域。在我所知道的人當中,只有我自己是沒有發明創造過什么東西的,因此我設想自己能夠以中立的立場來擔任他們的代言人。坦白說,那就是初始動機,我認為存在那樣的需求。
我寫作這樣的書,還有一個很自然的理由。那就是,我要嘗試將很多人的不同想法結合起來。我會看到,A君以某種方式來分析他的方法A,而B君會以另一種方式來分析與之競爭的方法B。因此,我就要用B君的方式來分析方法A,用A君的方式來分析方法B。
因此,我最終就是以單純分析以上內容的形式來創作書的雛形。很快,我認識到,有些被我捆綁使用的科學方法,在我所受的教育中其實是不允許同時出現的。然而,一次又一次地,我真的看到只有這樣的思維方式才可以正確地闡述問題。
長話短說,很快我也有了自己的不同意見,并且開始發現新東西,這樣就難以繼續中立地寫作了。不過,我仍然嘗試在最大限度內以公允、合理的態度去總結每個人的有價值思想。
至于這本書入選世紀最佳書籍,我還覺得不太好意思。他們把我推到愛因斯坦和費曼的偉大隊列中,而我實際上并不屬于那樣的級別。這可能僅僅是因為他們必須從計算機科學領域選出一個人,而我又沒有太多的競爭者罷了。雖然我也覺得自己在研究領域的努力工作是值得提及的,但這樣把我挑選出來代表計算機科學, 總有點關公戰秦瓊的意味了。
是什么促使您投身計算機科學這個領域的呢?
我天生就是一個計算機科學家——我的頭腦里有一種組織東西的思維方式,注定讓我成為一個好的程序設計員。我覺得任何人都可以學習使用計算機,但是五十個人里面大概只有一個人會成為像我這樣的極客。這意味著我們這些人將在這個領域中的不斷創新,并與計算機產生共鳴。我們的思維方式會幫助我們更容易地學習如何制造機器。
您為什么會認為計算機科學是如此重要呢?
計算機科學之所以重要,是因為它改變了溝通的方式。它還影響了金融業,這是我不太情愿提及的。可惜的是,世人是以我和我的同行們對華爾街產生的影響來衡量我們的工作的。在這個意義上,我是很嫉妒天文學家的,因為世人認為天文學家由自己的興趣去研究天文學是值得尊重的。其實,我研究計算機科學也是同樣出于興趣啊。
我對 IT 這個說法并沒有太大的共鳴,真正打動我的是科學。對我而言,IT 是不錯的東西,但并非我所擅長的領域。我的太太就能比我更快地掌握某個圖標的含義、找到要點擊什么地方。但要讓機器完成復雜、細致的工作,在科學上是有許多難題需要攻克的。我曾經覺得很多問題是無法找到答案的,但事實上我們已經一步步地知道要如何解決它們。對我來說,即便沒有任何金錢上的回報,我也會做這些工作。
所以說您對此充滿激情嗎?
那是,就像每天早上醒來我都會想著今天要好好寫個程序。
您是受到繆斯女神的眷顧了吧?
是啊,有些日子她給予我的要比給予其他人的多。甚至有某個階段,我幾乎認為自己是有個專屬的繆斯女神的。
在您看來,您在計算機科學領域最大的成就是什么?
我想我的第一個成果是研究編譯器的理論。我曾經研究過代數語言的理論,而在我寫這本書(第10章)的時候,我正試圖描述人們在這個領域的種種發現和成果,然后我突然意識到,可以有一種方法把這些發現和成果都關聯起來。由于這個發現過于新奇,我不知道該怎樣在書里面闡釋它,于是就把它發表成一篇學術論文。后來,其他的人讀懂了我的意思并開始應用,最終讓這個發現成為了今天所有代數編譯器的分析原理。
不過我覺得我最大的成就是發明了比較算法優劣的數學方法。為了了解一個程序到底好不好,我創造了一種量化的比較方法,例如你可以說一個程序優于另外一個程序2.3倍。這個數學方法叫做算法分析,是我最引以為豪的學術成就,也是成功應用計算機的關鍵。
當我發明這套數學方法的時候,我跟我的出版商說,不如把這本書改名作“算法分析”吧。但是他們說不行,這樣的話這書就永遠賣不出去了!但實際上那就是此書的核心內容,它除了綜合總結計算機學者發明的算法,還幫助我們從量化的角度去評價每個算法的優劣。
在您的網站上有關于“你為何不用 Email”的回覆。“對于那些生活在事務的頂端的人們而言,Email 是個美妙的東西。但那不是給我用的,我的角色是在事件的底層。”您是否可以再解釋一下自己對 Email 的立場,以及“在事件的底層”的含義?
某些人是不能整天聒噪不休的,他們要考慮的事情,需要長時間的專注、對材料進行組織并營造堅實的基礎,而不是僅僅對前沿問題的驚鴻一瞥。將某些內容以精確的形式表達出來,是需要很長時間的。要正確地做好事情,我就必須專注地耗費大量的時間。當我被大家當作權威的時候,世上數不清的人們要來問這問那。 因此,用了15年 Email 之后,我覺得真的足夠了。
之前的一位圖靈演講者 Grady Booch 非常主張編程的簡潔性,而您在贏取西班牙“知識邊界獎”的導言中也有相同的論調。您可否解釋一下您為何希望程序保持簡單、緊湊、易懂?
我想我們要先溫習愛因斯坦的名言“要讓它盡可能的簡潔,而又不至于過分簡潔”。事實上并非樣樣事情都存在捷徑,都是簡單易懂的。然而我發現,如果我們有再三思考的機會,幾乎沒有一件事情是不能被簡化的。正因為如此,人們時不時會說:“好吧,基于我們現有的知識,讓我們把舊的東西推到重來吧!”
幾年前在斯坦福有一個名為“清白歷史”的項目,口號是“讓我們找個更好的方法來實現因特網”。當東西不斷地累積,你就會發現已經存在太多的垃圾而實在沒有必要再去添加東西了。
那就像人的闌尾,也許曾經某個時候它是有存在的意義的,但是現在已經不再需要了。我覺得這個項目有潛力,盡管實現的可能性微乎其微,因為整個世界已經離不開現存的因特網了。要一個人跳出來說“讓我們重新設計整個因特網,從把程序導入計算機開始”,那是非常困難的。這有點像當時 Linux 的出現,其目的就是嘗試去簡化操作系統。
您跟 Grady Booch 還擁有另外一個共同的思想,你們都講過“不必寫代碼和編程就能欣賞到程序之美”,您這樣講的真正含義什么呢?
我是從幾層不同的含義來看待“藝術”這個詞的。通常,藝術意味著人類創造的某種東西,并非自然的。還有一層含義,那就是賦予美學價值的精致藝術品。
很多情況下,美感都是在旁觀者的眼中產生的。但是,人們會因某個事物本身的優雅和諧調而去創造它,那與評論和欣賞其他人的作品是類似的,我們會覺得自己感受到美。當這個作品達到某種標準的時候,我們會因之而滿足。
對于所謂的“某種標準”,可能 Grady 跟我的意見是不一樣的,那就如沒有任何兩個人能對哪種音樂是最好的問題達成完全一致的意見。但是,音樂家無疑是清楚自己喜歡和不喜歡什么音樂的,也很清楚自己什么時候創造出好音樂。這就很類似我看待程序的方式了。
我想最終都是個人喜好的問題?
的確如此。沒有一個算法你會在輸入以后問自己:這到底夠不夠漂亮呢?盡管的確有人嘗試去這樣做——美國最偉大的數學家之一 George [David] Birkhoff 曾經在三十年代寫過一本書,名為“美學衡量”。這本書充斥了形形色色的數學公式,還有一頁滿滿的印著各式各樣的希臘骨灰甕,并在每一個旁邊都給了一個美的評分。
他還給很多不同的設計系統評分。其中比較有趣的是,在他的一百強名單里面,排行第二還是第三的是萬十字章——他本身是同情納粹的。我想這個圖標的旋轉方向要是反過來,對印度教來說可能有更大的宗教意義。我不認為可以衡量這些東西的美丑,但是他的確這樣做了,而且也有其他人作了同樣的嘗試。
那么說,還沒有人編出能評判程序的美丑程度的程序啰?
實際上還沒有。有些軟件工程師因評測的需要而嘗試做這樣的事情,我也不是很清楚。大家都知道,像你這樣的記者或作家都有很多題材,你們需要量化數字來充實文字內容。例如,有人在開羅的沖突中喪生,你們就需要弄清楚是300人還是315人,這是新聞報道的必備部分。量化資料可以提升質量。我也在嘗試尋找數字化的方法。不過,實際上軟件工程師試圖衡量的是某個程序員的優秀程度。其實他們去問老板就行了!
我覺得數字的使用是讓人們在心里面能做個比較,例如20個人在這個事件中喪生,50個人在另外一個事件中喪生,那么人們通過對比就會覺得后面這個事件更為嚴重。
但這很可能其實是在用蘋果和橙子比較。因為一旦涉及到數字,人們就可能篡改某些數據來扭曲事實。你也可以想象教育學生,總想著學生怎么樣才能通過考試,然后你就可能會編寫一本關于應試的書,而不是一本關于學習科學的書。
這樣一來一切都是為了在學科考試中獲取高分。然而問題是這些數字評分并不是總能很好的反映事物的本質。當你把一些事情量化了,假如你想的話你總是可以找到作弊的方法,因而也最終忘記了學習的初衷。