書單:拓展對C++的認(rèn)知層次

我把C++書籍分為4個層次:
初級
高級
深入
哲學(xué)
初級層次的書主要寫的是「方法流程」型的內(nèi)容,其實算是初級與中級的聯(lián)合,用于了解某個主題的基本內(nèi)容以及使用方法,搭建知識框架。只需「依照規(guī)則」行事,便能吸收這些信息。
高級層次的書主要寫的是「經(jīng)驗技巧」型的內(nèi)容,這類書一般都是由C++大師或?qū)<腋鶕?jù)工作經(jīng)驗積累而成,用于了解某些在初級層次所未理解的組件原理,以及一些高級技巧。它所起的作用就是加強(qiáng)理解知識框架中的各個「概念」,將其連接起來,組成一張網(wǎng)絡(luò),將信息變成知識。到達(dá)該層次的人「按照經(jīng)驗」行事,能快速定位并解決一些疑難問題。
深入層次的書主要寫的是「學(xué)科原理」型的內(nèi)容,這類書的作者資格很老,大多都是大型公司的核心人員,或是C++標(biāo)準(zhǔn)委員會成員。他們經(jīng)歷過C++從形成到成熟的過程,參加過早期C++編譯器的開發(fā),對語言的理解極深。此類書可能并不會直接提升工作效率,但卻能對語言的起源、原理有更加深入的理解。此外,這類書往往只涉及一個主題,深入探析該主題的方方面面,這些知識具有遷移性,所謂一法通萬法,此之謂也。到達(dá)該層次的人往往「根據(jù)直覺」行事,面對一個問題,他可能說不出原因,但憑直覺就能馬上定位并解決問題。
哲學(xué)層次的書一般來說在本領(lǐng)域內(nèi)很少,要說區(qū)別,前三層次注重的是解決問題的「答案」,而哲學(xué)層次注重解決問題的「過程」。這類書可能包含歷史、經(jīng)濟(jì)、人文、社會、物理、生物等等看似和編程毫不相干的領(lǐng)域,但卻能從不同的廣度和深度來系統(tǒng)地思考問題。
若僅從技術(shù)而論,那么到達(dá)深入層次已是頂尖,但技術(shù)發(fā)展具有非連續(xù)性,不時有新技術(shù)顛覆舊技術(shù),而一個人的時間精力有限,不可能每次都能趕上潮流,所以淘汰是必然的結(jié)果。
因此,理論和工具固然有用,但是不要僅僅只是停留在使用工具和記憶理論本身,而是要去深入理解它背后的邏輯、起源,建立多元思維。編程領(lǐng)域中的許多理論、解決問題的方案也未必都是自創(chuàng)的,很多都是從別的學(xué)科同構(gòu)演繹而來,所以哲學(xué)層次的書便屬此列,讓我們可以從別的領(lǐng)域?qū)W科來思考問題,尋找屬于編程的「第一性原理」。
注:
本次書單主要是作者19年或近期所讀,未必都精讀過,但至少都通讀過一遍。除了技術(shù)書籍,可能還會包含一些非技術(shù)書籍,它們有利于理解一些技術(shù)理論,此類統(tǒng)歸為哲學(xué)層。
下面為具體書目:
《Modern C++ Design》
深入 | 泛型 & DP

雖然名為Modern C++,但卻是出版已久(03年出版),內(nèi)容已不算新,所以很多人可能未曾讀過。
實際上此書仍然值得反復(fù)閱讀,作者有著創(chuàng)新式的思維,能從舊要素中發(fā)現(xiàn)新東西,為如何探索語言特性提供了一個思路,也為如何「組合創(chuàng)新」指引了方向。這本書的內(nèi)容思想在當(dāng)時來說是顛覆式的,其實主要講了兩方面內(nèi)容:泛型和設(shè)計模式,作者深入淺出,介紹了許多優(yōu)秀的組件,如:Typelists、Functor、AbstractFactory等等。此外,第4章還介紹了一個小型內(nèi)存分配器SmallObjAllocator,這也是一個不錯分配器。
對于設(shè)計模式,雖說思想和別的語言相同,但C++有其獨特的實現(xiàn)方式。主要是C++除了面向?qū)ο?,還有泛型編程,利用泛型,可以實現(xiàn)更加通用、更加強(qiáng)大的設(shè)計模式。其它書籍對于設(shè)計模式的講解與實現(xiàn),僅僅只是描述了那種思想,真正將其付諸實踐,研究如何設(shè)計還是要觀此書。
不得不說,有些內(nèi)容確已太舊,有些實現(xiàn)亦有缺陷,如今已有更好的實現(xiàn),我在寫設(shè)計模式文章的時候會依次而論。此書值得研究的是思想,技術(shù)會舊,思想是不會舊的。
《Effective Modern C++》
高級 | C++11

Meyers大師之作,針對C++11和C++14的一些經(jīng)驗技巧。
包含類型推導(dǎo)、新關(guān)鍵字、智能指針、右值引用與移動語義和完美轉(zhuǎn)發(fā)、以及并發(fā)API的講解與建議。這些都是現(xiàn)代C++最重要的幾個特性,想要用好它,那么看這本書就夠了。
《C++ Templates》
高級 | 泛型

C++關(guān)于模板最全面的資料,直接包含到了C++17。
不錯的是對于WYH三方面均有描述,當(dāng)然,這也導(dǎo)致書籍略厚。里面有一些內(nèi)容就來自《Modern C++ Design》,對于已有模板基礎(chǔ)的朋友可以選擇性閱讀。
此外,對于Concept,Reflection這些新特性此書中也有介紹,的確是離標(biāo)準(zhǔn)最近的書了。
《STL源碼剖析》
深入 | STL & 算法

侯捷大師之作,學(xué)習(xí)STL的不二之選。
介紹數(shù)據(jù)結(jié)構(gòu)和算法的書籍很多,我自以只此一本便可,要知道STL中的實現(xiàn)比99%的實現(xiàn)要好,與其看那些,不如直接跟標(biāo)準(zhǔn)庫的這些專家學(xué)習(xí),無論眼光和能力都會大幅提升。
除此之外,書中還談?wù)摿藘?nèi)存管理,雖然只論及一角,也可參考一番(書中所論的就是GNU C++2.9版本的分配器,新版本中略有變化,卻也無傷大雅)。
若你自己想研究代碼,卻不知從何處下手,那么這本書其實也就是在教如何閱讀源碼。不若下載一份,跟著作者的步伐,觀察作者是如何一步一步分析如此大的一個庫的。
《深度探索C++對象模型》
深入 | 對象模型

深入層次的書籍寥寥無幾,但可以一抵十,反復(fù)閱讀。
這本書想必大家都讀過,其對C++對象底層原理介紹的詳盡而深刻,讀完頗有撥云見日之感。且每隔數(shù)月,當(dāng)探索了其它迷團(tuán)后再來回顧,有又新得。比如,當(dāng)你又去學(xué)習(xí)了內(nèi)存管理,編譯原理再來看,完全又是一番景象了。這就是深入層次的書籍,要時而回顧,慢慢吸收。
《Qt中的C++技術(shù)》
高級 | QT

偶然發(fā)現(xiàn)的一本書,研究了QT的源代碼,同時不忘對比C++的實現(xiàn),當(dāng)為一本好書。
市場上好多QT書籍都只是停留在認(rèn)知層和應(yīng)用層,而此書探析的是原理層,實為少見。
書中介紹了許多技術(shù),如d-pointer、Model/View框架、Command模式、Abstract Factory模式、Observer模式,這無疑能幫助你更好地理解QT。同時,還可以對比其它具有相關(guān)主題的書籍, 觀察其異同。
《Windows環(huán)境下32位匯編語言程序設(shè)計》
高級 | 匯編

32位匯編書籍,以Win32程序開發(fā)為例,也介紹了一些Windows內(nèi)存知識、Hook知識。
對于已經(jīng)有x86匯編和Win32開發(fā)知識的程序員來說,只需看前幾章過度到32位匯編便可,其實和高級語言的開發(fā)沒什么大的差別。
《Windows核心編程》
高級 | Win32
Windows開發(fā)主要有兩個參考資料,一個是MSDN,一個就是這本書。
其中對于進(jìn)程、線程、內(nèi)存管理、動態(tài)鏈接庫,SEH都有詳盡介紹,對于深入理解Windows有很大幫助。
《網(wǎng)絡(luò)是怎樣連接的》
初級 | 網(wǎng)絡(luò)

TCP/IP除了那三卷經(jīng)典(想必都知道),將這本作為入門讀物亦不錯,可以很快對網(wǎng)絡(luò)相關(guān)概念有個比較系統(tǒng)的了解。
當(dāng)然,這只是本理論書,要想深入還是得繼續(xù)學(xué)習(xí)其它知識。
《TCP IP網(wǎng)絡(luò)編程》
初級 | 網(wǎng)絡(luò)

上面那本是網(wǎng)絡(luò)理論入門書,而這本就是網(wǎng)絡(luò)編程入門書,推薦這兩本書一起讀。
該書以Windows/Linux兩種平臺來講解網(wǎng)絡(luò)編程,分別介紹了Windows上的select、重疊IO、IOCP和Linux上的selec、epoll模型,代碼為C語言。
不過其中的例子過于簡短,僅僅用于學(xué)習(xí)還好,對于C++版本有更加完善的例子,可以參考本號的網(wǎng)絡(luò)編程系列。
《Wireshark網(wǎng)絡(luò)分析就這么簡單》
高級 | 網(wǎng)絡(luò)

Wireshark是網(wǎng)絡(luò)分析利器,俗語云:“紙上得來終覺淺,絕知此事要躬行?!?要想真正理解各個協(xié)議之間的細(xì)節(jié)原理,Wireshark是最好的工具,當(dāng)具備網(wǎng)絡(luò)知識后,便可通過此書來學(xué)習(xí)如何使用Wireshark進(jìn)行網(wǎng)絡(luò)分析。
《圖解密碼技術(shù)》
初級 | 密碼學(xué)

密碼學(xué)初級讀物,可以了解密碼技術(shù)的基本原理,書中對于DES,AES,RSA等等主流加密算法都有詳細(xì)介紹。
《SQL反模式》
高級 | SQL

SQL設(shè)計中有許多陷阱,如何設(shè)計出高效的database?這本書里面都會告訴你。
同樣也是挺老的一本書,不過其中的諸多技巧仍然令人嘆服,絕對值得一觀。
《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
高級 | DP

經(jīng)典中的經(jīng)典,也就不多做介紹。
后續(xù)的許多設(shè)計模式書籍的內(nèi)容都源自這里,本書示例是以C++實現(xiàn)的,我覺得和《Modern C++ Design》這兩本結(jié)合起來學(xué)習(xí)C++設(shè)計模式基本就夠了。
當(dāng)然,這本書也很老,現(xiàn)在又增加了一些新的設(shè)計模式,不在本書之列,可以查詢別的資料學(xué)習(xí)。
《OpenGL編程指南》
初級 | 圖形學(xué)

圖形渲染基礎(chǔ)書,基于OpenGL。
唯一遺憾就是翻譯的不怎么樣,光錯字便有多處,實在是不走心。
但內(nèi)容不錯,對3D渲染、管線流程、MipMap、Shader、GLSL等等都有詳細(xì)描述,代碼風(fēng)格也不錯,還是值得一讀的。
《深入理解C++11:C++11新特性解析與應(yīng)用》
初級 | C++11

《深入應(yīng)用C++11 代碼優(yōu)化與工程級應(yīng)用》
高級 | C++11

這兩本C++11的書也值得一讀,其實和《Effective Modern C++》都有重疊部分。
所以我也只是挑了某些部分來讀,交替著閱讀能夠?qū)Ρ炔煌髡哒撌龅漠愅玫乩斫飧拍睢?br>
后一本是江南大佬寫的,書中的內(nèi)容要更加豐富,具體可以直接參考書籍。
《Reversing C++》
高級 | RTTI

一篇研究RTTI的論文,非常不錯。
作者以反匯編的形式探析了如何手動和自動識別C++ class信息與其繼承關(guān)系,對逆向工作者尤其有用。
地址為:http://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf
《程序員的自我修養(yǎng)——鏈接、裝載與庫》
深入 | C++ Startup

最近看的一本書,作者探析了C++程序生前和死后所做的工作,非常深入的一本書。
包含:C/C++代碼如何被鏈接編譯成目標(biāo)文件?目標(biāo)文件如何被鏈接在一起,形成可執(zhí)行文件?可執(zhí)行文件如何被裝載并執(zhí)行?可執(zhí)行文件與進(jìn)程的虛擬空間如何映射?為何要動態(tài)鏈接?堆與棧,函數(shù)調(diào)用約定?等等幕后內(nèi)容。
很感謝這些作者,能研究并寫出這些平常程序員不會關(guān)注的內(nèi)容,讓后來者學(xué)習(xí)能夠有所方向,有所參考。
《系統(tǒng)之美》
哲學(xué) | 系統(tǒng)思考

介紹系統(tǒng)思考的書籍,研究內(nèi)存管理的時候讀了此書,沒時間的可以只看前幾章基本概念,對于系統(tǒng)的運作能有更好的了解。
《技術(shù)的本質(zhì)》
哲學(xué) | 技術(shù)

“任何的技術(shù),都是由模塊來組成的。所以所謂創(chuàng)新就是把原有系統(tǒng)里邊,拈出一個模塊出來,把這個模塊拆分成最小單元,這就是你創(chuàng)新的開始。”書中論述的技術(shù)到底是什么,怎么形成的?面對舊有元素,我們?nèi)绾蝿?chuàng)新出新東西?
方法是拆解基本要素,將這些要素重新組合成新技術(shù)。
所以創(chuàng)新不是憑空出現(xiàn),而是有跡可尋的,在原有要素上進(jìn)行組合創(chuàng)新,就能產(chǎn)生新技術(shù)。
對應(yīng)到《Modern C++ Design》,作者又何嘗不是運用組合創(chuàng)新產(chǎn)生許多新組件呢?
這一次書單就到這里啦。
也歡迎在留言區(qū)分享你看過的C++好書喲。
