你不知道的關於計算機大師Dijkstra的事情

Dijkstra 的全名叫 Edsger Wybe Dijkstra(艾茲赫爾·韋伯·戴克斯特拉)。大部分中國程序員如果能記住這個名字是因爲學過計算最短路徑的「Dijkstra 算法」,然而大部分人都難以記住正確的拼寫,因爲他是荷蘭人,名字不符合英語的發音規則。

他是幾位影響力最大的計算科學的奠基人之一,也是少數同時從工程和理論的角度塑造這個新學科的人。他的根本性貢獻覆蓋了很多領域,包括:編譯器、操作系統、分佈式系統、程序設計、編程語言、程序驗證、軟件工程、圖論等等。他的很多論文爲後人開拓了整個新的研究領域。我們現在熟悉的一些標準概念,比如互斥、死鎖、信號量等,都是 Dijkstra 發明和定義的。1994 年時有人對約 1000 名計算機科學家進行了問卷調查,選出了 38 篇這個領域最有影響力的論文,其中有五篇是 Dijkstra 寫的。

Dijkstra 在鹿特丹長大。在高中畢業前他想在法學界發展,並且希望將來能在聯合國做荷蘭的代表。然而因爲他畢業時數學、物理、化學、生物都是滿分,老師和父母都勸他選擇科學的道路,後來他選擇學習理論物理。在大學期間,世界上最早的電子計算機出現了,他父親讓他到劍橋大學參加一個程序設計的課程。從這裏開始,他的程序設計生涯開始了。一段時間以後他決定轉向計算機程序設計,因爲他認爲相對於理論物理,程序設計對智力是更大的挑戰。程序設計是最無情的,每一個一和零都容不得差錯。

後來他在阿姆斯特丹的數學中心成爲了一個兼職的程序員。他的工作是爲一些正在被設計製造的計算機編寫程序,也就是說他要用紙和筆把程序寫出來,驗證它們的正確性,和負責硬件的同事確認需要的指令是可以被實現的,並寫出計算機的規範說明。他爲並不存在的機器寫了五年程序,因此他很習慣於不測試自己寫的程序,因爲無法測試。這意味着他必須通過推理說服自己程序是正確的,這種習慣可能是他後來經常強調通過程序結構保證正確性易於推理的原因。他曾經被後來出現的實時中斷困擾了一陣子,因爲中斷隨時可能發生,讓證明程序的正確性變得複雜了很多。他的博士論文就是關於一個他寫的實時中斷處理程序。

在他決定成爲一個程序員後,他儘快完成了學業,因爲以他的話說,他在大學裏不再受歡迎了:物理學家們覺得他是逃兵,而數學家們也看不起他和他做的事,因爲在當時的數學文化裏,你的課題必須和 ∞ 有關纔會受尊重。那個時候程序設計沒有成爲一個職業,沒有人能說出這個行業的基礎知識體系是什麼,而這些都會被 Dijkstra 改變。1957 年,他結婚的時候在申請的職業一欄寫上了「程序員」,結果被政府拒絕,因爲當時荷蘭沒有這個職業。

在一臺新的叫 ARMAC 的計算機發布之前,Dijkstra 需要想出一個可以讓不懂數學的媒體和公衆理解的問題,以便向他們展示。有一天他和未婚妻在阿姆斯特丹購物,他們停下來在一家咖啡店的陽臺上喝咖啡休息,他開始思考這個問題。他覺得可以讓計算機演示如何計算荷蘭兩個城市間的最短路徑,這樣問題和答案都容易被人理解。於是他在 20 分鐘內想出了高效計算最短路徑的方法。Dijkstra 自己也沒有想到這個 20 分鐘的發明會成爲他最著名的成就之一,並且會被以他的名字命名爲 Djikstra 算法。三年以後這個算法才首次發佈,但當時的數學家們都不認爲這能成爲一個數學問題:兩點之間的路徑數量是有限的,其中必然有一條最短的,這算什麼問題呢?在之後的幾十年裏,直到今天,這個算法被廣泛應用在各個行業。Djikstra 的眼科醫生一直不知道他是做什麼的,有一天突然問他:「是你發明了 GPS 導航的算法嗎?」。一問之下,原來他讀了 2000 年 11 月的科學美國人雜誌,講 GPS 的文章裏說到了 Djikstra。


求解最短路徑的 Dijkstra 算法

Dijkstra 後來在採訪中說,他的最短路徑算法之所以能如此簡潔,是因爲當時在咖啡店裏沒有紙和筆,這強迫他在思考時避免複雜度,儘可能追求簡單。在他的訪談和文章中,經常能發現一個主題,就是資源的匱乏往往最能激發創造性。

Dijkstra 第一次美國之行給他留下了深刻印象。在 1963 年時他已經小有名氣,ACM 邀請他參加了一次在普林斯頓的會議,這也是他第一次和 Donald Knuth 會面。第一個演講者是一個來自 IBM 的人,Dijkstra 發現他完全聽不懂這個人講的內容,也不理解寫滿了整個黑板的公式,而很多其他聽衆都積極提出問題並參與討論。在茶歇的時候他對其他人表達了擔憂,認爲自己可能不適合參加這個會議,美國的參會者告訴他「哦,不必擔心。其實大家都聽不懂他說什麼。但是這次會議是 IBM 贊助的,所以得讓他們先上臺,而且不能冷場。」Dijkstra 後來似乎一直對 IBM 不太感冒。IBM 的 System/360 大型機發布後,他花了一些時間閱讀 360 的手冊,他把這段時間描述爲「我職業生涯中最黑暗的一週」。後來蘇聯決定建造和 360 完全兼容的計算機,Dijkstra 在一次會議上說「這是美國在冷戰中最大的勝利」。

之後 Dijkstra 進入了學術上最活躍的時期,他解決了多個圖論算法問題,他發表的關於併發程序控制的論文開創了分佈式計算和併發計算的領域,他也首先定義了互斥和死鎖並提出瞭解法。他和  Jaap Zonneveld 一起寫了第一個 ALGOL 60 的編譯器,這是最早支持遞歸的編譯器。他們約定項目結束前都不許刮鬍子,Zonneveld 在結束後很快剃掉了鬍子,而 Dijkstra 從此終身留着鬍子。

1960 年代後期,由於計算機變得越來越強大,程序設計和維護的方式跟不上軟件複雜度的快速上升,世界進入了「軟件危機」。Dijkstra 在 ACM 的月刊上發表了一篇名爲 GOTO Statement Considered Harmful 的文章爲全世界的程序員們指明瞭方向,這就是結構化程序設計運動的開始。他和 Hoare、Dahl 合著的《結構化程序設計》成爲了這次軟件史上第一次變革的綱領,影響了此後大部分程序設計語言,包括 70、80 後程序員熟悉的 C 和 Pascal。很多大學的第一門程序設計課就是以這本書的名字作爲課程名。

在分佈式計算方面,除了定義前面提到的互斥、死鎖等併發控制的基礎概念和問題,他還開創了自穩定系統這個子領域,並且是最早對容錯系統進行研究的人。我自己的 Ph.D. 論文就屬於對自穩定系統的研究。分佈式計算最權威的會議是 PODC,而 Leslie Lamport 曾經評價到,PODC 之所以存在就是因爲 Dijkstra。「PODC 影響力論文獎」是分佈式計算領域最高的榮譽,它認可的是經過時間考驗的重要成就。我自己的導師 Michael Fischer 和 Nancy Lynch、Michael Paterson 一起在 2001 年獲獎。2002 年,Dijkstra 去世,這一年的 PODC 獎頒給了他,獲獎論文是他 1974 年關於自穩定系統的論文。爲了紀念他,PODC 決定從 2003 年把這個獎項改名爲 Dijkstra 獎。所以 Dijkstra 是少數獲得過以自己的名字命名的獎項的人之一。

Dijkstra 在學術界有一些很知名的個性。讀過碩士或者博士的人大多對論文的應用次數、影響因子之類的東西很敏感,中國學術界尤其如此。而 Dijkstra 在他的書和文章裏幾乎從來不提供參考文獻列表,很多人對此很不滿,而他認爲這樣增強了他工作的獨立性。他在德州大學奧斯丁分校的教學風格也很獨特。在每個學期開始的時候,他會給每個學生拍一張照片以便記住他們的名字(這是在智能手機還沒發明,使用老式相機的時代)。他的課程幾乎都沒有指定教科書,少數有教科書的時候也是他自己寫的書。我上大學的時候,有很多教授也有隻用自己寫的教科書的習慣,但可能原因不一樣吧。他通常用口試的方式進行期末考試,花一週的時間讓學生逐個到他辦公室或家裏考試,每個人要用兩三個小時。

儘管計算機軟件技術有很大一部分是 Dijkstra 發明的,但他卻很少使用計算機,或許這和他作爲程序員時很大一部分時間是在爲還沒造出來的計算機開發程序有關係。後來在德州大學的同事壓力下他購買了一臺 Macintosh 電腦,但只用來回覆電子郵件和瀏覽網頁。和 Donald Knuth、Leslie Lamport 這樣關注於論文的數字排版併發明瞭 TeX 和 LaTeX 來做這件事的計算機科學家不一樣,Dijkstra 從不用計算機寫論文。他認爲應該不需要草稿和編輯就能寫出一篇文章,所以他通常在腦中把整篇文章構思好才把文字落到紙上。在早期他用打字機,後來他一直只使用 Montblanc 的 Meisterstück 鋼筆。這在計算機學界是很有名的習慣,很多人都收到過 Dijkstra 用 Montblanc 寫的信。Montblanc 應該請他做代言。

Dijkstra 通常會用鋼筆寫好一篇文章,然後複印一些在同事中小範圍散發,而這些同事又會複印更多,發佈到更廣的範圍。他一生中寫了 1300 多篇文章,他用自己姓名的首字母 EWD 給他們編號:EWD 1, EWD 2, … EWD 1318。在計算機科學中,這些文章被統稱爲「EWD 報告」。他的算法和文章大都讓人感受到簡潔、經濟、優雅。他對簡潔的熱愛來自於早年母親的指導。他曾經問他的母親數學是不是一個很難的學科,她回答說「如果你需要超過五行文字來證明什麼,那你的方向多半錯了」

最後,作爲結語,送給大家一句 EWD 1213 裏的名言:

如果十年以後,你以快而髒的方式做什麼事的時候,能想象我在你的肩後看着,然後對自己說:「Dijkstra 不會希望這樣的。」那麼對我來說,這就和永生一樣了。
— Edsger Wybe Dijkstra

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章