开源项目学习方法-如何快速学习开源
更新时间:2024-07-24 13:11:01
学习开源项目可以帮助你提高技术能力、了解实际开发流程,并可能为你的职业生涯带来好处。以下是一些学习方法。
开源项目学习方法
1 学会使用
首先,我们需要学习如何使用开源项目。
Github 是全球最大的在线软件源代码托管服务平台,很多开源项目都托管在他上面。
在 GIthub 下载源码后,需要重点关注类似 Quick Start,Getting started ,Example 之类的文档,这些文档告诉初学者如何使用项目。
假如项目需要部署,参考项目文档,在独立的环境中,尝试从零开始,动手部署该项目。
某些项目也会提供完善的 example 工程·,里面有现成的例子,可以尝试按照文档介绍运行入门例子。
如果入门例子运行顺利 ,对于项目初学者来讲是一个很好的开始。若运行中出现异常,也不必慌张,寻找项目中 FAQ 文档,或者搜索出现问题的关键字(比如异常信息),查询相关的解决方案。
成功运行了项目中第一个基础例子之后,可以尝试运行更复杂的功能例子。
笔者建议单独创建一个工程,一个一个功能例子完善整个项目。当这个项目越来越充盈,也就证明你掌握得越多。在学习过程中,将学习的心得记录在笔记中,便于后续回溯。
2 阅读源码
阅读源码是深入理解开源项目最重要的一步。
阅读源码之前,尝试从源码构建该项目。通常开源项目都会提供一份构建指南,指导你如何搭建一个用于开发、调试和构建的环境。构建成功后,尝试运行该项目。
查看该项目的架构设计文档,梳理出整个项目的骨架,可以画流程图或者 UML 图,加深对项目的理解。
当我们了解到整个项目的骨架后,可以挑选感兴趣的模块来阅读,比如你对网络通讯感兴趣,就阅读网络层的代码,深入到实现细节,如它用了什么库,采用了什么设计模式,为什么这样做等。如果可以,DEBUG 细节代码。
阅读源码的时候,重视单元测试,尝试去运行单元测试,基本上一个好的单元测试会将该代码的功能和边界描述清楚。
笔者体系化的阅读源码是在2014年。彼时,RocketMQ 3.0 刚开源不久,笔者对消息队列极其感兴趣,同时也迫切想了解网络编程框架 Netty 到底是如何使用的。
于是,先从 RocketMQ 网络通讯模块 remoting 开始学习,因为源码中有完善的测试用例,先运行单元测试,学习网络编码模型。
在学习网络编程的过程中,笔者有两点思维突破:
▍一、客户端的编程模型
RocketMQ 客户端网络通讯有如下三种方式:
oneway : 单向发送
sync :同步调用
callback :异步回调
很多技术的思想是相通的,下图是蚂蚁开源的通讯组件 sofa-bolt 支持的调用类型。
蚂蚁通讯框架Bolt调用类型
▍二、服务端处理器模式
RocketMQ 服务端通讯使用经典的 Reactor 模式 ,服务端注册不同的业务处理器,而各个业务处理器可以绑定不同的线程池。
void registerProcessor(
final int requestCode,
final NettyRequestProcessor processor,
final ExecutorService executor);
学完网络框架 Remoting 之后,然后结合 Broker 模块,学习 RocketMQ 存储模型,通过这种方式就可以对 RocketMQ 有了一个相对清晰的认识。
3 知行合一
笔者大学刚毕业的时候,读李开复老师的书,书中有一句话,我印象深刻: “I Hear and I Forget, I See and I Remember, I Do and I Understand ” 。
中国古代哲学家荀子也说过:"不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之;学至于行之而止矣"。
学习源码的过程中,将知识点夯实的关键要诀是动手实践,并保证实践之后有输出产物,也就是知行合一。
笔者总结了两点经验,供大家参考。
▍一、源码中的知识点应用到项目中
开源项目中有非常多的优秀实践 ,可以将代码中的编码技巧,设计思想,优秀源码引进到业务项目里。
2014年,艺龙的优惠券计算服务遇到性能瓶颈,笔者负责重构这个系统。 在阅读 RocketMQ 源码后,学习到了线程池使用精髓:线程池隔离,各司其职 。
于是,笔者先梳理出业务场景,根据任务类型,绑定不同的线程池,为了便于扩展同时对外暴露并发度的配置参数。在重构这个系统的过程中,还引入 RocketMQ 创建线程工具类代码 。
重构之后,不仅系统的性能提升了5倍,而且笔者的自信心也大大提升,对技术的理解也更加深刻。
▍ 二、造轮子
当我们学习了一个开源项目,我们可以参考开源源码仿写一个。仿写的过程就是查漏补缺的过程,也能完善自己的知识体系。
2016年,sharding-jdbc 开源了,下图是当时 sharding-jdbc 的架构设计图:
笔者当时对分库分表着迷,同时脑海里有很多疑问,比如如何封装 jdbc 的接口,如何实现 SQL 解析 ,如何将多个分片的结果聚合等。
于是,笔者参考 sharding-jdbc 的源码,仿写了一个分库分表组件。
经过这次仿写,笔者深入实践了 client 模式分库分表的原理,并积累了自己的技术储备。
4 参与开源
“开源理念之一就是非常鼓励不同的人一起合作”。——Linux 之父 Linus Torvalds 2016 年 2 月 TED 演讲《The mind behind Linux (opens new window)》
在《教授鼓励学生参与开源项目的 5 个理由》这篇文章里,提到了如下五点理由:
无边界的学习
专业的交流
外在的机会
更深入的理解计算机科学
玩
那么程序员如何参与开源呢 ?参与开源有很多种方式,最常见的有如下几种:
直接参与开源项目的开发
参考开源项目的社区比赛
修复开源项目中的 Bug
开源项目文档编写
参与开源项目的测试和 Demo 编写工作
参与开源项目推广
参与一个开源项目,并与许许多多同样聪明的工程师协作,把脑海中的奇思妙想一一实现,那是多么美好的事情。
5 写到最后
当你不知道选择哪一个开源项目开始学习时,希望你立足当下,行动起来。当前技术团队使用的开源组件,正是你学习的方向。
行动起来,你会变成更好的自己,加油。
-
华为手环9终于在国内和各位观众老爷见面了,相信不少的小伙伴都迫不及待的换新呢。那么它和曾经的“小弟”荣耀旗下的荣耀手环9相比哪个好呢?
2024-06-18 10:08:26 -
kk平台中不能初始化opengl,可以优先检查设置,这里要将其给勾选上,之后就是更新驱动,然后确保显卡连接没有问题,最后再尝试下载一个DirectX工具修复一下就好。
2024-07-09 16:03:32 -
爱奇艺作为中国领先的视频播放平台,提供了多种会员服务,以满足不同用户的需求。这些会员服务不仅包括不同级别的观看权限,还包括对于登录设备数量的限制。以下是针对爱奇艺基础会员登录设备的详细分析。
2024-07-24 10:26:46 -
在搭载骁龙8 Gen 3芯片旗舰手机越来越多的当下,三星S24系列姗姗来迟。那么他比上一代S23系列有什么区别呢?接下来,HEX数码就为大家带来三星S24+和S23+的详细对比。
2024-06-19 09:49:09 -
Wallpaper Engine 是Steam平台上的一款桌面壁纸引擎软件,它允许用户在桌面上使用动态壁纸,从而大大提高桌面的美观性和个性化。要找到丰富的Wallpaper Engine资源,可以通过以下方法。
2024-07-04 16:25:01 -
对于想要在更大的屏幕上享受内容的用户体验,将今日头条投屏到电视上是一个理想的选择。如果你还不清楚如何进行投屏操作,不必担心,接下来的内容将为你详细介绍如何在电视上观看今日头条的步骤。
2024-07-12 13:53:23