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

OpenHarmony源码学习之编译框架 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。最近在学习OpenHarmony源代码,个人认为学习有三个阶段看、实操、写,本着学习的终极目标,因此有了这篇文章。 阅读详情

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

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

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

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

通过文档来了解开源项目

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

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

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

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

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

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

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

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

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

小结

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

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

思考题

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

Github 2024-09-09 开源项目周报 Top15 根据Github Trendings的统计,本周(2024-09-09统计)共有15个项目上榜。 阅读详情

相关推荐

Github 2024-09-02 开源项目周报 Top13

根据Github Trendings的统计,本周(2024-09-02统计)共有13个项目上榜。

老孙正经胡说 1400

ChatLab开发者指南:如何贡献代码,扩展聊天分析功能?

ChatLab 是一款本地化的聊天记录分析工具,通过 SQL 和 AI Agent 帮助用户回顾和探索聊天历史。本指南将详细介绍如何为 ChatLab 贡献代码,扩展其聊天分析功能,无论是修复 Bug 还是开发新特性,都能在这里找到完整的操作流程。 ## 准备工作:搭建开发环境 在开始贡献之前,需要先搭建本地开发环境。首先克隆仓库: ```bash git clone https://git

gitblog_00002的博客 887

【GitHub项目推荐--17个酷爆了的开源Flutter应用程序以及一些Flutter学习资源】【转载】

Immich是一个用于备份照片或者视频的免费开源应用,服务端采用Next.js框架开发,技术栈包括TensorFlow、PostgreSQL、Redis和Nginx等,前端基于Flutter,支持Android和iOS系统。这也是一个多年前的项目了。这是一个开源的Flutter群组群消息应用程序,包括很多功能,如:多个群组(类似于Slack中的Teams)、群组内的多个开放或私人频道、分享照片和照片集、表情符号消息等。可能模仿是人类的天性,就像婴儿学会说话的过程,他的每一次开口都是在模仿他的父母。

j8267643的博客 1万+

盘点适合入门学习的C/C++开源项目

C 项目名称: C 项目简介: 是的,你没有看错,这个项目的名字就是单个字母C。C是一个宝藏项目,可以说是学习数据结构和刷算法题的利器,因为里面包含了几乎各种基础算法、数据结构、以及LeetCode算法题的C语言实现。具体包括: 客户端/服务器问题 统计方法问题 进制转换问题 各种数据结构:数组、链表、字典、二叉树、堆、栈、队列、哈希、图等等 搜索/查找问题 排序问题 LeetCode习题 其他杂项问题 注意,下图中只是截取了一部分数据结构和算法题的具体实现: 对于我们的作用: 可以帮助我们更好的学习数据

OceanStar的博客 3万+

阅读开源源码的终极指南:从入门到精通

本文系统介绍了阅读开源项目源码的方法论与实践技巧。首先阐述了阅读源码的价值,包括学习最佳实践、深入理解技术原理和提升调试能力等。然后详细讲解了从心理建设、环境准备到具体阅读方法的完整流程,提出"三步阅读法"和"五层分析法"等结构化方法,并推荐了代码搜索、调试和可视化等实用工具。文章以Vue3响应式系统为例进行实战演示,展示了从宏观了解到微观实现的完整分析过程。最后提供了进阶贡献指南和长期学习策略,帮助开发者从源码阅读走向实际贡献。全文强调系统性思维和渐进式学习,为开发

油墨香^-^的博客 632

OpenSource

组织机构 Apache Software Foundation简介:Apache首页。开源软件提供组织,包括众多知名开源项目。如:Ant,Struts,Tomcat等。 Open Source Initiative简介:OpenSource官方网站。 Code Source Forge简介:世界最大开源软件提供站点。包括众多开源代码并对开源软件开发者免费提供服务。 共创软件联盟简介:Source

≡voozoo's Blog≡ 1646

地理坐标系:WGS84和BD09互转

关于坐标系的转换,可以参考如下两个开源项目gcoord和coordtransform GitHub - hujiulong/gcoord: 地理坐标系转换工具https://github.com/hujiulong/gcoordGitHub - wandergis/coordtransform: 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换https://github.com/wandergis/coordtransform我将gcoord中的BD09和W.

一只博客 1万+

09. 开源代码平台-Microi吾码 - 动态打印引擎

💦一款无状态、无侵染、零耦合,可以集成任何平台,可以满足市面基本打印需求的一款插件,来自Microi吾码 开源框架的爱 💕💕

李赛赛的专栏 2022

AD09教程AltiumDesigner09教程资源下载:掌握电子设计利器

AD09教程AltiumDesigner09教程资源下载:掌握电子设计利器 【下载地址】AD09教程AltiumDesigner09教程资源下载 探索电子设计的奥秘,掌握Altium Designer 09的精髓!我们的资源库为您提供了详尽的《AD09教程AltiumDesigner09教程.pdf》,这是一份专为电子设...

gitblog_06709的博客 412

乐玩插件9.09最新版下载说明:开源利器,功能全面解锁

乐玩插件9.09最新版下载说明:开源利器,功能全面解锁 【下载地址】乐玩插件9.09最新版下载说明 乐玩插件9.09最新版是一款功能强大且完全免费的资源,已去除所有限制,实现永久全功能使用。该版本不仅整合了支持库与易模块,还新增了go语言调用例程,提供更快速、更流畅的操作体验。所有功能均可无限制使用,无需担心时间到期验证...

gitblog_06797的博客 1397

Github 2025-06-09 开源项目周报 Top15

根据Github Trendings的统计,本周(2025-06-09统计)共有15个项目上榜。

老孙正经胡说 1307

Github 2024-09-17 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-17统计)共有10个项目上榜。

老孙正经胡说 1619

【亲测免费】 超声波雷达驱动:Elmos524.03 & Elmos524.09 开源项目推荐

超声波雷达驱动:Elmos524.03 & Elmos524.09 开源项目推荐 【下载地址】超声波雷达驱动Elmos524.03Elmos524.09资源下载 本仓库提供超声波雷达驱动(Elmos524.03 & Elmos524.09)的资源文件下载。该驱动适用于特定的超声波雷达模块,能够帮助开发者快速集成和...

gitblog_06656的博客 1441

联邦学习开源框架FATE

FATE (Federated AI Technology Enabler) 是微众银行AI部门发起的全球首个联邦学习工业级开源框架,可以让企业和机构在保护数据安全和数据隐私的前提下进行数据协作。 FATE项目使用多方安全计算 (MPC) 以及同态加密 (HE) 技术构建底层安全计算协议,以此支持不同种类的机器学习的安全计算,包括逻辑回归、基于树的算法、深度学习和迁移学习等。 FATE于2019年2月首次对外开源,并于2019年6月由微众银行捐献给Linux基金会,并成立 FATE TSC 对FATE社.

培根芝士的专栏 1万+

OpenSource-RoadMap-DataScience核心课程解析:数学基础篇(线性代数与微积分必备知识)

OpenSource-RoadMap-DataScience是一个专注于数据科学自学历程的开源项目,提供了从数学基础到高级应用的完整学习路径。本文将深入解析项目中的数学基础核心课程,重点介绍线性代数与微积分在数据科学中的关键作用及学习资源。 ## 为什么数据科学需要扎实的数学基础? 数据科学作为一门交叉学科,融合了统计学、计算机科学和数学。其中,数学基础是构建和理解复杂算法的基石。无论是机器学

gitblog_00014的博客 457

高通android开源代码下载,高通平台开源代码下载

1、进入codeaurora主页,https://www.codeaurora.org/2、选择【Projects】 -> 【Active Projects(Gerrit Repo)】 3、进入https://www.codeaurora.org/project-category/active-projects 4、找到【Android for MSM Project】,点击进入https:...

weixin_42525328的博客 1637
上一篇: 07 | 消息积压了该如何处理?
下一篇: 10 | 如何使用异步设计提升系统性能
vectorX
博客等级 码龄10年 37粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值