在上一篇CC++入门到进阶资料中,描述了C++后端的学习路径。进一步,本文解释两个问题:
如何学习
在介绍具体的C++项目之前我先介绍一下我自己学习开源项目和阅读源码的方法:
1. 首先!!!你需要学会如何使用这个项目。以 STL 为例。很少有人从阅读 STL 源代码开始学习 STL。大多数人都是从学习如何使用 std::vector 和 std::list 等容器开始的。当你熟练使用它们时,你将有更好的基础去探索内部实现。
2.看看有没有相关的书籍或者博客介绍源码,有的话可以参考一下,一般比较好的项目都会有相应的博客和书籍。
3.掌握gdb可以帮助你深入研究源代码,让gdb帮助你学习。当然你也可以选择其他你喜欢的工具。
项目
下面介绍的项目环环相扣、不断推进,自身能力的提升也呈螺旋上升趋势。
纳米洛格
日志功能对于较大的项目来说是必备的,自然对于后端项目来说也是必备的。
GitHub 上有一个纳秒级低延迟项目:Nanolog。不过这个项目有两个版本,最初的版本是基于 C++17 的 Nanolog-17,另外还有基于 C++11 的 Nanolog-11。它们都是基于 std::atomic 的高性能多线程无锁日志。仔细看看吧,值得写到简历上。
老九推荐:2023年面试圈必定火爆的六个优质C++简历项目:点击查看C++硬核项目(含源码)
如果你正在挑战开发职位(C++后端、SPDK、内核、音视频、云原生、Qt)
这里的每一个项目都能让你的面试主管信服,并让你得到满意的offer。
顺便一提
当你看一个项目的时候,不能只是了解它,你需要评估它的一些指标。例如,Nanolog 有性能测试的基准。你需要了解一个项目的以下几个层次:
你还需要知道在抄袭这个项目的时候自己遇到了什么问题,毕竟看懂了不代表它就是你的了,只有你真的能把它写出来,并且调试出里面的问题,才能对它理解的更深刻。
libuv
Libevent 或 libuv,一个非常好的事件库,而且代码相对较少:
muduo和libuv我个人是看了的,另外muduo的作者陈硕还有一本书《Linux多线程服务器》,讲解了设计多线程服务器的要点。
顺便一提
初次阅读libuv/muduo等项目时,最大的困难就是理解回调函数机制。他们的处理流程大致如下:
1、先注册可读、可写事件;
2、等待可读、可写事件触发;
3.触发后,在回调函数中处理相应的读写事件。
有些回调函数链可能很长,很难理解,就需要 gdb 帮你理清链子。所以在学习开源库之前,建议先学习 gdb 调试。有时间我也打算写一篇用 gdb 看开源项目的文档,或者录个视频。
如果您熟悉 libuv,则可以基于 libuv 编写 Web 服务器。请记住:
推荐项目:
uv-cpp: https://github.com/wlgq2/uv-cpp
RPC
RPC(Remote Procedure Call)即远程过程调用,一般可以理解为服务端向客户端提供服务,比如在Redis中,客户端向Redis服务端发送请求,服务端收到请求后进行处理,最后将结果返回给客户端。
RPC框架的源码通常有很多,比如gRPC、bRPC等,但是刚开始学RPC可能找不到重点,而且gRPC和bRPC的代码量也很大,在校招允许的时间内,选择一门然后精通就行了。
有一个更简单的 RPC 项目 libjson-rpc 可以帮助你理解 RPC:
推荐项目:
jrpc: https://github.com/szza/jrpc
这个项目有两个好处:
你甚至可以将 Nanolog 集成到这个项目中来实现日志记录功能。因此,这个项目不仅能让你了解 RPC,还能将你之前学过的项目串联起来,让它成为一次丰富的体验。
protobuf
如果你时间充足,可以看一下protobuf的使用。
协程
libuv、muduo、redis等都是基于事件驱动的回调函数机制,学习完之后会发现回调函数机制链条比较复杂。golang有了协程之后,C++也开始有了协程库,利用同步的思想来完成异步任务。在经历了前面几个项目之后,会更加深刻的感受到协程的便捷性。
到这里,如果你还有精力,可以看看如何实现协程库。可以先从云峰的协程项目入手,它利用 Linux 下封装的 ucontext 函数 cluster 实现了共享栈协程模型。学完之后,你应该知道:
如果你完成了上面的这些,可以看一下bRPC是如何实现bthread的。bthread是多线程多协程的模型,相对比较复杂。bRPC是基于bthread构建的,官方有详细的bRPC文档可以参考,可以看一下里面的设计思想。
顺便一提
最后,我想建议大家在有限的时间内,没必要去实现像STL这样的项目,因为STL的各种数据结构原理本身并不难,但是如果试图去实现的话,难度就很大了,因为STL里面涉及到很多元编程,也就是黑魔法,用人脑去完成编译器的任务。除了学习的时候用到,估计你一辈子在公司里都不会用到。
如果你有时间,不妨看看 Facebook 的 C++ 库愚蠢之处。
上面的过程是一个比较完整的C++后端进阶流程,也是我之前学到的方法。