如何高效阅读一个项目

先说一个最“笨”的方法,初学者在接触到项目代码后往往从入口函数开始,一行一行地往下看,这种方法不适合规模较大的项目,阅读的效率非常低。
下面介绍另外几种的方法。

既然是阅读好的项目,那怎样的项目才算好?
最优秀的不一定是好项目,但好的项目一定是适合自己的。

要求:

项目所使用的编程语言最好是自己掌握的,这里强调的是掌握,即使不熟悉也没关系。先大概浏览一下项目,观察里面涉及到的技术,如果里面很多内容都是陌生的,那这个项目恐怕未必适合。即先不求理解,但起码能看懂七、八成字面意思。

项目中所涉及的理论知识已经大概掌握。掌握其中涉及的核心理论,在阅读过程中对理解有很好的帮助。因此在看项目之前,如果不了解相关理论,建议去查询一下,只需了解大概即可。

要求程序是可执行的。阅读的项目最好是能够运行起来的,一来可以直观地展示项目代码修改后程序所发生的变化;二来可以让程序测试不同的demo数据;三来可以使用gdb进行调试。如果只靠眼睛去阅读代码,大脑中想象程序运行效果,理解起来会变得抽象和不切确。

明确阅读代码的目的。提升自身编程能力的确是阅读代码的一个目的,因此不少人喜欢一行一行地去阅读代码,充分理解每一个语句的效果,每一个变量的含义。但是这种阅读的效率同样太低,过于斟酌细节,就无法快速掌握程序的整体流程,造成理解的片面,加大阅读难度。况且当项目的不同变量之间的关系比较复杂,多个代码段之间也存在数据流通时,逐行阅读来理解所花费的精力是巨大的。阅读代码,更重要的是理解其中的“设计”,这种设计可以是算法的设计,也可以是项目架构上的设计,或者模块划分上的别出心裁等等。而设计主要是在宏观上去把握,实现的方法有很多种,关键是其中的”逻辑可行性“,即这个方法来实现这种设计是否行得通。

有了明确的目的之后,就可以正式开始阅读项目了,注意在阅读的过程中不要被各种细节拖进深渊之中,要懂得去理解项目中好的设计。结合理论去分析项目的各个模块,大概理解程序执行的流程。如一个编译器程序,执行流程可以是词法分析->语法分析->语义分析->中间代码生成->中间代码优化->目标代码生成。
在宏观上去理解程序中各个模块的划分,把握主要流程。

阅读单个模块。项目的模块一般指功能比较专一,联系紧凑的一组代码。阅读单个模块,可以更集中注意力,减少程序其它无关代码的干扰。但这个方法有2个受限的情况,一是该模块过于复杂,如果一个模块本身就很复杂,那阅读的效率也不高;二是多个模块之间联系比较紧密,单个模块地去阅读容易会造成理解上的中断。比如编译器项目中阅读中间代码优化模块,就必须对中间代码生成模块有所了解。

对于阅读复杂的项目,往往需要结合多种阅读方法,时而逐行阅读、时而单个模块阅读。但我主要推荐的是结合测试集来阅读代码。一个程序具有多种的功能,每种功能对应一个测试集,通过gdb之类的调试工具观察程序在处理某个测试数据时的逻辑流程。
这种做的好处有很多。令一个测试数据集对应程序的一种功能,便可通过选定某种测试集配合gdb调试,来观察程序执行某特定功能时的逻辑处理流程。在这个过程中,可以忽略程序跳过的代码(即无关代码),着重理解被执行的代码,并且这些代码所实现的功能(对应测试数据集)我们是知道的,不需要另外去猜测。这种“已知结果倒推过程”的方法比”已知过程推导结果“的方法高效许多,能更快地理解代码设计的缘由,其中的差别就像求解一个问题的答案和将答案带入问题验证。同时删减测试集的规模可以调整调试时的难度。

注重逻辑可行。前面通过测试集调试代码来阅读项目,此时执行的代码流程更加简练紧凑,我们应该把注意力放在程序实现该功能时的逻辑处理部分而非代码上,即程序通过什么方法实现了该功能,在阅读代码的过程中不断加深理解,自己能否同样想到一个逻辑上可行的方法(即算法),同时留意程序所采用的数据结构。这样下来,可能不需要从头到尾地阅读,自己就已经理解实现的方法了。

下面再说一点”模仿“一个项目的经验

对于提高编程能力,我认为阅读代码不是最高效的,而是编写代码。因此阅读好项目的同时,也要学会动手写项目。刚开始可以先模仿,切记模仿的过程不是一行一行代码地复制,这样能真正掌握的知识不多,编程能力的提高也有限。就像背书,过几天可能就忘光了,或者变一下题目就不会了。

读项目,是理解其中的设计与方法。模仿项目,则是将学到的设计和方法再自己用代码写一遍。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfgxf.html