我的新书《C++服务器开发精髓》终于出版啦
⼀、千呼万唤始出来
亲爱的各位读者,我的新书《C++ 服务器开发精髓》终于终于终于与⼤家见⾯了,图书如下:
图书的封⾯设计很精美,当然内容⼀定不负众望。因出版社⽼师要求提供⼀张照⽚放到封⾯上,今年的 6 ⽉ 1 ⽇⼉童节去拍了⼀张,照⽚拍出来放在下⾯⼤家⾃⼰看吧。⼈到中年,⽣活不易,没有少年时代那种懵懂与青涩,多了⼀份厚实与坚定了。⼀些想做的事情却⼀步步把它做成了,成为现实。昔⽇戏⾔⾝后事,明朝都到眼前来。所以,梦想还是要有的,还是要坚持的,即使这世界有那么多不完善,⽣活有那么多不如意,因为万⼀实现了呢?
⼆、写书的故事
关于这本书,我写了三年,故事太长了,容我细细道来。
2018 年的时候,我去携程旅⾏⽹⼯作,那个时候携程正在招⼀个具有 C/C++ 背景的 Java 资深开发,⽽我正好符合这样的要求。那会⼉,我已经玩了许多年的知乎,在知乎上也回答了⼀些 C/C++ 与 Linux 后台开发相关的问题,有些回答竟然达到了⼏千赞和收藏,有⼀些出版社编辑⽼师在知乎上到我,问我有没有写⼀本关于 C++ 或者服务器⽅⾯的图书,我考虑时机不成熟,就都⼀⼀婉拒了。
后来我抱着玩⼉的⼼态尝试在发表⽂章,没想到⼀下⼦打开了⼀个充满奇幻的未知⼤门。在互推的过程中结识了艳鹏,彼时他已经出版了⼀本⼝碑很好的分布式服务相关的图书,另外⼀本书也在写作中。艳鹏告诉我,和他对接的出版社编辑⽼师⾮常靠谱,可以推荐给我。于是,我就接受了他的推荐,没想到没过多久,出版社⽼师就发来约稿合同,我那个时候也没想到会这么快,就“糊⾥
糊涂”地签了合同。
⼈嘛,有时候不逼⾃⼰⼀把,你永远不知道⾃⼰能成事。既然签了合同,那就得认真对待,⽽且合同上也有交稿⽇期,虽然出版社⽼师说,延期⼀般提前沟通问题也不⼤,就算最终作者没写出来,出版社⼀般也不会追究责任和赔偿。
既然答应下来,书还是要好好写的,我写书分为⼏个阶段,第⼀个阶段是列书的⼤纲⽬录和章节,同时列举每⼀节要写的内容;第⼆阶段是实际的写作阶段,这个阶段时间花的最长;第三阶段是润⾊与优化阶段,我把书的内容发给了⼀些相关同⾏和读者,请他们提出⼀些修改建议和意见,同时,补充了⼀些后来⼯作和学习中⼀些新的想法与有⽤的技巧。2019 年年初⼜应朋友邀请⼀起创业,是早期团队三个主要开发之⼀。⼯作就更忙了,加上那个时候也是单休,只能利⽤早早晚晚或者节假⽇的时间去写作。
就这样断断续续地写了两年,期间有些章节反复的修改。⼤家都知道的,在如今讲究速成的年代,出⼀本关于 C/C++ 图书是很需要勇⽓的,企业要求快速化⽣产与学习周期长、学习难度⼤的 C/C++ 技术栈之间的⽭盾让很多同学望⽽却步,⼀些新⼈在尝试之后学不得法或者被浮躁的⽹⽂的宣传⽽最终放弃。
C/C++ 技术栈⼀旦学成,奇妙⽆穷。那么,C/C++ 技术栈到底该如何学好呢?笔者虽然经验有限,但
仍恬以剖析之。
按照技术掌握的深度,⼀般分为两个层级,第⼀个层级是开发熟练⼯,第⼆个阶段是融汇贯通阶段。
三、⽆穷岁⽉增中减,有味诗书苦后甜
3.1 开发熟练⼯阶段
C/C++ 这门语⾔与其他⾼级语⾔不同,它是离操作系统较近的语⾔。所以学好 C/C++ 体系的技术栈必须结合操作系统的运⾏机制来学习。展开来说,就是你必须掌握操作系统层⾯的⼏⼤基础知识,他们是汇编、编译链接与运⾏时体系、狭义的操作系统原理、多线程、⽹络编程。
第⼀个基础知识是汇编,我们学习汇编不是⼀定要⽤汇编来写代码,就像我们学习 C/C++ 也不⼀定单纯为了⾯试和⼯作。
对于 C/C++ 的同学来说,汇编是建议⼀定要掌握的,只有这样,你才能在书写 C++ 代码的时候,清楚地知道你的每⼀⾏C++代码背后对应着什么样的机器指令,if/for/while 等基本程序结构如何实现的,函数的返回值如何返回的,为什么整型变量的数学运算不是原⼦的,最终你知道如何书写代码才能做到效率最⾼。掌握了汇编,你可以明⽩,在 C++ 中,⼀个栈对象从构造到析构,其整个⽣命周期⾥,开发者的代码、编译器和操作系统分别做了什么。掌握了汇编,你可以理解函数调⽤是如何实现的,
怎样写代码 自己做编程你可以理解函数的⼏种调⽤⽅法,为什么printf这样的函数其调⽤⽅式不能是 __stdcall,⽽必须是 __cdecl。掌握了汇编,你就能明⽩为什么⼀个类对象增加⼀个⽅法不会增加其实际占的内存空间。
第⼆个基础知识是编译、链接与运⾏时体系知识。作为⼀个开发者,要清楚地知道我们写的 C/C++ 程序是如何通过预处理、编译与链接等步骤最终变成可执⾏的⼆进制⽂件,操作系统如何识别⼀个⽂件为可执⾏⽂件,⼀个可执⾏⽂件包含什么内容,执⾏时如何加载到进程的地址空间,程序的每⼀个变量和数据位于进程地址空间的什么位置,如何引⽤到。⼀个进程的地址空间有些什么内容,各段地址分布着什么内容,为什么读写空指针或者野指针会有内存问题。⼀个进程如何装在各个 so 或 dll ⽂件的,这些⽂件被加载到进程地址空间的什么位置,如何被执⾏,数据如何被交换。
第三个基础知识是狭义的操作系统原理。这⾥加上“狭义”⼆字是因为从⼴义上来讲,以上所说的内容都是操作系统原理的范畴。狭义的操作系统原理这⾥包括操作系统如何管理进程与线程,虚拟内存与物理内存之间的对应关系,何为内存映射⽂件,进程之间如何通信等等。
第四个基础知识是多线程知识。严格来说,这点已经包括在第三点之中了,我之所以将其单独列出来,是因为多线程编程是我们做应⽤服务最常⽤的技术之⼀。最近⾯试过⼏个学历⾮常好的同学,对于⼀个进程中如果某个线程因为内存问题⽽退出,是否会导致整个进程退出的问题答不好,实在不应该。多线程知识其实不难学,⽴⾜于理解与实践⽽不是应付⾯试,可以学的很好。⽆论是 Windows 还
是 Linux 操作系统,操作系统提供的线程同步对象就那么⼏种,Windows 常⽤的有临界区(关键端)、Event、互斥体、信号量等,Linux 有互斥体、信号量、读写锁、条件变量,这些知识点学过则会,不学则不会。这些线程同步原语花上⼏天就能搞得清楚,⼤多数同学不是学不会,⽽是不愿意学,但是偏偏喜欢在简历上写上⾃⼰熟悉多线程编程。⾯试的时候,被问到条件变量的虚假唤醒机制都说不清楚,⾮要说⾃⼰⽤过条件变量。这是⼀些同学犯的很低级的错误,如果真⽤过条件变量,如果不知道虚假唤醒机制,那⼀定写的代码是不对的。市场上⽬前没有任何⼀本图书对以上知识形成体系的介绍,当然,我的本书填补了这⼀空缺,你将从本书中获得从进程与线程的关系,再到常⽤的线程同步原语的区别与使⽤场景,再到线程池以及基于⽣产者消费者模型的消息队列,以及对协程思想介绍的相关知识。
掌握了常见的多线程同步原语之后,接下来可以⼀些带多线程的项⽬去学习⼀下,不管是否带 UI 的都⾏。我推荐的⼀种⽅式是,使⽤gdb 或者 Visual Studio 调试器将你需要学习的多线程程序中断下来,在多线程⾯板,看看这个进程⼀共有多少个正在运⾏的线程,分析每个线程的作⽤,然后研究下这些线程在何时何地创建的,为什么需要创建新的线程。尝试爱过⼏个⼈,⾯对爱情你会诚实很多;尝试研究⼏个多线程项⽬,⾯对多线程你会熟练许多。
第五个是⽹络编程,直⽩地说就是 Socket 编程。操作系统层⾯提供的 API 会在相当长的时间内保持接⼝不变,⼀旦学成,终⽣受⽤。理解和掌握常⽤的基础 socket API 不仅可以最⼤化地去定制各种⽹
络通信框架,更不⽤说使⽤市⾯上流⾏的⽹络通信库了,最重要的是,它会是你排查各种⽹络疑难杂症坚实的技术保障。操作系统层⾯提供的⽹络模型就那么⼏种,⽆论像 Java/Go/Python 等语⾔如何封装,作为技术的源头,我们有什么理由不去掌握它呢?市⾯上关于⽹络编程的书很多,我在书中结合我这些年的⼯作经验总结了⼆⼗⼏个⽹络编程中的重点和难点,现在全部交给你。
以上是基于 C++ 技术栈来说,并没有包括算法与数据结构、数据库等⽅⾯的基本功,但是这些额外的也是应该需要掌握的。掌握了如上所说的,你就达到了⼀个熟练⼯阶段。
3.2 融汇贯通阶段
掌握了这些基础知识,接下来,技术更进⼀步,就⽆关具体的编程语⾔了,互联⽹⽅向的⾼级技术有如下:
⾼可⽤与容灾容错
服务都是⼈开发的,既然是⼈开发的,必然有宕机的可能性,当然宕机的原因可能是程序⾃⾝ bug,也可能是物理故障(断电、磁盘损坏等等),作为开发⼈员,针对不同的业务场景,我们没法做到服务 100% 可能,⾄少让其尽量可⽤,⼋仙过海各显神通。在宕机时如何尽量不影响业务、如何尽量快速恢复、如何保证数据和业务状态不丢失等等。这当然有⼀定的固定套路,例如主从、主备,当然固定的套路不是万能的,尤其是对于⼀些有状态要求的服务,这需要不断的磨练与⾃我总结。
分布式
分布式你需要掌握基本的分布式理论和原理,常见的分布式算法,然后是分布式系统设计的初衷和技巧,在实际并发量⾼的业务中,如何利⽤分布式解决⾼可⽤和访问效率问题。
RPC
很多⼈都听说过这个词,在⾯试时也可以说出来个⼤概,但是当问到 RPC 技术解决的核⼼问题是什么就说不清楚了。当然,学习 RPC,我们还要考虑协议的设计(协议格式、序列化与反序列化、兼容性问题)、⽹络连接的重试与反馈、接⼝ stub 的设计等等。
消息中间件
⽬前除了⾃⼰公司⾃研的消息中间件,主流的有 Kafka、RabbitMQ、RocketMQ,如果想学习,建议选择其中⼀种深⼊学习⼀下,要掌握消
息中间件的⽤途、选举策略、保序策略、重试策略、⾼可⽤策略等。
缓存
缓存的设计是⼀个很⼤的⽅⾯,个⼈觉得与其说这是⼀种设计思想⽽⾮单纯的某个缓存服务。当然,⽼⽣常谈的有缓存雪崩、缓存穿透、缓存击穿的解决思路。当然,以缓存为代表的服务是 Redis,Redis 的常⽤数据类型、适⽤场景、持久化、主从复制、哨兵与集,这些建议你掌握,如果你从来没机会吃猪⾁,那就看看猪跑吧,⼀些技术书籍和项⽬案例都有 Redis 的⽤途说明。
数据库⾼级知识
包括 SQL 调优、数据库调优、分表分库、主从同步等等。
四、天下还有不会武功的百姓
融会贯通阶段远⾮仅仅需要掌握这么多知识。说了这么多,我能⽤⼀张图来表达⼀下我的见解吧:
《C++ 服务器开发精髓》这本书正是⼀本帮你成为 C/C++ 技术栈的熟练⼯的书。当然,这本书除了详细讲解了 C++11/14/17 新标准常⽤的⽅法以外,只是以 C/C++ 为编程语⾔来介绍相关的后端开发技术栈,这不是⼀本讲 C/C++ 语⾔本⾝的书,讲 C/C++ 语⾔的书太多了,多如过江之鲫。
后来,2020 年年初因为⼀些原因,我离开了创业团队,加⼊了另外⼀家独⾓兽公司。此时这本书的全部章节已经基本写完了,当我把他交给出版社⽼师的时候,我们产⽣了激烈的“交锋”,最后,这版书稿⼀共改了 8 个版本:
时⾄今⽇,我⼯作中写 C/C++ 的机会并不多,但是这是我接触 C/C++ 开发⼗年来,从客户端到服务器,从 Windows 到 Linux 的经验总结,如果它能助你职业⽣涯⼀臂之⼒,那我这⼀千多个⽇夜的付出就没有⽩费。
有读者给我留⾔说:
认真的⼈⽆论在哪条路上⾛,总会碰到相似的情况。偶然看到你开源的博客,作为吃⽠众过来看看开发者是怎样的⼈。叹息⼀声:中国⼈才真多。可为啥普通⽤户就是不到好软件⽤呢?可能⼤侠们都醉⼼于武学去了,⼩侠们醉⼼于赚钱去了,忘记了天下还有不会武功的百姓。
⼀路⾛来,感谢所有帮助过我的⼈,也感谢知乎上⽀持我的读者。
最后,我希望你,也祝愿你掌握 C/C++ 服务器开发这门武功。
图书已经在京东开始有售,下单链接(可以拷贝到浏览器中打开):
原⽂链接:《》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论