如何阅读复杂源码

  10 Sep 2015


在阅读复杂代码时,总是各种纠结: 一段代码中掺杂了几个功能的实现、 各种逻辑混杂在一起、看了前面忘了后面、跟踪代码的调用关系越跟越乱

通用原则

  • 首先阅读设计文档、源码依赖的重要算法等文档
  • 分解代码中的主要模块和功能,逐个模块或者逐个功能阅读
  • 阅读中抓住主要分支,忽略次要的分支。比如错误处理的代码、罕见情况的处理等通常可以先略过不看
  • 在阅读中频繁被各个地方调用到的函数要优先搞懂
  • 使用sublime中的"find in files","goto definition"功能
  • 代码中有多个功能的实现互相穿插时,逐个阅读各个功能的逻辑。在阅读某个功能的代码时,忽略遇到的其他逻辑的代码

终极心法——记笔记

在阅读代码时,总会遇到这样的问题:在跟踪一段逻辑A时,会遇到一系列的函数调用,在你抽丝剥茧、步步跟进时, 突然发现某处的代码B看起来非常关键,同时另一处代码C貌似也很重要。你决定先阅读B处,于是一头扎进B的代码中, 在费尽九牛二虎之力搞懂B的逻辑后,又忘记了刚才跟踪到的代码C了。

这时,如果你把A,B,C三者的逻辑关系都有条理的记录下来,就不会迷失在各种函数调用的汪洋大海之中了。

我习惯使用Evernote,把与一个模块相关的所有知识组织成一个笔记:

  • 把所有相关且对阅读代码有帮助的文档链接记录下来
  • 用层级关系来表达调用逻辑,简要注明每个函数的大概逻辑
  • 随时记下遇到的问题,并插入一个“待办事项”(就是一个checkbox)
  • 一个问题看懂后,给“待办事项”打钩

这是一个我在阅读golang runtime源码时的笔记片段: 笔记截图

版权声明:原创文档,转载请注明出处