讀《黑客與畫家》
作者:鄭凱
其實《黑客與畫家》是提前預訂的,所以一發售就看了,但現在才動手寫讀后感,實在是因為回味無窮。
這本隨筆集包含了很多觀點,對我而言最重要那部分,就是押題的那段:真正的程序員跟畫家是如此相似。其實我以前也有類似的模糊印象,但一直沒法說清楚:
額外的一個話題,我發現很多人都在 Google Profile 上都寫著職業 Engineer。我總覺得,寫 Engineer 和寫 Programmer 的,代表著兩種完全不同的態度。
作者 Paul Graham 一直強調快速創造原型,順便狂熱鼓吹 Lisp,先說我理解的第一層意思,語言對于開發效率的影響。
雖然大家所用的語言都是圖靈完備的,且不說能不能把函數作為返回值這類高級貨,單看拿 Java 的 syntax作為靶子,確實慘不忍睹,明明都表達同一個意思,卻要多寫那么多的冗余關鍵字,這里要強調一個概念,香農的信息熵,以前我能明白這么個概念但一直不知道是什么詞(最早想到這個問題是用來解釋為什么 mp3 和zip 是不同的壓縮方式,但 mp3 已經無法被zip 進一步壓縮了),后來在谷歌黑板報的幾篇數學之美系列的文章里得以窺豹,例如 輸入一個漢字需要敲多少個鍵,比方說如果所有 method 都必須有范圍,那最常見的 public 完全可以省略掉,雖然程序語言可以類比為自然語言,但也可以類比成都要輸入漢字時,不同語言相當與不同輸入法。很多動態語言的書寫效率是五筆的話,基本上 Java 就是全拼了……但是 Paul Graham 宣揚的代碼長度跟開發效率等比顯然是歪理邪說了,雖然有特例,例如39年德國在歐洲的征服速度約等于行軍速度,但放到42年的斯大林格勒就不是這樣了。大家應該都碰到過這種情況:區區兩三百行代碼被反反復復寫了好幾天,還是兩三百行,只不過不是之前的兩三百行了。
跟 Java 的 syntax一樣傻的,還有 DOS 換行符,雖然這可能是歷史原因,干出這事的人可能有理由不被責備,但 \r\n 換行符確實很傻,就像沒人會在寫字的時候,把“句號”寫成“逗號句號”。所有現代語言(就是除了 Java 之外我們常見到的)都在降低代碼的信息熵,說白點就是如何在保證不產生歧義的情況下盡量減少各種符號。其實 ;\n 跟 \r\n 差不多傻,所以所有現代語言(就是除了 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 的位置實際處于偽代碼和程序語言之間,以快和下賤為特色,你可以快速搭建原型,需要人手時可以找一群民工來寫,這語言當然就很厲害了。《黑客與畫家》給我最大的一個啟示就是,盡管我明白優化乃萬惡之源,但實際寫代碼的時候還是容易拘泥于細節,現在看來最痛恨的事情就是在給一個應用做第一版的時候,代碼還不夠偽代碼化。你是程序員,你是畫家,你要最快的速度讓一個程序能跑起來。畫一幅受歡迎的畫是程序員要做的,把畫印刷成無數分賣往全世界是工程師要做的。真等 非死book 的網站運轉起來了,還愁這世界找不到人改進下 memcache 的 pecl 就節省出上萬臺機器么。
我之前相信語言爭論的和事佬說法:語言各有各的精髓,但總的來說是相等的。Paul Graham 用一個簡單的例子來駁斥:如果承認 Perl 5 比 Perl 4 強,那就應該承認不同語言之間也存優劣之分(這種手法我以前也用過,當時用自己一年間的差距來證明合作的困難)。其實以前看《軟件隨想錄》里的一篇《你的編程語言能這樣做嗎?》時就在琢磨這個問題了,看到《黑客與畫家》的時候又把這個問題強化重視了。你可以繼續用 PHP 去謀生,但不可以不知道在一些語言特性上,PHP 相比 Python 或 Ruby差的有多么遠。