田春:走在Lisp的岔路上(圖靈訪談)

暘谷發表於2011-11-10

圖靈訪談之三:專訪田春

10月23日,圖靈社群就Lisp程式語言和《實用 Common Lisp程式設計》一書,採訪了譯者田春,以下為訪談內容:

人物簡介:田春

Common Lisp 程式設計師, 毽球運動員, 跆拳道 2 級

網名“冰河”,Glority Software資深軟體工程師,前網易杭州研究院高階開發工程師和系統管理員,資深Common Lisp程式設計師。

2001~2005年就讀於浙江大學。2003年起開始學習Commom Lisp,精通Lisp史和各種實現,2007年起成為 LispWorks 付費使用者,Common Lisp社群的網路專家,開源專案cl-net-snmp(SNMP協議庫)的作者,usocket跨平臺網路庫的主要維護者,common-lisp.net站點管理員,水木社群(newsmth.net)函式型程式語言(FuncProgram)版主,美國Versata/Gensym公司技術顧問。

曾在2008年翻譯了Paul Graham的On Lisp一書,在ILC 2009(國際Lisp會議)上發表學術論文,在《程式設計師》雜誌上發表Common Lisp專題文章,並在網上撰寫過大量相關的技術文章。

圖靈社群:你好,田春,可能大家更熟悉的還是你的網名“冰河”,先向社群的讀者介紹一下自己,好嗎?

田春:大家好。首先,關於敝人的網名,其實是自小學起就在使用的筆名或暱稱,只是一個名字而已。但需要解釋的是,敝人跟傳說中的冰河木馬沒有任何關係,重名純屬巧合。

我從小學五年級開始學習計算機,早年在NOI資訊學競賽上只有一點小成績,初高中階段沉迷遊戲和DOS/Windows程式設計,學習成績很一般,高考時超常發揮才有幸考入浙大一個非計算機專業。 大學期間自學了包括Linux和Lisp在內的多種計算機知識,畢業後憑藉在校期間Linux方面的聲望進入網易公司從事系統管理,工作期間繼續學習Common Lisp,在該領域寫過開源專案、發表過國際會議論文、翻譯過經典英文教材,最後因機緣巧合接觸到國外的古老商業Lisp軟體,經過兩年多的努力,目前以維護該軟體為生。

圖靈社群:你的經歷真是跟Lisp是息息相關啊,但很多人對Lisp只有一個模糊的概念:這是一種中古語言,能否結合你自己的經歷談談Lisp?

田春:在我計算機生涯的前十年,其實完全沒有想過將來會以此謀生。我選擇計算機領域的具體學習方向幾乎完全是興趣導向的。早期的時候,資訊相對封閉,我和當時其他同行一樣走的是從DOS到Windows,從BASIC到C或Pascal再到Visual Studio系列,這樣一個循規蹈矩的學習路線。後來到杭州讀大學,不久就開始學習Linux和Lisp。

我的Lisp經歷可以分為N個階段:

1) 人工智慧程式語言階段——小學五年級和六年級。那時有一本書,叫做《計算機應用指南》,裡面講述了1994年時整個計算機領域的狀況,其中“人工智慧與專家系統”那章裡著重強調了Lisp和Prolog這兩種AI語言的應用。這是我最早的Lisp印象。

2) GNU 和Emacs階段——大學第一年。GNU工程的創始人R. Stallman早獨立完成了兩大自由軟體:GCC和Emacs,後者使用一種Emacs Lisp語言來擴充套件Emacs環境。Stallman本身也是Lisp黑客,在Lisp機上寫過真正的Lisp程式,還參與過Common Lisp語言第一版(CLTL1)的標準制訂工作。按理說所有學習Linux的人都多少會受到一些Lisp方面的薰陶,遺憾的是,最終多數人只是停留在Emacs和elisp層面上,我算是少數順著這條Lisp道路一直走向終極(Common Lisp)的那些人。

3) Scheme階段——大學的第三年。通過 SICP 一書和 MIT OpenCourseWare 的配套視訊來學習,那個時候廣泛接觸了Linux系統自帶的各種Scheme軟體包,在學習計算機一般理論的同時學習Scheme語言。我逐漸發現Scheme語言本身太簡單了,具體的實現又非常多,互相之間區別很大。很多人最終停留在Scheme階段,其中少數有能力的人又自己創造了許多新的Scheme實現。但我沒有停下來,繼續向前走。

4) Common Lisp 階段I——大學第三年晚期和第四年。學習 Debian 系統自帶的 onlisp 和* Common Lisp the Language *電子書,然後用 Debian 自帶的 CMU Common Lisp,Steel Bank Common Lisp,GNU Common Lisp以及GNU CLISP等環境來進行Common Lisp程式設計實踐。

Debian裡還有幾個很大的Common Lisp寫出的軟體,包括Maxima和Axiom兩種數學符號計算系統。CMU Common Lisp (cmucl) 的軟體包文件裡有The Evolution of Lisp這篇著名的論文。我讀完以後,順藤摸瓜通過學校內網的ACM Digital Library等論文渠道,把關於Lisp語言發展史的關鍵論文幾乎全看了一遍。不過,這個時候還沒寫出一個像樣的Common Lisp程式,完全是在學習。

5) Common Lisp 階段II——主要是發起自己的開源專案(cl-net-snmp),試圖翻譯各種Lisp資料——最主要的就是On Lisp一書。我認為這是一個領域的新手通常會做的兩件事。

6) Common Lisp階段III——參與維護別人發起的開源專案(usocket、cl-xml、cl-http、cffi 等),以及試圖瞭解和改進各種Common Lisp 平臺本身的原始碼。捎帶著參與Lisp相關的國際會議,把自己的成果整理成論文,以便跟其他同行建立聯絡,走向領域前沿。

我現在處在一個新的階段,並且也走向了Lisp領域一條冷門的岔路上:維護前人留下的古老商業Lisp軟體。我不認為這是一條終極道路,相反這是一條歧途,但我必須去做,因為如果我不做的話,這些有價值的東西就可能失傳。我現在的工作與其說是為了謀生和個人興趣,還不如說是像一個歷史學家一樣,在努力地行使保護歷史文物的職責。Lisp領域可謂是浩如煙海,沒有其他任何語言具有像Lisp這樣的深度和廣度,也沒有哪個語言的程式設計師可以像Lisp程式設計師那樣熱愛自己的語言。這是我的觀點,但它的真正內涵需要人們自己去體會。

圖靈社群:關於程式語言的學習,你有一個很有意思的觀點——C和Lisp是程式語言的兩個極端。可否就此談談,並對如何學習程式語言提供一些建議?

田春:這實際是 Paul Graham 在The roots of Lisp(Lisp之根源)這篇文章中提出的觀點。該文第二段裡是這樣寫的:

“我認為目前為止只有兩種真正乾淨利落, 始終如一的程式設計模式:C語言模式和Lisp語言模式。此二者就像兩座高地,在它們中間是尤如沼澤的低地。隨著計算機變得越來越強大,新開發的語言一直在堅定地趨向於Lisp模式。二十年來,開發新程式語言的一個流行的祕決是,取C語言的計算模式,逐漸地往上加Lisp模式的特性,例如執行時型別和無用單元收集。”

我是在同意 Paul Graham 的上述觀點的基礎上,做出了“C和Lisp是程式語言的兩個極端”這一評價的。但我的依據除了兩種語言的語法風格迥異以外,還考慮了C程式和Lisp程式截然不同的執行方式:C程式總是一些零零散散的獨立可執行檔案,由作業系統把它們拼接在一起;而Lisp程式本質上是對Lisp環境和Lisp語言本身的擴充套件,Lisp環境就像一個虛擬機器一樣,行使著作業系統的職責,把其中載入的所有Lisp程式碼執行起來(Emacs又何嘗不是如此呢)。縱觀其他所有語言,我看不出還有本質上的第三種方式了。

圖靈社群:我們知道Common Lisp是Lisp的一門方言,對這門方言的實際應用和未來前景,你有什麼看法呢?

田春: Common Lisp 是 Lisp 語言家族中唯一具有工業強度的大型語言,它本身就是為了把之前所有真正用來一般性軟體的 Lisp 語言統一起來,儘量相容它們並消除不一致的地方,最後得到一個完美的集大成體。這個目標事實上確實實現了。1991年,Common Lisp釋出第一版,至今所有程式碼幾乎可以不經任何修改,就執行在目前還在流行的至少10種不同的Common Lisp環境上,整整二十年來Lisp程式設計師的成果一直可以正常執行,這對Lisp程式設計師無疑是一種巨大的鼓勵。相比之下,其他的語言要麼消失了,要麼已被改得面目全非。

我的看法是,一個追求卓越的程式設計師應該廣泛嘗試多種語言,但如何他真的這樣做了,他一定會在遇到Common Lisp時停下來,因為他發現這門語言是最強的,也是最美的,並且學習過程也是最艱難的,艱難到以至於學成之後,再沒有精力也沒有必要去學其他語言了。然後他就會想盡辦法讓一切程式設計事務都用Common Lisp來做,最後會奇蹟般地發現Common Lisp什麼都可以幹,而且沒有哪個領域是幹不了的,甚至於沒有哪個領域是尚未有Lisp程式設計師踏足的。

至於前景,就像我在《實用 Common Lisp程式設計》一書譯者序裡表達的:一門語言能安全地存活50年,那麼它就一定可以存活100年。人生寶貴,如果希望自己的勞動成果長久流傳於世,那麼選用Common Lisp來表達自己的思想是最穩妥的。

圖靈社群:《實用Common Lisp程式設計》的作者,強調了Lisp的“可程式設計性”和“適合探索性程式設計”。就這本書,他是如何體現這些特色的?這些帶來怎樣的閱讀體驗呢?

田春:主要體現在貫穿於書中的實踐性章節裡。在很多其他語言的類似實踐性章節裡,可能是把程式的最終版本逐個部分地向讀者做解釋,比如這個函式將會完成哪些功能,那個類是做什麼用的,諸如此類。但在學習者把所有程式碼輸入電腦之前,程式是幾乎跑不起來的。而在《實用 Common Lisp程式設計》一書裡,作者藉助Lisp語言本身的強大優勢,採用真正的循序漸進教學法:每一個函式,都從直接可以執行並完成實際功能的簡單版本開始,然後再根據逐漸複雜的需求被不斷改寫;或者單個函式規模變大以後,再新增新的子函式,諸如此類。這樣能夠確保學習者每次都能取得階段性成果,同時演示了Lisp程式設計師們真正寫程式時,是如何從零開始,邊設計邊施工,最後一路積累千上萬行程式碼的。

我自己也寫過超過1萬行程式碼規模的cl-net-snmp專案——一個完整的SNMP協議實現。在這個專案裡,我甚至做出了MIB編譯器,把MIB定義轉譯成Lisp,然後要麼解釋要麼編譯載入。這個專案就是從零開始,先解決ASN.1各種基本資料型別的BER編解碼,然後封裝SNMP資料包,再做MIB的語法解析,直到整個伺服器和客戶端都正常跑起來。Common Lisp開源社群的同行對我的成果極為稱讚,雖然我的程式碼質量和程式效率還不行,但人們普遍驚訝我可以用Lisp,將一個看似簡單的網路協議以最複雜也最貼近Lisp的方式成功實現。學完這本書的實踐部分,就可以掌握編寫Lisp程式的正統思路。然後無論多麼複雜的程式,都可以用同樣的思路逐漸寫出來。

圖靈社群:能不能向有志於學習Common Lisp的初學者,介紹一些網路資源呢?

田春:所有最重要的網路資源,都寫在這本書的最後一章裡。但我認為對於初學者來說,看書是最重要的。Common Lisp the Language(CLTL2) 是最重要的 Common Lisp 語言大全。說起來, 《實用Common Lisp程式設計》一書只涵蓋整個語言不到一半的特性。要想寫出最專業的程式碼,必須瞭解並且靈活組合運用這門語言所給予程式設計師的所有東西。因此CLTL2是一定要看完的,遺憾的是仔細看完這本書至少需要半年。

無論如何,我不推薦人們過早地去參與各種線上討論,因為Lisp社群對新手並不友好,國外的社群尤其是這樣,貿然去問各種無聊的問題只會自取其辱。

圖靈社群:跟你合作本書的過程中,圖靈的編輯都獲益良多。在這次的合作之後,你對技術圖書的出版,又有哪些看法和建議呢?

田春:這本書得以順利出版,還是要感謝圖靈的編輯們的。儘管這本書8月份的時候離出版還遙遙無期,我當時採取了一個手段威脅你們(笑)。不過,有幾點我還是不太滿意的:一是排版用Word太不專業,推薦用LaTex排版;二是這本書的最後沒有索引,其實索引對這本書比較重要,因為所有粗體的字都是Common Lisp的關鍵字,寫程式碼的人想用某個語句的時候,可以通過索引來查詢;三是出版週期還是太長。

至於建議,一是希望圖靈的書今後能保留索引,方便讀者查閱;二是應在翻譯合同中加入出版時間的約定,規定交稿後多長時間出版;三是希望圖靈能引進On Lisp的版權出版翻譯版,我可以提供譯稿供出版使用。

圖靈社群:感謝田春接受圖靈社群的採訪,與大家分享自己學習Lisp的經歷,以及對Lisp的看法。


更多精彩,加入圖靈訪談微信!

圖靈訪談系列之七:吳朱華談雲端計算和創業

相關文章