今年我读了四个开源项目的源码,来分享下心得

微信搜 「yes的练级攻略」干货满满,否则来掐我,回复【123】一份20W字的算法刷题笔记等你来领。 我的文章汇总:https://github.com/yessimida/yes 欢迎 star !java

Hola,我是 yes。git

原本今天是没打算发文的,我正在写下周四要去大学分享的 PPT。github

嘿嘿,老师让我给学弟学妹们作个小分享。算法

而后刷公众号刷到个广告:《想涨薪,要学会读源码》。微信

今年来看了 RocketMQ、Kafka、Dubbo 、Tomcat 的源码,以前也有读者询问过如何读源码,索性就来分享一下。架构

其实还看了一点点 Linux、Redis、jdk8,这几个阅读的目的和上面几个是不一样的,下面会提到。框架

相信经过今天的分享你不会被源码轻易劝退,其实没什么,不就是代码吗?源码分析

并且你一直在看源码,可能你没意识到,你看别人的代码不就是源码?学习

你新入职一个公司要熟悉代码的时候不就是看源码?url

这和你看开源框架源码没有本质的区别,要真说区别无非是代码的质量、总体的设计区别罢了。

那时候你怎么作的?

反正最终结果你应该都是上手了的。

那就得了,开源框架的同样,最终你也会上手。

因此没啥好怕的,不要被劝退了。

我先分享一下我入职一家新公司接手项目的时候是怎么作的。

入职新公司接手项目就是在读源码

新入职接手项目的时候,我先拉上了产品经理和原先这个项目的主力开发开了个会。

这个会的目的就是让产品经理介绍一下这个项目的背景、要解决什么问题、有哪些功能。

开发在旁边补充、解答个人疑惑,毕竟产品经理不太了解细节上的数据交互。

这个会议下来你就能得知这个项目究竟是干吗的,能提供哪些功能。

业务上的理解对你以后读源码很是的重要!!

而后我会去要文档、架构图、流程图、时序图等等(有多少要多少,没的话没办法)。

看完以后对整个项目有了大体的了解。

而后让项目跑起来,跑起来以后,开始用这个软件,各类功能点一点,毕竟听产品经理说和本身实际用仍是有区别的。

基本上项目主流程都过了一遍以后,开始看源码。

这个时候看源码,单看文件的命名其实已经能知道这个文件对应着哪一个模块了,有种成竹在胸的感受。

而后具体深刻细节就看分配到的任务了,几个需求接下来渐渐地细节就都全清楚了。

稳了。

因此入职接手项目是须要了解背景、总览全局而后再细化。

读开源项目的源码也是如此,自顶向下。

如何阅读开源项目的源码

读源码我我的分为两种状况:为了提高本身和为了找问题。

为了提高本身而读源码

我默认你是知道你要看的开源项目是干吗的,好比 RocketMQ 是消息队列,消息队列是干吗的你应该先知道。

我也默认你用过这个开源项目,业务上没用过本身私下也要先用用,了解简单功能怎么用,让它先跑起来。


首先看官网、wiki。

我截个 RocketMQ 的:

了解具体涉及到的概念、名称、特性、架构这是第一步。

这一步能让你脑子里有个角色分布图和数据流转图,让你明白总体项目的主要角色及之间的交互。

而后看源码目录,你得先知道每一个目录是干吗的涉及哪些功能,这其实和你看业务源码同样。

而后就是找突破口了,这种开源项目都有 demo ,跑,打断点就完事儿了!

好比 RocketMQ 的:

好比 Dubbo 的:

这就是突破口。

而后就开始源码之路了,是的仍是得本身啃,硬啃,这是读源码的必经之路!

可是这时候你不是像无头苍蝇同样乱啃。

你是在知晓大致会涉及到的角色和数据流转以后读源码,这很不同!

你会对一些方法调用有一种“承认感”,由于你知晓大体的流程,因此以为本该如此。

读源码有时候会以为代码不少,分支好多。

没事,先拷贝一份,而后把一些异常处理和不常见的分支先删了。

总体核心流程先理清楚!

而且理清楚了一个流程以后开始画图,流程图、脑图都上。

清楚以后再看没删减的代码,把异常处理的一些也理解了,补充完整流程图、脑图等。

看看我以前分析 Kafka 的时候画的图,就相似这样的搞清楚一个流程:

而后这一模块就收工了!搞定!

而后各类分支发散出去,大体的流程就都清晰了,源码也就读的差很少了。

读源码的时候也会遇到一些不能理解的,先略过,主流程先搞懂。

搞懂总体核心流程以后能够抠一些细节了,好比我以前看 Dubbo 的时候就抠了一个从一段 Dubbo 源码到 CPU 分支预测的一次探险之旅

再好比以前看 Kafka 的索引设计涉及到二分查找,可是源码中是改版的二分查找。把索引项分为热区和冷区,深究下去是为了不缺页中断。

再好比 RocketMQ 里面看预热文件的时候涉及的这个方法。

这时候又涉及到 mlock、madvise 。

这些就是细节,而细节每每就是咱们须要学习的地方,因此在理清总体流程以后不要错过细节。

每每你以为很奇怪的地方可能就是一些“骚操做”,学的就是“骚操做”。

这一趴读源码是为了让本身获得晋升、学习学习优秀开源框架是如何设计而读的源码。

为了找问题而读源码

这个目的性很强,有时候是项目出错,通常而言有日志,因此经过日志搜就行。

若是你自己对这个框架很熟悉那固然最好,若是不熟悉经过日志搜索结合上下文其实也能找到一些原因。

不过有时候仍是得整个链路分析下来才能排查问题,这个看功力了。

有时候是由于看到一些文章的说法冲突了,一篇说 A 另外一篇说 B ,若是你找不到权威的信息你只能本身去看源码,经过关键字搜。

好比我这篇写的

这就是源码之下无秘密。

这种目的性很强的读源码就得结合当时上下文和靠我的功力了。

最后

不知不觉说了这么多。

我只能告诉你不要被源码劝退,你其实一直在看源码。

而后要自顶向下的看源码,不要一头就钻进细节,先从官网等渠道对开源框架有个全面的了解,而后看源码理清主流程。

再配合流程图、时序图、脑图等记录、归类。

而后再看细节,学学优秀开源框架的“骚操做”。

模仿它,学会它,从中能延展出不少额外的底层知识,好比上面提到的预防缺页中断,预热锁页,分支预测等等。

固然也能够先去网上搜一搜别人的源码分析文章,好比我以前的一些,而后本身再上手,这样会比较舒服和顺利。

或者一些相关的付费专栏,我我的以为不要排斥知识付费,就这么点钱,比你买个皮肤划算。

人家汇总整理知识,你花点小钱,节省你本身研究的时间,我以为不亏。

反正我本身买了不少,我本身从中有收获,因此我说的一点都不心虚。

最后,源码是块硬骨头这毋庸置疑,我只能告诉你看源码的准备工做和一些当心得。

道阻且长,行则将至。

冲!

欢迎关注个人公众号【yes的练级攻略】,更多硬核文章等你来读。


本文分享自微信公众号 - yes的练级攻略(yes_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索