今年我读了四个开源项目源码,有哪些心得可以分享呢?

摘要:微信搜 「yes的练级攻略」干货满满,不然来掐我,回复【123】一份20W字的算法刷题笔记等你来领。 个人文章汇总:https:github.comyessimidayes 欢迎 star ! Hola,我是 yes。 今年来看了
微信搜 「yes的练级攻略」干货满满,不然来掐我,回复【123】一份20W字的算法刷题笔记等你来领。 个人文章汇总:https://github.com/yessimida/yes 欢迎 star ! Hola,我是 yes。 今年来看了 RocketMQ、Kafka、Dubbo 、Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下。 其实还看了一点点 Linux、Redis、jdk8,这几个阅读的目的和上面几个是不同的,下面会提到。 相信通过今天的分享你不会被源码轻易劝退,其实没什么,不就是代码吗? 而且你一直在看源码,可能你没意识到,你看别人的代码不就是源码? 你新入职一个公司要熟悉代码的时候不就是看源码? 这和你看开源框架源码没有本质的区别,要真说区别无非是代码的质量、整体的设计区别罢了。 那时候你怎么做的? 反正最终结果你应该都是上手了的。 那就得了,开源框架的一样,最终你也会上手。 所以没啥好怕的,不要被劝退了。 我先分享一下我入职一家新公司接手项目的时候是怎么做的。 入职新公司接手项目就是在读源码 新入职接手项目的时候,我先拉上了产品经理和原先这个项目的主力开发开了个会。 这个会的目的就是让产品经理介绍一下这个项目的背景、要解决什么问题、有哪些功能。 开发在旁边补充、解答我的疑惑,毕竟产品经理不太了解细节上的数据交互。 这个会议下来你就能得知这个项目到底是干嘛的,能提供哪些功能。 业务上的理解对你之后读源码非常的重要!! 然后我会去要文档、架构图、流程图、时序图等等(有多少要多少,没的话没办法)。 看完之后对整个项目有了大致的了解。 然后让项目跑起来,跑起来之后,开始用这个软件,各种功能点一点,毕竟听产品经理说和自己实际用还是有区别的。 基本上项目主流程都过了一遍之后,开始看源码。 这个时候看源码,单看文件的命名其实已经能知道这个文件对应着哪个模块了,有种胸有成竹的感觉。 然后具体深入细节就看分配到的任务了,几个需求接下来渐渐地细节就都全清楚了。 稳了。 所以入职接手项目是需要了解背景、总览全局然后再细化。 读开源项目的源码也是如此,自顶向下。 如何阅读开源项目的源码 读源码我个人分为两种情况:为了提升自己和为了找问题。 为了提升自己而读源码 我默认你是知道你要看的开源项目是干嘛的,比如 RocketMQ 是消息队列,消息队列是干嘛的你应该先知道。 我也默认你用过这个开源项目,业务上没用过自己私下也要先用用,了解简单功能怎么用,让它先跑起来。 首先看官网、wiki。 我截个 RocketMQ 的: 了解具体涉及到的概念、名称、特性、架构这是第一步。 这一步能让你脑子里有个角色分布图和数据流转图,让你明白整体项目的主要角色及之间的交互。 然后看源码目录,你得先知道每个目录是干嘛的涉及哪些功能,这其实和你看业务源码一样。 然后就是找突破口了,这种开源项目都有 demo ,跑,打断点就完事儿了! 比如 RocketMQ 的: 比如 Dubbo 的: 这就是突破口。 然后就开始源码之路了,是的还是得自己啃,硬啃,这是读源码的必经之路! 但是这时候你不是像无头苍蝇一样乱啃。 你是在知晓大体会涉及到的角色和数据流转之后读源码,这很不一样! 你会对一些方法调用有一种“认可感”,因为你知晓大致的流程,所以觉得本该如此。 读源码有时候会觉得代码很多,分支好多。 没事,先拷贝一份,然后把一些异常处理和不常见的分支先删了。 整体核心流程先理清楚! 并且理清楚了一个流程之后开始画图,流程图、脑图都上。 清楚之后再看没删减的代码,把异常处理的一些也理解了,补充完整流程图、脑图等。 看看我之前分析 Kafka 的时候画的图,就类似这样的搞清楚一个流程: 然后这一模块就收工了!搞定! 然后各种分支发散出去,大致的流程就都清晰了,源码也就读的差不多了。 读源码的时候也会遇到一些不能理解的,先略过,主流程先搞懂。 搞懂整体核心流程之后可以抠一些细节了,比如我之前看 Dubbo 的时候就抠了一个从一段 Dubbo 源码到 CPU 分支预测的一次探险之旅 再比如之前看 Kafka 的索引设计涉及到二分查找,但是源码中是改版的二分查找。把索引项分为热区和冷区,深究下去是为了避免缺页中断。 再比如 RocketMQ 里面看预热文件的时候涉及的这个方法。 这时候又涉及到 mlock、madvise 。 这些就是细节,而细节往往就是我们需要学习的地方,所以在理清整体流程之后不要错过细节。 往往你觉得很奇怪的地方可能就是一些“骚操作”,学的就是“骚操作”。
阅读全文