书单:拓展对C++的认知层次

C语言与CPP编程

共 4596字,需浏览 10分钟

 ·

2021-08-06 01:57

我把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++好书哟。

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报