阅读源代码的一些体会

最近一个月的时间,差不多都在看Android 4.0系统和它的WebKit实现的代码。面对庞大的代码库,复杂的系统,从一开始毫无头绪到后来慢慢厘清主要的流程和摸清系统的结构。体会到有一些方法对阅读源代码是非常有帮助的。

Screenshot_2012-03-02-20-02-38

需要可以编译,运行和调试

如果只是光看代码,没办法编译,运行和调试,那对系统的理解总是只能停留在概念性的表面而无法深入。最好是能够下断点和单步跟踪,如果很难实现单步跟踪,起码也要可以输出日志,dump出一些运行时的主要对象结构和对象状态,或者直接在渲染结果上面绘制额外的示意标记。

只有通过观察系统运行时的行为,才能深入的理解系统的运作。包括:

  • 理解系统的线程模型,线程运行的顺序,和它们之间的通讯;
  • 理解主要对象之间的关系,它们各自承担的职责;
  • 理解系统的主要流程,一些重要方法的调用链;
  • 理解系统的时间消耗分布,哪些部分对性能影响最大;
  • 等等…

所以在开始看代码之前,先建立好一个方便调试运行的环境是十分重要的。所谓工欲善其事,必先利其器。

 

找到那些(单元)测试或者例程

一个好的开源项目,通常都会附带一些单元测试程序或者演示例程。它们对我们对于整个系统的研究来说,简直是无价之宝。

  • 一来它们短小精悍,比较容易理解;
  • 二来它们聚焦特定的模块,通过观察它们的运行和输出,更容易帮助我们了解一个模块的职责;
  • 并且我们很容易修改它的代码,进行各种各样的试验,进一步帮助我们了解模块运行时的行为,印证我们各种猜想;

 

绘制类结构图

面对庞大的类型系统和它们之间复杂的关系,一幅类结构图就像是一份地图,随时可以告诉你当前所处的位置,周围的环境,来去的方向等等。使你不会觉得放眼望去,白茫茫一片,不知何去何从。

一开始总是比较困难的,但是更要坚持一边看代码一边绘制类图,随着你的类图越来越完善,你对系统全景也会越来越有感觉。

使用像EA这样的工具绘制正式的UML图固然很好(还可以通过逆向工程帮助建立初始的UML模式),使用像XMind这样的工具绘制脑图也是一个不错的选择。

 

记笔记

不要太相信自己的记忆力,对于那些你仅仅是在阅读,而没有自己亲自实现的东西,你的大脑是很容易就把它遗忘。一瞬间的明悟,最好马上把它记下来;一些无法确认的猜想,也没有关系,记下来然后打个问号即可。即使一开始十分的散乱,后续也可以花些时间整理的更有条理,而且通过整理笔记,可以进一步加深自己的记忆和理解。使用Evernote或者类似软件是一个很好的选择,你随时都可以阅读和进一步完善它们。

 

最后,如果你将来需要把研究的结果写成文档或者制作演讲稿,之前记录的笔记和绘制的类图就是最好的素材。

 

 

Advertisements