5

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

 3 years ago
source link: https://www.cnblogs.com/yescode/p/14136906.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

Hola,我是 yes。

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

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

a0866f76-83d2-4e08-9bb8-1ac622c3c21f.png

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

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

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

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

那时候你怎么做的?

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

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

所以没啥好怕的,不要被劝退了。

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

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

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

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

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

这个会议下来你就能得知这个项目到底是干嘛的,能提供哪些功能。

业务上的理解对你之后读源码非常的重要!!

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

看完之后对整个项目有了大致的了解。

然后让项目跑起来,跑起来之后,开始用这个软件,各种功能点一点,毕竟听产品经理说和自己实际用还是有区别的。

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

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

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

所以入职接手项目是需要了解背景、总览全局然后再细化。

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

如何阅读开源项目的源码

读源码我个人分为两种情况:为了提升自己和为了找问题。

为了提升自己而读源码

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

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


首先看官网、wiki。

我截个 RocketMQ 的:

e0e67802-3eef-4a61-814b-5a34dc2fdc7e.png

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

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

b382cca3-a0bb-4d27-aac7-74cd5dec83ec.png

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

3ebe3c69-0cff-4fb2-9284-46f3d6a0477d.png

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

比如 RocketMQ 的:

d8f87cf3-d3e9-4d54-91c4-71fb80c8ff50.png

比如 Dubbo 的:

f635d4ae-1d22-4dbf-87d3-6b194444cc15.png

这就是突破口。

然后就开始源码之路了,是的还是得自己啃,硬啃,这是读源码的必经之路!

但是这时候你不是像无头苍蝇一样乱啃。

你是在知晓大体会涉及到的角色和数据流转之后读源码,这很不一样!

你会对一些方法调用有一种“认可感”,因为你知晓大致的流程,所以觉得本该如此。

读源码有时候会觉得代码很多,分支好多。

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

整体核心流程先理清楚!

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

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

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

a1b81058-cd58-4db5-af37-fb2d70c8c5fa.png

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

然后各种分支发散出去,大致的流程就都清晰了,源码也就读的差不多了。

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

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

8bad9687-9cc8-49f8-b64e-e1939476cef2.png

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

ffaf0803-b7e1-407c-9de7-df0b6c187bfa.png

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

a873fbac-18a3-4237-bddd-5ccc80486234.png

这时候又涉及到 mlock、madvise 。

2abde476-5250-4ec8-ae77-4a09b07c2dfb.png

这些就是细节,而细节往往就是我们需要学习的地方,所以在理清整体流程之后不要错过细节。

往往你觉得很奇怪的地方可能就是一些“骚操作”,学的就是“骚操作”。

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

为了找问题而读源码

这个目的性很强,有时候是项目出错,一般而言有日志,所以通过日志搜就行。

如果你本身对这个框架很熟悉那当然最好,如果不熟悉通过日志搜索结合上下文其实也能找到一些缘由。

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

有时候是因为看到一些文章的说法冲突了,一篇说 A 另一篇说 B ,如果你找不到权威的信息你只能自己去看源码,通过关键字搜。

比如我这篇写的

bc3915cb-4803-412e-8a51-28e6200c2a63.png

这就是源码之下无秘密。

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

不知不觉说了这么多。

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

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

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

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

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

当然也可以先去网上搜一搜别人的源码分析文章,比如我之前的一些,然后自己再上手,这样会比较舒服和顺利。

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

人家汇总整理知识,你花点小钱,节省你自己研究的时间,我觉得不亏。

反正我自己买了很多,我自己从中有收获,所以我说的一点都不心虚。

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

道阻且长,行则将至。

最后的最后

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

up-f9888e6aa6606e96fd05de0a82a5d37c88a.png

微信搜索【yes的练级攻略】,关注 yes,回复【123】一份20W字的算法刷题笔记等你来领,从一点点到亿点点,我们下篇见。 个人文章汇总:https://github.com/yessimida/yes 欢迎 star !


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK