09 | 学习开源代码该如何入手?

对于开源软件,在使用其作为系统重要组成部分,真正用于生产时,仅知道如何使用不行

必须掌握原理和细节,以找到最佳使用姿势;在出问题时,基于其原理和一些现象去排查问题原因。

掌握开源软件最佳方式是学习源码,但面对上千个源码文件,几十万行代码,无从下手。

因此这里来聊一聊,如何下手学习开源软件代码。

通过文档来了解开源项目

学习源码最佳的方式是先看它的文档。

通过文档可以迅速了解整体结构,功能特性,关键技术,实现原理,生态系统等。

掌握这些整体的只是,再看源码,可以避免盲人摸象。

且需注意去阅读官方文档,而非翻译版本。原因是官方会及时更新,而翻译版会落后且有时会有错误。

对于英语差的,可以通过标题找中文版,读后再重读官方英文版。

开源社区经过这么多年发展,已经形成相对成熟的文化。每个开源软件,代码如何管理、社群成员如何沟通、如何协作都已经形成了一个比较固定的套路。大多数开源软件,它的官网和技术文档也是有一个相对比较固定的结构。

以Kafka的官网为例,如何阅读。

首先阅读Quick Start。把环境搭起来,项目跑起来,构成感性认识。

然后阅读Introduction,一般会有项目介绍,很重要的一点是,需要找到项目用到的一些基本概念或者名词介绍,在Kafka文档中,这些内容在Introduction中,如Topic,Producer,Consumer,Partition的含义。

有开源项目单独有一个Basic Concepts文档来讲解。因为开源社区开发者爱发明概念,自创名词,了解这些才能看懂项目其它文档。

对项目有个基本了解后,接下来可以看下使用场景功能特性以及相关生态的介绍。

Kafka中在Use Case,EcoSysyem两篇红有介绍。有些项目会有类似Features的文档进行介绍。

其中项目的生态系统,也就是EcoSystem,会介绍它这个项目适用的典型应用场景,在某个场景下适合与哪些其他的系统配合使用等。如果说你的系统不是特别特殊或者冷门,大概可以找到类似场景,少走弯路。

读完上面那些文档,对这个项目的整体会有全面了解,比如:

  • 项目是干什么的
  • 能解决什么问题
  • 适合在哪些场景使用
  • 哪些功能
  • 如何使用

对这些问题有初步答案后,可以深入学习原理了。这是不是意味可以直接看源码,这样做其实并不是最好的办法。

大部分的开源项目的诞生,一般是某个大厂或大学的科学家,某天脑海中突然有了一个改变世界的想法,科学家们会基于这个想法做一些深入的研究,然后写了一篇论文发表。发表后在业务获得很多赞,这时候轮到Google、Facebook等大厂出手:此文有价值,不如实现?一个开源项目就诞生了。

所以对于开源项目,其背后的论文是整个项目的灵魂。把论文看完理解透了,项目的实现原理基本就透了。

对于Kafka来说,灵魂就是这篇博文:对应的中文译稿。

这篇博文被评为程序员实施版必读文章,无论你是不是想了解Kafka的实现原理,都强烈推荐你好好读一下上面这个博文。

学习完项目灵魂,可以开始读源码。

用以点带面的方式来阅读源码

需要注意的是,在读源码时,不要上来就找main方法泛泛地看。一篇文章是线性结构,从前往后看即可。一本书,按目录是树状结构,大多

程序源码是网状结构。错综复杂,这种结构不适合人类阅读,如果泛泛而读,容易迷失在网里。

推荐带着问题读源码,最好是带着问题的答案去读源码。比如:

  • RocketMQ 的消息是怎么写到文件里的?
  • Kafka的Coordinator是怎么维护消费位置的?

类似这种非常细粒度的问题,细粒度到每个问题的答案就是一两个流程就可以回答,这样就可以了。如果说你就想学习一下源码,或者说就是提不出这些问题怎么办。答案还是:看文档

确定问题后,不要着急看源码,先找下有没有对应的实现文档,一般核心功能会有专门的文档说明实现原理,比如Kafka中有 DESIGN 和 IMPLEMENTATION两个章节,介绍了很多功能的实现原理和细节。

一些更细节的非核心功能不一定有专门的文档来说明,但是我们可以去找一找是否有对应的Improvement Proposal。

这个 Improvement Proposal 是什么呢?你可以认为它是描述一个新功能的文档,一般开源项目需要增加一个新的功能或者特性的时候,都会创建一个 Improvement Proposal,一般标题是 “xIP-新功能名称”,其中IP就是 Improvement Proposal的缩写,x一般是开源项目名称的首字母,比如Kafka就是KIP。

每个Improvement Proposal都有固定格式,一般要说明为什么需要增加这个功能,会对系统产生哪些影响和改变,还有我们最关心的设计和实现原理的简述。

读完讲解实现的文档再去看源代码,就是刚说的,不只带问题,而是带着答案去看,读的时候,更容易理解代码,且可以花更多精力在实现细节上,这样阅读源码的效果会更好。

使用这种以问题为阅读单元的方式读源码,每次花很少时间,阅读少部分源码,就能解决一个问题,获得一些收获。这种方式其实是通过一个一个的问题,在网状源码中,每次去读几个点组成的一两条线,随着通过源码了解的问题越来越多,对项目源码的理解也会越来越全面而深入。

小结

若想学习代码,最佳切入点是其官方文档。这些文档中,最灵魂是项目背后的论文,是整个开源项目的理论基础。

阅读源码的时候,最佳的方式是带着问题去阅读,最好是带着问题的答案去读。难度低,周期短,收获快。不要想着一定从总体上去全面掌握一个项目的所有源码,没必要。

思考题

课后,找一个熟悉的开源项目,可以是消息相关,也可以不是。确定一个问题,用这节课讲到的“带着问题和答案去读源码”的方法,去读一点源码。然后最重要的是,把主要流程用流程图或者时序图画出来,把重点算法、原理用文字写出来。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值