文章内容來源自網絡。因時間久遠,現在難以知道具體的來源。
自從Dennis M.Ritchie于1973年設計并實作C語言以來,計算機程式設計領域已經發生了巨大的變化。以C語言為根基的C++、Java和C#等面向對象語言相繼誕生,并在各自領域大獲成功。今天,C及其後裔幾乎統治了計算機程式設計世界。可以這麼說,C語言的誕生是現代程式語言革命的起點,它改變了程式設計語言發展的軌迹,是程式設計語言發展史中的一個裡程碑。 然而,C并不僅僅是其他語言的起點和基礎,否則它早已成為程式設計語言發展過程中又一個被遺棄者。和當初發明時一樣,C語言今天依然至關重要。它的表達力、效率、簡練、緊湊、對機器的最終控制以及跨平台的高度移植性,使其在系統程式設計、嵌入式程式設計等領域一直占據着統治地位,而C99标準的制訂則再一次使C語言煥發出新的活力。下文介紹C程式設計領域中的幾本好書,其中一些堪稱經典。
1. The C Programming LanguageBrian (W.Kernighan, Dennis M.Ritchie)
中譯本名稱:《C程式設計語言》
這是迄今為止在所有程式設計語言書籍中最廣受尊敬的一部經典,是任何一名C程式員的必讀之作。因為出自C語言的設計者 Dennis M.Ritchie 和著名的計算機科學家 Brian W.Kernighan之手,它被昵稱為“K&R C”。是它首先引入了“Hello World!”程式,這個程式幾乎成了後來任何一本入門性程式設計語言書籍中的第一個例子。
如同C語言本身簡潔緊湊而極具威力一樣,這本書輕薄短小而極富張力。通過簡潔的描述和典型的示例,它全面、系統、準确地講述了C語言的各個特性以及C程式設計的基本方法,内容涵蓋基本概念、類型和表達式、控制流、函數與程式結構、指針與數組、結構、輸入與輸出、UNIX系統接口以及标準庫等内容。
簡潔清晰是這本書最大的特色。這本小書可以教給你許多比它厚幾倍的“大部頭”的知識。我認為那些動辄洋洋灑灑拼湊出好幾百頁乃至上千頁的技術作者應該好好向K&R學一學。對于中、進階程式員而言,如果希望迅速獲得C語言的嚴肅知識而又不願意多花費哪怕一丁點時間,這本書就是首選。
順便說一句,這本書的索引制作非常出色,極具實用價值,這可能首先要歸功于正文部分的簡明扼要。此外,盡管它看上去很像一本教程,但其實更是一本寫給專業程式員的指南。如果你不具備任何其他語言程式設計背景或基本的C語言知識,這本書也許并不适合用作你的C語言啟蒙讀物。
Expert C Programming: Deep C Secrets (Perter Van Der LinDen),
中譯本名稱:《C專家程式設計》
C語言是嚴肅的程式員語言,但這并不意味着C語言書籍必須闆着面孔說教。在這本被C程式員昵稱為“魚書”(封面上有一條“醜陋的”腔棘魚)的著作中,作為SUN公司編譯器和作業系統核心開發組成員之一,Peter淋漓盡緻地展示了其深厚的技術沉澱、豐富的項目經驗、高超的寫作技巧以及招牌式的幽默。在這部作品中,作者以流暢的文字、诙諧的筆法将逸聞典故、智慧和幽默自然地融入技術描述中,讀來宛若一本小說,極富趣味。
本書講述了C語言的曆史、語言特性、聲明、數組、指針、連接配接、運作時以及記憶體使用等知識,揭示了C語言中許多隐晦之處,尤其深入解析了聲明、數組和指針、記憶體使用等方面的細節。要想成為一名專家級C程式員,這些内容都是必須掌握的。和其他滿是抽象例子的C語言書籍不同,這本書充滿了大量的來自真實世界的C程式設計執行個體,它們對C程式員具有很高的參照價值。另外,每一章都以極富趣味的“輕松一下”收尾,而附錄A“程式員工作面試的秘密”則是任何語言的程式員在應聘工作前增強自信的好材料。
我懷疑真正的C專家可能用不着看這本書 ——從内容到組織方式到行文風格都決定了這是一本輕松愉快的“從菜鳥到高手”的進階讀本,是以,它理應擁有更廣泛的讀者群。初級程式員往往更需要熱情的鼓勵,在閱讀這本書的過程中,你定會深深地被作者對程式設計的激情所感染。
世間并無完美。我認為這本書的缺陷在于,和大多數平庸的C語言書籍一樣,它畫蛇添足地加入了一章關于C++的描述。在今天看來,這個描述既不全面也有失公允。不過,鑒于作者是在1994年從一名C程式員的角度去觀察C++,這一點也就不足為奇了。
3. Samuel P. Harbison, Guy L. Steele,《C語言參考手冊(第五版)》 影印版(機械工業出版社)、中文版(機械工業出版社)
在C語言參考手冊類書籍裡,Samuel P. Harbison 和Guy L. Steele合著的C: AReference Manual是非常出色的一本。這本手冊的第五版新增了對C99标準的介紹,以便滿足新時期C語言學習的需要。全書共分為兩大部分,第一部分專注于C語言特性,第二部分則全面讨論了C标準庫。本書涵蓋C99、C89、傳統的C、所有版本的C運作庫以及編寫與C++相容的C代碼等一切知識。
這本手冊隻是中等厚度,但它比“比它更厚”的其他參考手冊更清晰地描述了C語言的現在和過去的方方面面。整本手冊技術細節描述精确,組織條理清楚,内容完備詳盡而又簡明扼要。可以這麼說,它在廣度、深度和精度方面都是出類拔萃的。對于中、進階C程式員而言,這本手冊值得常備案頭,它幾乎肯定要比K&R的著作使用頻率更高。
4. David Hanson,《C語言接口與實作:建立可重用軟體的技術》,機械工業出版社
C語言能夠曆經三十多年而不衰,一個重要的原因在于它的适應能力。在這“複用”、“面向對象”、“元件”、“異常處理”等先進機制漫天飛舞的年代,C語言仍然能夠憑借它小而優雅的語言特性,在相當程度上滿足現代軟體體系架構提出的要求。隻不過,想要達到這個程度,必須要在C的應用功力上達到最高層次。在嵌入式、系統軟體以及對性能要求極高的系統開發中,開發人員必須達到這樣的層次,熟練掌握C語言的進階特性,才能夠同時滿足效率和靈活性、複用性的要求。可惜,雖然C語言技術圖書汗牛充棟,但是關注這個峰頂之域的作品卻是屈指可數。David Hanson的C Interfaces and Implementations就是個中翹楚。
David Hanson是業内大名鼎鼎的自由編譯器lcc的合作者。在這個項目中,他負責提供高度可複用的基礎架構。在不斷的實踐中,他完全使用ANSI C形成了一整套可複用元件庫。這套元件庫架構清晰,性能優異,而且提供了很多進階的特性,比如類Win32 SEH的異常處理機制、可移植的線程庫、高性能的記憶體池、豐富的可複用資料結構元件。David Hanson把他在創作這些元件的過程中所積累的心得以及對其源碼的精緻剖析原原本本地寫在了這本書裡。這樣的著作,當然堪稱C語言領域裡的銘心絕品。難怪已故著名技術作家Richard Stevens對此書贊不絕口,他說:“這本書中的技術,對于大部分C程式員來說,已經遺忘得太久了。”對于希望能在C語言應用上達到最高層次的核心程式員而言,這本書是難得的必讀之作。
Andrew Koenig的著作《C陷阱和缺陷》(人民郵電出版社)和Deitel父子合著的C How to Program兩本書。
C陷阱和缺陷
Andrew Koenig是世界上屈指可數的C++專家,他的這本書可能是最薄的一本C語言經典。它簡明扼要地講述了C程式設計中的陷阱和缺陷,包括詞法陷阱、文法陷阱、語義陷阱、連接配接、庫函數、預處理器以及可移植性缺陷等,最後一章還給出了關于如何減少程式錯誤的建議以及前面各章問題的參考答案。盡管這個小冊子成書于C89标準制定之前,然而,即使到了C99早已頒布的今天,書中提到的大多數陷阱和缺陷一如十五年前那樣使我們警醒。
C程式設計教程
Deitel父子合著的C How to Program一直是非常好的C語言入門教程,我手頭的中譯本名為《C程式設計教程》(機械工業出版社出版,原書第二版)。除了對技術的正規描述(輔以許多簡明扼要的例子)外,每一章後面都帶有小結、術語、常見的程式設計錯誤、良好的程式設 計習慣、性能忠告、可移植性忠告、軟體工程評述、自我測驗練習及答案等。整書内容清晰,組織良好,易于閱讀和了解。值得一提的是,有許多入門書讀完一遍即可扔掉,而這一本是個例外。
結語
以上這幾本書很大程度上局限于描述C語言及标準庫本身,如果希望學習更專業的、領域相關的C程式設計技術,你可以在選擇閱讀這幾本書的基礎上繼續查閱專門書籍。此外,在C語言書籍領域,水準不相上下的作品有很多,這幾本隻是根據我自身的閱讀體驗而做出的推薦。
我并不是一名C程式員,我的大多數時間都花在C的後裔語言尤其是C++身上了。然而,正如你知道的那樣,C++并不全是類和模闆,不全是面向對象和泛型程式設計,在較低的層面,C++的各個實作一如既往在很大程度上相容C。C++和C的親密關系決定了每一本C語言經典都應該是C++程式員的讀物。
這世界變化得真是太快。各色新事物層出不窮,讓人眼花缭亂、目不暇接。人們也很容易被那些五光十色的花哨玩意兒所吸引,常常會忘記構築過去、現在和未來的堅實基礎。C語言就是這樣的基礎之一。今天,世界上有許多我們看不見的重要軟體是用C語言(以及C++等)編寫而成的,正是它們在默默地支撐着這個資訊世界的運轉。
C++是一門廣泛用于工業軟體研發的大型語言。它自身的複雜性和解決現實問題的能力,使其極具學術研究價值和工業價值。和C語言一樣,C++已經在許多重要的領域大獲成功。 然而,一個不可否認的現實是,在低階程式設計領域,C++擠壓着C同時也在承受着C的強烈反彈,而在高階程式設計領域,Java和C#正在不斷蠶食着C++的地盤。也許C++與C合為一體永遠都是一個夢想,也許Java和C#的狂潮終将迫使C++回歸本位——回到它有着根本性優勢的開發領域:低級系統程式設計、進階大規模高性能應用設計、嵌入式程式設計以及數值科學計算等。果真如此,我認為這未嘗不是一件好事。
C++吸引如此之多的智力投入,以至于這個領域的優秀作品,包括重量級的軟體産品、程式庫以及書籍等,數不勝數。文題“C++程式設計之四書五經”一個不太嚴格的含義是:C++程式設計之四書×五經。是的,在本文(及其下篇)中,我将分門别類推薦20多本C++好書,你可以根據自己的需要選讀。
TCPL和D&E
TCPL和D&E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的簡稱,均出自Bjarne Stroustrup之手。我将它們單列出來,首先是因為Bjarne是C++語言的建立者,然後是因為比“首先”那個原因更重要的原因:這兩本書是C++領域毋庸置疑的傑作。說它們是C++語言聖經,并不為過。
Bjarne Stroustrup,《C++程式設計語言》影印版、中文版、題解
迄今為止,TCPL是除了C++标準文獻之外最權威的C++參考手冊。和大多數人的看法不大一樣,我認為Bjarne的文字語言并不遜色于他所建立的程式語言,至少我喜歡這種學院氣息濃厚的作品。本書對C++語言的描述輪廓鮮明、直截了當。它從C++語言建立者的角度來觀察C++,這是任何别的作者和書籍做不到的——沒有任何人比Bjarne自己更清楚該怎麼來使用C++。
這是一本嚴肅的著作,以中、進階C++開發人員為目标讀者。如果你是一名有經驗的C++程式員,需要了解更加本質的C++知識,本書正是為你而寫。它不是那種讓你看了會不斷竊喜的小書,需要用心體會,反複咀嚼。在閱讀過程中,請特别留心Bjarne先生強調了什麼,又對什麼一語帶過。我個人比較喜歡這本書的第四部分“使用C++做設計”,這樣的内容在類似的程式
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
設計語言書籍中很難看到——我甚至認為Bjarne應該将這部分獨立出來單獨寫一本書。
Bjarne Stroustrup,《C++語言的設計和演化》影印版、中文版
D&E是一本關于C++語言設計原理、設計決策和設計哲學的專著。它清晰地回答了C++為什麼會成為今天這個樣子而沒有變成另外一種語言。作為C++語言的建立者,Bjarne淋漓盡緻地展示了他獨到而深刻的見解。除了廣受贊譽的語言特性外,Bjarne沒有回避那些引起争議的甚至被拒絕的C++特性,他一一給出了邏輯嚴密、令人信服的解釋。内容涵蓋C++的史前時代、帶類的C、C++的設計規則、标準化、庫、記憶體管理、多重繼承、模闆等,對包括異常機制、運作時類型資訊和名字空間在内的重要的新特性都分别進行了深入探讨。每一名C++程式員都應該可以從Bjarne的闡釋中加深對手中這門語言的認識。
需要再次提醒的是,這兩本書知識濃縮,資訊量極大,請不要錯過Bjarne每一句看似漫不經意的話。
入門教程
學習任何一門語言都需要一個從入門到精通、從新手到高手循序漸進的過程。不過,對于一個所謂的新手而言,究竟是一個完完全全的新手,還是一個熟悉某種别的語言的“新手”,甚至是在某種語言程式設計領域已經頗有建樹的高手,很難一概而論?不同的C++新手需要不同的入門書籍。
Andrew Koenig, Barbara E. Moo,《Accelerated C++》影印版、中文版
和市面上大多數C++教程不同,本書不是從“C++中的C”開始講解,而是始于道地的C++特性。從一開始就使用标準庫來寫程式,随着講述的逐漸深入,又一一解釋這些标準庫元件所依賴的基礎概念。另外,和其他C++教材不同的是,這本書以執行個體拉動語言和标準庫的講解,對後兩者的講解是為了給執行個體程式提供支援,而不是像絕大多數C++教材那樣,例子隻是用作示範語言特性和标準庫用法的輔助工具。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
作者在C++領域的程式設計實踐、教育教育訓練以及技術寫作方面都是世界一流水準。我喜歡這種大量使用标準庫和C++語言原生特性的清新的寫作風格。在這本教材面前,幾乎迄今為止的所有C++教材都黯然失色或顯得過時。盡管這本教材也許對于國内的高校教育來說有些前衛,不過我仍然極力向我的同行們推薦。順帶一提,在Bjarne和我最近的一封通信裡,他這樣評價本書:對于有經驗的程式員學習C++而言,這本書可能是世界上最好的一本。
Stanley B.Lippman, Josee Lajoie,《C++ Primer》影印第三版、中文第四版
這本書的名字多少有點讓人誤解。盡管作者聲稱這本書是為C++新手而寫,但無論是它的厚度還是講解的深度都暴露了似乎并非如此。也許說它是一本“從入門到精通”的C++教程會更合适一些。我個人認為它并不适合完全不懂C++的初學者——在閱讀這本書之前,你至少應該先有那麼一點C或C++的背景知識,或者至少要具有一些其他語言的程式設計經驗。
盡管這本書省略了一些進階C++特性的讨論,但仍然可以稱得上是迄今為止最全面的C++學習教程。事實上,如果一名C++初學者能夠紮紮實實地讀完本書并對照《C++ Primer Answer Book》完成全部習題的話,他的水準肯定可以進入職業C++程式員的行列。我個人認為,即使你已經擁有了TCPL,這本書依然有擁有的價值,因為在許多方面它比TCPL來得更詳細、更易懂。
Stanley B. Lippman,《Essential C++》影印版、候捷譯文版
可以不太嚴格地認為這本書是《C++ Primer》的精簡版。本書一一講述了C++中最具代表性的主題,包括過程式程式設計、泛型程式設計、基于對象程式設計、面向對象程式設計、模闆程式設計以及異常處理等。Stanley将門檻調低到“具有其他語言程式設計經驗”的C++新手所能接受的最基本的層次,使他們能夠迅速開始使用C++程式設計而又免于閱讀《C++ Primer》那樣的大部頭。它以執行個體引導學習,力圖使讀者在最短的時間内把握C++的精粹。
也許換一個人來概述C++程式設計範型(paradigm)的方方面面需要好幾百頁才能說清楚,但
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
這本小書不可思議地做到了這一點。我個人非常喜歡這種滿是技術、簡明扼要并且“有話好好說”的書。這本書同樣具有一個明顯的風格:所有程式例子全部采用标準庫元件,讓人耳目一新。
以上三本書都不是為了完完全全的程式設計新手而寫。完全的C++程式設計新手可以閱讀Francis Glassborow的新書(尚未出版):《A Beginners Introduction to Computer Programming: You Can Do It!》。這也是Bjarne的推薦。Francis Glassborow是ACCU主席,多年來他對幾乎每一本C++經典名著評頭論足,他自己的這一本自然會引起C++社群的極大興趣。
高效、健壯程式設計
兩年前我在負責一個省級電力排程系統項目時編寫了一個網關程式,它從SCADA系統擷取電力實時資訊。通訊接口采用了不常用的資料庫直連方式(這個網關程式一端連接配接SQL Server 6.5,另一端連接配接Oralce 8.1.6)。由于實時測點近萬,每次将全部取樣更新或插入一遍顯然是低效的。我在網關程式裡建了一個記憶體庫,擷取到的資料首先在其中進行比較,然後決定是否更新實體資料庫(同時還做了别的更複雜的事情……),進而在效率和資源占用兩方面達到了預期效果。
這個程式一直運作得很好,但在離開現場之後的某一天,系統管理者打來電話,說大概因為網絡故障等原因,有時這個網關程式會崩潰掉——它自己崩掉也就罷了,問題是它還會把Windows 2000 Advanced Server搞成“藍屏”!(坦白地說,我還從來沒看過哪個非蓄意的程式有這個“能耐”)由于當時正忙于另外一個大項目,無法去現場調試,最後隻有憑經驗對記憶體庫代碼小心翼翼地封裝以異常處理代碼(同時也做了一些别的修改。這個程式本來不乏異常處理,可惜在開發調試期,很難模拟出真實的“異常”狀況,以便驗證那些異常處理代碼真的可以工作)。這樣,雖然沒有徹底解決問題,但程式終究不再死得那麼難看了。
在這兒講這麼一段花絮有什麼意思呢(當初為那個可怕的bug朝思暮想時我可不認為這是一個“花絮”)?我想說的是,對于任何軟體而言,離開強健,效率也就無從談起。而對于C++程式員來說,也許編寫一個高效的程式并不難,但要編寫一個需要7×24小時持續運作的服務端軟體就不是那麼容易了(實際上,隻要應用伺服器不當機,即使發生網絡故障,即使資料庫伺服器當掉,那個網關程式也應該有能力持續運作下去),需要考慮許多因素,有時這些因素甚至遠遠超出C++語言和開發工具的本身。作為一名開發實際項目軟體的程式員,并非非得自己碰釘子才能積累經驗,隻要我們足夠虛心,别人的經驗往往都是我們很好的借鑒。鑒于此,我推薦以下幾本書供你選讀,它們可以讓你從強健和效率兩方面受益(當然了,它們涵蓋的内容遠不限于異常處理)。
Scott Meyers,《Effective C++》英文原版(二版、三版),候捷中文版(二版、三版)
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
Scott Meyers,《More Effective C++》英文原版、候捷中文版
如果說《Effective C++》主要讨論C++中一些相對基礎的概念和技巧的話,那麼《More Effective C++》則着重探讨了包括異常處理在内的一系列進階技術。與前者相比,後者具有兩大主要差別:其一,它包含很多時新的标準C++的内容;第二,它讨論的主題傾向于“戰略化”而非“戰術化”,并且讨論得更深入、更徹底。尤其是對虛析構函數、智能指針、引用計數以及代理類(proxy classe)等技術和模式論述的深入程度,讓人很難想象是出現于這樣的一本小書之中。
遊刃有餘的技術,高超的寫作技巧,Scott無疑是世界上最優秀的C++技術作家之一。在簡潔、清晰、易讀等方面,這兩本書都卓爾不群。總之,Scott提供的這85個可以改善程式設計技術和設計思維的方法,都是中、進階C++程式員必備的技能。我強烈推薦這兩本書(實際上還有一本,稍後就會看到)。
Herb Sutter,《Exceptional C++》英文版、中文版
Herb Sutter,《More Exceptional C++中文版》英文版、中文版
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
你自認為是一名C++語言專家嗎?讀一讀ISO C++标準委員會秘書長的這兩本書再回答。在這兩本書中,Herb采用了“問答”的方式指導你學習C++語言特性。對于每一個專題,Herb首先合理地設想出你的疑問和困惑,接着又猜測出你十有八九是錯誤的解答,然後給你以指點并提出最佳解決方案,最後還歸納出解決類似問題的普适性原則。
這兩本書是典型的深究C++語言細節的著作,很薄,但内容密集,遠遠超過Scott的那兩本書,讀起來很費腦筋 — 我個人認為它們要比Scott的書難懂得多。若要研習這薄薄的兩本書所包含的知識,至少需要花費數月的時間!(在Scott的薦序中,他坦陳不止一次陷入GotW問題的陷阱,你應該知道這意味着什麼)對于語言細節的深究有什麼好處呢?盡管在大多數情況下,我們不必關心C++代碼幕後的動作,然而當我們不得不關心時,這兩本書可以為我們提供很好的線索,因為它們揭示了C++語言中微妙而又至關重要的東西。
Stephen C. Dewhurst,《C++程式設計陷阱》,中國青年出版社
Stephen的理論素養和實踐經驗注定這是一本值得一讀的好書。Stephen曾經是貝爾實驗室中第一批C++使用者。他已經使用C++成功解決了包括編譯器、證券交易、電子商務以及嵌入式系統等領域中的問題。本書彙集了作者來自開發一線的99條程式設計真知灼見,洞悉它們,你可以避免幾乎所有常見的C++設計和程式設計問題。
我甚至認為,對于C++程式設計菜鳥而言,閱讀這本書會比閱讀Scott和Herb的書更能輕松而立竿見影地獲得更大的提高。我個人很喜歡這本書的寫作風格——Stephen的許多觀點看似極端卻無可辯駁。當然了,這種自信(以及冷幽默)來自于作者深厚的技術素養,而非自大的偏執。
除了上面推薦的書籍外,Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的程式設計技術》,清華大學出版社)也值得一看。這本超薄小書聚焦于高性能C++應用程式開發。兩位作者都是IBM軟體專家,都工作于對性能要求極高的系統建構領域,本書是他們的經驗之談。也有人不喜歡這本書,因為它花了不少的篇幅講述和C++無關的東西,我卻恰恰因為這一點而對這本書産生好感,正是這些東西讓我開闊了眼界。
模闆和泛型程式設計
模闆和基于模闆的泛型程式設計無疑是當今發展最活躍的C++程式設計技術。模闆的第一個革命性的應用是STL,它将模闆技術在泛型容器和算法領域的運用展現得淋漓盡緻,而Boost、Loki等現代程式庫則将模闆技術的潛能不斷發揮到極緻。在模闆和泛型程式設計領域,我推薦以下兩本重量級著作。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
David Vandevoorde, Nicolai M. Josuttis,《C++ Templates》影印版、中文版
有一種老套的贊美一本書的手法,大緻是“沒有看過這本書,你就怎麼怎麼地”,這裡面往往誇張的成分居多。不過,倘若說“沒有看過《C++ Templates: The Complete Guide》,你就不可能精通C++模闆程式設計”,那麼這個論斷對于世界上絕大多數C++程式員來說是成立的。
這本書填補了C++模闆書籍領域由來已久的空白。此前,上有《Modern C++ Design》這樣的專注于模闆進階程式設計技術和泛型模式的著作,下有《The C++ Standard Library》這樣的針對特定模闆架構群組件的使用指南。然而,假如對模闆機制缺乏深入的了解,你就很難“上下”自如。鑒于此,我向每一位渴望透徹了解C++模闆技術的朋友推薦這本書。
這本書在大陸、台灣各有一個譯本,但出自不同的譯者之手。當你看到這篇文章時,兩個譯本應該都已經上市,對于讀者來說當然也就多了一種選擇。侯捷先生個人網站上開放了繁體譯本大部分章節,不妨先睹為快。
Andrei Alexandrescu,《C++設計新思維:泛型程式設計與設計模式之應用》影印版、中文版
你自認為是C++模闆程式設計高手嗎?請看過這本書再回答。這是一本出自天才之手令人敬畏的傑作。泛型模式,無限延伸你的視野,足以挑戰任何一名C++程式員的思維極限。
這本書共分為兩大部分,第一部分讨論了 Loki程式庫采用的基礎技術以及一些進階語言特性,包括基于政策的類設計、模闆局部特化、編譯期斷言、Typelist以及小型對象配置設定技術等。第二部分則着重介紹了Loki中的重要元件和泛型模式技術,包括泛化仿函數(Generalization Functor)、單件(Singleton)、智能指針、對象工廠(Object Factory)、抽象工廠(Abstract Factory)、通路者(Visitor)以及多方法(Multimethods)等。每一種技術都讓人大開眼界,歎為觀止。
在C++的學習方面,過猶不及往往成了不求甚解的借口。然而,面向對象并非C++的全部,模闆和泛型程式設計亦占半壁江山。對于“嚴肅”的C++程式員而言,及時跟進這項早經例證的成功技
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
術,不失為明智之舉。
結語
這些著作是如此大名鼎鼎,也許根本不缺我一個推薦。然而,縱然C++程式員隊伍的發展壯大速度不像其他更時髦的語言那樣迅速,新人進總是多于舊人出。除了熱忱地歡迎新人,我個人認為到了對C++書籍進行“盤點”的時候了,并且希望這樣的“盤點”有益于感興趣的讀者。請保持耐心和寬厚。在下篇中,我将繼續介紹标準庫、網絡程式設計以及其他方面的C++好書。有好書相伴,這個冬天不會冷。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
04年第3期:榮耀——C++程式設計之四書五經(下)
http://book.csdn.net 2006-7-21 19:32:00
C++程式設計之四書五經(下篇)
榮耀/文
我在上篇中“盤點”了TCPL和D&E以及入門教程、高效和健壯程式設計、模闆和泛型程式設計等方面共十幾本C++好書。冬去春來,讓我們繼續C++書籍精彩之旅。
标準庫
當我還在研究院工作時,與同院另外兩家研究所合作開發過一個大型水利樞紐排程內建項目。我們三家軟體系統之間都要互相通信。在調試通訊子產品時,細心的客戶(一名好學的系統管理者)發現對于同一通信規約的解釋代碼,我的不超過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++程式員強烈推薦。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
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》影印版、中文版
讀完Scott 的《Effective C++》和《More Effective C++》的中譯本之後,我一直期待這本書的中文版。我從潘愛民先生的個人首頁上了解到,他和他的合作夥伴似乎早已完成了這本書的翻譯工作,可惜至今市面上仍不得見。幸運的是,我們可以看到它的原版。
本書是使用STL的程式員必讀之作。在這本書中,Scott向我們講述STL容器和算法的工作機制以及如何以最佳方式使用它們。和Scott的其他作品一樣,這本書的寫作風格清晰、精确,具有極佳的可讀性。看過這本書以後,我想你也許會和我以及其他C++程式員一樣産生這樣的想法:Scott什麼時候會寫出一本“More Effective STL”?
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
Matthew H. Austern,《Generic Programming and the STL: Using and Extending the C++
Standard Template Library》影印版、中文版《泛型程式設計與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、Volume 2: Systematic Reuse with ACE and Frameworks
中文版:,《C++網絡程式設計》卷1:運用ACE和模式消除複雜性、卷2:基于 ACE 和架構的系統
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
化複用
采用C++進行企業級網絡程式設計,目前ACE(以及這兩本書)是一個值得考慮的選擇。ACE是一個面向對象、跨平台、開放源碼的網絡程式設計架構,目标在于建構高性能網絡應用和中間件。Douglas是ACE的創始人,Stephen則已為ACE提供了數年的技術支援和顧問服務,兩位都是ACE社群(是的,ACE的影響和實際應用的程度已經形成了一個社群)的專家。
ACE并不單單被大學和研究所追捧,它已經被成功地應用于世界上成千上萬個商業應用中。在電信、宇航、醫藥和财經領域的網絡系統中,ACE已經并繼續發揮着重要的作用。如果你準備開發高性能通訊系統,你應該考慮考慮這一彙集世界頂尖專家智慧的成果。
除了使用C++面向對象設計技術和模闆等進階語言特性外,ACE還運用了大量的模式。《C++網絡程式設計》卷1和卷2并不僅僅教你關于ACE的方方面面,它還會教給你模式和通用架構設計等進階技術等。是以,作為一名中、進階C++程式員,即使你很少進行正兒八經的C++網絡程式設計,閱讀這兩本書同樣可以從中受益。
是的,并非所有網絡應用都要使用Web伺服器(以及其他應用伺服器)和重量級元件模型,換個思路,它們或許也可以從輕量級的ACE元件中獲益。
雜項
以下幾本書是以被列入“雜項”單元,是因為我沒有考慮到合适的歸類方法,它們和上面的書籍一樣,值得一讀。
Bruce Eckel,《Thinking in C++》影印版二版、三版(又名卷二)
中文《C++程式設計思想》二版、卷一:标準C++導引 卷二:實用程式設計技術
《Thinking in C++》的第1版于1996年榮獲“軟體研發”雜志評選的圖書震撼大獎。最新推出的第2版對内容進行了大幅改寫和調整,以反映C++标準化帶來的影響以及近幾年面向對象領域最新研究和實踐成果。“輸入輸入流”、“多重繼承”、“異常處理”和“運作時類型識别”等進階主題
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
連同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++程式員不要錯過這本書。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented software
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,《Design Patterns: Elements of
Reusable Object-Oriented software》影印版、中文版《設計模式:可複用面向對象軟體
的基礎》
設計可複用的面向對象的軟體,你需要掌握設計模式。本書并非專為C++程式員而寫,但它采用了C++(以及Smalltalk)作為主要示例語言,C++程式員尤其易于從中受益。四位作者都是國際公認的面向對象軟體領域專家,他們将面向對象軟體的設計經驗作為設計模式詳細記錄下來。這本書影響是如此深遠,以至于四位作者以及本書都被昵稱為GoF(Gang of Four)。本書學院氣息濃厚,行文風格嚴謹簡潔,雖然它不如某些講解模式的書籍易讀,但真正要精準地了解設計模式,本書是終極權威。學習設計模式,這本書需要一而再、再而三的咀嚼。順帶一句:請将設計模式化作開拓思維的鑰匙,切莫成為封閉思維的枷鎖。
John Lakos,《Large-Scale C++ Software Design》中文版《大規模C++程式設計》、候捷:《STL 源碼剖析》
還有一些C++好書值得一讀,恕此處無法一一列出。例如John Lakos的著作《Large-Scale C++ Software Design》(《大規模C++程式設計》,中國電力出版社)和侯捷先生的《STL 源碼剖析》(華中科技大學出版社)等。
《STL 源碼剖析》是一本很有特色的書,但我認為它還可以更好。我個人期待侯捷先生自第一版發行以來經過對模闆技術的沉澱和再思考之後,再寫一本剖析得更深入、更透徹并且更全面的“第二版”。遺憾的是,侯捷先生在完成《C++ Templates: The Complete Guide》一書的翻譯後似乎決定暫時告别模闆、泛型程式設計和STL領域。
使用C++成功開發大規模軟體系統,不僅需要很好地了解大多數C++書籍中講述的邏輯設計問題,更需要掌握《大規模C++程式設計》中講述的實體設計技術。當然,這本書的确有點過時了,不過,如果你的精力和金錢都比較寬綽,買一本看看并無壞處。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
至此,我想有必要聲明一下,有一些(好)書沒有得到推薦,主要原因如下:
● 以上這些書已經足夠多、足夠好了。
● 我不會推薦通過正常管道很難購買到的書籍 ——不管是中文版還是英文版。
● 作(譯)者名氣大小不影響我的推薦。我們是在看書,不是看人。
● 我不會推薦我從來沒有看過的書。我至少要看過其中的某個版本(包括電子檔)。這個“看”,一般指“認真閱讀”,不過有一些也隻能算是“浏覽”。
結語
作為一名普通技術寫譯者,我深知技術創作和翻譯的艱辛(和快樂),并多多少少了解一些有關技術書籍創作、翻譯、制作、出版以及市場推介背後的細節。今天,我不會再對一本看上去差強人意的圖書信口開河。羅列同一本書的各種版本的用意隻在于為你多提供一些資訊,讓你多一種選擇。
在本文成文的後期,我給Bjarne寫了一封信,請教如果他來寫這篇文章會怎麼寫。他給了我簡明扼要的建議。在肯定以上列出的絕大部分圖書都是世界頂尖水準的C++著作的同時,Bjarne提醒我别忘了向專家級程式員推薦《The C++ Standard: Incorporating Technical Corrigendum No. 1》
《The C++ Standard : Incorporating Technical Corrigendum No. 1》
Bjarne還友好地提醒我,在我的推薦清單中沒有哪一本有助于C++程式員進行Windows程式設計——這正是我的本意。在這篇文章中,我隻推薦、點評平台中立的C++著作(網絡程式設計除外)——和作業系統無關,和內建開發環境無關,我甚至幻想它們和編譯器也無關。你可以根據業務開發需要,選讀自己喜愛的領域相關的C++書籍。
說到“系統無關、平台中立”,我不由得想起了“抽象層”的概念。開發實際應用的C++程式員通常工作于特定作業系統、特定開發環境和特定業務領域之中,而對标準C++和C++标準庫紮實而深刻的把握,無疑是你得以在不同的作業系統、不同的開發環境以及不同的業務領域之間縱橫馳騁的“抽象”本錢。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
03第11期:孟岩——Win32系統程式設計之四書五經
http://book.csdn.net 2006-7-20 11:18:00
Win32系統程式設計之四書五經
孟岩/文
所謂的Win32開發,就是在C語言的層面上,直接使用Win32 API開發Windows應用程式或者系統程式。雖說現在直接用Win32 API開發應用程式的人已經不多了,但是深入了解Windows系統程式設計原理,仍然是成為Windows開發高手的必經之路。所謂的Win32,其實是一個API規範,與UNIX系統程式設計接口标準POSIX是相對應的。從設計上講,Win32絕對算不上是簡潔優雅,是以學習Win32系統程式設計,相對來說是比較困難的。Win32來源于Win16,而Win16最初設計于1980年代中早期。設計Win16的時候,Microsoft還是一家小公司,應該說能力還有限。同時,Win16的主要目标是DOS之上GUI系統,設計上偏重GUI部分,在系統程式設計領域考慮不多。等到設計Win32時,微軟能力增強了,有心要把Win32打造成第一流的作業系統API規範,但是已經背上了Win16的曆史包袱。是以相對而言,Win32的設計實在趕不上POSIX那麼簡介優雅。微軟在随後又先後進入了COM時代和.NET時代,每一次進步都需要繼續背負以前的曆史包袱,使得微軟的技術體系越來越複雜。微軟技術的複雜性,是微軟與Java競争中的最大弱勢。而對我們程式員來說,無論你現在是在學習和使用最新的.NET技術,還是繼續堅持COM開發模型,要克服微軟技術的複雜性,必須上溯到Win32。那麼Win32領域的“四書五經”是哪些?讓我們一一道來。
-
Windows程式設計
Charles Petzold, Windows程式設計(第五版) 北京大學出版社
本書是盡人皆知的Win32 API程式設計經典,也稱為“Petzold Book”,學習Win32 API程式設計的人幾乎都從這本書入手。此書的優點是落墨細緻,對基本概念和基本技巧的解釋非常詳盡,不厭其煩。同時,這本書篇幅不小,但是包容的東西并不多,基本上把重點放在GUI程式設計上和正常程式設計任務上,是以能夠把很多問題講得非常透徹。通常第一次閱讀此書,會覺得作者行文有些羅嗦。但在日後的開發中,卻發現,這些當時覺得羅嗦的論述,都是實際工作中值得反複查閱和咀嚼的寶貴資料。這就是所謂的Petzold風格,既可做tutorial,又可做reference。
幾年前,人郵出過一本Charles Calvert的《21天學通Windows 95程式設計》,那本書的定位與
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
“Petzold Book”相似,而且寫得也非常出色,在控件程式設計方面的闡述甚至超過了“Petzold Book”。可惜這本書完全被“Petzold Book”的光芒所覆寫。不僅國内沒有再版過,而且原出版者也徹底打消了與“Petzold Book”對抗的念頭。
現在仍然用Win32 API直接開發GUI的人,恐怕是少之又少,是以“Petzold Book”的意義不及當年。更公允的說,現在該書最大的意義是作為Win32的入門教材。不經過它的洗禮,很難升堂入室。
2、Windows核心程式設計
Jeffrey Richter, 《Windows核心程式設計》第四版 機械工業出版社
這本書的前三版名為Advanced Windows,第四版改名為Programming Applications for Microsoft Windows。作者在前言裡還特别講了改名的原因。但在我看來,這本書還是叫做Advanced Windows更貼切。因為這本書雖然同樣是講Win32 API,卻幾乎和Petzold Book沒有任何重複。初級的内容完全略過不提,GUI部分也是一帶而過,全書傾力于系統程式設計,一上來就講Win32核心對象,從程序到線程,從DLL到SEH,從鈎子到記憶體管理,可以說是不避艱險,迎難而上,将最複雜最微妙的細節完整展現出來,同時配備大量精心準備的例子,代碼品質非常高超。是以,這本書從問世之日起,就成為Win32系統程式設計方面的聖經,作者Jeff Richter也成了Win32程式設計方面的絕對權威。想要學習Win32核心程式設計,不讀這本書是無法想象的。遺憾的是,這本書的中文版翻譯配不上原書的高水準,可以說是大錯不多,小錯不少。如果有讀者要認真研讀此書,可以找北京大學出版社出版的影印版。
這本書是Richter的代表作,也奠定了Richter世界頂級技術作家的地位。我本人非常喜歡讀Richter的書,因為他的文字是寫給專業人士看的,決不假裝弱智,同時有相當體貼細緻,非常符合我的習慣和胃口。是以通常在某個領域有了Richter的書,我就不會去看别人的書了。
對于某些讀者來說,Marshall Brain的Win32:System Service 3/e(中文名《深入學習:Win32系統服務開發與執行個體》)和Johnson Hart的Win32 System Programming2/e(中文名《Win32系統程式設計》)也是不錯的選擇。兩書的論述都不如Richter深入,但是例子精當,講解恰到好處。Brain的書覆寫面很廣,例子非常有啟發性,而Hart的書最适合從UNIX轉到Win32的朋友。我發現自己在有空閑的時候喜歡啃Richter的書,但是在實踐中需要快速學習解決方案時,反而Brain和Hart的書對我更有幫助。是以這兩本書雖然不像Richter那麼必需,但是也是非常實用的補充。
四書五經:CSDN《程式員》四書五經專欄曆年文章彙總
Petzold Book和Richter的這兩本書,構成一個連貫一緻的系列,一般Win32學習者精讀并且基本掌握這兩本書的主要思想和技術,就可以稱得上Win32系統程式設計的專家了。如果說這兩本書的弱點,主要是兩書寫作時以Win9X的開發作為一個基本出發點,是以對于Win2000平台的新特性介紹不足。特别是對于Windows 2000服務端高性能軟體的開發,基本上沒有涉及,很多Win32特有的機制也沒有覆寫到。是以,如果想在Win32方面再上一層樓,可以考慮Jeffrey Richter的下面這本書。
-
Programming Server-side Application for Microsoft Windows 2000
Jeffrey Richter, Programming Server-side Application for Microsoft Windows 2000
知道I/O Completion Port嗎?知道如何在多CPU伺服器上把機器的能力發揮到極至嗎?知道如何利用Windows的logging service嗎?知道如何利用WMI開發服務端程式嗎?即使你是一個Win32開發高手,也可能會對上述問題感到困難。随着一般應用程式的開發逐漸轉移到Java、.NET或者Delphi這樣的平台上,Win32能夠完全發揮威力的最後一個角落,大概就是服務端高性能程式設計了。而如果你想在這個領域有所建樹,Jeffrey Richter的這本書就不可不讀。這本書幾乎是這個領域裡唯一的一本書,而Jeffrey Richter的實力又保證了這本書的水準達到了相當的高度。讀這本書給人以震撼的快感,你會感歎,Jeffrey Richter對于Windows系統的了解竟能夠達到如此深度!
這本書跟上面提到的Petzold Book和《Windows核心程式設計》幾乎又是零重疊,所涉及的内容都是進階技術,特别是自Windows 2000以來出現的伺服器軟體開發新技術。與前兩本配合起來,形成了一條從基礎到專家的完整鍊條。在當今業界,仍然使用純Win32開發程式的開發者,有不少是在金字塔頂端的“高手”級人物。如果說Petzold Book在今天的主要意義在于教育,《Windows核心程式設計》的主要意義在于深化你對系統的了解,那麼這本書中教授的知識是實實在在吃飯的家夥。是以,對于高手和有志最終成為高手的程式員來說,這本書是一本難得的經典。
TCP/IP網絡程式設計之四書五經
TCP/IP協定是目前廣域網和區域網路通用的網絡協定,是以,基于TCP/IP的程式設計就格外重要。從應用上來說,現在直接利用C層次Socket API進行TCP/IP程式設計的人确實越來越少了,各種現成的架構(如ACE、Java、.NET FCL)和控件(如IP*Works)大大簡化了TCP/IP程式設計的難度。但是,如果想要在這個領域達到融會貫通的地步,不打下堅實的基礎是不可想象的。正如Richard Stevens在TCP/IP Illustrated中所說,在網絡程式設計領域,開發者所遇到的實際問題中,大約有90%都與開發者對于TCP/IP的了解相關。高層的架構和控件總結了TCP/IP的主要使用模式,并且進行了抽象和封裝,這固然非常好,但是要想真正掌握TCP/IP網絡程式設計的真谛,恐怕需要認真學習下面的幾本著作。
-
TCP/IP Illustrated, Vol.1 / Vol.2 / Vol.3 Richard Stevens 中文版(卷一、卷二、卷三) 機械工業出版社
這是一本衆望所歸的書。自從1994年出版以來,TCP/IP Illustrated就一直是TCP/IP領域具有傳奇色彩的聖經級著作。這一套著作共分為三卷,第一卷通過實際動手實驗的方式深入探讨TCP/IP協定;第二卷逐行解釋了4.4BSD系統TCP/IP協定棧的15,000行實作代碼;第三卷探讨了T/TCP和HTTP等進階協定。整套書最大的特點就是貼近實踐,完全符合程式員的胃口,不空談,不說教,用實驗和代碼來說明問題。寫作這樣的書,對于作者要求非常之高,即使在今天看來,敢于這麼寫作的作者也是鳳毛麟角。Richard Stevens以他的寫作風格和作品,在TCP/IP程式設計領域豎立起一座豐碑,令其他作者高山仰止,心向往之。在下文将要提到的Effective TCP/IP Programming一書中,甚至把“讀Stevens的書”專門列為一個條款。這套著作的地位,可見一斑。
學習這套書,與其說需要讀,不如說需要做。Stevens最強調程式員的兩項能力:一是讀代碼,二是動手實驗。他在自己所有的書裡都敦促讀者将範例輸入電腦,親自編譯、運作和調試。這當然需要花費大量的時間和精力,但是如果有讀者能夠紮紮實實地這麼做,那麼他所付出的每一分鐘都将會有雙倍的回報。
2. UNIX Network Programming, 2/e, Vol.1 / Vol.2 Richard Stevens,UNIX Network Programming 中文版(卷 一、 卷二) 清華大學出版社 又是Richard Stevens,又是經典名著。這本書的第一版問世于1990年,是Stevens的開山之作,一舉奠定了Stevens在網絡程式設計領域的重要地位。如果說TCP/IP Illustrated解答了“什麼是TCP/IP”和“TCP/IP是怎麼實作的”兩個問題,那麼這本書則是在回答“怎樣運用TCP/IP開發網絡應用程式”的問題。顯而易見,這本書的内容更加貼近普通程式員,是以,大多數人是先學習這本書,然後再深入學習TCP/IP Illustrated。 這也是一本讓人傷感的書,Richard Stevens從1997年開始撰寫此書第二版,制定了一個宏大的計劃:卷1闡述Socket API和TLI API;卷2闡述除Socket之外的其他IPC機制;卷3闡述網絡程式設計應用。應該說,卷1和卷2都是為了給卷3打基礎。然而天妒英才,就在世人翹首企盼第三卷的時候,1999年9月1日,Richard Stevens英年早逝。留下這套未完成的巨著,讓人感慨不已。不過最近從Prentice Hall傳來好消息,出版社已經找到合适的作者,重新修訂這套經典巨著,其中第一卷即将問世,并且已經在Amazon上熱賣。相信會有當世高人沿着Stevens的足迹給我們續寫第三卷的,讓我們拭目以待。 可選圖書:Douglas E. Comer, Internetworking with TCP/IP, Vol.1 / Vol.2 / Vol.3
這套書也是三卷,前兩卷内容與TCP/IP Illustrated相似,最後一卷則偏重應用程式的開發。總體上來看,這三卷書的内容與上述Stevens的兩套著作相當。Comer教授的這套書定位是教材,是以寫出來中規中矩,寓精彩于平和之中。讀者如果喜歡閱讀教材風格的書,這套應該是很好的選擇。
3. Effective TCP/IP Programming Jon C. Snader 中文版:進階TCP/IP程式設計
自徹讀Effective C++之後,我總結出一條經驗。無論在哪個領域中,一旦掌握基礎知識,則應該迅速去尋找該領域中一本名為“Effective XXX”的著作并閱讀之,一定可取得事半功倍的效果。Effective C++如此,Effective STL如此,Effective Java如此,這本Effective TCP/IP同樣如此,也是一劑功效強大的催化劑。
本書作者是經驗豐富的TCP/IP程式員,他在這本書中總結了44個難得的TCP/IP開發經驗,并且将每條經驗背後的道理都詳細地講解。毫無疑問,這種“專家經驗”型著作對于提高讀者水準,能夠起到最高效、最直接的作用。
初學TCP/IP的朋友可能覺得,自己應該先把基本知識熟練掌握,再看這本書,效果會更好。我認為不必如此,您可以在基本觀念建立起來之後直接品讀此書。這本書篇幅不大,起點不高,卻對很多關鍵問題進行了全面而細緻地介紹,在具體問題的闡述上頗有Richard Stevens之風,也是純而又純的程式員風格——拿代碼說話。
系統學習和重點難點的突破相結合,曆來是快速掌握一門技術的良方。由Scott Meyers開創的“Effective”之風,已有愈演愈烈之勢,這是程式員們的巨大福音。我強烈建議大家,不要放過任何一本以“Effective”為名的技術書籍。
4. C++ Network Programming, Vol.1 / Vol.2 Douglas C. Schmidt,Stephen D. Huston英文版(卷一、 卷二)、中文版(卷一、 卷二)
今天的網絡程式設計環境是建立在C的基礎之上。如果你滿足于C層次的TCP/IP程式設計,那麼Stevens的書可以說達到了一個最高境界,你大可以登東山而小魯。但是如果再上一個層次,考慮如何運用C++強大的抽象機制使網絡程式設計變得更加富于藝術性,更加高效可靠,那麼恐怕必須要高度重視這套書。
這套書共兩卷,篇幅都不大,主要内容是介紹ACE。在C++領域,由于這套書被Bjarne Stroustrup編入C++ In Depth系列,是以具有崇高的地位。而在網絡程式設計領域,也有人稱贊此書為Stevens之後最重要的網絡程式設計著作。作者Douglas Schmidt是C++、網絡程式設計和模式領域中國際公認的權威專家,潛心研究C++網絡程式設計已經十多年。他發起的ACE開源項目是目前當之無愧的最優秀和最成功的C++網絡程式設計環境,不僅具有非常出色的可移植性,而且性能卓越。美國國防部的ARPA已經支援這個項目好幾年了,其最終目的是在ACE的基礎上建立可用于現代戰争的實時分布式系統。毫無疑問,ACE無論在理論上還是在實踐中,都是最值得程式員關注的網絡程式設計典範項目,而這一套兩卷對ACE的介紹性書籍,也毫無疑問是最值得網絡程式員品讀分析的經典。學習這兩本書,你可以将經典的基于C API的網絡程式設計知識與現代面向對象、模式和架構等最新技術思想結合起來,進而使你對網絡程式設計的認識上升到一個新的高度。
TCP/IP是計算機網絡協定中的一族,我們學習TCP/IP,是為了更好的進行網絡程式設計。而為了更好地學習網絡程式設計,還應該打下紮實的計算機網絡理論基礎。雖說“計算機網絡”書籍應該是另外一個主題,但是如果考慮到與TCP/IP的學習相配合,我倒想在這裡額外推薦一本相關的書籍:
Larry Patterson & Bruce Davie,Computer Networks: Systems Approach Second Edition
這本書的作者是普林斯頓大學教授,對于網絡系統有極為深刻的了解。作品的最大特點是以非常系統的方式介紹了網絡系統的“why”和“how”,整本書思維非常清晰,讀來連貫一緻,欲罷不能,而對于提高你的TCP/IP程式設計能力,有着非常切實的作用。