作为一名程序员,经常需要阅读一些开源项目的源代码。同时,阅读源码对我们也有很多好处:
1.提升自己
阅读优秀的代码,一来可以提高我们自己的编码水平,二来可以打开我们写代码的思路,三来可以让我们拿到大厂的offer。不管在什么情况下,优秀的代码都是提升我们开发水平的资源,想要理解和理解这些优秀的代码并不容易。
2.修复bug
有时候,我们使用的一些开源组件会出现一些意想不到的问题。此时没有前人的经验可以借鉴,也没有文献可以参考,只能自己修复。只有阅读代码,了解项目,才能顺利解决问题。如果阅读代码的水平不够,修复bug就会成为一件棘手的事情,影响我们的工作。
3.增加新功能
在工作中,我们会遇到搜索开源库后没有特别合适的组件的情况。这只能改造现有的组件,而这种改造的前提是要了解开源组件。这个时候我们只能看代码了。
阅读源码的好处有很多,但阅读源码本身并不是一件简单的事情。
相反,这是一件非常困难的事情。一般来说,阅读代码比较困难的情况体现在:
工作以来,长期和各种开源组件打交道,被迫阅读了大量代码。在经历了以上种种困难之后,我花了好几年的时间总结出自己的打法,才真正的快速了解和理解了很多开源组件。
正好有不少读者问我怎么看代码,所以我决定把自己总结的一些套路写出来,希望能给大家一些帮助源码,更快的提升自己。
那我们就来看看我个人的一些阅读代码的方法吧。
一、概述
在阅读代码之前,我们首先要以上帝视角来看源码。使用上帝视角的目的是了解这个组件的全貌。
完整图片包括:
一、开源项目的主要目的
我们需要知道项目主要是做什么用的,因为这是项目的最终目的。
所有开源项目的源代码都是为了这个最终目标而编写的。
例如,对于 ,它的目的是记录。不管它的所有代码多么复杂,最终目标都是稳健高效地打印日志。
2.项目结构
理解项目架构的价值在于,如果你能理解系统的层级结构,你就能梳理出项目的核心脉络。有了核心脉络,我们才能把有限的时间花在阅读最有价值的代码上。
如果项目的官方文档有架构图,那就从官方的架构图中了解项目的整体架构。如果文档中没有架构图,搜索一下有没有民间大神画过。如果没有,可以根据官方文档中的描述自己画架构图。
举个例子,由于官方没有提供架构图,所以我大概是根据文档画了一个架构图。
2.贪玩
找到系统的核心上下文后,我们还需要运行项目。
运行项目有两个目的:
1. 了解运行此项目前的必要前提条件
或者回到例子。
当我们能运行成功的时候,必须要有一个.xml文件,否则不能运行。
这个.xml文件对于我们看源码其实很重要,它指出了需要的关键元素。
而且,如果你在阅读源码的时候遇到了困惑,理解这个配置文件可以有效的帮助我们渡过难关。后面会详细讲到如何阅读源码。
以上是基本配置,罗列了运行所需的关键部件。
2.阅读代码有疑惑,可以通过调试解决自己的困惑
我们阅读的开源项目往往很复杂。最典型的情况有以下三种:
以上情况只能通过代码调试解决。
3.剥茧
了解了全局和核心脉络,项目跑起来了,你心里说,现在我要看代码是吧?
错了,你还差一步,那就是细化目标。
前面说过,我们阅读源码的目的有以下三种:
然而,这些目的都太模糊了。提升自己,看什么代码可以提升自己?修bug,读哪些代码可以修bug?添加新功能,读取哪些代码可以添加新功能?
因此,必须选择这些有效代码。如何选择?
我们在从事开发工作的时候,听到最多的一句话就是分解问题:把大问题分解成小问题,分而治之。
选择和阅读有效代码也是如此。
对于大量的代码和太多的功能,我们最重要的事情之一就是将模糊的目标分解为可以具体实现的精确小目标。这些小目标对应到项目上,其实就是项目的业务流程一一对应。
比如我们想增加一个新的功能,可以让公司的日志以统一固定的格式打印出来。看看我们是怎么做的:
1.纵向分解
纵向分解就是在我们已知的架构图上,对纵向的业务流程进行分解。
由于我们要统一公司的日志格式,所以在打印到文件之前,必须先对日志内容进行格式化。因此,业务流程应该选择一个从应用程序日志调用打印日志开始,到日志内容输出到目标文件结束的业务流程。
2.横向扩展
横向扩展决定了我们如何组合业务流程,才能完全实现当初定下的大目标。
比如这里可以决定看打印日志的过程后看日志是如何切换的。
4.腾龙入海
好了,现在我们终于要开始看代码了。
但是看代码也是需要技巧的,不是上来就看。
1.请把我的心照在月亮上
首先,我们细化了目标,提炼出一个完整的业务流程。在此之后,我们可以映射业务流程和代码逻辑。
看看情况:
2. 一入侯门,深似海
业务关系映射后,我们就可以开始阅读代码了。在阅读代码的时候,我们还需要掌握几个技巧:
Tip 1:代码一定要跳过看
我们必须了解的一件事是,并非所有代码都值得仔细研究。我们的首要任务是看正流程,核心代码,其余代码可以跳过。
可以跳过的代码大概是:
判断异常输入的代码——这种代码对于我们理解系统意义不大。以后想提高编码能力的时候,可以回过头来找一些优秀的代码学习借鉴。
错误处理和异常处理的代码 – 与上述相同的原因。
数据处理的代码——经常解析输入数据,打包输出数据,有时使用DTO或DAO来传输数据。其中一些代码非常复杂且非常长。看完之后会耗费精力,扰乱思维,往往无助于掌握项目原理。一定要跳过它们。
低级交互代码——说实话,低级交互技术性很强,需要大量的底层知识。一时半会儿补不回来,一旦不明白,对自信心的打击会很大。建议跳过它。
技巧二:调用关系需要判断
在查看代码时,我们可以通过一些方式认真阅读代码。
如果你看了代码发现找不到后续的流程,那你就得考虑作者是不是使用了非顺序的调用方式来调用后续的方法或对象。
一般来说,开发者经常使用以下方法进行非顺序调用:
这些非顺序调用会严重影响我们阅读代码。对于这些情况,大概有两种解决方法:
Tip 3:把超难的算法放在最后
对于一些开源项目,它会用到很多经典的算法。很经典,当然也有难度。
然而,这些算法会严重阻碍我们理解整个项目的进展。我建议这些算法,可以先记住位置。在后续的剧集中,我们会慢慢了解算法信息。
以上就是日志文件的切分算法。在理解业务流程时,不建议马上去理解算法。您可以设置另一个目标以便稍后了解它。
以上就是我多年来一直沿用的读码套路。如果你也是学习Java的,如果在学习过程中对源码、学习路线、学习教程、学习方法等有疑问,可以加关注和我交流,我可以拉你进入我的十年Java学习裙,学习氛围好,对初学者学习Java很有帮助,需要的朋友可以关注或者私信我,发“编程”就可以了!
总结一下
首先,在阅读代码之前,我们应该对项目有个大概的了解。我们可以从官方文件、民间博客等方面加快对整体情况的了解。最好参考一些架构图和时序图。如果没有现成的图,最好自己画一些。
然后,我们运行项目,运行它可以帮助我们进行后续的调试,帮助我们快速理解那些难懂的代码段。
然后,将我们的目标细化为业务流程。没有这些业务流程,我们一下子读一大段代码,一是没有清晰的上下文,二是没有可达到的任务目标……结果就是一片混乱。
最后,我开始真正阅读代码。阅读代码时,我们应该熟练地阅读它。我们需要知道如何跳过某些代码,如何巧妙地找到后续的调用过程,以及如何集中精力克服一些困难。
正是通过这个套路,我不仅快速阅读了代码,而且理解深刻。
另外,多看代码还有一个很大的好处:我在设计项目架构或者写框架的时候,会不自觉的出现类似的项目或者代码块。
总之,读代码让我受益匪浅,这也是我事业比较顺利的重要原因之一源码,希望能对这里的后来者有所帮助。
如果您觉得本文对您有帮助,请点个赞。
暂无评论内容