书单:拓展对C++的认知层次
我把C++书籍分为4个层次:
初级
高级
深入
哲学
初级层次的书主要写的是「方法流程」型的内容,其实算是初级与中级的联合,用于了解某个主题的基本内容以及使用方法,搭建知识框架。只需「依照规则」行事,便能吸收这些信息。
高级层次的书主要写的是「经验技巧」型的内容,这类书一般都是由C++大师或专家根据工作经验积累而成,用于了解某些在初级层次所未理解的组件原理,以及一些高级技巧。它所起的作用就是加强理解知识框架中的各个「概念」,将其连接起来,组成一张网络,将信息变成知识。到达该层次的人「按照经验」行事,能快速定位并解决一些疑难问题。
深入层次的书主要写的是「学科原理」型的内容,这类书的作者资格很老,大多都是大型公司的核心人员,或是C++标准委员会成员。他们经历过C++从形成到成熟的过程,参加过早期C++编译器的开发,对语言的理解极深。此类书可能并不会直接提升工作效率,但却能对语言的起源、原理有更加深入的理解。此外,这类书往往只涉及一个主题,深入探析该主题的方方面面,这些知识具有迁移性,所谓一法通万法,此之谓也。到达该层次的人往往「根据直觉」行事,面对一个问题,他可能说不出原因,但凭直觉就能马上定位并解决问题。
哲学层次的书一般来说在本领域内很少,要说区别,前三层次注重的是解决问题的「答案」,而哲学层次注重解决问题的「过程」。这类书可能包含历史、经济、人文、社会、物理、生物等等看似和编程毫不相干的领域,但却能从不同的广度和深度来系统地思考问题。
若仅从技术而论,那么到达深入层次已是顶尖,但技术发展具有非连续性,不时有新技术颠覆旧技术,而一个人的时间精力有限,不可能每次都能赶上潮流,所以淘汰是必然的结果。
因此,理论和工具固然有用,但是不要仅仅只是停留在使用工具和记忆理论本身,而是要去深入理解它背后的逻辑、起源,建立多元思维。编程领域中的许多理论、解决问题的方案也未必都是自创的,很多都是从别的学科同构演绎而来,所以哲学层次的书便属此列,让我们可以从别的领域学科来思考问题,寻找属于编程的「第一性原理」。
注:
本次书单主要是作者19年或近期所读,未必都精读过,但至少都通读过一遍。除了技术书籍,可能还会包含一些非技术书籍,它们有利于理解一些技术理论,此类统归为哲学层。
下面为具体书目:
《Modern C++ Design》
深入 | 泛型 & DP
虽然名为Modern C++,但却是出版已久(03年出版),内容已不算新,所以很多人可能未曾读过。
实际上此书仍然值得反复阅读,作者有着创新式的思维,能从旧要素中发现新东西,为如何探索语言特性提供了一个思路,也为如何「组合创新」指引了方向。这本书的内容思想在当时来说是颠覆式的,其实主要讲了两方面内容:泛型和设计模式,作者深入浅出,介绍了许多优秀的组件,如:Typelists、Functor、AbstractFactory等等。此外,第4章还介绍了一个小型内存分配器SmallObjAllocator,这也是一个不错分配器。
对于设计模式,虽说思想和别的语言相同,但C++有其独特的实现方式。主要是C++除了面向对象,还有泛型编程,利用泛型,可以实现更加通用、更加强大的设计模式。其它书籍对于设计模式的讲解与实现,仅仅只是描述了那种思想,真正将其付诸实践,研究如何设计还是要观此书。
不得不说,有些内容确已太旧,有些实现亦有缺陷,如今已有更好的实现,我在写设计模式文章的时候会依次而论。此书值得研究的是思想,技术会旧,思想是不会旧的。
《Effective Modern C++》
高级 | C++11
Meyers大师之作,针对C++11和C++14的一些经验技巧。
包含类型推导、新关键字、智能指针、右值引用与移动语义和完美转发、以及并发API的讲解与建议。这些都是现代C++最重要的几个特性,想要用好它,那么看这本书就够了。
《C++ Templates》
高级 | 泛型
C++关于模板最全面的资料,直接包含到了C++17。
不错的是对于WYH三方面均有描述,当然,这也导致书籍略厚。里面有一些内容就来自《Modern C++ Design》,对于已有模板基础的朋友可以选择性阅读。
此外,对于Concept,Reflection这些新特性此书中也有介绍,的确是离标准最近的书了。
《STL源码剖析》
深入 | STL & 算法
侯捷大师之作,学习STL的不二之选。
介绍数据结构和算法的书籍很多,我自以只此一本便可,要知道STL中的实现比99%的实现要好,与其看那些,不如直接跟标准库的这些专家学习,无论眼光和能力都会大幅提升。
除此之外,书中还谈论了内存管理,虽然只论及一角,也可参考一番(书中所论的就是GNU C++2.9版本的分配器,新版本中略有变化,却也无伤大雅)。
若你自己想研究代码,却不知从何处下手,那么这本书其实也就是在教如何阅读源码。不若下载一份,跟着作者的步伐,观察作者是如何一步一步分析如此大的一个库的。
《深度探索C++对象模型》
深入 | 对象模型
深入层次的书籍寥寥无几,但可以一抵十,反复阅读。
这本书想必大家都读过,其对C++对象底层原理介绍的详尽而深刻,读完颇有拨云见日之感。且每隔数月,当探索了其它迷团后再来回顾,有又新得。比如,当你又去学习了内存管理,编译原理再来看,完全又是一番景象了。这就是深入层次的书籍,要时而回顾,慢慢吸收。
《Qt中的C++技术》
高级 | QT
偶然发现的一本书,研究了QT的源代码,同时不忘对比C++的实现,当为一本好书。
市场上好多QT书籍都只是停留在认知层和应用层,而此书探析的是原理层,实为少见。
书中介绍了许多技术,如d-pointer、Model/View框架、Command模式、Abstract Factory模式、Observer模式,这无疑能帮助你更好地理解QT。同时,还可以对比其它具有相关主题的书籍, 观察其异同。
《Windows环境下32位汇编语言程序设计》
高级 | 汇编
32位汇编书籍,以Win32程序开发为例,也介绍了一些Windows内存知识、Hook知识。
对于已经有x86汇编和Win32开发知识的程序员来说,只需看前几章过度到32位汇编便可,其实和高级语言的开发没什么大的差别。
《Windows核心编程》
高级 | Win32
Windows开发主要有两个参考资料,一个是MSDN,一个就是这本书。
其中对于进程、线程、内存管理、动态链接库,SEH都有详尽介绍,对于深入理解Windows有很大帮助。
《网络是怎样连接的》
初级 | 网络
TCP/IP除了那三卷经典(想必都知道),将这本作为入门读物亦不错,可以很快对网络相关概念有个比较系统的了解。
当然,这只是本理论书,要想深入还是得继续学习其它知识。
《TCP IP网络编程》
初级 | 网络
上面那本是网络理论入门书,而这本就是网络编程入门书,推荐这两本书一起读。
该书以Windows/Linux两种平台来讲解网络编程,分别介绍了Windows上的select、重叠IO、IOCP和Linux上的selec、epoll模型,代码为C语言。
不过其中的例子过于简短,仅仅用于学习还好,对于C++版本有更加完善的例子,可以参考本号的网络编程系列。
《Wireshark网络分析就这么简单》
高级 | 网络
Wireshark是网络分析利器,俗语云:“纸上得来终觉浅,绝知此事要躬行。” 要想真正理解各个协议之间的细节原理,Wireshark是最好的工具,当具备网络知识后,便可通过此书来学习如何使用Wireshark进行网络分析。
《图解密码技术》
初级 | 密码学
密码学初级读物,可以了解密码技术的基本原理,书中对于DES,AES,RSA等等主流加密算法都有详细介绍。
《SQL反模式》
高级 | SQL
SQL设计中有许多陷阱,如何设计出高效的database?这本书里面都会告诉你。
同样也是挺老的一本书,不过其中的诸多技巧仍然令人叹服,绝对值得一观。
《设计模式:可复用面向对象软件的基础》
高级 | DP
经典中的经典,也就不多做介绍。
后续的许多设计模式书籍的内容都源自这里,本书示例是以C++实现的,我觉得和《Modern C++ Design》这两本结合起来学习C++设计模式基本就够了。
当然,这本书也很老,现在又增加了一些新的设计模式,不在本书之列,可以查询别的资料学习。
《OpenGL编程指南》
初级 | 图形学
图形渲染基础书,基于OpenGL。
唯一遗憾就是翻译的不怎么样,光错字便有多处,实在是不走心。
但内容不错,对3D渲染、管线流程、MipMap、Shader、GLSL等等都有详细描述,代码风格也不错,还是值得一读的。
《深入理解C++11:C++11新特性解析与应用》
初级 | C++11
《深入应用C++11 代码优化与工程级应用》
高级 | C++11
这两本C++11的书也值得一读,其实和《Effective Modern C++》都有重叠部分。
所以我也只是挑了某些部分来读,交替着阅读能够对比不同作者论述的异同,更好地理解概念。
后一本是江南大佬写的,书中的内容要更加丰富,具体可以直接参考书籍。
《Reversing C++》
高级 | RTTI
一篇研究RTTI的论文,非常不错。
作者以反汇编的形式探析了如何手动和自动识别C++ class信息与其继承关系,对逆向工作者尤其有用。
地址为:http://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf
《程序员的自我修养——链接、装载与库》
深入 | C++ Startup
最近看的一本书,作者探析了C++程序生前和死后所做的工作,非常深入的一本书。
包含:C/C++代码如何被链接编译成目标文件?目标文件如何被链接在一起,形成可执行文件?可执行文件如何被装载并执行?可执行文件与进程的虚拟空间如何映射?为何要动态链接?堆与栈,函数调用约定?等等幕后内容。
很感谢这些作者,能研究并写出这些平常程序员不会关注的内容,让后来者学习能够有所方向,有所参考。
《系统之美》
哲学 | 系统思考
介绍系统思考的书籍,研究内存管理的时候读了此书,没时间的可以只看前几章基本概念,对于系统的运作能有更好的了解。
《技术的本质》
哲学 | 技术
“任何的技术,都是由模块来组成的。所以所谓创新就是把原有系统里边,拈出一个模块出来,把这个模块拆分成最小单元,这就是你创新的开始。”书中论述的技术到底是什么,怎么形成的?面对旧有元素,我们如何创新出新东西?
方法是拆解基本要素,将这些要素重新组合成新技术。
所以创新不是凭空出现,而是有迹可寻的,在原有要素上进行组合创新,就能产生新技术。
对应到《Modern C++ Design》,作者又何尝不是运用组合创新产生许多新组件呢?
这一次书单就到这里啦。
也欢迎在留言区分享你看过的C++好书哟。