具備實踐精神的理論家;咱們時代的達芬奇------高德納訪談錄

 
《程序員》雜誌的一位做者袁泳 先 生,曾經說太高德納是一位文藝復興時期式的天才人物,這說的是他的博學,以及他同時具有的靈巧的編程能力。在分工愈來愈細緻的現代社會,這確實很是罕見, 就像一我的本身製造一架飛機,他既要考慮空氣動力學問題,也要考慮飛機上的每棵螺絲釘的固定方式。也確實使咱們想到達芬奇,後者創造了享譽後世的《蒙娜麗 莎》,《計算機編程藝術》在計算機領域的影響能夠與之媲美,同時也是機器設計方面的專家。從計算機科學史上說,高德納正是生逢其時。1936 年,圖靈發表了《論可計算數及其在斷定問題上的應用》一文,確立了可計算模型。1953 年,巴克斯發明了Fortran 語言。從1960 年 代起,高德納以他的博識與耐心開始了《計算機編程藝術》的寫做,該書旨在對計算機科學理論的數學背景與歷史,作一梳理和總結。如今大學計算機系的《數據結 構》課程的內容基原本自該書。有人更是把它與牛頓的《天然哲學和數學原理》並列,選爲對世界歷史發生影響的十大科學著做,這不無理由。高德納本人在36 歲時,得到了計算機科學的最高榮譽--- 圖靈獎。從1993 年起,他主要專心致力於完成七卷本的《計算機編程藝術》一書。幾個星期之前,咱們採訪了他。使咱們特感幸運與欣悅的是,高德納先 生對咱們的採訪表現出極大的熱誠,在繁忙工做中抽出寶貴時間,細緻地回答了咱們的問題,並在通訊中特別強調但願用他的中文名字。從這裏,不難看出他對中國 和中國文化的熱愛。這在採訪的本文中也有所體現。當咱們談到最先的算法時,他特別提到《九章算術》,這本即便中國人也不多讀過的書。或者咱們能夠將此看做 一種激勵,正如高德納在採訪中所說,計算機科學的思想來自世界各個地域、各類文明。能夠期待,今天的中國也會產生如劉徽、秦九韶那樣的數學高手,對計算機 科學與技術作出獨特的貢獻。如下是採訪的本文:
本刊記者:什麼是最先的算法?
高德納 :我想,第一個「真正的」算法能夠追溯到大約4000年前,它們以楔型文字記載在粘土板上。我在文章「史前巴比倫算法」中對此有過討論(我將其翻譯爲現代註記方式),這篇文章也重印爲個人書《計算機科學論文精選》的第十一章。
固然,這些早期的算法並非很精巧。它們解釋瞭如何以計算的方式解決這些問題,但後來發現使用代數方法能更好地解決它們。最先的「有意義的」算法,它對於今天的程序員們仍然很重要,是最大公約數的求解。其中一個算法被稱爲歐幾里德算法,它被記載於歐幾里德幾何本來上,儘管它來自於歐多克索斯和其它一些更早期的人物。這種算法基於展轉相除法。另外一個算法僅須要除以二,所以很是適合當前的二進制計算機。這個算法可能發源於2000年前的中國——這要取決於咱們如何理解經典的《九章算術》中一些句子的隱藏的含義(我在個人書《半數值算法》的340到341頁和中文版的309頁討論了這個問題)。
本刊記者:奧運會今年夏天在中國舉行,這是對於中國來講是一件很重要的事情,由於它有一些特殊的含義,也許是一個符號,表示中國人能像接受希臘火炬同樣接受西方文化。希臘先哲畢達哥拉斯說過「我喜歡做爲奧運會的觀衆賽過成爲一個運動員或商人」。如今不少中國人也成爲了奧運會觀衆,我來問個問題:爲何希臘人發現的數學對於人類文明(包括計算機科學)如此重要?

高德納 : 希臘數學家發明的最偉大的東西是嚴格證實的概念。這個概念將數學與其它知識區別開來,其它知識每每是基於事實的累計、由老師傳授給學生的並由社會共識所評 估(舉個例子,物理中,並不知道一個假設的真假,而只能等着所謂專家們的想法愈來愈趨於統一。可是在數學中,不少事情都是無可辯駁的,或者說不存在不一樣的 觀點),縱觀人類歷史,那些沒有聽從希臘方式理解數學的文明把數學認爲是應該記憶的規則而不是能夠由邏輯推演而來的事實。在這些文明(例如古代中國、日 本、印度和哥倫布發現以前的美洲等)中,人們發現了不少重要的數學原理可是也犯了不少錯誤,由於學生否決老師是不明智的!這也是爲何我如此感激史前的希 臘數學家教會其餘人如何真正的證實問題。
    另外一方面,我但願澄清一點,我相信全部文明之間都是相互學習的。我爲計算機科學這個全世界成千上萬的人的共同成果而慶祝,每一個人都爲此貢獻了他們從經驗中而來的重要觀點。

本刊記者:如何看待數學和計算機科學之間的關係,特別是數學和算法學習之間的關係?
高德納 :你能夠參照我對第二個問題的回答,我認爲數學對於程序員最重要的意義在於它告訴咱們如何證實咱們的程序將會在全部狀況下正常工做。若非如此,咱們就得爲此擔憂,儘管咱們的程序經過了已有的全部測試,但或許明天它在處理另一些新數據時就會出錯。
固然,僅僅知道程序能正常工做這一點並不夠。有了數學,咱們能夠證實一個程序比另外一個程序快成千上萬倍。某些時候,咱們甚至能證實程序是「最好的」(best possible)——根據某些標準,沒有其它程序會比它好。
本刊記者:這個問題是關於您的書《計算機編程藝術(The Art of Computer Programming)》,寫這本書的主要目的是什麼呢?您是否試圖構建一個算法體系?您是如何選擇主題呢?
高德納 :我寫《計算機編程藝術》的主要目地是組織和理解一些普遍被各類程序使用的最基礎的想法。只要可能,我使用數學給出對於每種基礎的方法的對於精 確效率的計量的理解。此外,我儘可能敘述每一種方法的歷史,由於理解這些方法是如何被發現的有助於咱們在現時和從此發明新的方法。
可是,書的主題是1962年 選定的,這時計算機科學還沒發展到一個做者沒法掌握的規模。所以,沒有像操做系統、並行處理、分佈式處理之類的資料。此外,我更多地使用整數而不是浮點 數。我把高級數學主題,例如數值分析、計算幾何留給別人討論。我關注的是程序員與機器間的低層次接口,爲支持高級應用程序而用於構建庫和工具的基礎的子程 序。然而,儘管將主題列表作了如此多限制,我這個關於計算科學的一小部分仍舊是一個如此巨大的主題,我須要爲剩下的內容工做20年!因此,我但願一直保持健康。
 
本刊記者:個人不少朋友都嘗試過閱讀《計算機編程藝術》,可是他們發現這很是困難。我據說一個小說家——詹姆斯喬伊斯(James Joyce),《尤利西斯》(Ulysses)的做者——有人爲他的小說寫了本書,名字叫《喬伊斯小說指導》,我不知道有沒有針對 《計算機編程藝術》 的相似書籍,好比 《計算機編程導論閱讀指導》。您能給 《計算機編程藝術》 的讀者一些建議嗎?
 
高德納 :《計算機編程藝術》不是爲全部人寫的。大約每50我的中就有一個能發展出獨特的看問題的方式,這使他們成爲真正的程序員。像你我這樣的人,傾向於將知識用特殊的形式在腦中組織以便於更好地利用電腦。每50人中的另外49人不應從事編程這一行,儘管他們可使用計算機完成一些不須要編程的任務。
對程序員來講,擁有非程序員的朋友是很是重要的,因此對於你所說的你有朋友閱讀《計算機編程藝術》很是困難,我並不以爲奇怪。固然,你的朋友也許不該該閱讀你看過的全部書籍,你也不該期待能輕易看懂他們的書籍!最好的方法是團隊合做,用天分和技巧做爲補充。

本刊記者:您認爲對最近一些年來講,計算機科學最須要解決的問題是什麼?

高德納 :我在全部地方都看到很大的發展的潛能。因此,從這些一樣精彩的候選者中我沒法選擇。機器人、加密、製圖(mapping)、動態規劃、大量文本或大量DNA序列的搜索等等,都亟待提升。
總 的來講,我認爲我期待的主要進步來自於程序員和非程序員的合做。好比,人類能更好地理解動做。我相信不少針對醫生、化學家、物理學家、生物學家等的將數據 以動畫形式表現出來的工具應該被開發出來。要實現它們,須要優秀的程序員實現動畫,與可以理解人類視覺能力的優秀的圖形設計師一塊兒工做,與知道哪些數據需 要被理解的優秀的醫生、化學家、物理學家和生物學家一塊兒工做。
本刊記者 我據說狄克斯特拉(Edsger W. Dijkstra)曾經試圖解決這樣的問題:什麼是正確的程序?所謂的形式證實?如今在軟件工業中,咱們主要依靠測試而編寫正確的程序。有沒有可能在理論上找到一種方法讓咱們知道程序是否正確,尤爲是對大規模的程序?
高德納 :在我回答第二個問題的時候,我提到使用數學去證實(不是重複地測試直到你找不到錯誤)的重要性。克斯特拉和其餘人都發展了驗證正確性方法,這些方法能夠放大,以驗證「大」程序。可是,如你指出的,軟件工業界並無真正聽從他們的建議。部分的問題在於——「大」的含義一直在變:當咱們有一個能夠工做的大程序,人們經常就想寫一個更大的,這也就更加難以驗證。驗證技術從沒有跟上人們對於代碼體積愈來愈大的胃口。
我將會試着同時從理論和實踐上解釋個人態度。拿個人程序TeX作例子,它按照今天的標準來講並不「大」,它只有500頁的代碼。我並無完成對於TeX徹底的形式化的正確性證實,儘管我很是喜歡數學證實。可是,我已經很是熟悉驗證的基礎,我知道如何非形式化地使用它們——大致上我知道如何證實正確性,若是我有時間去研究每個瑣碎的細節(grind through the gory details)。
沒有這些基礎知識,個人程序可能會常常崩潰,像你我知道的一些商業軟件同樣。有了這些知識,我就能寫出很是穩定和好用程序,但也僅是在我測試了它以後!
讓我從另外一個不一樣角度再說一遍:沒有理論,我不知道程序可被證實的正確是什麼意思,我掙扎前進(flounder)。可是儘管有了理論,我也不能肯定個人程序是好的,除非我進行了普遍的測試!
爲何?由於在現實中,沒有程序能被真正被證實是正確的:假定的「證實」可能包含錯誤。若是某人給我看一個通過形式化證實的程序,我不得不檢查一下驗證過程有沒有錯誤。驗證過程也許由機器完成,可是機器邏輯也許是錯誤的,如此這般。這是一個永無終點的循環。
數學展現給咱們理想,咱們能夠檢查證實,直到咱們認爲它們是合理的。可是隻有不會犯錯的超人能真正得出證實是正確的結論。
進一步來講,證實程序是否知足它的規格說明(specification)的想法也是值得懷疑的,由於規格說明自己多是不正確的。實際上TeX並無精確的規格說明,若是有,我也認爲它徹底沒有用處!(不是每一個人贊成我這個觀點,但他們應該設計並實現一個完美排版軟件,在我已完成了TeX這個排版軟件的時候。)
總之,我認爲將「形式證實」和「測試」分裂開來是危險的。最好的作法是正確地同時使用兩種方法。我在個人著做《Literal Programming》的第十章和第十一章詳細地討論了TeX的調試(在《Digital Typography》的第三十四章中討論了後續開發)。
本刊記者:咱們的雜誌名字叫《程序員》,因此個人最後一個問題是:什麼是程序員,您如何看待程序員?
高德納 :程序員選取一個抽象的算法,並將其轉化爲以某種定義良好的語言寫成的程序中的具體形式,程序才能夠被機器執行。
    「 算法」之於「程序」就相似於「信息」之於「數據」: 信息是理想化的抽象的概念,它或多或少能夠由某種精確的方法將其編碼爲數據,以完美地表達。一個算法是一種理想化的可計算的爲某些任務服務的過程,它或多 或少能夠由某種精確的方法將其編碼爲程序,以完美地表達。可是程序員事實上不只僅是寫程序的人。真正的任務是編寫能夠被人們閱讀的程序,而不只僅是編寫可 以被機器分析的程序,由於人們會須要驗證它(非形式化的)、修改它和維護它。這就是爲何我堅信「做文式程序設計(literate  programming)」——像文學創做那樣寫程序,寫出本身的風格,爲他人所欣賞。
原文: http://blog.csdn.net/programmer_editor/archive/2008/12/11/3501111.aspx
相關文章
相關標籤/搜索