阅读源代码的一些体会
2012-03-02 20:12
211 查看
最近一个月的时间,差不多都在看Android 4.0系统和它的WebKit实现的代码。面对庞大的代码库,复杂的系统,从一开始毫无头绪到后来慢慢厘清主要的流程和摸清系统的结构。体会到有一些方法对阅读源代码是非常有帮助的。
![](http://hi.csdn.net/attachment/201203/2/0_1330690483j7YM.gif)
如果只是光看代码,没办法编译,运行和调试,那对系统的理解总是只能停留在概念性的表面而无法深入。最好是能够下断点和单步跟踪,如果很难实现单步跟踪,起码也要可以输出日志,dump出一些运行时的主要对象结构和对象状态,或者直接在渲染结果上面绘制额外的示意标记。
只有通过观察系统运行时的行为,才能深入的理解系统的运作。包括:
理解系统的线程模型,线程运行的顺序,和它们之间的通讯;
理解主要对象之间的关系,它们各自承担的职责;
理解系统的主要流程,一些重要方法的调用链;
理解系统的时间消耗分布,哪些部分对性能影响最大;
等等…
所以在开始看代码之前,先建立好一个方便调试运行的环境是十分重要的。所谓工欲善其事,必先利其器。
一个好的开源项目,通常都会附带一些单元测试程序或者演示例程。它们对我们对于整个系统的研究来说,简直是无价之宝。
一来它们短小精悍,比较容易理解;
二来它们聚焦特定的模块,通过观察它们的运行和输出,更容易帮助我们了解一个模块的职责;
并且我们很容易修改它的代码,进行各种各样的试验,进一步帮助我们了解模块运行时的行为,印证我们各种猜想;
面对庞大的类型系统和它们之间复杂的关系,一幅类结构图就像是一份地图,随时可以告诉你当前所处的位置,周围的环境,来去的方向等等。使你不会觉得放眼望去,白茫茫一片,不知何去何从。
一开始总是比较困难的,但是更要坚持一边看代码一边绘制类图,随着你的类图越来越完善,你对系统全景也会越来越有感觉。
使用像EA这样的工具绘制正式的UML图固然很好(还可以通过逆向工程帮助建立初始的UML模式),使用像XMind这样的工具绘制脑图也是一个不错的选择。
不要太相信自己的记忆力,对于那些你仅仅是在阅读,而没有自己亲自实现的东西,你的大脑是很容易就把它遗忘。一瞬间的明悟,最好马上把它记下来;一些无法确认的猜想,也没有关系,记下来然后打个问号即可。即使一开始十分的散乱,后续也可以花些时间整理的更有条理,而且通过整理笔记,可以进一步加深自己的记忆和理解。使用Evernote或者类似软件是一个很好的选择,你随时都可以阅读和进一步完善它们。
最后,如果你将来需要把研究的结果写成文档或者制作演讲稿,之前记录的笔记和绘制的类图就是最好的素材。
![](http://hi.csdn.net/attachment/201203/2/0_1330690483j7YM.gif)
需要可以编译,运行和调试
如果只是光看代码,没办法编译,运行和调试,那对系统的理解总是只能停留在概念性的表面而无法深入。最好是能够下断点和单步跟踪,如果很难实现单步跟踪,起码也要可以输出日志,dump出一些运行时的主要对象结构和对象状态,或者直接在渲染结果上面绘制额外的示意标记。只有通过观察系统运行时的行为,才能深入的理解系统的运作。包括:
理解系统的线程模型,线程运行的顺序,和它们之间的通讯;
理解主要对象之间的关系,它们各自承担的职责;
理解系统的主要流程,一些重要方法的调用链;
理解系统的时间消耗分布,哪些部分对性能影响最大;
等等…
所以在开始看代码之前,先建立好一个方便调试运行的环境是十分重要的。所谓工欲善其事,必先利其器。
找到那些(单元)测试或者例程
一个好的开源项目,通常都会附带一些单元测试程序或者演示例程。它们对我们对于整个系统的研究来说,简直是无价之宝。一来它们短小精悍,比较容易理解;
二来它们聚焦特定的模块,通过观察它们的运行和输出,更容易帮助我们了解一个模块的职责;
并且我们很容易修改它的代码,进行各种各样的试验,进一步帮助我们了解模块运行时的行为,印证我们各种猜想;
绘制类结构图
面对庞大的类型系统和它们之间复杂的关系,一幅类结构图就像是一份地图,随时可以告诉你当前所处的位置,周围的环境,来去的方向等等。使你不会觉得放眼望去,白茫茫一片,不知何去何从。一开始总是比较困难的,但是更要坚持一边看代码一边绘制类图,随着你的类图越来越完善,你对系统全景也会越来越有感觉。
使用像EA这样的工具绘制正式的UML图固然很好(还可以通过逆向工程帮助建立初始的UML模式),使用像XMind这样的工具绘制脑图也是一个不错的选择。
记笔记
不要太相信自己的记忆力,对于那些你仅仅是在阅读,而没有自己亲自实现的东西,你的大脑是很容易就把它遗忘。一瞬间的明悟,最好马上把它记下来;一些无法确认的猜想,也没有关系,记下来然后打个问号即可。即使一开始十分的散乱,后续也可以花些时间整理的更有条理,而且通过整理笔记,可以进一步加深自己的记忆和理解。使用Evernote或者类似软件是一个很好的选择,你随时都可以阅读和进一步完善它们。最后,如果你将来需要把研究的结果写成文档或者制作演讲稿,之前记录的笔记和绘制的类图就是最好的素材。
相关文章推荐
- java集合框架类源代码阅读体会
- [置顶] 为什么要阅读源代码?如何有效的阅读源代码? 选一些比较优秀的开源产品作为源代码阅读对象?
- 想要阅读一些开源项目或框架的源代码,不知道从哪里入手?
- 为什么要阅读源代码?如何有效的阅读源代码? 选一些比较优秀的开源产品作为源代码阅读对象?
- 阅读作业中软件开发书籍阅读后的一些体会
- 想要阅读一些开源项目或框架的源代码,不知道从哪里入手?
- 《.NET大局观》的一些阅读感悟与心得体会
- 进行的一些源代码阅读
- RTEMS 的libio ,work area ,heap,串口驱动等的一些阅读源代码分析笔记
- 关于源代码的阅读体会
- 为了方便把一些源代码放进pad的文件管理后不再显示.py无法阅读 写了一个小小程序将他们都变成以[py].txt结尾
- 阅读一些关于软件开发本质和开发方法的文章的体会与心得
- 阅读redis源代码的一些体会
- 研究PHP源代码的一些心得体会
- 阅读王垠《怎样写一个解释器》一文后的一些体会
- 阅读redis源代码的一些体会
- 想要阅读一些开源项目或框架的源代码,不知道从哪里入手?
- 《.NET大局观》的一些阅读感悟与心得体会
- 阅读分析程序源代码的一些方法(转载整理)
- C++新手,请推荐一些开源项目的源代码供阅读