三讀《Java編程思想》
又一次,或者准確地說,第三次讀完了《Java編程思想》,合上書,我陷入沉思之中,這本書為什么值得我一而再,再而三地去讀它呢?而且,似乎每遍重讀,似乎總有些新的收獲。我盡我所能來闡述其原因,希望在本文結束之時,我們共同擁有一個滿意的答案。
為什么此書值得讀?
為什么是這本書,而不是其他書呢?先賣個關子,中學的時候有一個奇怪的現象,有的老師,再聽他講課的時候,沒覺得難,但是,聽完之后,卻發現已經把一個很難的問題在不知不覺之中搞明白了。現在想想,這其實就是大師的能力,他可以化繁為簡,把復雜的問題用簡單的語言解釋清楚。而此書的作者Bruce Eckel就是當之無愧的大師,他擁有豐富的Java教學經驗,又對Java有獨到的見解,而且對Java的很多設計提出了問題和建議。此書獨特的地方可以歸結為以下幾個方面:
- 每次一小步。每次只介紹一個知識點,在確保讀者能夠掌握之后,再介紹新的知識點。如此,讀者理解起來更加容易,也更有成就感,同時也不會因為眾多糾纏不清的知識點而迷惑,這就是此書中文版厚達880頁的原因。
- 每個知識點都有對應的可編譯執行的代碼例子。讀者可以自己運行,加深理解。當有疑問時,也可以通過修改代碼,自我驗證,在不知不覺中得到提高。
- 采用測試框架展示程序輸出。有以下優點:
- 培養讀者對測試的重視,在實際工作中,很多初學者容易忽視測試的重要性。
- 培養讀者去寫出可測試的代碼,比如緊密耦合等,都會導致程序很難測試。
- 培養讀者如何寫測試框架,這對工作中寫單元測試和其他測試都很有幫助。
- 要修改程序時,比如重構,可以通過測試框架來確保程序的正確性。
- 示例中運用眾多設計模式。關於設計模式的重要性,相信大家都知道,只是面向對象設計的基本功,結合實際的例子來學習,可以說是一舉兩得。
- 有些功能,有很深入的探討。比如泛型,通過與C++的對比,介紹了設計思路和優缺點。
為什么值得讀3遍?
先介紹以下我讀此書的經歷:
- 2010年初,購入此書第四版中文版。此前,在Stackoverflow,見多人推薦此書。
- 半年時間,讀第一遍,當然很多問題淺嘗輒止,沒有搞明白,總算是翻完了以便。最大的感受是,原來Java還有這么多我不知道的功能。
- 2011年,工作之后,發現真正寫代碼的時候,很多都是一知半解。比如,容器和泛型應該怎么用,並發該怎么寫,異常該如何處理,IO的框架是怎么回事。不過,總算知道這些東西的存在。又花了半年的時間,第二遍。這次,帶着問題有目的性地把相應的章節仔細地重讀了一遍。工作中的問題得到順利解決了,但是好奇心沒有得到充分的滿足,很多東西不知道為什么要這么用。
- 2012年初,購入此書第四版英文版。因為我認為翻譯不可能沒有信息損失,這些損失很可能使我不能正確理解作者要表達的意思。
- 開始閱讀第三遍,花了1年左右。這次可是說是咬文嚼字,很多不認識的單詞還查了詞典。讀完第一章對象導論,我就大有收獲。之前竟然沒有發現這章如此之好,從哲學的對象到編程中的對象,對面向對象做了全面而准確的解釋,讀完之后,豁然開朗。之后,更是驚喜不斷,尤其是異常那一章,對檢查型異常的優缺點做了詳細的論述,並提出了解決方案來克服檢查型異常的缺點,讓了理解了為什么這個功能只在Java中存在(在Python, C#中都沒有檢查型異常)
學習的過程
在Java Performance的開頭,作者認為,要想成功地調優Java性能,你需要經歷三個階段:
- 我不知道我要知道什么。也就是說,在解決一個問題是,你不知道你需要知道什么知識和方法才能解決問題。
- 我知道我要知道什么。你知道你要了解哪些重要的東西才能解決問題,但是你還沒有研究過那些重要內容的細節。
- 我已經知道了我需要知道的。簡而言之,你了解並理解了所有的細節。
我認為,還要加上一個階段:
- 我質疑並改進我已經知道的。對於我所掌握的知識和細節,我會持懷疑的態度問自己,為什么要怎么做才能解決問題?怎么做有什么優缺點?有沒有其他的方法,更好的方法?
你會發現,我讀《Java編程思想》的經歷完整得重現這四個階段:
- 未讀之前,我不知道要知道什么才能用好Java。
- 一遍之后,我知道我要理解面向對象,異常,並發,泛型,IO等才能用好Java。
- 兩遍之后,我理解了所有的技術細節。
- 三遍時,我開始評價並反思所有的技術細節,以及它們從何而來,為什么成為現在這樣,以后又會去向何方。
結論
相信讀者讀到這里,應該已經能夠理解我為什么讀三遍《Java編程思想》。如果您讀完此文,決定讀一下《Java編程思想》;如果您讀完此文,決定好書以后要讀三遍,我知足矣。