非商業轉載請註明做譯者、出處,並保留本文的原始連接:http://www.ituring.com.cn/article/553git
田春,Common Lisp 程序員,毽球運動員,跆拳道 2 級。網名「冰河」,Glority Software資深軟件工程師,前網易杭州研究院高級開發工程師和系統管理員,資深Common Lisp程序員。他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個階段:socket
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的見解。