1

如何阅读复杂源码

 2 years ago
source link: http://ga0.github.io/tech/2015/09/10/how-to-read-source-code.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
如何阅读复杂源码

  10 Sep 2015


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

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

终极心法——记笔记

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

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

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

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

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK