Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

1.引言

这篇文章是萌叔对阅读开源项目源代码的一般思路和方法的总结。

2. 带着问题去阅读?

首先需要搞清楚为什么你要阅读这个项目的源代码?你想从阅读这个开源项目获得什么?

  • 是看项目的代码如何布局?
  • 以RocketMQ为例,你是想了解为什么RocketMQ有强大的吞吐能力?
  • 以RocketMQ为例,Clustering模式下,同组的消费者如何保证负载均衡?
  • 以RocketMQ为例,你是想了解死信队列的作用?

总之需要在阅读之前多给自己提问题?在阅读的过程中也要给自己不断的提问题。

一个成熟的开源项目的源代码动辄就是上万行。根据二八法则,其实核心的代码顶多就是20%,剩下的大量都是参数解析,判断各种条件,处理错误、异常情况等防御性编码。在阅读时,要学会跳过这些代码,只关注自己感兴趣的代码,以节约时间。

3. 阅读官方文档并使用一段时间后,再去阅读源代码

“没有调查,没有发言权”–李德胜

建议先阅读官方文档,并针对开源项目对应的工具或者服务使用一段时间,再去看源码。官方文档中往往会有关于这个服务的架构说明,核心原理的讲解,有的还会给出最佳实践,这对于我们快速理解这个项目的有很大的帮助。

使用一段时间有助于加深对项目的理解,了解它的应用场景,优点和缺点,也可以在脑海中产生更多的问题。如果是服务,能够亲手搭建一次最好,特别是要关注配置文件中的参数说明,留意哪些参数可能对服务性能造成的影响。

4. 站在巨人的肩膀上

充分借鉴前人的智慧,搜搜已经公开的资料,看有没有诸如

  • “xxx源码解析”
  • “xxx原理”
  • “xxx总结”
  • “xxx过程分析”

如果运气好,已经有人对你疑惑的问题做出了解答。如果运气再好点,说不定还会把核心代码涉及的文件、函数列得清清楚楚,这样通常我们只需要沿着文章的脉络把核心代码再看一遍即可。

5. 从哪里开始?

5.1 顺着接口往里看

对于有接口的服务,可以顺着接口往里看,从接收到请求开始,到最后输出响应结果

5.2 从数据库看起

对于有数据库的服务,还可以从数据库表结构看起,看都针对数据库表都有哪些操作

5.3 从Example和单元测试看起

example和单元测试往往都是侧重一个场景。从特定场景入手会比较好理解

6. 抓住核心脉络

6.1 数据流&控制流

绝大多工具或者服务都可以看做过滤器

所以我们只要关注数据在系统中的流动就可以了,还有的系统除了数据流之外,还有单独的控制流

6.2 状态机

一些系统内部有比较多的状态,比如订单系统,这种情况我们可以手绘一下状态机,多关注一下状态变换所需要触发的条件。

7. 举一反三,多做对比

比如我们再看RocketMQ源码的时候,我们就可以想想它和kafka在架构上有什么不同,各有什么优点缺点。

8. 多做分享

人们对一个知识的理解程度往往可以分为三个层次。

当你能够把看完的一个开源项目,并能够给其他人讲明白的时候,你才算是真的搞明白了。另外分享的过程也是查余补缺的过程,一些原先你没有关注的点,可以重新熟悉起来。在分享的过程中,与他人交流的过程,思想的碰撞往往带来新的火花。

萌叔认为 技术分享是利人利己的好事,大家可以多做。

总结

以上就是萌叔的阅读源代码的经验总结,希望对大家有所帮助。


微信公众号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据