Skip to content

Latest commit

 

History

History
executable file
·
77 lines (39 loc) · 4.69 KB

阅读复杂系统代码的方法论.md

File metadata and controls

executable file
·
77 lines (39 loc) · 4.69 KB

前言

主要是讲解怎样在large/complex的codebase下工作,怎样理解。

方法

文档

如果有文档或论文,首先开始读文档,了解其架构逻辑,设计原则。即使文档有些内容过时,甚至写得很烂,但是也值得读,因为了解一个项目的设计历史,包括演进,也至关重要。

选择某个特定的版本

这个很重要,最好选择最初的版本,用git把特定的tag checkout出来。比如最低的0.0.x 最高就选择1.0.0这样的,因为这些往往更简单,更简单意味着不复杂,更好掌握high level的认知

分析项目的依赖

从项目的依赖你们你可以看到很多,因为这些依赖一般是知名的开源项目,文档丰富,它们更加通用。从这些依赖里面提供的功能,你可以猜测依赖它们的模块和组件的功能(比较high ;level地猜测)

分析目录结构

从目录结构也可以看出一些有用的信息,比如系统的物理组织和架构。

阅读commit信息

  • 阅读你正在工作的的源码文件的commit修改历史。

从commit历史中,你也许能找到一个pull request,其中有关于任何修改和作出修改的开发者的进一步细节。如果该开发者仍在该项目中,你可能会问他们一些关于代码的问题。

  • 如果第一个commit代码量不大,可以试着直接看第一个commit的源码,对项目直接有一个整体细节的了解

阅读examples和测试

如果有tutorial和examples,首先阅读,调试这些用例,先学会怎么用,再去深入代码。要逐步深入代码,可以先从tests看,tests直接就可以看到每个模块,组件,库的不同测试用例和使用方法,甚至边界条件。这样可以让你直接熟悉模块/库的细节。这些tests用例,你也可以试着修改以下,看看变化。

写测试,加入新的测试

这个同上,也是你了解这个系统功能的开始,测试API,模块的边界,功能。这里,你不要把自己先代入这个codebase的开发者角色,先做一个测试人员。写测试,写测试,补全测试,补全测试!一开始不要写太小的测试,比如一小段函数的测试,这个没必要,因为系统里面的函数太多了,你要补补不完的,要写大一点的业务型的函数测试,稍微大一点。

找到切入点,然后逐步深入

比如某个RPC,API调用,跟踪这个流程,一点点,一行行的看,记住看代码可以DFS和BFS结合起来地浏览,期间不要忘记做源码分析笔记或者添加注释。sourcegraph有源码阅读的笔记功能。

怎样跟踪这些流程呢?可以多加点日志还有简单点的printf都行。甚至你还可以做点代码逻辑修改,看看会有什么运行反应。接下来,理解完毕,理解没问题,就可以试着重构你熟悉的这一小部分代码。

这里主要,提到了广度优先和深度优先,我觉得首先要推荐广度优先,因为广度优先地遍历阅读代码,你才可以对整个项目有个high level的认知,也就是,对于一些函数的底层实现,你可以不需要过多关心。

阅读正确的代码路径,忽略错误处理

首先阅读正确的代码路径,暂时不关心各种异常和错误处理的代码,这样可以更快的理解功能和系统目标,因为错误异处理一般与业务无关。

加入日志

加入日志,分析日志,由日志为切入点,分析源码。理解日志的背后。

使用工具

比如docxygen这些文档生成工具,可以自动生成一些模块的流程图。调用关系图。golang的pprof都有这样的功能。当然,如果有IDE支持很好的语言,那么就用IDE吧,比如java。

重写一小段代码

这里说的重写是因为你非常熟悉这段代码了,你认为写得不好,不清晰才重写的。这里的一小段代码可以是一个函数。最好重写的这段代码,是在测试中没有被包含的。如果有测试了,尽量就不要重写了。

重构代码

随着你的深入,和对代码的逐步了解,慢慢开始重构,从小到大的重构,重构中你可以学习很多东西。对重构的代码记得添加测试。重构和添加测试是互相结合的。

写笔记文档,多画图

这个是边分析源码,边重构,边做的事情,互相迭代的。数据流图,调用关系图,类图,架构图,时序图都画吧,这里推荐用plantUML来画图。画图的过程中也是一种思考。

工具

在线配合sourcegraph+它的Notebooks如何添翼。

本地配合VSCode的codetour插件。

用github1s 在仓库的RUL的github.com/XXXX 加上 github1s.com 就可以