如何阅读源代码?
先说结论,我的阅读方式是通过自顶向下的方法掌握全局,使用自底向上的方法深入理解。
自底向上的方法
先说自底向上的方法。简单来说,就是从一个具体的小功能点出发阅读和实践,然后再由此小功能扩展逐步的向上上溯到大模块,就好比种上一颗小树,每天的施肥浇水,如果方法得当自然可以长成参天大树。
以阅读PG的源代码为例,可以通过psql从插入一行数据的最小方法/函数(PageAddItemExtended)为出发点,深入理解该函数后,使用gdb跟踪该函数的调用栈,根据调用栈的函数信息逐步上溯到最顶层的调用入口函数或主函数,每上溯一层就把该层函数相关的数据结构、宏定义和依赖的子函数完全彻底的理解清楚。通过这么一个过程,把插入数据相关联的知识体系建立起来,比如Page存储结构、Buffer的管理、WAL日志相关管理、SQL解析执行、前后台接口等相关知识。有了这个脉络,有了相关的数据结构作为基础,再来理解其他操作,比如UPDATE/DELETE等DML、CREATE TABLE/ALTER TABLE等DDL语句、SELECT等查询语句等就相对容易很多。
自顶向下的方法
与自底向上的方法相对的是自顶向下的方法,阅读源代码的初期可以使用这种方法建立源代码的体系结构,有利于全局把控,就好比原来一棵大树,如果一开始关注某片树叶,某个枝干,自然无感,但如果从主树干出发来看整个大树,那就基本可以看到这颗大树的全貌了。
阅读细节的时候可以使用自顶往下的方法吗?我的个人经验是不太适合,还是以大树做个类比吧。从主树干出发,这时候有N个子干,从某个子干进入,有M个分支,从分支进入子分支,又有X个子子分支,除非脑容量够大,否则里面的细节会让人望而生畏。
本是凡人,还是踏踏实实做些凡人能做的力所能及的事情吧。