高德納談計算機程序設計藝術2

高德納(D. E. Knuth)教授,備受尊崇的系列鉅著《計算機程序設計藝術》(The Art of Computer Programming,TAOCP)和數十篇受到高度讚譽的計算機科學論文的作者。2011年6月,結束了在英國的書籍研討和系列演講的高德納教授,跟BCS編輯Justin Richards暢談了自己的人生和工作。

高德納談計算機程序設計藝術2

Justin Richards:您最廣為人知的成就應該是《計算機程序設計藝術》系列著作了。1999年,這個系列被美國科學家(American Scientist)期刊評選為20世紀最重要的12部理學專著之一。這個系列最初是如何創作出來的?您是如何看待美國科學家期刊的這一評價呢?

D. E. Knuth:這系列書籍大約從1960年代開始創作。那時候,因為沒有合適的資源,所以大家都在重新發明一些已有的東西。我一直都很喜歡寫作,在學校參與報紙和雜誌的工作,認為自己是一個作家。我意識到,需要有人記錄下所有已經發表而我們正在遺忘的優秀思想。

這又要回溯到最初的年代,當時真正研究計算技術的人很可能還不到一千人。我沒有把這看作是將要影響世界的事情,但仍然覺得這些很酷的資料是值得認真整理的。


高德納談計算機程序設計藝術2


那時候,我就思考還有什麼人適合寫作這樣的書籍。我能想到的每個人,他們都很可能只會關注自己所研究的那個領域。在我所知道的人當中,只有我自己是沒有發明創造過什麼東西的,因此我設想自己能夠以中立的立場來擔任他們的代言人。坦白說,那就是初始動機,我認為存在那樣的需求。

我寫作這樣的書,還有一個很自然的理由。那就是,我要嘗試將很多人的不同想法結合起來。我會看到,A君以某種方式來分析他的方法A,而B君會以另一種方式來分析與之競爭的方法B。因此,我就要用B君的方式來分析方法A,用A君的方式來分析方法B。

因此,我最終就是以單純分析以上內容的形式來創作書的雛形。很快,我認識到,有些被我捆綁使用的科學方法,在我所受的教育中其實是不允許同時出現的。然而,一次又一次地,我真的看到只有這樣的思維方式才可以正確地闡述問題。

高德納談計算機程序設計藝術2

長話短說,很快我也有了自己的不同意見,並且開始發現新東西,這樣就難以繼續中立地寫作了。不過,我仍然嘗試在最大限度內以公允、合理的態度去總結每個人的有價值的思想。

至於這本書入選世紀最佳書籍,我還覺得不太好意思。他們把我推到愛因斯坦和費曼的偉大隊列中,而我實際上並不屬於那樣的級別。這可能僅僅是因為他們必須從計算機科學領域選出一個人,而我又沒有太多的競爭者罷了。雖然我也覺得自己在研究領域的努力工作是值得提及的,但這樣把我挑選出來代表計算機科學,總有點關公戰秦瓊的意味了。

Justin Richards:是什麼促使您投身計算機科學這個領域的呢?

D. E. Knuth:我天生就是一個計算機科學家——我的頭腦裡有一種組織東西的思維方式,註定讓我成為一個好的程序設計員。我覺得任何人都可以學習使用計算機,但是五十個人裡面大概只有一個人會成為像我這樣的極客。這意味著我們這些人將在這個領域中不斷創新,並與計算機產生共鳴。我們的思維方式會幫助我們更容易地學習如何製造機器。

高德納談計算機程序設計藝術2

Justin Richards:您為什麼會認為計算機科學是如此重要呢?

D. E. Knuth:計算機科學之所以重要,是因為它改變了溝通的方式。它還影響了金融業,這是我不太情願提及的。可惜的是,世人是以我和我的同行們對華爾街產生的影響來衡量我們的工作的。在這個意義上,我是很嫉妒天文學家的,因為世人認為天文學家由自己的興趣去研究天文學是值得尊重的。其實,我研究計算機科學也是同樣出於興趣啊。

我對IT這個說法並沒有太大的共鳴,真正打動我的是科學。對我而言,IT是不錯的東西,但並非我所擅長的領域。我的太太就能比我更快地掌握某個圖標的含義、找到要點擊什麼地方。但要讓機器完成複雜、細緻的工作,在科學上是有許多難題需要攻克的。我曾經覺得很多問題是無法找到答案的,但事實上我們已經一步步地知道要如何解決它們。對我來說,即便沒有任何金錢上的回報,我也會做這些工作。

Justin Richards:所以說您對此充滿激情嗎?

D. E. Knuth:那是,就像每天早上醒來我都會想著今天要好好寫個程序。

Justin Richards:您是受到繆斯女神的眷顧了吧?

D. E. Knuth:是啊,有些日子她給予我的靈感要比平常的多。甚至有某個階段,我幾乎認為有個繆斯女神一直在給我口授內容呢。

Justin Richards:在您看來,您在計算機科學領域最大的成就是什麼?

D. E. Knuth:我想我的第一個成果是研究編譯器的理論。我曾經研究過代數語言的理論,而在我寫這本書(第10章)的時候,我正試圖描述人們在這個領域的種種發現和成果,然後我突然意識到,可以有一種方法把這些發現和成果都關聯起來。由於這個發現過於新奇,我不知道該怎樣在書裡面闡釋它,於是就把它發表成一篇學術論文。後來,其他的人讀懂了我的意思並開始應用,最終讓這個發現成為了今天所有代數編譯器的分析原理。

不過我覺得我最大的成就是發明了比較算法優劣的數學方法。為了瞭解一個程序到底好不好,我創造了一種量化的比較方法,例如你可以說一個程序優於另外一個程序2.3倍。這個數學方法叫做算法分析,是我最引以為豪的學術成就,也是成功應用計算機的關鍵。

當我發明這套數學方法的時候,我跟我的出版商說,不如把這本書改名叫“算法分析”吧。但是他們說不行,這樣的話這書就永遠賣不出去了!但實際上那就是此書的核心內容,它除了綜合總結計算機學者發明的算法,還幫助我們從量化的角度去評價每個算法的優劣。


高德納談計算機程序設計藝術2


Justin Richards:在您的網站上有關於“你為何不用Email”的回覆,“對於那些生活在事務的頂端的人們而言,Email是個美妙的東西。但那不是給我用的,我的角色是在事件的底層。”您是否可以再解釋一下自己對Email的立場,以及“在事件的底層”的含義?

D. E. Knuth:有些人是不能整天聒噪不休的,他們要考慮的事情需要長時間的專注,對材料進行組織並營造堅實的基礎,而不僅僅是對前沿問題的驚鴻一瞥。

將某些內容以精確的形式表達出來是需要很長時間的。要正確地做好事情,我就必須專注地耗費大量的時間。當我被大家當作權威的時候,世上數不清的人們要來問這問那。因此,用了15年Email之後,我覺得真的足夠了。

Justin Richards:之前的一位圖靈演講者Grady Booch非常主張編程的簡潔性,而您在贏取西班牙“知識邊界獎”的導言中也有相同的觀點。您可否解釋一下您為何希望程序保持簡單、緊湊、易懂?

D. E. Knuth:我想我們要先溫習愛因斯坦的名言“要讓它儘可能的簡潔,而又不至於過分簡潔”。事實上並非樣樣事情都存在捷徑,都是簡單易懂的。然而我發現,如果我們有再三思考的機會,幾乎沒有一件事情是不能被簡化的。正因為如此,人們時不時會說:“好吧,基於我們現有的知識,讓我們把舊的東西推倒重來吧!”

幾年前在斯坦福有一個名為“清白歷史”的項目,口號是“讓我們找個更好的方法來實現因特網”。當東西被不斷添加進來並且累積一段時間後,你就會發現已經存在太多的垃圾,而這些垃圾現在看來已經沒有任何理由存在了。

那就像人的闌尾,也許曾經某個時候它是有存在的意義的,但是現在已經不再需要了。我覺得這個項目有潛力,儘管實現的可能性微乎其微,因為整個世界已經離不開現存的因特網了。要一個人跳出來說“讓我們重新設計整個因特網,從把程序導入計算機開始”,那是非常困難的。這有點像當時Linux的出現,其目的就是嘗試去簡化操作系統。

Justin Richards:您跟Grady Booch還擁有另外一個共同點,就是你們都講過你們可以欣賞到代碼和編程中體現的美,您這樣講的真正含義是什麼呢?

D. E. Knuth:我是從幾層不同的含義來看待“藝術”這個詞的。通常,藝術意味著人類創造的某種東西並非自然的。還有一層含義,那就是賦予美學價值的精緻藝術品。

很多情況下,所謂美感不過是“情人眼裡出西施”。但是,人們會因某個事物本身的優雅和諧而去創造它,那與評論和欣賞其他人的作品是類似的,我們會覺得自己感受到美。當這個作品達到某種標準的時候,我們會因之而滿足。

對於所謂的“某種標準”,可能Grady跟我的意見是不一樣的,那就如沒有任何兩個人能對哪種音樂是最好的問題達成完全一致的意見。但是,音樂家無疑是清楚自己喜歡和不喜歡什麼音樂的,也很清楚自己什麼時候創造出好音樂。這就很類似我看待程序的方式了。

Justin Richards:我想最終都是個人喜好的問題?

D. E. Knuth:的確如此。沒有一個算法你會在輸入以後問自己:這到底夠不夠漂亮呢?儘管的確有人嘗試去這樣做——美國最偉大的數學家之一 George David Birkhoff 曾經在三十年代寫過一本書,名為《美的衡量》。這本書充斥了形形色色的數學公式,還有一頁滿滿的印著各式各樣的希臘骨灰甕,並在每一個旁邊都給了一個美的評分。

他還給很多不同的設計系統評分。其中比較有趣的是,在他的一百強名單裡面,排行第二還是第三的是萬十字章——他本身是同情納粹的。我想這個圖標的旋轉方向要是反過來,對印度教來說可能有更大的宗教意義。我不認為可以衡量這些東西的美醜,但是他的確這樣做了,而且也有其他人作了同樣的嘗試。

Justin Richards:那麼說,還沒有人能編出評判程序的美醜程度的程序囉?

D. E. Knuth:實際上還沒有。有些軟件工程師因評測的需要而嘗試去做這樣的事情,我也不是很清楚。大家都知道,像你這樣的記者或者作家都有很多題材,你們需要量化數字來充實文字內容。例如,有人在開羅衝突中喪生,你們就需要弄清楚是300人還是315人,這是新聞報道的必備部分。量化資料可以提升質量。我也在嘗試尋找數字化的方法,不過,如果軟件工程師試圖衡量的是某個程序員的優秀程度,其實他們去問老闆就行了!

Justin Richards:我覺得數字的使用能讓人們在心裡面做個比較,例如20個人在這個事件中喪生,50個人在另外一個事件中喪生,那麼人們通過對比就會覺得後面這個事件更為嚴重。

D. E. Knuth:但這很可能其實是在用蘋果和橙子比較,因為一旦涉及到數字,人們就可能篡改某些數據來扭曲事實。你也可以想象教育學生,總想著學生怎麼樣才能通過考試,然後你就可能會編寫一本關於應試的書,而不是一本關於學習科學的書。

這樣一來一切都是為了在學科考試中獲取高分,然而問題是這些數字評分並不是總能很好的反映事物的本質。當你把一些事情量化了,假如你想的話你總是可以找到作弊的方法,因而也最終忘記了學習的初衷。


高納德作品目前已出版的中文版:

高德納談計算機程序設計藝術2

《美國科學家》(American Scientist)雜誌曾將《計算機程序設計藝術》與愛因斯坦的《相對論》、狄拉克的《量子力學》等書並列為20世紀最重要的12本科學類專著

比爾·蓋茨曾經花幾個月研讀《計算機程序設計藝術》,並這樣對廣大程序員說:如果你自以為是一個很好的程序員,請去讀讀高德納的《計算機程序設計藝術》吧……要是你真把它讀下來了,就毫無疑問可以給我遞簡歷了。

根據著名Common Lisp專家Peter Seibel的訪談筆錄成書的《編程人生》,記錄了15 位軟件先驅的編程生涯。Seibel特別有意思,在訪談每個大牛的時候基本都會問到一個問題:

“你覺得《計算機程序設計藝術》這套書怎麼樣?我在訪談中問過一些人,他們中有些真的從頭讀到了尾,有些把它放在書架上,在需要時作為參考書查閱,還有些就只是擺在書架上,連碰都不去碰它。”

以下大牛都認真研讀過高德納的《計算機程序設計藝術》:

  • 參與創建Common Lisp和Scheme的Guy Steele
  • Smalltalk之母Dan Ingalls
  • 調試大師Bernie Cosell
  • JavaScript宗師Douglas Crockford
  • JavaScript之父Brendan Eich
  • Java大神Joshua Bloch
  • Haskell先驅Simon Peyton Jones
  • 人工智能專家、谷歌研發總監Peter Norvig

關於TAOCP,他們有話說

Brendan Eich

Knuth 寫的《計算機程序設計藝術》,卷1到卷3,我很喜歡,特別是半數值算法那部分,還有雙重散列之類的,關於黃金比例的證明則被留做練習題,很有意思。

Joshua Bloch

Knuth的《計算機程序設計藝術》,事實上,我從來沒有讀完這一套書,沒有從頭到尾看過。但當我研究某個具體算法的時候,我就去看他會怎麼說。往往可以得到我想要的東西,這套書太全面了。

Douglas Crockford

在上大學時,有那麼幾個月我連房租都沒交,就是為了買他的書。我讀過這些書,從中得到了不少樂趣,比如在第一卷的索引有個關於拖車的笑話就很好玩。我到現在為止還沒能把書上的內容全部搞懂。Knuth對某些地方的研究要比我深入得多,但我還是喜歡這些書並把它們當做參考資料。

Simon Peyton Jones

Don Knuth的《計算機程序設計藝術》系列不是能夠一口氣讀下去的,不是那種書。在某個階段我多次推薦過這套書。

Peter Norvig

有段時間我拿它當我的顯示器底座,因為它是我最大部頭的成套書之一,而且高度恰好合適。我感覺這樣很舒服,因為它總在那兒陪著我,而且因為它就在我面前,所以我找參考書的時候就更容易去順手翻翻它。

Seibel:但你每次想查閱它,還得先把顯示器抬起來嗎?

Norvig:不用,我那套書是盒裝的,你只要使勁抽書就行,也可以只抽其中一本。


分享到:


相關文章: