一个软件开发人员,作业到了必定的年限(一般是3、4年左右),假如他还没学会阅览源码,那么他就会遇到瓶颈。由于到了这个时分的开发,他应该不只仅只会做那些 CURD 的事务逻辑,而应该会依据公司的实际情况去写结构。
而根本上没有谁能像天才相同从零写出一个结构,许多人写结构其实都是从仿照开端的。而你要仿照,那么你首要得看得懂结构源码才行。所以说阅览源码才显得那么重要。
我在作业一两年的时分有测验去看过 JDK 的源码,那时分感觉就跟看天书相同,看一点都觉得苦楚。一直到作业三年左右,由于搭档都在看源码,我也开端看一些源码。
我看的第一个结构的源码是 dubbo,尽管说没有彻底搞懂它。可是经过阅览 dubbo 源码,我弄懂了 JDK 的 SPI 机制,知道 SPI 在结构开发中的效果。一直到最近阅览公司的一个网关结构,我才渐渐有一点阅览源码的经历和套路。正好抓住时机,把这些经历写下来,期望你们也能提前踏上源码阅览之路。
查找网上材料
阅览一个结构的源码,最根底的操作必定是扫一遍网上的各种剖析文章。经过这个操作,你能够对这个结构有个大致的了解。站在伟人的膀子上,少走许多弯路。但假如你看的项目是公司内部的结构,那么你只能找公司内部的文档了,更甚者,有些连文档都没有。那么你能够略过这一步。扫一遍源码
当你拿到结构的源码的时分,你能够大致把源码的每个包,以及每个包下面的文件扫读一遍。扫读并不需要你弄清楚每一行代码的意思,只需要让你知道源码每一部分的效果。
假如一个开源结构满足规范,那么他的命名是十分语义化的。所以咱们扫读的时分,经过包名、文件名就能够判别出这个包是用来干嘛的。
例如 util 包是东西类,那咱们能够直接越过。vo 包是寄存实体模型的,相同能够越过。protocol 包是寄存协议相关的等等。经过这么一个过程,你会对整个项目有一个根本的形象,知道这个项目大约有哪些东西,哪些相对比较重要。找到进口
阅览任何一个结构的源码,首要就是要找到结构的进口。经过上面扫读源码,你应该能够发现一些进口的痕迹,例如关于 Dubbo 来说,你会发现它有一个名为 dubbo-demo 的子模块,那么咱们必定要点看它。
进一步开掘需求你会发现它的进口就是 dubbo-demo 中的 Provider 类、Consumer 类。咱们能够直接接运转这两个类的 main 办法,并一步步盯梢代码的执行情况。
通读源码
找到进口之后,下一步就是通读一切源码了,就是把源码的每个文件每一行都看一遍。在这个阶段不求彻底弄懂详尽的事务逻辑,可是要构成一个大约的结构,知道这个结构是怎么规划的,有哪些大致的模块,这些模块是怎么规划的。
在通读源码这个阶段是最单调无味的,也是最简单抛弃的。一方面由于源码真实过于多,另一方面由于没有一个方针,所以看着看着心里没有底,所以简单抛弃。我一开端也是如此,但之后我想出了一个比较好的办法,经过数字化的办法让自己知道阅览进展。这样自己就不会觉得心里没底,不知道要多久才干看完了。
我的办法是给我的 IDE 装一个代码计算插件:Statistics。这个插件能够计算项目中的源码行数。例如下面是我计算 dubbo 项目源码的截图,它会列出每个 java 文件的源码行数,以及一共的行数。
从上面的截图咱们能够看到 dubbo 项目里,源码的行数有 11 万行。这样一来,自己心思也有个大致的预期了。接下来,我会把这些数据复制出来,放在一个 Excel 表格里,就像下面这姿态:
在 Excel 表格中,我只会寄存每个源码文件的姓名、其源码行数、源码行数占比。接下来我会按着进口,一个个去看源文件,把每个办法看过一遍,看过的办法我会写一个注释,例如:csy mark,并写上我的注释。
当我把一个文件都看过之后,我会把 Excel 表格中对应的文件最右边一列,写上其百分比。最终我会在下边有一行,计算我所看完文件的百分比。
我每看完一个办法,我就写一个 csy done 来鼓舞下自己。每看完一个文件,我就在 Excel 中把它标记为完结,最下边的已读百分比也会跟着不断升高。经过这种办法,我让单调无味的源码阅览,有些一点兴趣,有了一些方针。
通读源码是最单调的,最简单没有方向和方针的。有了数字化的记载,你能够知道自己现在的进展是怎么样,看了多少的源码。许多时分咱们看了好久,发觉没什么进展的姿态,又不想看了。
这时分你能够给自己定一个方针,例如:一天看完 5% 的源码就能够歇息。那当你想偷闲的时分,看看 Excel 下方的已读百分比,还没到 5%,持续看吧。
这种办法关于我来说,仍是有必定效果的。但关于你们不知道有没有效果,你们能够测验一下。假如有用的话,就来谈论告诉我吧。收拾结构
在通读源码的过程中,你就会对结构有许多新的知道,会知道这个结构大致分为哪几个部分,每个部分的效果是什么,这个模块用了什么规划理念等等。
假如说上个阶段是通读源码,那么这个阶段就是要把你在通读源码过程中的收成收拾出来。在收拾的过程中,你必定会有更多的疑问,你会不断地细化,不断地精读。
批判性考虑
经过了上面几个阶段,你会发现你对这个结构有了全体的知道,而且对每个模块的完成细节都有了比较深入的知道。这个时分,你能够想一想为什么它要这么做,这么做有什么优点,那能用另一种办法做得更好吗?总结
上面几个阶段是我阅览几个结构源码之后的一些领会,信任会是一个不错的源码阅览攻略。假如你有更好的源码阅览经历或办法,欢迎留言与我沟通。