程式語言教程書該怎麼寫:向KandR學習!

發表於2011-06-12

每年在評審Jolt Awards圖書的時候,我都會被一些語言教程類圖書弄得心力交瘁。從這些年的評審經驗來看,這些語言類教程的寫得都不錯,但除此之外,少有亮點。換句話來說,這些書都很嚴謹、很精密,如果讀者有足夠的定力,通過它們掌握一門語言的程式設計技術還是不成問題的。可是,即便對那些賣得最好的書,除此之外我都想不出來還能多說幾句什麼樣的讚美的話了。

這些書普遍存在的一個缺點就是把簡單的任務複雜化。最大的或者說最常見的一個問題,是作者們混淆了教程與一本面面俱到地介紹一門語言的專著的區別。由於種種原因,出版行業似乎特別熱衷於後一種體裁,結果就導致了一些令人瞠目的大部頭。我曾經看到過一本“介紹”Java語言的書,厚達1480頁。如果說入門讀物都得這麼厚,顯然是不合理的。不消說,這本書深入地討論了一下AWT和Swing,然後筆鋒一轉,又給讀者羅列出各種各樣的第三方庫,關於虛擬機器的研究當然少不了,而最終則收尾於並行程式設計。謝天謝地,到這裡終於全書完。鑑於這本書已經出到了眼前的第4版,有理由認為它體現了作者對它最終的心理預期。那就是,這實際上是教程兼參考書。而且,既然書的重量都達到了4.5磅(約2.04千克),我想多半也只能把它當作參考書來用了。Mark Lutz的《Learning Python》是Python語言圖書中與此類似的一本。其他語言類圖書中,像把Ruby介紹給西方讀者的“鶴嘴鋤書”(《Programming Ruby: The Pragmatic Programmers’ Guide》),作為此類圖書也是當之無愧。書的前一半是教程,後一半明說就是參考。這種方法就好多了。不用管其中的Ruby教程佔了多少篇幅(418 頁),僅就其質量而言,就充分說明它大受歡迎是有理由的。

第二個常見的問題,就是作者忘了讀者在打算學一門新語言的時候,最想做的是什麼;當然,無非就是要寫幾個小程式,藉以熟悉語法。然而,很多教程通篇都是隻有一兩行的微型程式碼示例,只夠演示某個功能,但沒有一個獨立有用的程式。如果語言還有一個內建的shell(或直譯器),比如像Ruby、 Groovy、Scala,那這個傾向就越發地明顯了。

比如說,Odersky、Spoon和Venners合著的Scala教程(《Programming in Scala》)就能清楚地反映出這個問題。在這本書的前200頁裡面,超過20行程式碼的示例只有一個;大部分都不會超過10行。[而在 K&R(Brian W. Kernighan和Dennis M. Ritchie)那本書(稍後會說到)裡,第一個20行程式碼的示例出現在第26頁。]結果呢,按照我自己的經驗,就是看了半天書,也敲了不少程式碼,由此瞭解了不少功能,但卻始終沒有寫出一個有點什麼用的程式來。實話實說,這種現象簡直太普遍了。現在,我眼前就擺著兩本書,一本Clojure,一本 Groovy,也都是這個套路。

最後一個問題在編輯不給力的書中經常會發現:一心只想展示一門語言的聰明技巧或者能做到的一些小hack。個人認為,讀者是想來學語言的,不是來欣賞語言特技的。這個問題最常見於那些函式式語言,或者像Groovy一樣有意設計得比競爭性語言(對Groovy來說就是Java)更好的語言的教程。

以上三個問題之所以讓人感到難以理解,關鍵在於長期以來一直都有一本絕好的榜樣:Kernighan和Ritchie的《C Programming Language (英文版 | 中文版)》(K&R)。拿這本書跟其他教程比一比,差異立現。先從最明顯的地方開始,K&R的教程部分只有177頁,隨後是40 頁的附錄,附錄是極其簡明的參考。在這種篇幅適中的情況下,任何讀者都能輕鬆看完,並且做完全部示例。其次,大多數程式都在20行程式碼以上,既有相應的用途,也不讓人感到陌生,而且相對完整。即便是到了這本書的第125頁左右,示例程式中都包含main()函式。這裡說的可不是程式碼片段,而是雖短但卻真實的程式。最後,書中對所有程式的解釋分析十分透徹,而且前後相繼,由淺入深。沒有對功能漫無邊際的簡單羅列,所有示例都有一種內在的線索,讓讀者在任何時候都知道自己掌握了哪些基礎知識,還需要探索哪些基礎知識。

那在K&R中看不到什麼呢?最明顯的是,書中沒有解釋標準庫中每個函式功能的部分。Java圖書也應該把這個部分刪掉。(對Java知識體系介紹得最為全面的兩本書,就是Horstmann和Comell合著的《Core Java》卷I卷II。但在兩卷合起來1800頁的篇幅中,沒有包含教程,也沒有像書中所說的那樣講述。)

K&R也沒有填鴨式的說教。看這本書必須邊看邊思考。所有資訊都擺在那兒,但你必須動手去做每一個例子,才能理解這門語言。作者希望看這本書的讀者很用心很專注,因此會在你迅速學會這門語言的過程中,隨時為你提供幫助,但不會強迫你一頁接一頁地閱讀那些對理解語言沒用的東西。

恐怕有人會說,C只不過是一門小型語言,所以介紹它自然用不著大部頭。要是你也這麼認為,請睜開眼來看看別的C語言教程,看有哪一本書像 K&R這麼薄,而且寫得又那麼好。要不然,再看看JavaScript,JavaScript也是一門小型語言,但還沒有哪本書是篇幅又短,又容易理解的。

我想說明一下,前面提到的那幾本書都是著意挑選出來的,因為這幾本書在我看來都是相應語言領域的最佳教程。Odersky等寫的Scala、 Thomas寫的Ruby,還有Lutz那本Python,這些都是學習相應語言的最佳起點。我只是希望這些書要是能更像K&R那樣就好了。

原文:Andrew Binstock(《Dr. Dobb’s》主編)
譯文:李鬆峰

 

相關文章