為什麼《Dive into Python》不值得推薦

賴勇浩發表於2008-08-28
2010 年 5 月 5 日更新:我翻譯了一篇《<Dive Into Python>非死不可》作為對本文觀點的進一步支援和對評論的回覆,請見:http://blog.csdn.net/lanphaday/archive/2010/05/05/5558617.aspx

為什麼《Dive into Python》不值得推薦

作者:賴勇浩(http://blog.csdn.net/lanphaday

不論是在國內人氣最旺的 Python 社群 python-cn google group,還是在 CSDN 的指令碼論壇,都不時有新加入的朋友諮詢有沒有什麼 Python 書比較好,回覆的貼子裡,肯定少不了《Dive into Python》(以下簡寫為 DIP,且不加書名號)。今天我要說的是它不值得推薦的理由:它太舊了,而且內容編排相當古怪,全書來看缺乏大局觀,我沒見認是靠它入門的,最後還有非常重要的一點——推薦者可能根本不在工作中使用 Python。

基於老版本

在第一章,我們可以看到這本書基於 Python 2.2 或 2.3 版本編寫。當前 Python 最新的釋出版是 2.5.2,2.6/3.0 版本也計劃在今年 10 月釋出,這當中相隔的版本太大,使得很多書中推薦的編碼形式、效能要點都不再成立了。

其實這本書作者到 2004 年就沒有再做更新了,時隔四年,對於一個開源的指令碼語言來說,產生的變化足以用山河變換來形容。在 manuals 中可以看到許多特性都加 new in 2.3/2.4/2.5 的註腳,不客氣地說,DIP 已經不合時宜了。

來個例子

寫這篇文章的時候,我參考啄木鳥網站的DIP 5.4b 版本(http://www.woodpecker.org.cn/diveintopython/index.html ),這是 DIP 最新的中文版。其中第2章的例2.1,如下:

這裡至少有兩處沒有充分利用新版本特性,一處是 myParams 的定義,續行符讓程式碼變得醜陋,另一處是 join() 函式的實參無須構建一個新的列表,損失了效能。

這本書裡不僅沒有 new-style class,也沒有function decorator;沒有談有用 Unicode 字串,卻有 UserDict 這樣的老掉牙的實現。除了這此跟不上時代以外,還有一些內建函式、標準庫都沒有使用最新的。當 DIP 先入為主,讀者會認為程式碼就應該這樣寫,以致出現大蝦不識 enumerate() 的情況屢見不鮮。s

內容編排古怪

DIP 的第一個例子(即上文的例2.1)足足花了兩章才能夠完全說明。其中至少有如下概念:函式定義、變數定義、docstrings、字串、字串格式化、字典、字典迭代、列表、列表包含、元組、分枝語句、迴圈語句、程式入口、預定義系統變數等。哦,天啊!這是一本定位於初學者的書的第一個例子嗎?而你竟然還向初學者推薦?我非常懷疑你對 DIP 一書是否真的足夠了解,有沒有深入地讀一下這本書。

雖然我很欽佩作者竟然能找到一個如此精妙的例子,短短几行程式碼竟然包括了十餘個 Python 特性,另外還有隱含的對資料庫知識的瞭解。Coooooooool!但這種酷例子只會把大部分初學者嚇得退避三舍。

除了這個例子外,再舉一個內容編排古怪的例子——就是第4章“自省的威力”。第3章剛講完了內建資料型別,加上第2章的基本語法、函式定義等內容,馬上就應該到 Python 的特點之一:物件導向了吧?作者他偏不,讀著讀著,只是奇峰突起,來了個神也怪也的“自省”。如此大起大落、婉轉曲折,作者應該去寫章回小說,何必來寫個教程湊熱鬧。硬著頭皮讀下去,發現例4.1是一個有更多 Python 特性的小例子,不知又有多少初學者在此打道回府?

缺乏大局觀

大家知道一篇好文章,需要一條主線,所有的情節都是為主線服務的。寫一本書也差不多,內容應當為主題服務,既然書名定為 Dive into Python,那自然應該多講講 Python 的知識點。但全書的第7到12 章三分之一的篇幅講了正規表示式、HTML、XML、HTTP web 甚至 SOAP web等具體應用,而且相當多內容是與 Python 無關的、獨立的協議的講解。哦,那您老還不如寫本書叫《Python 與 web 開發從入門到精通》。

這本書缺乏大局觀的另一個表現在於它花了中間的三分之一的篇幅講 web 之後,最後三分之一的內容卻又開始陽春白雪起來,完全拋棄了 web 相關的內容開講單元測試、測試驅動開發、重構、函數語言程式設計、效能優化等主題。不得不說這些話題非常有意思,但一堆鬆散的珍珠並不能讓你光芒四射,只有用一條金錢把它們穿起來,形成一體,才能彼此相得益彰。

一個國內 Python 社群頗有聲名的高手如此評價 DIP:“我覺得 DP 最大的問題是該講的沒講, 不該講的亂講。”在一本有著許多發光點的書也許可以讓讀者開拓眼界,但也往往導致他們變得眼高手低。以為自己什麼都見過,真正開幹卻又無從下手。Python 是拿來用的,應當多介紹常用的模組,DIP 則是一本看完以後沒法用的書。

推薦者,你靠它入了門?

好吧,這本書從 2000 年到2008 年的今天已經走過了 9 個年頭,不知道多少人靠它入門了?我沒有做過統計,只能在下文講講我掌握的情況;但讀者您不妨在文章後面匿名留言,看看比較大眾化的情況。

我之前在一個使用 Python 相當普及的公司任職,在入職之後才學的 Python。因為我是通過校園招聘進去的,所以同時去的有一大批應屆生,幾乎全部不懂 Python。後來我們也沒有使用 DIP,當然,我們都學會了 Python。跟老員工熟悉了之後,加上後來在公司呆的幾年,瞭解到公司幾乎沒有人用這本書。

雖然後來在網路結識了許多 Pythoner,但也仍然沒有聽過誰是靠 DIP 學會 Python 的。這樣的事實讓人不得不懷疑大家對 DIP 推薦有加其實只是以訛傳訛。s

推薦者,你靠 Python 謀生嗎?

像 google 的pagerank 演算法,推薦 DIP 的人本身靠 Python 謀生的話,才會有說服力。我當然不知道推薦 DIP 的人是否真的靠 Python 謀生,但我這個不推薦 DIP 的人卻正是靠 Python 謀生。

專業的人才能有專業的推薦,如果推薦者在本職工作中並不使用 Python,那它的推薦就像一個內蒙古人推薦的帆船,夏威夷的性感沙灘妹推薦的馬,你覺得信得過嗎?

我們可以不讀 DIP 仍然弄懂 Python,起碼說明了 DIP 並非必讀書目,你不必因為曾經被 DIP 嚇退而放棄 Python,我們完全有更好的選擇。

那什麼更好?

指出一樣事物的不足不是難事,難事是推薦一個替代品。DIP 的替代品是 Python manuals 中自帶的 Tutorial,甚至你仍然可以找到它的中譯版。Tutorial 的好處包含但不限於以下幾點:

1) 它是最新的,而且會在出新版本的時候第一時間更新;

2) 它是官方的,出自 Guido 和其他 Python 主力開發者之手,沒有人比他們更有能力帶你 Dive into Python,不是嗎?

3) 它的內容編排循序漸進,行文平實,讀起來雖然沒有跌蕩起伏的快感,但可以讓你輕鬆上路;

4) 它的內容覆蓋面廣,這一點遠勝 DIP;

5) 我和我的大部分同事都是靠它走入了 Python 的殿堂,所以這是真正的實踐者的推薦;

6) 許多我認識的靠 Python程式設計師跟我一樣認為這才是真正的好教程,當然,他們靠 Python 謀生或曾靠 Python 謀生。

如果你非要找一本可以捧在手上的書,那麼一本好的 Python 書的標準是要麼在廣度上有建樹要麼就是深度。廣度上來說,《Python程式設計金典》做得不錯;深度上, 《python cookbook》和《可愛的 Python》系列文章比較好。而DIP 這種四不像讓人看完後只會更迷惑,因為 Python 是拿來用的, 所以深度和廣度是比較重要的。而 DIP 以入門為幌子,但是不像“金典”具有極高的可操作性。如果難以動手操作,自然不能很好地掌握知識,那麼作為入門書也就變成扯淡了。

相關文章