這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
這是 Joe Armstrong,Erlang 之父在昨天(2013-01-24)發表在 Erlang 郵件清單裡的內容。詳細解說了他自己從開始學習編碼到發明 Erlang 的整個曆史。並且,對如何學習編程;如何成為大牛等一系列熱門問題提出了自己的看法。當然,文中槽點無數(包括堅定不移的黑我大PHP)。這也是我覺得有必要翻譯出來的原因之一。
由於是發在郵件清單的,所以原文是沒有正式的標題的。我從 HN 上抄了這個標題回來。
整體上,雖然是和 Erlang 相關的話題。但是讀過之後,會突然領會到 Golang Team 一直以來堅持的一些東西的更深層次的含義。
————翻譯分隔線————
回到過去……
當我開始學習編程的時候(1967),我可以在 FORTRAN 和(傳說中的)Algol 之間選擇,不過沒有任何人瞭解 Algol,所以我選擇了 FORTRAN。
編程的一個周期是三個星期
第一周 在紙上的表格裡編寫代碼,然後送到電腦中心將其轉換為打孔卡
第二周 複查打孔卡,如果沒問題就放到裝置上執行
第三周 得到結果
編譯器遇到第一個語法錯誤的時候會終止運行,這會將你帶回第一周——因此,如果在你的程式中有十個錯誤,它會需要花費 30 周的時間讓它運行起來。
這種氛圍是非常好的——教會大家不要犯錯,並且首先思考。
大約在 1970 我在大學的時候,這個周期已經減少到了 4 個小時,並且你可以自己給卡片打孔——仍然是 FORTRAN。
在 1974 我可以訪問一台電腦了——霍尼韋爾 DDP 516,有著 32KB 之大的記憶體。因此 474 FORTRAN 編譯器可以在少於一周的時間裡編譯上百行代碼。(大概如此……)
事情總在發展,我去了 CERN 並且使用可以在一皮秒編譯十萬行 FORTRAN 代碼的 CRAY1(大概比我現在用的手機慢無數倍)。
還是 FORTRAN。
在 1974(大約)我玩了 DEC10 ——現在我可以編寫 FORTRAN、Basic、彙編,並且有了按時間輪換的分時(哇~~)。如果我當時在美國的話,我可能就是比爾蓋茨了,可惜那是在愛丁堡。
在 1976 我得到了一份在 NORD10 上用 FORTRAN/彙編編程的工作,而按時間輪換變得非常快。
大約在 1980,我仍然在用 FORTRAN 編程。我不記得那個裝置的名字了,所有的檔案儲存在一個目錄中,沒有全屏編輯器,沒有版本控制系統。我為其大約編寫了 15 萬行的 FORTRAN 代碼。
1985,我加入了愛立信,神奇的 VAX11/750,需要學習新的語言。再見啦,FORTRAN。
我學習了(在不同的熟練程度下)Lisp、Prolog、awk、bash、smalltalk、TCL,並且成為了 Prolog 專家(哈哈哈哈~那個小美人……)。
同時我也對那些隨手就能玩的語言進行了嘗試(ML、forth 等等)。
然後(1986)我進入了我的 Erlang 時代(我其實沒辦法學 Erlang,因為它不存在,所以我發明了它)。它其實是 Prolog + Smalltalk 再配合點錯誤處理、並發和分布式的產物。
然後我學習了 C(學得很差)。但是 Mike Williams 說我的 C 是垃圾,並且看起來像 FORTRAN,因此他回收了我的 C……(為啥要用 malloc 和 free,還有指標什麼的……)
我看到 C++ 的出世並且看了本書,或者說至少嘗試去讀了本書。在我的鋼琴後面的牆上有個坑,就是那本書砸出來的。對 C 進行改進應當讓事情變得簡單,而不是更複雜,我這樣想到。
時間飛逝。
我嘗試了 Java(沒什麼深刻的印象,比 C++ 好點,但是如此羅嗦。在編寫 FORTRAN 的時候,你不得不為一個很小的事情編寫上百行代碼,我甚至為此打腫了手。Java 也差不多,如此羅嗦)。(後來)我還嘗試了 Python(還行)、Ruby(還行)、Lua(不錯)、Javascript(我喜歡 :-))。
實際上學習所有這些語言花費了我相當長的時間,並且它們不是同時進行的。我和 FORTRAN 有 15 年的美好時光,對於用好它來說足夠長了。Prolong 10年, Erlang 20 年,等等。
我也花了很長時間來消化新的主意。那些關於編程的主意或者其他人的好主意,出現得很慢,差不多二十年一個。在過去的二十年裡,編程並沒有多大的改進。那個時候它就是一坨,現在還是一坨。
IDE 和版本控制系統讓事情變得更糟,現在你有了所有版本的一坨,以及那一坨本身,而 IDE 意味著你看不到那一坨了。
世界上最好的 IDE 是你的大腦,它比這些哢啦哢啦的東西好無數倍。
教育為此做了什嗎?
假設你剛剛起步。
你可以在二十餘種語言中進行選擇(它們每個都有一個或多個好理由),這花費了我 40 年來學習,你必須在 2-3 年裡明白這些,看起來不太可能。
初學者應當學習什麼語言,學校應當教什麼語言?
現在我們遇到了一個選擇的悖論,由於有太多選項而無法選擇。
以前說“為了問題而選擇語言”,當你已經瞭解了二十餘種語言(在不同的熟練程度下)這麼說很容易。但是,如果你只瞭解兩種語言 Java 和 C,那麼這就沒什麼協助。
許多實際問題的解決方案在 CLP 語言中只需要幾行代碼,而在 C 中需要幾千行。
我建議學習的是什嗎?
C
Prolog
Erlang(我偏心)
Smalltalk
Javascript
Hakell / ML /OCaml
LISP/Scheme/Clojure
(每個語言)花幾年的時間應該是夠了。
注意這裡沒有捷徑,如果你想要捷徑去買本《十分鐘學會 PHP》,然後用接下來的二十年在 Google 上搜尋“我該如何計算字串長度”。
將所有東西組織在一起仍然是極度糟糕到令人發狂的地步。組織到一起最好的辦法還是 UNIX 的管道
find ... | grep | uniq | sort | ...
這其中最基礎的原理是組件應當通過某個統一的媒介語言中,良好定義的協議來進行分離。
通過訊息傳遞來組織是個途徑。這是 OO 編程的基礎,但是大多數程式設計語言做得很差。
如果世界上所有的應用都通過 socket + LISP S 運算式作為介面(通訊),並且將協議描述用格式化的標準編寫,那麼重用的時候就會(更)容易。
當前,對於語言有種不良的關注和推進,而忽視用什麼協議來如何組織。應該講授協議,而不是語言。
並且應當講授演算法。
祝福大家
/Joe
(所有日期都是大概時間)