开源项目源代码阅读指北

本文参考 @ref: Jaison - 阅读开源项目源码的建议姿势

先选择合适的源码版本

需要先审视自己的需求:“我阅读源码,是单纯的为了学习?还是希望在业务系统中更好的用好它?”

  • 如果是前者,那完全可以选择最新发布或待发布的稳定版本。
  • 如果是后者,则需要选择自己业务系统中正在使用的版本。

快速了解架构和关键特性

如果有介绍原理的书籍,可以先快速浏览一遍,粗略了解整体架构、关键特性,同类、相似产品性能比较。
这些信息也可以从官方资料中一探究竟,尤其是架构介绍相关的章节。

快速试用

官方资料中的“Quick Start”章节,先学习如何使用,加强自己对于整体项目的感性认识。
基本能摸清楚利用该项目“能做什么”,以及“如何做”。当然,这里仅仅涉及了最基础的功能。
学习一个特性要从了解配置和如何使用着手,同时建议阅读相关特性的设计文档或网上已有的源码解析文章,这样可以在阅读源码时避免分散精力去看无关紧要的部分。

开始阅读

简单了解代码模块结构

快速了解源码的模块组成结构,以及每一个模块的主要作用。这样有助于从源码结构上把握整体项目的结构,而后选择最基本的流程入手。

避免过早陷入旁枝末节

摸清主线,避免过早陷入一些旁枝末节,我们在刚开始阅读源码时,会遇到很多”好奇点”:

  • 这个算法居然实现的如此神奇?
  • 这个数据结构怎么没有见过?
  • 这个参数是干嘛的?

我自己也时常经不起这些”诱惑”,陷于对这些细节的考究中,常常”离题”半天以后,才被拉回到主线中。
在阅读源码的时候,能遇到一些感兴趣的细节是好事,但建议先将这些细节点记录下来,等过完整体流程以后再回头看这些细节,避免过早陷入。

工具、时序图、日志和Debug

  1. 借助合理工具。阅读源码过程中,通常需要动手做一些测试,此时,可以借助jstack工具(针对Java项目),它能为你提供如下有价值的信息:
    • 线程模型
    • 调用栈: 调用栈信息可以帮你理清整体调用流程(另外,在定位问题时,jstack打印出的信息也时常可以发挥重要作用)。
  2. 重视阅读日志信息: 在进程启动或运行过程中,一些关键的操作或处理,都会记录日志信息,因此,阅读日志往往是一条有助于理清流程主线的捷径。
  3. 阅读源码过程中,同步绘制时序图,固化对流程的理解。好不容易摸清的主线,建议及时用时序图的方式固化下来,这样可以帮助自己快速回顾整个流程。
  4. 阅读源码过程中,不断发现或提出疑问,并且记下来。但不要当时就尝试去解决这些疑问,因为当时对代码的理解还不足以去解释这些疑问,结果很可能是费时费力但没成效,建议理清代码主线后再回头去解决这些疑问。
  5. 对于一些”莫名其妙“或”匪夷所思“的设计,请一定要对照参考社区问题单中的描述信息、设计文档或Comments信息。比如JDK源码里HashMap的默认负载因子为什么是0.75的注释。
  6. 阅读源码过程中,遇到晦涩难懂的细节,如何应对?此时,建议开启Debug模式,详细跟踪每一步的调用流程,
  7. 重视阅读测试用例源码,很多人并不习惯于阅读HBase的测试用例源码,其实,阅读测试用例的源码,可以帮你理解一些正确的行为应该是怎样的。
  8. 能力进阶:开始关注社区动态,或尝试为社区贡献Patch。关注社区动态,可以及时获知一些重要的Bugs或社区正在开发的大的Features。关注的方式包括但不限于:
    • 订阅社区的Mail List
    • 关注社区的问题单