如何高效阅读源码¶
如何对待开源¶
需要树立正确的观念:
不管你是什么身份,都可以从开源项目中学到很多东西 实例:理解 Redis 的网络模型 * 不需要成为 Redis 的开发者 * 不需要一定要用到 Redis * 只要具备一定的网络编程基础 * 都可阅读源码学习 Redis 这种单进程的 Reactor 模型
不要只盯着数据结构和算法:
这两点在学习开源项目的时候并没有那么重要 实例: Nginx 使用红黑树来管理定时器 * 对大部分人,只要知道这点就够了 * 无需去研究 Nginx 实现红黑树的源码
采取自顶向下的学习方法:
源码不是第一步,而是最后一步 不要一上来就去看源码, 而是要基本掌握了功能、原理、关键设计之后再去看源码, 看源码的主要目的是为了学习其代码的写作方式,以及关键技术的实现。
五步法¶
第一步: 安装:
了解依赖组件,而依赖的组件是系统设计和实现的基础
安装目录也能够提供一些使用和运行的基本信息
系统提供了哪些工具方便我们使用
第二步:运行:
两个地方要特别关注:命令行和配置文件
系统具备哪些能力和系统将会如何运行
这些信息是我们窥视系统内部运行机制和原理的一扇窗口
令行参数和配置项
将每个命令行参数和配置项的作用和原理都全部掌握清楚
包括配置项的原理、作用、影响
尝试去修改配置项然后看看系统会有什么变化
第三步:原理研究:
关键就是“系统性”三个字
关键特性的基本实现原理
这个开源项目的「关键特性」是什么(卖点)
常见的有高性能、高可用、可扩展等特性
优缺点对比分析:
意义:
* 只有清楚掌握技术方案的优缺点后才算真正的掌握这门技术
* 只有掌握了技术方案的优缺点后才能在架构设计的时做出合理的选择
方法:对比分析
* 将两个类似的系统进行对比
* 看看它们的实现差异,以及不同的实现优缺点都是什么
* 典型的对比有 Memcache 和 Redis
原理研究的手段:
通读项目的设计文档
阅读网上已有的分析文档
Demo 验证
第四步:测试:
意义:
* 只是自己学习和研究可以只看网上结论
* 准备在实际项目中使用某个开源项目的话,必须进行测试
* 因为网上搜的测试结果,不一定与自己的业务场景很契合
注意
* 测试一定要在原理研究之后做,不能安装完成立马就测试!
* 原因在于如果对系统不熟悉,很可能出现命令行、配置参数没用对
* 或者运行模式选择不对,
* 导致没有根据业务的特点搭建正确的环境、没有设计合理的测试用例,
* 从而使得最终的测试结果得出了错误结论,误导了设计决策
第五步:源码研究:
建议:
* 通常情况下,不建议通读所有源码
* 尤其是 MySQL、Nginx 这种规模的项目
Demo调用
* 对于一些基础库,除了阅读源码外
* 还可以自己写个 Demo 调用基础库完成一些简单的功能
* 然后调试来通过调用栈来理解基础库的处理逻辑和过程
* 这比单纯看代码去理解逻辑要高效一些
时间分配¶
时间不够用:
前 3 个步骤必不可少
第四步可在准备采用开源项目的时候才实施
第五步可以自己灵活安排
技巧:
与其蜻蜓点水每个开源项目都去简单了解一下
不如集中精力将一个开源项目研究通透
就算是每个季度只学习一个开源项目,积累几年后这个数量也是很客观的