对于开源软件,在使用其作为系统重要组成部分,真正用于生产时,仅知道如何使用不行
必须掌握原理和细节,以找到最佳使用姿势;在出问题时,基于其原理和一些现象去排查问题原因。
掌握开源软件最佳方式是学习源码,但面对上千个源码文件,几十万行代码,无从下手。
因此这里来聊一聊,如何下手学习开源软件代码。
通过文档来了解开源项目
学习源码最佳的方式是先看它的文档。
通过文档可以迅速了解整体结构,功能特性,关键技术,实现原理,生态系统等。
掌握这些整体的只是,再看源码,可以避免盲人摸象。
且需注意去阅读官方文档,而非翻译版本。原因是官方会及时更新,而翻译版会落后且有时会有错误。
对于英语差的,可以通过标题找中文版,读后再重读官方英文版。
开源社区经过这么多年发展,已经形成相对成熟的文化。每个开源软件,代码如何管理、社群成员如何沟通、如何协作都已经形成了一个比较固定的套路。大多数开源软件,它的官网和技术文档也是有一个相对比较固定的结构。
以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都有固定格式,一般要说明为什么需要增加这个功能,会对系统产生哪些影响和改变,还有我们最关心的设计和实现原理的简述。
读完讲解实现的文档再去看源代码,就是刚说的,不只带问题,而是带着答案去看,读的时候,更容易理解代码,且可以花更多精力在实现细节上,这样阅读源码的效果会更好。
使用这种以问题为阅读单元的方式读源码,每次花很少时间,阅读少部分源码,就能解决一个问题,获得一些收获。这种方式其实是通过一个一个的问题,在网状源码中,每次去读几个点组成的一两条线,随着通过源码了解的问题越来越多,对项目源码的理解也会越来越全面而深入。
若想学习代码,最佳切入点是其官方文档。这些文档中,最灵魂是项目背后的论文,是整个开源项目的理论基础。
阅读源码的时候,最佳的方式是带着问题去阅读,最好是带着问题的答案去读。难度低,周期短,收获快。不要想着一定从总体上去全面掌握一个项目的所有源码,没必要。
思考题
课后,找一个熟悉的开源项目,可以是消息相关,也可以不是。确定一个问题,用这节课讲到的“带着问题和答案去读源码”的方法,去读一点源码。然后最重要的是,把主要流程用流程图或者时序图画出来,把重点算法、原理用文字写出来。
原文链接:https://blog.csdn.net/vectorx/article/details/119549482