代码阅读技巧

我读源代码喜欢自顶向下的方式,先把整体脉络理清楚,然后按照模块去阅读代码,把类和类、函数和函数之间的调用关系记录下来,如果可以进行逆向工程,用类似 Intelli IDEA 这样的工具把代码之间的调用关系用 Diagrams 展现出来,阅读会更加直观一些,不同的语言有不同的工具可以选择。

另外,阅读 test case 同样能帮助你理解作者的代码设计意图。正常情况下,测试用例都是从文档和设计衍生出来的,而不是完成了代码再写 test case。阅读测试用例,可以让你更清晰的知道对应的类和函数想要做什么事情。


阅读代码的经验:

1:https://segmentfault.com/q/1010000002396186

第零步 —— 准备好你本次的阅读目的
一个项目,特别是上万行的代码,你是不可能一次读完的。带着目的读代码,而不是翻代码。
如果你是要修改一个功能,这样明确的目的就非常好。
如果不是,也请列一个提纲,比如今天读懂代码组织方式,明天读懂架构,后天读懂功能A 等等。
你可以用剥洋葱的方式一层层往里读,也可以直接切一刀。但是请不要翻代码,这样永远都读不懂。

第一步 —— 把代码运行起来 读代码之前请一定要让代码能运行起来,读 usage,读 API 文档,把握代码的主要功能和功能入口。如果你连程序是干嘛的都不知道,怎么读代码?

第二步 —— 找入口点
根据上一步你了解到的功能,选一个最简单的(比如 xpdf 有 GUI,有 pdftopng, pdftohtml, pdftotext,显然难度是下降的)程序,或者 API。找到它的源码位置,从它开始读。而像 tornado 的文档直接就有 API 到代码的链接,就简直太完美了!
不过,像 tornado 这样的异步架构,你可能找不到它的主循环,这时候找一个主事件处理 callback 就可以。

第三步 —— 观察数据流 好,假设你在第二步选好了要读的 main 函数或者主循环。不要着急读代码,首先看看 argv 在 main 函数中是怎么解析的,传递给了谁,谁输出了结果。主函数是怎么拿到请求的,谁处理了请求,最后输出的是哪个变量。

第四步 —— 只看函数,不看逻辑
跟着数据流,看它经过的函数,不要看逻辑,只看函数。猜,它是干嘛的。如果猜不出,跳到函数定义,看函数头注释,看接受的参数。但是记住只跳一层,不要看代码逻辑。
如果你是在剥洋葱,找个小本本记下每个函数的功能,明天请从最主要的那个函数开始看。如果你有着明确的目的,猜哪个函数和你需求相关的,进入那个函数继续看。
GOTO 3

因为很重要,再说一次,在认识所有的函数之前,不要读代码逻辑!除非:一、你已经找到你需要修改的地方;二、它是这个程序的最主要的功能算法。而这样的代码,整个程序往往只会有一处。


2

足兆叉虫已经说的很好了,这里补充一些自己有时候会用的方法:
1. 看项目的概要文档(API文档最好不要一开始就看,除非必要)搞清楚代码的目录结构和模块功能;
2. 看项目的测试案例,了解各模块的用法;
3. 看不懂的地方,google查找相关的文章,或许已经有人分析过相同的模块;
4. 如果是c++, 快速画类图和时序图(不求完备,只为了再次看的时候用来查询);


推荐两本书,《Docker 源码分析》和《Go 语言学习笔记》,这两本书,都是关于 Go 语言的,可以说是源代码阅读的典范,有兴趣可以找来读读。

你可能感兴趣的:(代码阅读技巧)