工作几年的程序员同学,有了一定的项目经验,对于编程也有了自己的理解,但他们偶尔也会感到困惑,不知道接下来该如何提升自己。

在笔者看来:“这个阶段的程序员最需要的是提升自身编程能力和视野高度,而学习开源项目是最有效的方法之一”。

这篇文章,笔者聊聊自己的学习开源项目的心得,希望对你有所帮助。

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 个理由》这篇文章里,提到了如下五点理由:

  1. 无边界的学习
  2. 专业的交流
  3. 外在的机会
  4. 更深入的理解计算机科学

那么程序员如何参与开源呢 ?参与开源有很多种方式,最常见的有如下几种:

  1. 直接参与开源项目的开发
  2. 参考开源项目的社区比赛
  3. 修复开源项目中的 Bug
  4. 开源项目文档编写
  5. 参与开源项目的测试和 Demo 编写工作
  6. 参与开源项目推广

参与一个开源项目,并与许许多多同样聪明的工程师协作,把脑海中的奇思妙想一一实现,那是多么美好的事情。

5 写到最后

亲爱的程序员朋友,当你不知道选择哪一个开源项目开始学习时,希望你**立足当下,**当前技术团队使用的开源组件,正是你学习的方向

聊聊如何学习开源项目相关推荐

  1. 如何高效地学习开源项目 |“华仔,放学别走”

    你好,我是华仔.今天这期"特别放送",我想和你聊聊如何高效地学习开源项目,一方面澄清开源项目学习过程中的几个误区,另一方面谈谈我自己具体实践时的一套方法论. 得益于开源运动的蓬勃发 ...

  2. 如何高效地学习开源项目

    转载于:https://time.geekbang.org/column/article/10022 你好,我是华仔.今天这期"特别放送",我想和你聊聊如何高效地学习开源项目,一方 ...

  3. 一周焦点 | 李彦宏:如果谷歌回来,有信心再赢一次;GitHub深度学习开源项目Top200...

    ▌业界焦点 瞄准超算皇冠:神威E级超算原型机正式启用 运算速度达每秒百亿亿次的 E 级计算机,被称作"超级计算机界的下一顶皇冠".8 月 5 日,国产超算研制向着这一皇冠又迈进了一 ...

  4. 《开源思索集》一如何更有效地学习开源项目的代码?

    本节书摘来异步社区<开源思索集>一书中的第2章,第2.1节,作者: 庄表伟 责编: 杨海玲, 更多章节内容可以访问云栖社区"异步社区"公众号查看. 如何更有效地学习开源 ...

  5. 如何学习开源项目及Ceph的浅析

    摘要:开源技术的学习和采用确实存在着一定门槛,然而学习各种开源项目已经成为许多开发者不可回避的工作内容.那么,对于类似OpenStack的大型开源项目,开发者该如何着手,这里我们看章宇的分享. [编者 ...

  6. 新手如何在Git Hub上学习开源项目+社交

    文章目录 背景 前提条件 搜索相应主题的开源项目 步骤 从Git Hub上下载项目源码并编译执行 步骤 Fork别人的项目并申请Pull Request 步骤 Git Hub社交 步骤 关于我 背景 ...

  7. 转: 学习开源项目的若干建议(infoq)

    转: http://www.infoq.com/cn/news/2014/04/learn-open-source 学习开源项目的若干建议 作者 崔康 发布于 2014年4月11日 | 注意:GTLC ...

  8. 5.42如何高效的学习开源项目

    date comments categories tags permalink title 2020/4/18 true 软件架构 架构 开源项目 5.42 如何高效学习开源项目 工作当中会经常使用到 ...

  9. 九章云极发布YLearn因果学习开源项目;字节跳动大量招聘芯片工程师;苹果被俄法院罚款约21.6万元 | 每日大事件...

    数据智能产业创新服务媒体 --聚焦数智 · 改变商业 01.九章云极DataCanvas公司开源发布YLearn因果学习开源项目 7月12日,九章云极DataCanvas公司发布YLearn因果学习开 ...

最新文章

  1. v-model无法对返回的数据进行填写_学会数据分析思维,学会透过事物看本质
  2. java拖动组件,[小娱乐] 一个能拖动组件、改变组件大小的容器
  3. LeetCode 799 JavaScript
  4. python linecache模块读取文件用法详解
  5. python haskell 使用对比_性能-为什么这个Haskell程序比等效的Python程序慢得多?
  6. Codeforces - 914F bitset 维护字符串匹配个数
  7. oracle怎么删除lob对象,Oracle系列:LOB大对象处理
  8. UI实用素材模板|天气应用app的ui设计
  9. Beagle 0.2.16(附 Ubuntu Edgy 安顿源)
  10. 翻译|How to Export a Connected Component
  11. android布局及其常用属性
  12. Python题库编程记录
  13. Matplotlib 设置支持中文的默认字体
  14. 见山是山,见山不是山,见山只是山
  15. 模拟多线程并发订单处理功能实现
  16. Python汉英/英汉翻译(百度API/有道API)
  17. Android阅读器——FolioReader
  18. eslint报错Parsing error: Unexpected token prettier/prettier
  19. 我是那个逼走创业合伙人的CEO,我有话说!
  20. 【网络进阶】五种IO网络模型(一)

热门文章

  1. winhex数据恢复linux,使用winhex对已删除文件进行恢复
  2. 系统升级是为了修BUG、补漏洞?但也可能跟你想得完全不一样
  3. 转----没必要参加嵌入式开发培训班
  4. 跨越速运:打破时效边界,以客户为中心优化时效
  5. mysql创建用户、数据库并授权
  6. arduino ide+esp32-cam基于点灯科技blinker实现手机监控
  7. CiteSpace系列——关键词共现图重叠很多怎么办?
  8. MX-Yolov3本地训练模型的安装和使用
  9. 服务器端口8888被占用,如何解决电脑出现服务器8080端口无法访问
  10. 深度学习生成对抗网络(GAN)