我在上篇中“盤點”了TCPL和D&E以及入門教程、高效和健壯編程、模板和泛型編程等方面共十幾本C++好書。冬去春來,讓我們繼續C++書籍精彩之旅J
標準庫
當我還在研究院工作時,與同院另外兩家研究所合作開發過一個大型水利樞紐調度集成項目。我們三家軟件系統之間都要相互通信。在調試通訊模塊時,細心的客戶(一名好學的系統管理員)發現對于同一通信規約的解釋代碼,我的不超過30行,而對方的則超過了150行且很難看懂。這位系統管理員很納悶,我說大家編程風格和習慣不一樣,我使用了標準庫,而他使用了傳統C編程風格以及他所習慣的另外一些技術。
別誤會!我絕無貶低這位合作伙伴的意思。事實上,我對那些真正有著深厚的C編程功力的程序員常常懷有欽佩之心。畢竟,C++能有今天的成功在很大程度上緣于它深深地植根于C。作為一名C++程序員,倘若不熟悉C++中的C,我往往會認為他的基本功是不扎實的,他的技術底氣是不足的。
不過話又說回來,C++是一種多范型(paradigm)編程語言,具體采用哪種編程風格,專業程序員應該知道視具體情況而定。作為一名經常需要在現場做即興開發的項目負責人,為了短平快地解決當務之急,我習慣盡量采用現有的庫(和組件)。效率(以及強健性)久經驗證的C++標準庫已經擺在那兒了,何樂而不用呢?
Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference
《C++標準程序庫:自修教程與參考手冊》,華中科技大學出版社
這是一本百科全書式的C++標準庫著作,是一本需要一再查閱的參考大全。它在完備性、細致性以及精確性方面都是無與倫比的。本書詳細介紹了每一標準庫組件的規格和用法,內容涵蓋包括流和本地化在內的整個標準庫而不僅僅是STL。正如本書副標題所示,它首先適合作為教程閱讀,爾后又可用作參考手冊。
淺顯易懂的寫作風格使得這本書非常易讀。如果你希望學習標準庫的用法并盡可能地發揮其潛能,那你必須擁有這本書。正如網絡上所言,這本書不僅僅應該擺在你的書櫥中,更應該放到你的電腦桌上。我向每一位職業C++程序員強烈推薦。
Angelika Langer, Klaus Kreft, Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference
《標準C++輸入輸出流與本地化》,人民郵電出版社
C++標準庫由STL、流和本地化三部分構成。關于STL的書市面上已經有不少,但罕見流和本地化方面的專著。本書是這兩個領域中最優秀的一本,迄今為止沒有任何一本書比這一本更全面詳盡地討論了流和本地化。如果你不滿足于停留在“會用”流庫的層面,千萬不要錯過它。
2001年夏天,我草草翻閱過這本書的中文版,從內容到包裝都給我留下了比較深刻的印象 — 不過負面的居多一些。2003年秋天,無意中得知某網絡書店正以超低價格甩賣這本書的中譯本,情不自禁,一陣唏噓。
Scott Meyers, Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library
《Effective STL(影印版)》,中國電力出版社
讀完Scott 的《Effective C++》和《More Effective C++》的中譯本之后,我一直期待這本書的中文版。我從潘愛民先生的個人主頁上了解到,他和他的合作伙伴似乎早已完成了這本書的翻譯工作,可惜至今市面上仍不得見。幸運的是,我們可以看到它的原版。
本書是使用STL的程序員必讀之作。在這本書中,Scott向我們講述STL容器和算法的工作機制以及如何以最佳方式使用它們。和Scott的其他作品一樣,這本書的寫作風格清晰、精確,具有極佳的可讀性。看過這本書以后,我想你也許會和我以及其他C++程序員一樣產生這樣的想法:Scott什么時候會寫出一本“More Effective STL”?
關于STL,我還提醒你留心Matthew H. Austern的《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》(《泛型編程與STL》,中國電力出版社)。這本書散發著濃厚的學院氣息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一書末尾鄭重推薦另外兩本進階好書(除了他們自己的《Ruminations on C++》外),其中一本是TCPL,另外一本就是本書!
網絡編程
在網絡編程時代,C++應該扮演著怎樣的角色,讓ACE(Adaptive Communications Environment)來告訴你。
Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns
Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks
《C++網絡編程,卷1:運用ACE和模式消除復雜性》,華中科技大學出版社
《C++網絡編程,卷2:基于 ACE 和框架的系統化復用》,電子工業出版社
采用C++進行企業級網絡編程,目前ACE(以及這兩本書)是一個值得考慮的選擇。ACE是一個面向對象、跨平臺、開放源碼的網絡編程框架,目標在于構建高性能網絡應用和中間件。Douglas是ACE的創始人,Stephen則已為ACE提供了數年的技術支持和顧問服務,兩位都是ACE社群(是的,ACE的影響和實際應用的程度已經形成了一個社群)的專家。
ACE并不單單被大學和研究所追捧,它已經被成功地應用于世界上成千上萬個商業應用中。在電信、宇航、醫藥和財經領域的網絡系統中,ACE已經并繼續發揮著重要的作用。如果你準備開發高性能通訊系統,你應該考慮考慮這一匯集世界頂尖專家智慧的成果。
除了使用C++面向對象設計技術和模板等高級語言特性外,ACE還運用了大量的模式?!禖++網絡編程》卷1和卷2并不僅僅教你關于ACE的方方面面,它還會教給你模式和通用框架設計等高級技術等。所以,作為一名中、高級C++程序員,即使你很少進行正兒八經的C++網絡程序設計,閱讀這兩本書同樣可以從中受益。
是的,并非所有網絡應用都要使用Web服務器(以及其他應用服務器)和重量級組件模型,換個思路,它們或許也可以從輕量級的ACE組件中獲益。
雜項
以下這幾本書之所以被列入“雜項”單元,只是因為我沒有考慮出更合適的歸類方法,它們和上面的書籍一樣,值得一讀。
Bruce Eckel, Thinking in C++, Volume 1: Introduction to Standard C++ (2nd Edition)
Bruce Eckel, Thinking in C++, Volume 2: Practical Programming (Second Edition)
《C++編程思想(第2版)第1卷:標準C++導引》,機械工業出版社
《C++編程思想(英文版 第2版)》,機械工業出版社
《Thinking in C++》的第1版于1996年榮獲“軟件研發”雜志評選的圖書震撼大獎。最新推出的第2版對內容進行了大幅改寫和調整,以反映C++標準化帶來的影響以及近幾年面向對象領域最新研究和實踐成果?!拜斎胼斎肓鳌?、“多重繼承”、“異常處理”和“運行時類型識別”等高級主題連同C++標準化以后增加的一些內容則被放入第二卷中。Bruce是一名經驗豐富的C++講師和顧問,其培訓和寫作經驗都是世界一流水準,他的作品比那些“玩票”的技術人員寫的東西更能吸引讀者。事實上,在同類圖書中,對于大多數讀者而言,這本書的可讀性要超過TCPL和《C++ Primer》。順帶一提,訪問作者的站點,你可以先睹第二卷的風采。
Andrew Koenig, Barbara E. Moo, Ruminations on C++: A Decade of Programming Insight and Experience
《C++沉思錄》,人民郵電出版社
Andrew是世界上屈指可數的C++專家。這是一本關于C++編程思想和程序設計技術而非語言細節的著作。如果你已經具有一定的基礎,這本書將教你在進行C++編程時應該怎樣思考,應該如何表達解決方案。整本書技術表達透徹,文字通俗易懂。Bjarne這樣評價這本書:本書遍布“C++是什么、C++能夠做什么”的真知灼見。
Stanley B. Lippman, Inside The C++ Object Model
《深度探索C++對象模型》,華中科技大學出版社
《深度探索C++對象模型(影印版)》,中國電力出版社
從編譯器的角度觀察C++可以使你知其然并知其所以然。本書探討了大量的C++面向對象程序設計的底層運作機制,包括構造函數、函數、臨時對象、繼承、虛擬、模板的實例化、異常處理、運行期類型識別等,另外還介紹了一些在實現C++對象模型過程中做出的權衡折衷。喜歡刨根問底的C++程序員不要錯過這本書。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented software
《設計模式:可復用面向對象軟件的基礎》,機械工業出版社
《設計模式:可復用面向對象軟件的基礎(英文版)》,機械工業出版社
設計可復用的面向對象的軟件,你需要掌握設計模式。本書并非專為C++程序員而寫,但它采用了C++(以及Smalltalk)作為主要示例語言,C++程序員尤其易于從中受益。四位作者都是國際公認的面向對象軟件領域專家,他們將面向對象軟件的設計經驗作為設計模式詳細記錄下來。這本書影響是如此深遠,以至于四位作者以及本書都被昵稱為GoF(Gang of Four)。本書學院氣息濃厚,行文風格嚴謹簡潔,雖然它不如某些講解模式的書籍易讀,但真正要精準地理解設計模式,本書是終極權威。學習設計模式,這本書需要一而再、再而三的咀嚼。順帶一句:請將設計模式化作開拓思維的鑰匙,切莫成為封閉思維的枷鎖。
還有一些C++好書值得一讀,恕此處無法一一列出。例如John Lakos的著作《Large-Scale C++ Software Design》(《大規模C++程序設計》,中國電力出版社)和侯捷先生的《STL 源碼剖析》(華中科技大學出版社)等。
《STL 源碼剖析》是一本很有特色的書,但我認為它還可以更好。我個人期待侯捷先生自第一版發行以來經過對模板技術的沉淀和再思考之后,再寫一本剖析得更深入、更透徹并且更全面的“第二版”。遺憾的是,侯捷先生在完成《C++ Templates: The Complete Guide》一書的翻譯后似乎決定暫時告別模板、泛型編程和STL領域。
2004年3月31日補充:我目前最常查閱的兩本參考書是《C++標準程序庫》和《STL源碼剖析》。當然了,這與我年內的寫作計劃有很大的關系。
使用C++成功開發大規模軟件系統,不僅需要很好地理解大多數C++書籍中講述的邏輯設計問題,更需要掌握《大規模C++程序設計》中講述的物理設計技術。當然,這本書的確有點過時了,不過,如果你的精力和金錢都比較寬綽,買一本看看并無壞處。
至此,我想有必要聲明一下,有一些(好)書沒有得到推薦,主要原因如下:
* 以上這些書已經足夠多、足夠好了。
* 我不會推薦通過正常渠道很難購買到的書籍 — 不管是中文版還是英文版。
* 作(譯)者名氣大小不影響我的推薦。我們是在看書,不是看人。
* 我不會推薦我從來沒有看過的書。我至少要看過其中的某個版本(包括電子檔)。這個“看”,一般指“認真閱讀”,不過有一些也只能算是“瀏覽”。
結語
作為一名普通技術寫譯者,我深知技術創作和翻譯的艱辛(和快樂),并多多少少了解一些有關技術書籍創作、翻譯、制作、出版以及市場推介背后的細節。今天,我不會再對一本看上去差強人意的圖書信口開河。羅列同一本書的各種版本的用意只在于為你多提供一些信息,讓你多一種選擇。
在本文成文的后期,我給Bjarne寫了一封信,請教如果他來寫這篇文章會怎么寫。他給了我簡明扼要的建議。在肯定以上列出的絕大部分圖書都是世界頂尖水平的C++著作的同時,Bjarne提醒我別忘了向專家級程序員推薦《The C++ Standard : Incorporating Technical Corrigendum No. 1》。這本書是 C++標準規范的“圖書版”,Bjarne親自為之作序。
Bjarne還友好地提醒我,在我的推薦列表中沒有哪一本有助于C++程序員進行Windows編程 — 這正是我的本意。在這篇文章中,我只推薦、點評平臺中立的C++著作(網絡編程除外) — 和操作系統無關,和集成開發環境無關,我甚至幻想它們和編譯器也無關。你可以根據業務開發需要,選讀自己喜愛的領域相關的C++書籍。
說到“系統無關、平臺中立”,我不由得想起了“抽象層”的概念。開發實際應用的C++程序員通常工作于特定操作系統、特定開發環境和特定業務領域之中,而對標準C++和C++標準庫扎實而深刻的把握,無疑是你得以在不同的操作系統、不同的開發環境以及不同的業務領域之間縱橫馳騁的“抽象”本錢。