王垠:我和權威的故事

古希臘的漢密士發表於2020-11-15

原文連結:https://www.douban.com/note/747557052/



幻覺

每個人小時候心裡都是沒有權威的,就像每個人小時候也都不相信廣告一樣。可是權威就像廣告,它埋伏在你的潛意識裡。聽一遍不信,聽兩遍不信……直到一千遍的時候,它忽然開始起作用了,而且這作用越來越強。

消滅廣告所造成的幻覺,最好的辦法就是去嘗試,去實地的考察它。有些虛幻的東西只要你第一次嘗試就會像肥皂泡一樣破滅掉。可是如果你不主動去接觸它,它就會一直在你腦海裡造成一種美好神聖的假象。越是得不到的越是覺得美好。很神奇的一個現象就是,權威對人思想的作用其實也跟廣告一樣。

上大學以前的人因為沒有專業,所以還不怎麼崇拜權威,大不了追追歌星,影星,球星啥的。而進了大學之後,就會開始對本領域的權威耳濡目染。一遍,兩遍,一千遍的聽到同學們仰慕某“牛人”或者“大師”的名字,雖然從來沒親身見過,不知不覺就對這人產生了崇拜心理,然後自愧不如。不知不覺的,自己也開始附和這些說法,不自覺地提到這些大師的名字,引用他們說的話作為自己的行動指南。

Donald Knuth, Dennis Ritchie, Ken Thompson, Rob Pike, … 就是通過這些途徑成為了很多計算機學生的權威。以至於幾十年以後,他們的一些歷史遺留下來的糟糕設計和錯誤思想還被很多人奉為神聖。


Donald Knuth

很多人包括我都曾經對 Knuth 和他的 The Art of Computer Programming (TAOCP) 極度崇拜。在我大學和研究生的時候,有些同學花了不少錢買回精裝的 TAOCP 全三卷,說是大概不會看,但要供在書架上,鎮場子。當時我本著“書非借不能讀也”的原則,再加上搬家的時候書是最費力氣的東西,所以堅決不買書。我就從圖書館把 TAOCP 借了來。說實話我哪裡看的下去啊?那裡面的程式都是用一個叫 MIX 的處理器的組合語言寫的。一個位元組只有6位,每位裡面可以放一個十進位制數(不是二進位制)!還沒開始寫程式呢,就開始講數學,然後就是幾十頁的公式推導,證明…… 接著我就睡著了。但我總是聽說有人真的看完過 TAOCP,然後就成為了大師。比爾蓋茲也宣稱:“要是誰看完了 TAOCP,請把簡歷投給我!” 在這一系列的號召和鼓吹之下,我好幾次的把 *AOCP 借回來,下定決心這次一定看完這曠世奇書。每次都是雄心勃勃的開始,可從來就沒看完過開頭那段 MIX 機器語言和數學公式。

看不懂 TAOCP總是感覺很失敗,因為看不懂 TAOCP 就成不了“大師”,可我仍然認為 Knuth 就是電腦科學的神,總能從他那學點什麼吧,所以又開始折騰他的其他作品。這就是為什麼我開始用 TeX,並且成為中國 TeX 界的主要“傳教士”之一。為了 TeX,我把 Knuth 的 TeXbook 借回來,從頭到尾看了兩遍,做完所有的習題,包括最難最刁鑽的那種“double bend”習題。接著又開始看 MetaFont Book,開始使用 MetaPost 進行繪圖。開頭還挺有成就感,可是不多久就發現學會的那些 TeX 技巧到了臨場的時候就不知道該怎麼用,然後就全都忘記了。這就是為什麼我把 TeXbook 看了兩遍,可是看完第二遍之後不久還是忘記得一乾二淨。

師兄師姐看到我用 TeX ,說怎麼折騰這麼過時的玩意兒。我很氣憤他們以及國內學術界居然都用 Word 排版論文,就開始針鋒相對,寫出一系列煽動文章鼓吹 TeX 的種種好處,打擊“所見即所得”這種低智商玩意兒。這還不夠,又開始折騰 Knuth 設計的 MMIX 處理器,並且認為 MMIX 的暫存器環就是世界上最先進的設計。發現一些無關緊要的小錯,就給 Knuth 發 email,居然拿到兩張傳說中的“Knuth 支票”,並且一度引以為豪。當然像所有拿到 Knuth 支票的人一樣,你是不會去兌現它的,甚至有人把它們像獎狀一樣放在相框裡。我還沒那麼瘋狂,那兩張支票一直在它們原來的信封裡。多年以後我到美國想兌現那支票的時候,發現它們已經過期了。

當你心裡有了這樣的權威,其他人的話你是不可能聽得進去的,就算他們其實比你心目中的權威更具智慧也一樣。在清華的時候我有時候去姚期智的小組聽客串講座。有一次請來了美國某大學一個教授講演算法,不知道怎麼的我就跟他聊起 TAOCP,大概是想請教他如何學習演算法。他跟我說 Knuth 的書已經比較過時了,你可以看看 MIT 的那本《演算法導論》。可是這位教授的名氣怎能和 Knuth 相比,這話我恁是沒有聽進去,仍然認為 TAOCP 隱藏了演算法界最高的機要,永恆的珍寶。

在清華的時候我很喜歡一門叫做“計算幾何”的課,就經常跟那門課的老師交流思想。有一次我在 email 裡面提到 Donald Knuth 是我的偶像,那位老師很委婉的回覆道:“有偶像很好啊,Knuth 也曾經是我的偶像。” 我對“曾經”這兩個字感到驚訝:難道這意味著 Knuth 現在不是他的偶像了?在我執意的詢問之下他才告訴我,其實世界上還有很多更聰明的人,Knuth 並不是電腦科學的一切。你應該多看看其他人的作品,特別是一些數學家的。然後他給了我幾個他覺得不錯的人的名字。

現在回想起來,這些話對我是有深遠作用的。那位老師雖然在系裡的“牛人”們眼裡是個研究能力(也就是發 paper 能力)不強的人,但是他卻對我的人生轉折有著強有力的作用。他引導了我去追尋自己真正的興趣,而不是去追尋虛無的名氣。我發現很多人都在為著名氣而進行一些自己其實不感興趣的事情,去做一些別人覺得“牛氣”的事情。我真希望他們遇到跟我一樣的好老師。

在現在看來,Knuth 的 TAOCP 就是所謂的“神聖的白象”(white elephant)。大家都把它供起來,其實很少有人真的看過,卻要顯得好像看過一樣,並且看得津津有味。這就讓試圖看懂它的人更加自卑和著急,甚至覺得自己智商有問題。別人都看過了,我怎麼就看不懂呢?其實 TAOCP 裡面的大部分演算法都不是 Knuth 自己設計的,而且他對別人演算法的解釋經常把簡單的問題搞得很複雜。再加上他執意要用匯編語言,又讓程式的理解難度加倍。

有一句話說得好:“跟真正的大師學習,而不是跟他們的徒弟。”如果你真的要學一個演算法,就應該直接去讀那演算法的發明者的論文,而不是轉述過來的“二手知識”。二手的知識往往把發明者原來的動機和思路都給去掉了,只留下蒼白無味,沒有什麼啟發意義的“最後結果”。確實是這樣的,多年以後當我看見 Knuth 計劃中的幾卷新的 TAOCP 的目錄時,發現其中大部分的東西我已經通過更容易的方式學到了,因為我找到了這些知識的源頭。

所以之前的那位訪問清華的教授說的其實是實話,Knuth 真的落伍了,可是就算在美國也少有人知道或者承認這個情況。有一次看一個對世界上公認最厲害的一些程式設計師的採訪,包括總所周知的一些大牛,以及 ML 的設計者 Robin Milner,Haskell 的設計者之一 Simon Peyton Jones 等人。也不知道採訪者是什麼心理,在對每個人的採訪中他都問,你看過 TAOCP 嗎?大部分人都說看過,真是了不起的鉅著,很重要啊云云。只有 Robin Milner (如果我沒記錯的話)比較搞笑,他說我希望我看過,但是可惜實在沒時間。我一直把 TAOCP 墊在我的顯示器下面,這樣我工作時就可以一直看著它們。

Knuth 說過早優化是萬惡之源,然而他自己卻是非常喜歡用過早優化的人。他的程式碼裡到處是莫名其妙的小聰明,小技巧。把程式碼弄得難懂,實際上卻並沒有得到很多效能的提高。有一次看 MMIX 處理器的模擬程式,發現他用來計算一個暫存器裡的“1”的個數的程式碼非常奇怪。本來寫個迴圈,或者用那種從末位減 1 的做法就可以了,結果他的程式碼用了 Programming Pearls 裡面一個古怪的技巧,費了我半天時間才看懂,後來我發現這個技巧其實還不如最簡單的方法。就是這些細小卻又蹊蹺的做法,使得 Knuth 的程式碼用細節掩蓋了全域性,所以到最後我其實也沒從大體上搞懂一個處理器的模擬器應該如何工作。直到後來到印第安納大學學習了程式語言的理論之後我才發現,其實處理器模擬器(以至於處理器本身)的工作原理很簡單,因為它就是一個機器程式碼的直譯器。使用跟高階語言直譯器同樣的結構,你可以比較容易的寫出像 MMIX 模擬器那樣的東西。

Knuth 最重要的一個貢獻恐怕是程式語言的 parsing (語法分析),比如 LR parsing,然而 parsing 其實是一個基本不存在的人造問題。它的存在是因為人們的誤解,以為程式語言需要有跟人類語言一樣的語法,所以把程式語言搞得無端的複雜和困難。如果你把語法簡化一下,其實根本用不著什麼 LR,LALR。我最近給我自己設計的語言寫了一個 parser ,從頭到尾只花了兩個小時,500 行 Java 程式碼,包括了從 lexer 一直到 AST 資料結構的一切。完全手寫的程式碼,根本沒用任何複雜的 parsing 技術和 YACC 之類的工具,甚至正規表示式都沒有用。之所以可以這樣,因為我的語法設計讓 parsing 極其容易,比 Lisp 還要容易。Knuth 過度的強調了 parsing。他的誤導使得很多人花了幾十年時間來研究 parser,到現在還在不時地提出新的技術,用於設計更加複雜的語法。何必呢?這隻會讓程式設計師和編譯器都更加痛苦。如果這些人把時間都花在真正的問題上,那今天的電腦科學不知道要美好多少。

幾乎每一本編譯器教材都花大量篇幅來講述 DFA, NFA, lexing, LL, LR, LALR…… 幾乎每個學校的編譯器課程都會花至少 30% 的時間來做 parser,折騰 LEX,YACC 等工具,而對於編譯器真正重要的東西卻沒有得到很多的訓練。這就是為什麼 Kent Dybvig 的編譯器課程如此有效,因為 Scheme 的語法非常簡單,我們根本沒有花時間來做 parser。我們的時間用在了思考真正的問題:做優化,實現尾遞迴,高階函式…… 很多語言夢寐以求卻又做不好的東西。 這樣的課程給了我可以發揮自己潛力的餘地,我的課程編譯器裡面具有大量的獨創寫法,我的 X64 機器程式碼生成器生成極其短小的程式碼,讓 Kent Dybvig 都在背地裡琢磨是怎麼回事。這些東西到現在也許仍然是世界上最先進的技術。

一個人的思維方式似乎決定了他設計的所有東西。Knuth 的另一個最重要的發明,文學程式設計(Literate Programming)其實也是多此一舉,製造麻煩。文學程式設計的錯誤在於認為程式語言應該像人類語言,應該適應所謂的“人類思維”。然而程式語言卻是在很多方面高於人類語言的,它不應該受到人類語言裡的糟粕的影響。把程式按照 Knuth 的方式分開在不同的文章段落裡,造成了程式碼之間的關係很難搞清楚,而且極其容易出錯。這個錯誤與“Unix 哲學”的錯誤類似,把程式作為一行一行的文字,而不是一個像電路圖一樣的資料結構。我不想在這裡細說這個問題,對此我專門寫了一篇文章,講述為什麼文學程式設計不是一個好主意。

TeX 其實也是異常糟糕的設計。它過度的複雜,很少有人搞得懂怎麼配置。經常為了一個簡單的效果折騰很久,然後不久就忘了當時怎麼做的,回頭來又得重新折騰。原因就是因為 TeX 的設計缺乏一致性,特殊情況太多,而且組合能力很差。所以你需要學太多東西,而不是跟象棋一樣只需要學習幾個非常簡單的規則,然後把它們組合起來形成無窮的變化。

在程式語言設計者看來,TeX 的語言是世界上最惡劣的設計之一,但如果沒有這個語言,它也許會更加糟糕。其實 TeX 之所以有一個“擴充套件語言”,有一個鮮為人知的小故事。在最早的時候 Knuth 的 TeX 設計裡並沒有一個語言。它之所以有一個語言是因為 Scheme 的發明者 Guy Steele。Knuth 設計 TeX 的那個時候 Steele 碰巧在史丹佛實習。他聽說 Knuth 要設計一個排版系統,就建議他設計一個語言,以應付以後的擴充套件問題。在 Steele 的強烈建議和遊說之下,Knuth 採納了這個建議。可惜的是 Steele 並沒能直接參加語言的設計,在短短的一個夏天之後就離開了史丹佛。

Knuth 的作品裡面有他的貢獻和價值,TeX 的排版演算法(而不是語言)也許仍然是不錯的東西。可是如果因為這些好東西愛屋及烏,而把他所推崇的那些亂七八糟的設計當成神聖的話,那你自己的設計就逃脫不出同樣的思維模式,讓簡單的事情變得複雜。仍然對 TeX 頂禮膜拜的人應該看一下 TeXmacs,看看它的作者是如何默默無聞的,徹徹底底的超越了 TeX 和 Knuth。

在我看來,Knuth 是個典型的精英主義者,他覺得自己做的都是最好,最有“格調”的。他利用自己的權威和特立獨行來讓使用者屈服於自己繁複的設計,而不是想法設計出更加易用的工具。TeX 的版本號每次更新都趨近於圓周率π,意思是完美,沒有 bug。他獎勵大額的支票給發現 TeX 程式碼裡 bug 的人,用於顯示自己對這些程式碼的自信,然而他卻“冰封”了 TeX 的程式碼,不再填加任何新東西進去,也不再簡化它的設計。當然了,如果不改進程式碼,自然就不會出現新的 bug,然而它的設計也就因此固步自封,停留在了幾十年以前。更奇怪的是,“TeX”這個詞居然不按照正常的英語發音邏輯讀成”teks”。每當有人把它“讀錯”,就有“高手”打心眼裡認為你是菜鳥,然後糾正:“那個詞不讀 teks,而要讀‘特喝’,就像希臘語裡的 chi,又像是蘇格蘭語的 loch,德語的 ach,西班牙語的 j 和俄語的 kh。”也許這就叫做附庸風雅吧,我是純種的歐洲人!當一個軟體連名字的發音都這麼彆扭,這麼難掌握,那這個軟體用起來會怎樣?每當你提到 TeX 太不直觀,就有人跟你說:“TeX 是所想即所得,比你的所見即所得好多了!”可事實是這樣嗎?看看 TeXmacs 吧,理解一下什麼是“所見即所得+所想即所得”二位一體。

我跟 Knuth 的最後一次“聯絡”是在我就要離開清華的時候。我從 email 告訴他我覺得中國的研究環境太浮躁了,不是做學問的好地方,想求點建議。結果他回紙信說:“可我為什麼看到中國學者做出那麼多傑出的研究?電腦科學不是每個人都可以做的。如果你試了這麼久還不行,那說明你註定不是幹這行的料。”還好,我從來沒有相信他的這段話,我下定了決心要證明這是錯的。多年的努力還真沒有白費,今天我可以放心的說,Knuth 你錯了,因為我已經在你引以為豪的多個方面超過了你。


Unix

Unix 的創造者們是跟 Knuth 非常類似的權威,他們在我的心目中也曾經佔據了重要的位置,以至於十年前我寫了一篇文章叫《完全用 Linux 工作》,大力鼓吹 Unix 的“哲學”,甚至指出 Linux 不能做的事情就是不需要做的,並且介紹了一堆難用的 Unix 工具,引得很多人去折騰。可如果你知道我現在對 Unix 的態度,肯定會大吃一驚,因為在經過努力之後,我成功的“忘記”了 Unix 的幾乎一切,以至於本科剛畢業的學生都會以為我是腦盲,並且以為可以在我面前炫耀自己知道的 Linux 技巧。他們不會明白,在我心裡 Unix/Linux 的設計是計算機軟體界目前面臨的大部分問題的罪魁禍首,而他們顯示給我看的,只不過是 Unix 的思想和精英主義給程式設計師造成的精神枷鎖。其實我並不會忘記 Linux 的設計,但我已經下意識的以熟悉 Linux 的奇技淫巧為恥,所以很多時候我即使知道也要裝作不知道。因為我是機器的主宰,而不是它的奴隸,所以我總是想辦法讓機器去幫我做更多的事,幫我記住那些無聊的細節,而不是去順從它的設計者所謂的“哲學”。

評論 Unix 和它的後裔們總是一件尷尬的事情,因為你提到它們的任何一個缺點,都會被很多人認為是優點。GNU 的含義是“GNU is Not Unix”,但很可惜的是 GNU 和 Linux 的設計從來沒有擺脫過 Unix 思想的束縛。Unix 的記憶體管理,程式,執行緒,shell,程式間通訊,檔案系統,資料庫…… 幾乎都是很蹩腳的設計。所謂的“Unix 哲學”,也就是程式間通訊主要依靠無結構字串,造成了一大批過度複雜,毛病眾多的工具和語言的產生:AWK,sed,Perl,…… Unix 的記憶體管理是按“頁”而不是按“結構”分配,相當於把記憶體分配的任務完全推給應用程式。而且允許任意的指標操作,這就像給每個老百姓一把愛走火的槍。可是又想要“安全”,自相矛盾。沒辦法,不得不強制程式資料空間完全隔離,使得程式間無法直接傳遞資料結構。程式和執行緒上下文切換開銷過大,造成了使用大規模併發或者分散式計算的瓶頸,導致了 goroutine 和 node.js 等“變通方法”的產生。把資料無結構的儲存在檔案裡,無法有效的查詢資料,造成了關係式資料庫等過度複雜的資料解決方案的產生。再加上後來 WEB 的設計,現在的網站基本上就是補丁加補丁,一堆堆的 hack。

“Unix 哲學”貌似也有好的部分,比如“每個程式只做一件事,多個程式互相合作。”然而,這個所謂的哲學其實就是程式語言(比如 Lisp)裡面的模組化設計。它當然是好東西,然而這些思想被 Unix 偷來之後,有其名而無其實。很少有 Unix 程式真正只做一件事的,而且由於字串這種通訊機制的不可靠,它們之間其實不能有效地合作。有時候你換了一個版本的 make 或者 sed 之類的工具,你的 build 就莫名其妙的出問題。這就是為什麼有的公司請了專門的所謂“build engineer”,因為高階別的程式設計師不想為這些事情操心。Lisp 程式設計師早就明白這個道理,所以他們盡一切可能避免使用字串。他們設計了 S 表示式,用於結構化的傳輸資料。實際上 S 表示式不是“設計”出來的,它是每個人都應該首先想到的,最簡單的可以表示樹結構的編碼方法。Lisp 的設計原則裡面有一條就是:Do not encode。它的意思是,儘量不要把有用的資料編碼放進字串。Unix 的世界折騰來折騰去,XML,CORBA,…… 最後才搞出個 JSON,然而其實 JSON 完全不如 S 表示式簡單和強大。Unix 就像一個腦瘤,它讓人們放著最好的解決方案几十年不用,不斷地設計烏七八糟的東西用來取代烏七八糟的東西。這些垃圾對人有很大的洗腦作用。前段時間我說 S 表示式比 JSON 簡單,有人居然跟我說 JSON 好些,因為它結構的 field 是“無順序”的。這讓我相當無語,因為一個編碼方式有沒有順序完全取決於你如何解釋它。從這個意義來講,S 表示式可以是有順序,也可以是沒有順序的。

Unix 喜歡打著“自由”和“開源”的旗號,可是它的歷史卻充滿了政治,宗教,利益衝突和對“歷史教科書”的串改。幾乎所有作業系統課本的前言都會提到 Unix 的前身 Multics,而提到 Multics 的目的,都是為了襯托 Unix 的“簡單”和偉大,接下去基本上就是按部就班的講 Unix 的設計,彷彿 Unix 就是世界上唯一的作業系統一樣。課本會告訴你,Multics 由於設計太複雜,試圖包羅永珍,最後敗在了 Unix 手下。可是如果你仔細瞭解一下 Multics 的歷史,就會發現最後一臺 Multics 機器直到 2000 年還在執行,擁有 Unix/Linux 到現在還沒有的先進而友好的特性,並且被它的使用者所愛戴。Multics 的設計並不是沒有問題(對比一下 Lisp Machine 和 Oberon),但是相比之下,Unix 的設計一點都不簡單。Unix 抄了 Multics 最好的一些思想,有些沒有抄得像,然後又引入了很多自以為聰明的糟粕。可是 Unix 靠著自己病毒一樣的特徵,迅速佔領了市場。Unix 最開頭是開源和免費的,但是後來 AT&T 發現這裡面有利可圖,所以就收回了使用權,並且開始跟很多人打官司。AT&T 的邪惡比起微軟來,真是有過之而無不及。

Unix 的很多設計是如此齷齪,很多人卻又由於官僚的原因不得不用它。以至於 Unix 出現的早期怨聲載道,有人甚至組織了一個 mailing list 叫“Unix 痛恨者”(Unix Haters)。你很有可能把這些人當成菜鳥,可是這些人其實都用過更好的作業系統,有的甚至設計實現過更好的作業系統甚至程式語言。最後他們的叫罵聲被整理為一本書,叫做 Unix Hater’s Handbook。讓人驚訝的是,這本書有一個“反序言” (anti-foreward),作者正是 Unix 和 C 語言的設計者之一,Dennis Ritchie。這個反序言說,Unix 這座設計缺乏一致性的監獄會繼續囚禁你們,聰明的囚犯會從它裡面找到破綻,可惜的是自由軟體基金會會建造跟它完全相容的監獄,只不過功能多一些。擁有三個 MIT 學位的記者,微軟的研究員,Apple 的高階科學家可能還會對這座監獄的“規矩”貢獻一些文字。從這些文字裡,我看到了一個炫耀武力的暴君,看到了赤裸裸的權威主義和教條主義。

可惜的是在軟體的世界裡任何糟糕的設計都可以流行,只要你的廣告做得好,只要你的傳教士夠多。一知半解的人(比如十年前的我)最喜歡到處尋找“新奇”的東西,然後開始吹噓它們的種種好處,進而成為它們的佈道者。再加上大學計算機系的“緊跟市場”的傳統,不幸的事情發生了:Unix 和它的後裔們幾乎壟斷了伺服器作業系統的市場。由於 Unix 的壟斷,現在的軟體世界基本上建立在一堆堆的變通之上,並且固化之後成為了“珍珠”。公司裡,學校裡,充滿了因為知道一些 Unix 的“巧妙用法”而引以為豪的人,殊不知他們知道的只是迴避一些蹩腳設計的小計倆。程式設計師有太多的特例和細節需要記憶,不但不抱怨,還引以為豪。很少有人想過如何從根本上解決問題,歷史的教訓很少有人吸取,以至於幾十年前犯過的設計錯誤還在重現。Unix 的最大貢獻,恐怕就是製造了大量的工作崗位—因為問題太多太麻煩,所以需要大量的人力來維護它的執行。

現在看來,Unix 當初就是依靠《皇帝的新裝》裡織布工的辦法封住了大家的嘴。皇帝的織布工們說:“愚蠢或者不稱職的人都看不見這件衣服。”Dennis Ritchie 說:“Unix 是簡單的,但只有天才才能理解這種簡單。”看出來了嗎?你不敢說 Unix 的設計太亂太複雜,因為這話一出口,立馬會有人引用 Dennis 的話說,是你自己不夠天才,所以不理解。當然了,這就意味著他比你聰明,因為只有天才才能理解這種簡單嘛。哎,這種喜歡顯示自己會用某種難用工具的人實在太多了。你不敢批評這些工具對使用者不友好,因為你立即會被鄙視為菜鳥。

Dennis Ritchie 去世了。死者長已矣,可是有些他的崇拜者在那個時候還要煽風點火,拿他的死與賈伯斯的死來做對比,把像這樣的照片四處轉帖,好像賈伯斯死錯了時間,搶了 Dennis 的風頭似的。然後就有人寫一些這樣的文章,把世界上的所有系統,所有語言都歸功到 Dennis 和 Unix 身上。看到這些我明白了,所謂的“天才”就是這樣被造出來的。在我看來這些是很滑稽的謬論,就像是在說有人拿一把很鈍的剪刀做出了一件精美的衣服,所以這剪刀立下了汗馬功勞。其實這人一邊裁布一邊在罵這剪刀,心想媽的這麼難用,快點做出這衣服,賣了錢買把好點的!

用了這麼久蘋果的產品,平心而論,雖然它們並不完美,然而它們並不是 Unix 的翻版,它們做出了擺脫 Unix 思想束縛的努力。它們本著機器為人服務的原則,而不是把人作為機器的奴隸。Mac 的很多內部設計跟 Unix 有著本質的不同。然而就是這樣的系統,被 Dennis Ritchie 在他的反序言裡面蔑稱為“以 Sonic the Hedgehog 作為智力主題和互動設計基礎的系統”。

有誰知道,在那同樣一段時間裡,Lisp 的發明者 John McCarthy,機器學習的發明者 Robin Milner,都相繼去世了呢?那個時候我只是在郵件列表裡看到有人發來簡短的訊息,然後默默地思念他們給我帶來的啟迪。我們沒有覺得賈伯斯的死搶了他們的風頭,因為他們不需要風頭。死就是要安安靜靜的,讓知己者默哀已經足矣。出現這種事情恐怕不能怪 Dennis Ritchie 自己,然而這些 Unix 的崇拜者們,真的應該反省一下自己的做法了。

Unix 的設計者們曾經在我的心裡佔據了一席之地,可是現在覺得他們其實代表了反動的力量,他們利用自己的影響力讓這些糟糕的設計繼續流傳,利用人們的虛榮心,封住大部分人的嘴,形成教條主義,讓你認為 Unix 的設計是必須學習的東西。很多人成為了 Unix 的傳教士和跟屁蟲,沒有什麼真實水平,就會跟著瞎起鬨,把 Unix 設計者的話當成教條寫進書裡。可是他們的權威和名氣是如此之大,讓我在很多人面前只能無語。


Go 語言

現在,同樣這幫 Unix “大牛”們設計了 Go 語言,並且依仗自己的權威和 Google 的名氣大力推廣。同樣的這幫跟屁蟲開始使用它,吹捧它,那氣勢就像以為 Go 可以一統天下的樣子。真正的程式語言專家們都知道,Go 的設計者其實連語言設計的門都沒摸到。這不是專家們高傲,他們絕不會鄙視和嘲笑一個孩子經過自己的努力做出一個醜陋的小板凳。他們鄙視,他們嘲笑,因為做出這醜陋小板凳的不是一個天真的小孩,而是一些目空一切的人,依仗著一個目空一切的公司。他們高舉著廣告牌,試圖讓全人類都坐這樣醜陋的板凳。

跟當年設計 Unix 時一個德行,不虛心向其它語言和系統學習經驗教訓,就知道瞎猜瞎撞。自己想個什麼就是什麼,但其實根本就不知道自己在幹什麼。把很多語言都有的無關緊要的功能(比如自動格式化程式碼)都吹噓成是重大的發明,真正重要的東西卻被忽略。Go 語言的設計在很多方面都是歷史的倒退,甚至犯下幾乎所有其他語言都沒有的低階錯誤。在語法上大做花樣,卻又搞得異常醜陋,連 C 和 Java 都不如。自己不理解或者實現難度大點的東西就說是不需要的,所以連很多語言支援的 parametric type(類似 Java generics)都沒有,以至於沒法讓程式設計師自定義通用資料結構,只好搞出一堆特例(比如 map,make,range)來讓程式設計師去記。這些做法都跟 Unix 如出一轍。

Go 語言最鮮明的特徵就是 goroutine,然而這個東西其實每個程式語言專家都知道是什麼。有些語言比如 Scheme 和 ML 提供了 first-class continuation(call/cc),可以讓你很容易實現像 goroutine 這樣的東西,甚至實現硬體中斷的“超輕量執行緒”。至於 Go 那種“基於介面”的型別系統設計,我在很多年前就已經試驗過,並且寄予了很大的希望。結果最後經過很多的研究和思索後發現有問題,於是放棄了這個想法。很顯然,我不是第一個在這個問題上失敗的人,很多語言專家在使用 parametric type 以前都試圖過做這種基於介面的設計,結果最後發現不是什麼好東西,放棄了。然而 Go 的設計者卻沒有學到這些失敗教訓,反而把它當成寶貝。一個很顯然的問題是,在 Go 裡面你經常會需要使用“空介面”(interface{}),用來表示所有型別。這就像使用 C 的 void 指標一樣,有著靜態型別系統的麻煩,卻失去了靜態型別系統的好處。

每當你提到 Go 沒有 parametric type,Go 的擁護者們就說“我看不到這有什麼用處”,就像一些非洲土著跟你說“我看不到鞋子有什麼用處”一樣。他們利用人們對 Java 的繁複和設計模式的仇恨,讓你拋棄了它裡面的少數好東西。其實 Java generics 不是 Java 首先有的。它的主要設計者其實包括 Haskell 的設計者之一 Philip Wadler。這種 parametric type 很早就出現在 ML,Haskell 等語言裡面,是非常有用的東西。

每當受到批評,Go 的擁護者們就託詞說,Go 是“系統語言”。這裡潛在的前提就是,認為 Unix 就是唯一的“系統”,而 C 就是在 Go 以前唯一的“系統語言”,好像其他語言就寫不出所謂的“系統”似的。而事實是,在 C 誕生十年以前,人們就已經在用 Algol 60 這樣的高階語言來寫作業系統了。由於先天不足卻又大力推廣,所以 Go 的很多缺陷基本已經沒法修補了。這樣的語言一旦流行起來就會像 Unix 一樣,成為一個無休止的補丁堆。如果像 Java 或者 Haskell 這樣的語言還值得批評的話,對 Go 語言的設計者我只能說,去補補課吧。


Cornell(康奈爾大學)

可是權威和名氣的威力還是很大的。雖然 Knuth 在我心目中的位置不再處於“壟斷地位”,世界上可以佔據我心裡那個位置的人和事物還很多。在離開清華之後我申請了美國的大學。也許是天意也許是巧合,只有兩所大學給了我 offer:康奈爾和印第安納,而我竟然先後到了這兩所大學就讀。

說實話,印第安納給了我比康奈爾更好的 offer。康奈爾給我的是一個 TA 的半工讀職位,而印第安納給我的是一個不需要工作白拿錢的 fellowship(研究員)。說實話我從來沒有搞明白康奈爾這樣的“牛校”怎麼會給我這樣的人 offer,績點一般,論文很菜,而印第安納卻是真正在乎我的。印第安納的 fellowship 來自《異璧集》的作者 Doug Hofstadter。他從電子郵件瞭解到我的處境和我渴求真知的願望之後,毅然決定給我,一個素不相識的人寫推薦信。後來我才發現那 fellowship 的資金也是他提供的。

可是 Indiana 和 Hofstadter 的名氣哪裡能跟康奈爾的號稱 “CS前五” 相比啊?Indiana 的 offer 晚來了幾天。當收到 Indiana 的 offer 時,我已經接受了康奈爾。Hofstadter 很驚訝也很失望,因為他以為我一定會做他的學生,可是聽說我接受了康奈爾的 offer,他也不知道該怎麼辦。我只隱約的記得他告訴我,學校的排名並不是最重要的東西……

名氣和權威的力量是如此之大,它讓我不去選擇真正欣賞我並且能給我真知的人。有時候回想起來,我當時真的是在尋找真知嗎?我明白什麼叫做真知嗎?

康奈爾給了我什麼呢?到現在想起來,它給我的東西恐怕只有教訓,很多的教訓。TA 的工作可不是那麼好做的,基本就是苦力,你甚至會懷疑他們錄取你就是為了利用你的廉價勞動力。我第一次做 TA 就是一個 200 多人在階梯教室上的大課,教最基本的 Java 程式設計。雖然有好幾個 TA,但任務還是很繁重。講課的人不是教授,而是專職的講師。這種講師一般得靠本科生的好評來謀生,所以雖然在學術上沒什麼真本事,對學生真可謂是點頭哈腰,服務周到。這就苦了各位 TA 了,作業要你設計,還要設計得巧妙,要準備好標準答案,之後還要批作業,批得你頭腦麻木,考試要監考,之後還要批試卷。每週還得抽好幾個小時來做 office hour,給學生答疑。然後你還有自己要上的課,自己的作業,自己的考試。每當考試的時候都很緊張,因為你得準備自己的考試,還要為學生的考試多做很多工作。

如果真的學到了東西,這麼辛苦也許還值得,可是那些教授真的是想教會你嗎?有人打了個比方,說康奈爾說要教你游泳,就把你推到水池裡,任你自己撲騰。當你就要撲騰上岸時,他在你頭上用榔頭一砸,然後繼續等你上岸。當你再次快要撲騰上岸時,他又舉起一塊大石頭扔到你頭上,這樣你就可以死了,可是康奈爾仍然等著你游上岸…… 這就是對我在康奈爾的經歷的非常確切的比喻。

我在一篇老的博文裡面提到過,康奈爾的學生,包括博士生,一上課就抄筆記,一天到晚都在趕作業。可其實康奈爾不只是愛抄筆記的學生的天堂,而且是崇拜權威者的天堂。即使你不是那麼的崇拜權威,你不可避免的會被一群像朝聖者一樣的人圍在中間,在你耳邊談論某某人多麼多麼的牛。不管你向同學打聽哪一個教授,得到的回答總是:“哇,他很牛的!” 然後你就去上了他的幾節課,覺得不咋的嘛,可是人家就說那是因為你不理解他的價值。這種氣氛我好像在另一個地方感覺到過呢?啊對了,那是在谷歌。這樣的氣氛也許並不是偶然,康奈爾大學的大部分博士同學當時的最大願望,就是畢業後能去谷歌工作。當然,後來臉書上升成為了他們的首選。值得一提的是,印第安納大學其實是更有個性的地方。我在印第安納大學的同學們一般都把去谷歌工作作為最後的選擇之一。有一次一個剛來不久的學生問,如何才能進入谷歌工作?有個老教授說,那個容易,谷歌招收任何能做出他們題目的人!

康奈爾的研究可以用“與時俱進”來形容,什麼熱門搞什麼。當時臉書和社交網路正在“崛起”,所以系裡最熱門的一個教授就是研究社交網路的。我去聽過他幾堂課,他用最容易的圖論演算法分析一些社交網路資料,然後得出一些“理論”。其中好些結論實在太顯然了,我覺得街上的賣菜大媽都能猜到,還不如研究星際爭霸來得有意思點。可是臉書名氣之大,跟著這位教授必然有出路啦,再加上有人在耳邊煽風點火,所以有好多的學生為做他的博士生擠破了頭皮,被刷下來的就只好另投門路了。每次新來一個教授都會被吹捧上天,說是多麼多麼的聰明,甚至稱為天才。然後就有一群的人去上他的課,試圖做他的學生。結果人家每節課都是背對學生面朝黑板,喃喃自語,寫下一堆堆的公式和證明,一堂課總共就沒回過幾次頭。下面的人當然是狂抄筆記,有的人甚至帶著錄音筆,生怕漏掉一句話。上這樣的課還不如干脆把板書列印出來讓大家自己回家看。人多了競爭也就難免了。上課的同學們就開始勾心鬥角,三國演義的戰術都拿出來了。作業做不出來就來找你討論,等你想討論了就說自己也沒做出來。沒聽懂偏要故作點頭狀,顯得聽懂了,讓你覺得有壓力。自己越是喜歡的教授就越是說他不咋的,扯淡,然後就自己去跟他。自己不喜歡的教授就告訴你他真是厲害啊,只可惜人家不要我。直到兩年後我離開康奈爾之前,還有好些同學因為沒找到教授而焦頭爛額。因為兩年內沒有找到導師的博士生學生,基本上等於必須退學。

當我離開康奈爾之後,有一位國內的學生給我發郵件套磁(從系裡主頁上找到我的地址),問我康奈爾情況如何。我告訴他我都已經走人了,並且告訴了他我的感覺,一天到晚抄筆記趕作業之類的。然後又問我一個剛畢業的博士生的情況,我說他水平不咋的,博士論文我看過了,很扯淡,解決一個根本不存在的問題。他對我說的話有點驚訝,但還是將信將疑。為了確保萬無一失,他在假日的時候專程去康奈爾考察了一下。回去又給我郵件,說見到好多牛人啊,大開眼界,哪裡像你說的那麼不堪。還說跟那位博士生的導師談過話,真是世界級的牛人那,他的博士論文也是世界一流的。我就無話可說了,仁者見仁,智者見智,隨他去吧,哎。

結果兩年之後,我又收到這位同學的郵件,說他在康奈爾還沒找到導師,走投無路了,問我有沒有辦法轉學。


圖靈獎

說到這裡應該有人會問這個問題,我是不是也屬於那種沒找到導師走投無路的人。答案是,對的,我確實沒有在康奈爾找到可以做我導師的人。然後我就猜到有人會說,就知道王垠水平不行嘛,沒搞定導師,被迫退學,哈哈!可是事情其實沒他們想象的那麼簡單。作為一個博士學生,不僅必須精通學術,而且要懂得政治和行情。哦錯了,其實不精通學術也行的,但是一定要懂得政治和行情!可是由於學生之間的窩裡鬥,他們之間的資訊互通程度,是沒法和教授之間的資訊互通程度相比的。這就造成了“學生階級”在這場資訊戰上的劣勢,總是被動的被教授挑選,而不能有效地挑選適合自己的教授。

進入康奈爾之後我上了一門程式語言的課,就開始對這些東西入迷。可是由於“與時俱進”,康奈爾的研究方向並不是那麼平衡的發展的,其實是很畸形的發展。程式語言領域的專家們早已因為受到忽視而轉移陣地,剩下一群用紙和筆做扯淡理論的。說實話,在歷史上程式語言方向曾經是康奈爾的強項,出現了一些很厲害的成果。可是當我在康奈爾的時候,只剩下兩個名不見經傳的教員,一個助理教授,一個副教授。其實 Robert Constable 也在那裡,可惜的是他做了系主任之後已經沒空理學生了,以至於我兩年之後都不知道這個人的存在。我當時也不知道康奈爾有過這段歷史,看不到它的研究重心的移動趨勢。

我不喜歡那個副教授搞的專案,大部分是在 Java 上面加上一些函式式語言早就有的功能。可是人家做的是熱門語言,所以拉得到資金,備受系裡親睞,他的學生們也比較趾高氣昂。初次見面的時候,我跟他的一個學生說了我的一個想法,他說:“你那也能叫研究嗎?待會兒我給你看看什麼是真正的研究!” 其實那只是我的一個微不足道的想法,我也沒說那是研究啊。只是隨便聊一下而已就這麼激動,何況你們那些 Java 的東西能算是研究?我是不可能跟那樣的人合作的,所以我就跟那個助理教授做了一點靜態分析的專案。當然我們分析的也不是什麼好東西,是用 Fortran 寫的 MPI 程式。不過說實話,那個助理教授其實挺有點真知灼見,他有幾句話現在仍然在指引我,防止我誤入歧途。其中一句話是針對我對 π-calculus 的盲目崇拜 說的:“那些理論其實不管用的。最好是針對自己的問題,自己動腦筋想。” 他也是很謙虛很善良的人,可是好人不一定有好報的。後來他沒有拿到終生教職職位,不得不離開康奈爾加入了工業界,而我就失去了最後一個有可能在程式語言方向做我的導師的人。

沒辦法,我就開始探索其它相關領域的教授,比如做資料庫的,做系統的,看他們對相關的語言設計是否感興趣。可惜他們都不感興趣,而且告訴我程式語言領域太狹窄了。我當時還將信將疑,甚至附和他們的說法,可是現在我斷定他們都是一知半解胡說八道。如果這些人虛心向程式語言專家請教,現在資料庫和作業系統的設計也不會那麼垃圾,關係式,SQL,NoSQL,…… 一個比一個扯淡。沒有辦法,我就開始探索其他的方向,開始瞭解圖形學和數值分析等東西,進展很不錯。可是終究我還是發現,我不喜歡圖形學和數值分析所用的語言。我想製造出更好的程式語言來解決這些問題。可是跟教授們談這些想法的時候就感覺是在對牛彈琴,他們完全不能理解。後來我發現,教授們貌似不喜歡有自己想法的學生,他們更希望找到願意“打下手”的學生,幫助實現他們自己的想法。

這就讓我走到了跟那位向我打聽康奈爾情況的同學差不多的局面,真是心裡有許多的苦卻沒有人可以理解。這時候我想到了系裡的一些德高望重的教授,比如得過圖靈獎的人,也許這些頂級的大牛會給我指出方向。於是我就聯絡到一點陣圖靈獎得主,說想找他聊聊。我說我感興趣的東西康奈爾貌似並不重視和發展。康奈爾的校訓是“any person, any study”,而我想學習的東西卻得不到支援。最後我談了一下我對康奈爾的總體感受。我說我覺得大家上課死記硬背,不是很,我不是很確定學術界是否還保留有它原來的對智慧和真知的嚮往。

我很誠懇的告訴了他這些,只是希望得到一些建議。結果他不但沒有理解任何一點,而且立馬開始用質問的語氣問我,你成績怎麼樣?考試都通過了沒有?哎,說白了就是想搞清楚你是不是成績不好沒人要。怎麼就跟高中教導主任一樣。於是乎那次談話就這樣不了了之。可是沒有想到,這次談話就造成了我最後的離別。在學生們互相之間勾心鬥角,不通訊息的同時,系裡的教授們其實背後都是“通氣”的。他們根本不懂得如何教學,就知道拿作業和考試往學生頭上砸,倖存下來的就各自挑去做徒弟,挨不住的就打發掉。這算盤打得真是妙啊。我也不知道他們是什麼機制,每個學生對哪些教授感興趣,表現如何,他們貌似都瞭如指掌,貌似背後有個什麼情報網。然後系裡的教授們不知道怎麼的,彷彿就都知道有這樣一個不知趣的學生,居然敢說學術界的壞話!

大地震前夕的天空總是異常的美。我竟然在過道里看到那點陣圖靈獎教授對我點頭致意並且微笑,以前做 TA 時把我呼來喚去還橫豎不滿意的教授也對我笑臉相迎。我彷彿覺得那一席話打動了那位德高望重的教授,再加上在圖形學和數值計算的紮實進展,也許我的學術生涯有了轉機。可是,我那一次真正的領悟了什麼叫做所謂的“笑裡藏刀”。

由於那個學期上的圖形學還有矩陣計算的課成績都不錯,我心想應該能找這兩門課的授課教授的其中一個做導師吧。再加上那些貌似友好的笑容…… 所以沒想很多,居然過了一個非常快樂的寒假。沒有任何前兆,沒有任何直接的通知,一封紙信不知道是什麼時候默默地進到了我在系裡的“信箱” — 一個我基本上從來不看的,系裡用來塞廣告資訊的信夾子裡,直到下一個學期開始的時候(2月份)我才發現。信是系主任寫的,大概就是說,由於你的表現,我們覺得康奈爾不是適合你的地方……

說得對,我也覺得康奈爾不適合我。我本來就有想走的意思,可我一般呆在一個地方就懶得動。如果你們早一點告訴我這個,比如12月以前,我還可以申請轉學到其它學校。可是都 2 月份了才收到這樣的東西,康奈爾啊康奈爾l,你讓我現在怎麼辦?我想我可以說你不仁不義吧?

在這個萬分窘迫的時候,我想起了曾經關心過我卻又很失望的 Hofstadter。我告訴他我在康奈爾很不開心,我很想研究程式語言,可是 Cornell 不理解也不在乎這個領域。他回信說,沒有關係,你能找到自己喜歡的東西就應該去追尋它。Indiana 的 Dan Friedman 正好是做程式語言的,你可以聯絡他,就說是我介紹你去的。

於是給 Friedman 發了郵件,很快得到了回信說:“Yin,兩年前我們都看過你的材料,我們覺得你是非常出眾的學生,可惜你最後沒有選擇我們。你要明白,人生最重要的事情不是名利,而是找到你願意合作的人。你的材料都還在我們這裡。現在招生已經快結束了,但是我會把你的材料提交給招生委員會,讓他們破例再次考慮你的申請。” 我和 Dan Friedman 的故事就從這裡開始了。

我在康奈爾的遭遇貌似不可告人的恥辱和祕密,然而我今天卻可以把它公之於世,因為康奈爾不再有任何資格來評價我。依靠自己的努力和 Indiana 的老師們的培養,我的水平已經超越了康奈爾計算機系的大部分教授。現在我覺得自己就像那個到康奈爾學“游泳精髓”人,本來就是會游泳的,可是每到岸邊康奈爾就搬起大石頭來砸我,還說我不會遊。於是我鑽到水底下鑽了一個洞,把水放幹。

由於曾經與多點陣圖靈獎得主發生不大愉快的遭遇,再加上在自己的研究中多次受到其它圖靈獎得主的理論的誤導,而且許多點陣圖靈獎得主最主要的貢獻仍然在給軟體行業帶來混亂,圖靈獎這個被許多計算機學生膜拜的神物,其實在我心裡已經沒有任何效力了。很多人可能對此難以想象,可是對圖靈獎是這種態度的不只我一個人。我認識的幾乎所有程式語言專家幾乎都不拿圖靈獎當回事,而且其中很多人甚至不拿圖靈本人當回事,覺得他設計了一些非常醜陋的東西。雖然我現在覺得圖靈的研究成果確實有一定價值,但由於上面的原因,拿圖靈獎來開玩笑還是成為了我的家常便飯。我甚至覺得 ACM 應該停發這個獎,因為它是一種非常虛幻和政治的東西。每當人們談起這些“大獎”煞有介事的時候,就讓我看到了他們的愚昧。


常青藤聯盟和“世界一流大學”

我在康奈爾的經歷應該不是偶然,不是因為我比較特殊。跟我同時進入康奈爾的博士生有好幾個沒有拿學位就離開了。其中有一個是非常聰明的少年班,18歲就讀 PhD 了,我根本聽不懂的理論課他還能拿A。可是四年後他退學去了臉書,說真是太難畢業了,神馬都是扯淡。有些本科生也告訴我類似的經歷,說被一個叫做“笑面虎”的教授“整了”。康奈爾的自殺率居美國大學前列。離開以後的有一天,忽然看到新聞報導說一週之內有三個康奈爾學生從瀑布旁邊的那座橋跳下去,結果派了警察在橋上日夜巡邏。我覺得自己在康奈爾所感受到的壓力確實超乎想象,是有可能把人逼上絕路的。現在回想起來真是可笑,因為下意識裡在乎權威和名氣,我給予了一群根本沒有資格來教育我的人莫大的權力,讓他們可以向我施加無端的壓力。

應該指出,這種現象應該不是康奈爾所特有的。我對清華,還有 Princeton,Harvard,MIT,Stanford,Berkeley,CMU 等學校的學生都有了解。這些所謂的“世界一流大學”或者“世界一流大學 wannabee”差不多都是類似的氣氛。你衝著它們的名氣和“關係網”擠破了頭皮進去,然後就每天有人在你耳邊對其它人感嘆:哇,他好牛啊!發了好多論文,還得了XX獎。跟參加傳銷大會似的,讓你懷疑這些人還有沒有自尊。然後就是填鴨式的教育,無止境的作業和考試,讓你感覺他們不是在“教育”你,而是在“篩選”你。這種篩選總是篩掉最差的,但也篩掉最好的。因為最好的學生能意識到你在幹什麼,他們不給你篩選他們的機會。一旦發現其實沒學到東西,中途就輟學出去創業了。所以剩下來的就是最一般的,循規蹈矩聽話的。在這樣的環境裡,你感覺不到真正的智慧和真知的存在。托福考試所鼓吹的什麼“批判性思維”(critical thinking )在美國大學裡其實是相當缺乏的。學生們只不過是在被培訓成為某些其他人的工具,他們具有固定的思維定勢,像是一個模子倒出來的。他們不是真正的創造者和開拓者。

人們在這些大學裡的時候都是差不多感受的,可是一旦他們出來了,就會對此絕口不提。自己身上掛著這些學校的鍍金牌子,怎麼能砸了自己的品牌,長別人的威風?所以每當我批判康奈爾 就有些以前的同學一臉的著急相,好像自己沒有吃過那苦頭一樣。


程式語言專家

雖然我在 Indiana 得到了思想的自由,但這種自由其實是以孤獨為代價的。我並不是一個自高自大不合群的人,但是我不喜歡跟一群像追星族一樣的人在一起。應該說在 Indiana 的日子裡,權威主義的影子也是經常出現的。Indiana 學生們的權威比較特殊一點,不然就是 Dan Friedman,不然就是 Kent Dybvig。Friedman 的身邊總是圍繞著一群自認為是天才的本科生,喜歡拍他的馬屁,喜歡在人面前炫耀。博士生們開始時貌似還比較酷,可是後來發現其實也有很多類似現象,急於表現自己,越是研究能力弱的人越是愛表現。所以你就發現有人開頭為了混進這個圈子拍你的馬屁,過了兩年就開始自高自大,而且經常想這樣來壓倒你:“Kent 說過……”我很尊敬 Dan 和 Kent,但我其實在很多方面已經超越了他們。我看到他們的一些思維方式並不是那麼的正確,我也從來不引用他們的話作為理論依據。對權威的崇拜其實顯示了一個人心理的弱小。如果你對自己有信心,有自己的想法和判斷力,又何必抬出個名人來壓制別人呢?

在我自己心裡毫無疑問的是,我是 Indiana 最厲害的程式語言學生。由於我不斷地動手嘗試新的想法,所以幾乎沒有任何其他人的研究逃脫過我的探索。我從來不記錄自己的半成品和失敗(因為太多了),而且我對自己的標準異常的高,所以我經常看到有人做演講或者寫論文,裡面其實是我很久以前嘗試過又拋棄了的想法。有時候我去聽別人的演講,就會立即看出破綻,問一些演講者答不出來的問題。其實很多時候我只是懷疑自己,我試圖給那些想法再一次的機會來證明它們的價值,而且問得相當委婉,但那樣的問題仍然是不受歡迎的,所以同學們甚至一些助理教授看到我在場都是心驚膽戰的。吃飯的時候我也不喜歡旁邊的人討論問題,因為他們經常顯示出對理論提出者的膜拜心理,而且煞有介事,可惜那些經常是我早就知道不管用的理論。他們有時候其實也知道那些是扯淡的,但卻又怕我捅破這窗戶紙,所以就像鴕鳥一樣把頭埋在沙子下面。

我也想合群一點,但是“屢試不爽”,所以後來我就基本是孤立的做自己的研究了。最開頭是不得已,但後來就越來越喜歡獨自一人。這是不可避免的,因為創造力和孤獨幾乎是雙胞胎。因為免去了跟人討論的時間,我有了大把的時間來做自己的探索。然後我才發現當年期望的那種 common room 其實沒什麼用,因為那裡根本不會有人理解你在說什麼。現在即使有這樣的地方我也不會去了。

我從一開始進入 Indiana 就沒想過要拿博士學位,我只是在玩弄這個系統以達到我求知的目的。所以除非危及到我的存在,我把學校對學位的各種要求都拋到了九霄雲外。給教授做 RA 幾乎總是被要求研究各種毫無前途的東西,與我自己的思考相沖突,所以我後來乾脆都做 TA 了。雖然累點,但不怎麼費腦力。其結果是,在短短的一兩年時間之內,我利用自己摳出來的時間,獨自摸索出了這個領域大部分的理論。我經常不看書不看論文,在一個星期之內解決別人十多年才完成的研究。讓人驚訝的應該不是我有多麼聰明,而是這些研究者們十年來到底在幹什麼。我從來不認為自己比別人聰明,我只是覺得很多人的腦子被禁錮了而已。我有非常簡單的頭腦,我看不懂複雜的公式,聽不懂高深的術語。可正是因為這一點,讓我脫離了已有理論的困擾。

可以說,這個領域在過去一個多世紀的研究,很少有逃脫過我的洞察力和直覺的。這些研究最早可以追溯到 1870 年代。我一般很少看論文,因為自己想清楚一個問題其實花不了那麼多時間的。看別人的論文一般都枯燥乏味,所以與其花那麼多時間讀論文還不如自己思考。當我看論文的時候,一般是想搞清楚自己琢磨出來的問題有沒有人已經研究過了,所以很多論文只需要掃一下就夠了。我看到一個東西一般很快就會知道它到底會不會管用。我經常發現一些被認為很艱深的理論其實是在解決根本不存在的問題,甚至是在製造問題,而真正的問題卻沒有得到有效的解決。很多問題其實是權威的陰影造成的,它讓人們不敢否認這些大牛思想的價值,不敢揭穿它們,拋棄它們,甚至想讓自己寄生在它們上面,所以很多的時間花在瞭解決一些歷史遺留問題,而不是真正的問題。這就是為什麼我的英文 blog 標題叫做“Surely I Am Joking”,因為它記錄了一些我認為根本不存在,或者是人為造成的問題。


邏輯學家

批評程式語言領域的問題並不意味著其它領域就好一些。恰恰相反,我認為做系統和資料庫的領域有更大的權威崇拜和扯淡的成分。有時候程式語言專家看起來很明顯的問題,做資料庫和作業系統的人卻看不到,扯來扯去扯不清楚,還自以為是的認為程式語言的東西他們都懂。

程式語言的理論是電腦科學的精髓所在,可是程式語言專家有他們自己的問題:他們膜拜邏輯學家。幾乎每一篇程式語言領域的論文,至少有一頁紙裡面排列著天罡北斗陣一樣的稀奇古怪的邏輯符號,而它們表示的其實不過是一些可以用程式語言輕鬆做出來的直譯器和資料結構。有人(比如 Kent Dybivg)早就發現了這個規律,所以寫了一些工具,可以把程式語言自動轉換成 LaTeX 格式的邏輯公式,用以對付論文的寫作。

有人覺得那些公式有“數學的美感”,可是它們其實是挺有毛病的設計。如果你看看現代邏輯學鼻祖 Gottlob Frege 的原著,就會發現其實最早的時候邏輯學不是用公式表示的。Frege 那篇開創性的論文 Begriffsschrift 裡面全都是像電路圖一樣的圖片,只有 20 多頁,而且非常容易讀懂。不知道是哪一個後輩把電路圖改成了一些稀奇古怪的符號。其實他的目的是用符號來表示那些電路圖,結果到後來徒孫們以為那些符號就是祖傳祕籍的精髓,忘記了那些符號背後的電路圖,所以導致了今天的混亂局面。看完了 Frege 的論文,我再一次領悟到了之前那句話:跟真正的大師學習,而不是跟他們的徒弟。

ACM SIGPLAN 的主席 Philip Wadler 有一次寫了一篇論文介紹 Curry-Howard corresponce,裡面提到,好的點子邏輯學家總是比我們先想到。可是他卻沒有發現,其實程式語言的能力已經大大超越了數理邏輯,數理邏輯那些公式裡面的 bug 其實不少。因為邏輯學家們不用機器幫助進行推理,有些問題搞了一百多年都搞不清楚是怎麼回事,然後就弄出一些特殊情況和補丁來。有了一堆邏輯“定理”,卻又不能確信它們是正確的,而且存在悖論一類無厘頭的東西,所以又掰出一些 model theory 之類的東西來驗證它們的正確性。邏輯學家們折騰了一百多年都是在折騰類似的事情,卻沒懷疑過老祖宗的設計。我之前提到的 Hindley-Milner 系統的問題,很大部分原因就在於它所使用的邏輯裡面其實有一個根本性的誤解。簡言之,就是把全稱量詞 ∀ 隨意亂放,導致輸入與輸出關係混亂。這也就是我為什麼不喜歡 Haskell 和 OCaml 的最主要原因。

現在最熱門的邏輯學家莫過於 Per Martin-Löf。他的型別理論 Martin-Löf Type Theory 被很多 PL 人奉為神聖。我一直沒有搞清楚這個型別理論有什麼特別,直到有一天我把 Martin-Löf 1980 年的那篇論文(其實是演講稿)拿出來看了一遍。然後我發現他通篇本質上就是在講一個 partial evaluator 要怎麼寫,而我早就自己寫過 partial evaluator。其實並不是特別神奇的東西,只需要在普通直譯器裡面改一兩行程式碼就行,可是有人(比如 Neil Jones)卻為此寫出了 400 多頁的書和大量的論文。

之前提到的 Curry-Howard corresponce 也被很多人奉為神聖,它來自數學家 Haskell Curry 和邏輯學家 W.A. Howard 的一些早期發現。他們發現有些程式和定理的證明之間有對應的關係。然後就有 PL 專家開始走火入魔,說“程式就是證明,程式的型別就是定理”。可是他們卻沒有發現這個說法沒法解釋作業系統這種程式,因為它被設計為永遠不停地執行,所以不能滿足一個證明所具有的基本特徵。而且很多程式被設計出來根本就不是要證明什麼定理,它們是被設計來幫人做事情的。所以我覺得“程式就是證明”是很牽強附會的說法,你不能因為有的程式可以用來證明數學定理,就認為所有的程式都是某個定理的證明啊!把那句話反過來,說成“證明就是程式”還差不多。

但從以上的發現,我很高興的看到了自己作為一個程式設計師的價值。很多人瞧不起程式設計師,把他們蔑稱為“碼農”,可是程式如果寫好了,其實比起那些高深的邏輯學家和哲學家還要強,因為程式語言其實比數理邏輯還要強。有一位數學家說得好:為了真正深入的理解一個東西,你應該把它寫成程式。還有人說,程式設計只是一門失傳的藝術的別名,這門藝術叫做“思考”。我覺得很在理。


再見了,權威們

幾經顛簸的求學生涯,讓我獲得了異常強大的力量。我的力量不僅來自於老師們的教誨,而且在於我自己不懈的追求,因為機會只親睞有準備的頭腦。

曾經 Knuth 是我心中唯一的權威,後來我又屈服於康奈爾和常青藤聯盟的權威和名氣。在一而再再而三的上當受騙之後,我終於把所有的權威們從我的腦子裡轟了下去。也許有時候轟得太猛烈了一些,但總的說來是有好處的。不再是我心目中的權威並不等於我鄙視他們或者不尊敬他們。我只是獲得了不用膜拜他們,不用跟一群人瞎起鬨的自由。我不尊敬的人都是一些自視過高的人或者他們的跟屁蟲。一般來說,權威們在我的腦子裡失去的只是他們在很多其他人腦子裡的那種被膜拜的地位,那種你可以用“XX人說過……”來壓倒理性分析的地位。現在他們在我心目中是一群普通的,由蛋白質形成的生物,有好心腸或者壞心眼的,高傲,謙虛或者虛偽的人。我不會自討苦吃,他們的想法如果真的好,我當然要拿來用,但是沒有任何人的東西我是不加批判全盤接受的。我深深地知道接受錯誤想法的危害性,所以我也希望大家都具有批判的思維,不要盲目的接受我說的話。我不喜歡“大神”或者“牛人”這種稱呼,我也反感那種自稱膜拜我的人,因為正是這種人讓權威主義現在橫行於世。

美國的權威主義勝於歐洲,但也不是每個人都那麼的崇拜權威,而中國才是權威主義的重災區。像“圖靈獎得主XX”這樣的稱呼,恐怕只有在中國才見得到。所以我希望國內的同學們,不要盲目的崇拜國外的所謂“大師”,“牛校”或者“牛公司”。祝你們早日消滅掉心裡的各種權威以及對他們的畏懼心理,認識到自己的價值和力量。


後記(關於 IU)

有些人看了我的文章介紹在 IU 的經歷,告訴我他們申請了 IU。我覺得有必要免責宣告一下:我沒想到,也不希望有人因為我的文章而去 IU,YMMV (your mileage may vary)。由於我有所準備,所以對於 Friedman 的教學如魚得水。很多同學也說學到很多,可是有一些其他人告訴我他們覺得 Friedman 的課他們聽起來很吃力,只能說是勉強過關。而且我只介紹了 IU 好的方面,卻把不大好的地方一筆帶過了。我在 IU 也有很艱難的時候。現在的情況是 Kent Dybvig 已經離開了 IU,加入了 Cisco。他的公司 Cadence Research Systems 和 Chez Scheme 也併入了 Cisco。Dan Friedman 由於年紀原因說不準還帶不帶學生。最近引進了一些貌似不錯的助理教授,但是我跟他們都不熟。我的經驗是助理教授一般都會為了研究資金,為了升為正教授而做一些身不由己的事情。其他的 CS 方向我都說不準 IU 是什麼水平,所以還請同學們自己斟酌。我可以毫無疑問的一點是,IU 有非常美麗的校園,大大的超過清華,北大,康奈爾,史丹佛,麻省理工。

相關文章