当前位置: 首页 > 科技观察

面对枯燥无味的源码,我们该如何继续看下去呢?

时间:2023-03-21 00:12:57 科技观察

一个工作了一定年限(一般是3、4年左右)的软件开发人员,如果还没有学会阅读源码,那么就会遇到瓶颈。因为此时的开发,他不仅要能做那些CURD的业务逻辑,更要能根据公司的实际情况去写框架。基本上,没有人能像天才一样从零开始写出一个框架。很多人其实都是从模仿框架开始的。而如果你要模仿,那么你就必须先了解框架的源码。所以阅读源代码是如此重要。工作一两年的时候,我尝试去阅读JDK的源码。那时候感觉就像在看一本圣经,读起来很痛苦。直到工作三年左右,因为同事都在看源码,我也开始看一些源码。我看到的第一个框架的源码是dubbo,虽然没有完全看懂。但是通过阅读dubbo源码,了解了JDK的SPI机制,知道了SPI在框架开发中的作用。直到最近看了公司的一个网关框架,才慢慢有了一些阅读源码的经验和套路。趁热打铁,写下这些心得,希望你也能早日走上源码阅读之路。搜索网上资料阅读一个框架的源码,最基本的操作肯定是浏览网上各种分析文章。通过这个操作,可以对框架有个大概的了解。站在巨人的肩膀上,少走很多弯路。但是如果你看的项目是公司内部的框架,那你只能找公司内部的文档,更有什者有的连文档都没有。那么你可以跳过这一步。扫描源码当你拿到框架的源码后,你可以粗略地扫描一下源码的每个包以及每个包下的文件。扫描不需要你弄清楚每一行代码的含义,它只需要让你知道源代码每一部分的功能。如果一个开源框架足够标准,那么它的命名是非常语义化的。所以我们在扫描的时候,可以通过包名和文件名来判断这个包是做什么用的。比如util包是一个工具类,我们可以直接跳过。vo包存放的是实体模型,所以也可以跳过。协议包用于存放协议相关等。通过这样一个步骤,你会对整个项目有个基本的印象,知道这个项目是做什么的,哪些是比较重要的。找到入口阅读任何一个框架的源码,首先就是要找到框架的入口。通过扫描上面的源码,你应该能找到一些入口的迹象。比如对于Dubbo,你会发现它有一个名为dubbo-demo的子模块,所以我们要关注它。如果进一步探究需求,会发现它的切入点是dubbo-demo中的Provider类和Consumer类。我们可以直接运行这两个类的main方法,一步步跟踪代码的执行情况。源码通读找到入口后,接下来就是通读所有源码,也就是源码的每一个文件、每行都要通读一遍。这个阶段不需要完全理解详细的业务逻辑,而是要形成一个大体框架,知道这个框架是怎么设计的,有哪些大体模块,这些模块是怎么设计的。通读源码的阶段是最无聊的,也是最容易放弃的。一方面是因为源代码太多,另一方面是因为没有目标,很容易放弃。一开始我也是这样做的,但后来我想出了一个更好的方法来让自己以数字方式了解我的阅读进度。这样我就不会觉得自己没有头绪,不知道要多久才能看完。我的方法是为我的IDE安装一个代码统计插件:Statistics。这个插件可以统计项目中的源代码行数。比如下面是我统计dubbo项目源码的截图。它将列出每个java文件的源代码行数和总行数。从上面的截图我们可以看到,在dubbo项目中,有11万行源代码。这样一来,我心里也有了一个大概的期待。接下来,我将把这些数据复制出来,放到一个Excel表格中,像这样:代码行。接下来我会按照词条一个一个的看源文件,把每个方法都读一遍。我会为我看过的方法写一个评论,例如:csymark,写下我的评论。当我读完一个文件后,我会把百分比写在Excel表格中对应文件的最右边一栏。***我将在下面的一行中计算我已阅读的文件的百分比。每看一个方法,就写一个csydone来鼓励自己。我每次读完一个文件,在Excel中标记为完成,底部的阅读百分比会不断增加。就这样,让枯燥的源码阅读变得有趣起来,有了一些目标。通读源码是最枯燥的,也最容易没有方向和目标。有了数字记录,你就可以知道自己目前的进度,阅读了多少源代码。很多时候我们看了半天,发现一点进展都没有,就不想看了。这时候可以给自己定一个目标,比如:一天读完5%的源码就可以休息了。然后想偷懒的时候,看看Excel最下面的读取百分比,还不到5%,继续看下去。这种方法对我仍然有效。但如果你不知道它是否有效,你可以尝试一下。如果它有用,请在评论中告诉我。在阅读源码的过程中,你会对框架有很多新的认识。你会知道这个框架大致分为哪些部分,每个部分的作用是什么,这个模块采用了什么样的设计理念等等。如果说上一个阶段是通读源码,那么这个阶段就是梳理自己在通读源码的过程中有哪些收获。在整理的过程中,你肯定会有更多的疑问,不断提炼,精读。批判性思维经过以上几个阶段后,你会发现你对框架有了一个整体的认识,对每个模块的实现细节有了更深入的了解。这个时候你可以想想它为什么要这样做,这样做有什么好处,是不是可以换一种方式做得更好?总结以上几个阶段是我阅读了几个框架源码后的心得,相信会是一份不错的源码阅读指南。如果大家有更好的源码阅读经验或方法,欢迎留言与我交流。