注:本文轉載自鄭凱的部落格
其實《黑客與畫家》是提前預訂的,所以一發售就看了,但現在才動手寫讀後感,實在是因為回味無窮。
這本隨筆集包含了很多觀點,對我而言最重要那部分,就是押題的那段:真正的程式設計師跟畫家是如此相似。其實我以前也有類似的模糊印象,但一直沒法說清楚:
額外的一個話題,我發現很多人都在 Google Profile 上都寫著職業 Engineer。我總覺得,寫 Engineer 和寫 Programmer 的,代表著兩種完全不同的態度。
作者 Paul Graham 一直強調快速創造原型,順便狂熱鼓吹 Lisp,先說我理解的第一層意思,語言對於開發效率的影響。
雖然大家所用的語言都是圖靈完備的,且不說能不能把函式作為返回值這類高階貨,單看拿 Java 的 syntax作為靶子,確實慘不忍睹,明明都表達同一個意思,卻要多寫那麼多的冗餘關鍵字,這裡要強調一個概念,夏農的資訊熵,以前我能明白這麼個概念但一直不知道是什麼詞(最早想到這個問題是用來解釋為什麼 mp3 和zip 是不同的壓縮方式,但 mp3 已經無法被zip 進一步壓縮了),後來在谷歌黑板報的幾篇數學之美系列的文章裡得以窺豹,例如 輸入一個漢字需要敲多少個鍵,比方說如果所有 method 都必須有範圍,那最常見的 public 完全可以省略掉,雖然程式語言可以類比為自然語言,但也可以類比成都要輸入漢字時,不同語言相當與不同輸入法。很多動態語言的書寫效率是五筆的話,基本上 Java 就是全拼了……但是 Paul Graham 宣揚的程式碼長度跟開發效率等比顯然是歪理邪說了,雖然有特例,例如39年德國在歐洲的征服速度約等於行軍速度,但放到42年的斯大林格勒就不是這樣了。大家應該都碰到過這種情況:區區兩三百行程式碼被反反覆覆寫了好幾天,還是兩三百行,只不過不是之前的兩三百行了。
跟 Java 的 syntax一樣傻的,還有 DOS 換行符,雖然這可能是歷史原因,幹出這事的人可能有理由不被責備,但 rn 換行符確實很傻,就像沒人會在寫字的時候,把“句號”寫成“逗號句號”。所有現代語言(就是除了 Java 之外我們常見到的)都在降低程式碼的資訊熵,說白點就是如何在保證不產生歧義的情況下儘量減少各種符號。其實 ;n 跟 rn 差不多傻,所以所有現代語言(就是除了 Java 和 PHP 之外我們常見到的)都把分號去掉了
第二層意思,語言的適用性
其實 Paul Graham 已經在一個不起眼的註釋裡,借其搭檔之口間接的表達了這個意思:智力是分階級的,而不同語言歸屬於不同階級(這個理念屬於書中《不能說的話》裡說指的那類東西)
(中文版 P173 註釋)
莫里斯覺得不用這麼保密,因為即使競爭對手知道我們使用 Lisp 語言,對他們也不會有幫助:“如果他們真的聰明,早就已經在用 Lisp 程式設計了”
對於 Viaweb 為什麼是用 Lisp 寫的,我只能這麼解釋這個問題:掌握 Lisp 屬於智力上的挑戰,倚靠 Lisp 的特性來快速開發產品是極少數高智商的人能做到的事情,Lisp 的始創者將其作為數學表達方式,而從來沒想過用 Lisp 做這麼具體的產品。所以書中引用別人的話,建議黑客瞭解 Lisp,哪怕未必在實際工作中用到它,其實和王建碩對微積分的看法是一樣的(人的腦子思考問題,除非經過特別的訓練(微積分是訓練的一種),都是線性的)。我的看法是,Lisp 絕不適合做開發,就像高斯的尺規作圖十七邊形不是你能做的一樣。我想象的 Lisp 裡大量使用所謂的 macro,可維護性相當於十七邊形。
PHP 能足夠流行,主要原因之一是這語言下賤,我想如果所有語言都能測一下開發者的平均智商的話,應該 PHP 的開發者的平均智商是最低的。但這話絕不是冒犯任何人,想承認他流行就必須承認這是因為連智商 90 的人都敢嘗試給 PHP 寫 Framework 才能導致這麼流行,這是一個事實,跟任何一個具體的使用者是誰、怎麼用無關。我在開始瞭解其他語言後,才知道這麼個事實:其他幾乎所有語言的基礎庫,都是用同樣的語言寫就的,唯獨 PHP 的基礎庫都是靠 C 的。去年看到一片文章說 PHP 不是語言,深表同意,我認為 PHP 的位置實際處於虛擬碼和程式語言之間,以快和下賤為特色,你可以快速搭建原型,需要人手時可以找一群民工來寫,這語言當然就很厲害了。《黑客與畫家》給我最大的一個啟示就是,儘管我明白優化乃萬惡之源,但實際寫程式碼的時候還是容易拘泥於細節,現在看來最痛恨的事情就是在給一個應用做第一版的時候,程式碼還不夠虛擬碼化。你是程式設計師,你是畫家,你要最快的速度讓一個程式能跑起來。畫一幅受歡迎的畫是程式設計師要做的,把畫印刷成無數分賣往全世界是工程師要做的。真等 facebook 的網站運轉起來了,還愁這世界找不到人改進下 memcache 的 pecl 就節省出上萬臺機器麼。
我之前相信語言爭論的和事佬說法:語言各有各的精髓,但總的來說是相等的。Paul Graham 用一個簡單的例子來駁斥:如果承認 Perl 5 比 Perl 4 強,那就應該承認不同語言之間也存優劣之分(這種手法我以前也用過,當時用自己一年間的差距來證明合作的困難)。其實以前看《軟體隨想錄》裡的一篇《你的程式語言能這樣做嗎?》時就在琢磨這個問題了,看到《黑客與畫家》的時候又把這個問題強化重視了。你可以繼續用 PHP 去謀生,但不可以不知道在一些語言特性上,PHP 相比 Python 或 Ruby差的有多麼遠。