我在v2ex的首个回复就破在这吧。我个人经验是这样:
1. 首先要有个好用的工具,比如我用 Visual Studio,可以方便地在方法定义间快速切换等,这对代码阅读有极大帮助;
2. 然后花几分钟时间对项目结构做个粗略浏览,随手点开几个文件混个脸熟,通常质量比较高的代码可读性比较好,这时光靠猜就能猜出不少文件/目录的用途。有时在阅读某个细节并被卡住时,会突然灵光一闪,好像哪里有个什么文件看起来和这有点关系,而这灵光一闪经常是来源于这个粗略浏览阶段;
3. 看一下程序的入口做了什么事,同样也是留下个印象,因为入口处往往会注册很多东西,尤其在一些使用了依赖注入容器的项目,对依赖注入理解的比较好的开发者都会把依赖在容器中的注册放到程序入口处 (有人称它为 Composition Root 模式);
4. 以上都是为了对整个项目有个“大局观”,当细致研究某个模块的实现时,貌似也只能从 API 入手了,但要避免过度深入细节,通常一个方法内又会调用很多其它的方法,支线上的方法调用不要深入,尽量只看主线,这样才能保持比较清醒的大脑。部分情况可以深入一些支线,这要自己灵活把握。
如手上有纸笔,可以画些简单的树状图记录一下调用路径。以前我看代码是纯靠脑袋干记调用图,所以一旦这张图很大了后,大脑就会很紧张,只要上个厕所回来就会忘记一大半,或者办公室里谁突然开始讨论问题时也会打断我的思路 (所以我不喜欢在办公室上班),后来有纸笔的帮助后会好很多。
5. 背后的理论基础很重要。如果对一个框架背后的理论很熟悉,那阅读起来就会比较顺利,比如某 MVC 框架,如果不知道 MVC 为何物,那会看得很折磨人的。涉及某些算法时就更惨了,有些算法背后对应着一个数学公式,而程序语言往往很难清楚地表示一个公式,这时就要先去把相对应的理论搞清楚了再回来看代码 (所以你要会出墙,会Google,顺便推荐一下 12vpn:
https://my.anuson.com/aff.php?aff=864&redirect=https://getsetupfile.com/)。这时注释的重要性也体现出来了,对于复杂的逻辑,最好在注释中写清楚这么实现的原因 (当然,我也反对那种无意义的注释),幸运的是,知名开源项目代码的注释往往写得很好,通过阅读注释就能学到很多东西。
6. 让调试器来帮忙。如果有办法在 IDE 中对源代码进行调试,那阅读效率会提高很多,因为很多细节肉眼时很难看出来的。
7. 动力也很重要。我得承认我有点懒T_T,所以你要拿一堆代码给我,我看着看着可能就睡着了,但要是给我一堆代码,让我找出某个bug出现的原因,有了目标后效率就要高得多。
以上是一些比较零散的总结,欢迎补充 :)