zoukankan      html  css  js  c++  java
  • 如何阅读开源代码?

    一、通过文档来了解开源项目

    通过看文档,你可以快速地掌握这个软件整体结构,它有哪些功能特性,它涉及到的关键技术、实现原理和它的生态系统等等。在掌握了这些之后,然后再去看它的源代码。

    强调一点,你必须去看这些开源软件官网上的文档,尽量不要去搜索一些翻译的中文文档。因为中文文档很多都会落后于英文文档。如果直接阅读英文文档困难或者慢,可以找到你需要阅读的文章后,搜索对应的中文版本,先看一遍中文版,然后在对着英文版过一遍。

    大多数开源软件,它的官网和技术文档是有一个相对比较固定的结构的。

    Kafka 的官网为例,怎么看它的文档:

    1、首先需要看Quick Start,安装Quick Start中的指导快速把它的环境搭起来,把它运行起来,这样你会对这个项目有个感性认知,也便于你在后续深入学习的时候跑一些例子。

    2、然后找一下Introduction(介绍),一般里面会有项目的基本介绍。你需要找到这个项目用到的一些基本概念或者名词的介绍文档。有些开源项目会单独有一个 Basic Concepts 文档来讲这些基础概念。

    3、对项目有个基本了解后,可以看一下它的使用场景、功能特性以及相关的生态系统介绍。在kafka官网中功能相关的内容在Use cases(使用用例)、EcoSystem(生态系统,一般会介绍它这个项目适用的一些典型使用场景,在某个场景下适合与哪些其他系统一起配合使用等)两篇文章中,有些项目中会有类似名为 Features 的文档介绍功能和特性。

    在你读完这些文档后,对项目有个整体的了解了,如:这个项目是干什么的?能解决哪些问题?适合在哪些场景使用?有哪些功能?如何使用?接下来就可以去深入学习它的实现原理了。但并不是立即去看源码,一般开源项目都是通过一篇论文发表后,由某个大厂出手实现它,对于这样的开源项目,它背后的这篇论文就是整个项目的灵魂,如果把这篇论文看完并且理解透了,这个项目的实现原理也就清楚了。对于kafka来说,它的灵魂论文是:The Log: What every software engineer should know about real-time data's unifying abstraction,对应的中文译稿在这里:日志:每个软件工程师都应该知道的有关实时数据的统一抽象。学习完项目灵魂,就可以开始阅读源码了。

    二、以点带面的方式阅读源码

    程序的源代码是一个网状结构,关系错综复杂,所以这个结构是非常不适合人去阅读的。推荐阅读的方式是:带着问题去读源码,最好是带着问题的答案去读源码。

    每次读源码之前,确定一个具体的问题,比如:

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

    确定问题后,先不要急看源码,而是找一下是否有对应的实现文档。一般核心功能都会有专门的文档来说明它的实现原理。比如在 Kafka 的文档中,DESIGN、IMPLEMENTATION两个章节中,介绍了 Kafka 很多功能的实现原理和细节。一些更细节的非核心的功能不一定有专门的文档来说明,但是我们可以去找一找是否有对应的 Improvement Proposal。(Kafka 的所有 Improvement Proposals 在这里

    Improvement Proposal是描述一个新功能文档,一般开源项目需要增加一个新的功能或者特性的时候,都会创建一个 Improvement Proposal,一般标题都是"xIP- 新功能名称",其中 IP 就是 Improvement Proposal 的缩写,x 一般就是这个开源项目的名称的首字母,比如 Kafka 中 Improvement Proposal 的标题就都是以 KIP 来开头。每个 Improvement Proposal 都是有固定格式的,一般要说明为什么需要增加这个功能,会对系统产生那些影响和改变,还有我们最关心的设计和实现原理的简述。这样当你读完实现的文档,不只是带着问题,而是带着答案去读源码,不仅仅是更加容易理解源码,还可以放更多的精力在实现的细节上。

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

    在读源码的过程中,把主要的流程用流程图或者时序图画出来,把重点的算法、原理用文字写出来。

  • 相关阅读:
    冒泡排序、选择排序、简单二分查找
    asp.net和js读取文件的MD5值的方法
    C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
    利用jQueryRotate旋转插件开发大转盘抽奖
    说说第三方支付接口开发及开发中遇到的坑爹问题
    浅谈程序员接私单那点事及接私单需要注意的问题
    C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
    C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
    C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)
    C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
  • 原文地址:https://www.cnblogs.com/chjxbt/p/11353167.html
Copyright © 2011-2022 走看看