丁老师在他的知识星球邀请我回答以下一个问题:

我觉得这个问题非常有意思,姑且把它贴到公众号这里,与大家分享一下我对这个问题的一些感悟。

感谢丁老师的邀请问答:

在这里我就简单说下,我这段时间参与 Seata 开源项目的一些感悟:

1、如何参与到开源项目中并贡献自己的一份力量?

我一直都有上 GitHub 搜索一些主流开源项目的习惯,我是从去年 5 月份从 GitHub 开始关注 Seata 项目的,经过入门上手之后,我就觉得它的设计理念非常棒,尽管当时还有很多地方没有完善,但并不阻碍我对它的赞美,我对它产生了浓厚的兴趣,我那个时候就萌发了我要成为这个项目的贡献者。

很多人说,我又不是大佬,我现在还不够优秀,我没有太多的业余时间和精力,我也不知道这个项目是否合适我,等等,也有人以为需要成为某个领域大牛,才可以参与其中,其实这是对开源最大的误解,开源当然有大牛,不但有,而且非常多,这些大牛很多都是值得你学习的榜样,但是为开源项目做贡献需要成为某个领域大牛并不是必要的,但需要你花费大量时间和精力去贡献,在这个过程中,你同样能够学到很多。

我接下来继续讲讲我是如何参与 Seata 的贡献:

我是先从官方文档开始了解 Seata 项目的,并根据自己的了解,写了一篇文章,同时这篇文章还被阿里巴巴中间件转载过,正如丁老师所说,为开源项目做贡献并不只是贡献代码,为项目写文章同样是一种贡献。

在了解 Seata 的原理之后,我就着手看 Seata 源码,继续深入研究,在这个过程中,我是发现 Seata 源码是有很多地方需要完善的,因此我得到了代码贡献的机会,在看源码的过程中,我参与了某些 bug 的修复,一些功能的开发,同时还对部分代码进行了优化,代码优化这点我特别有感触,因为 Seata 的 RPC 重构主要是由我完成的,由于我之前研究过一些 RocketMQ 的源码,其中就包括 remoting 模块,感觉它的设计思想非常好,于是我就将这个设计思想从 RocketMQ 带到 Seata 中。

我这里在补充一点,很多人看源码的时候,看到某些代码写得不是很优雅,瞬间不想研究下去了,我觉得这点非常不可取,我们在看源码的同时,需要秉承一种 “不拘小节,观其大意” 的精神,因为每个人都有自己的编码风格,如果你觉得写的不好,那么这时候你的机会就来了,这时候提个 PR 优化一波会不会更加爽?而且一个开源项目都有其本身的设计理念,不要为了拘一时小节,而忽略了其整体的架构设计。

在参与开发的过程中,相当于在玩游戏打怪升级,如果你对某个开源项目贡献了自己的代码,那么恭喜你,你成功成为了该项目的贡献者(Contributor),这时候在开源项目的贡献者名单中,就有你的大名啦,你的代码将会随着项目 run everywhere,是不是心中充满了成就感?如果你一直对项目有持续的贡献,那么成为该项目的核心开发(Committer)指日可待。但需要记住一点的是,持续贡献不仅仅只是提交代码,参与 PR Code Review、输出文章、解答用户问题同样是一种贡献。

总之,参与到开源项目中并贡献自己的一份力量并没有想象中的难,难的是你有没有一颗坚持的心,难的是你有没有花心思并付诸行动。

做开源,需要持之以恒。

2、从开源项目中能够学到什么?

从以上的描述中,我花费了那么多时间和精力,我能够从中得到什么?仅仅只是让我的代码 run everywhere?那不免太过于浮躁了。

在这个过程中,你将会和一群优秀的程序员沟通交流,能够将本职工作做好,同时还能把业余时间贡献给开源的人,本身就说明了这个人能力不赖,而且富有激情,至少对编程这件事来说,是充满兴趣的,跟者这些优秀的人在一起做一个有趣的开源项目,你也会慢慢地变得优秀起来。

参与开源项目会形成给予你一种学习驱动力,比方说我在重构 Seata RPC 模块时,驱动我去学习 Netty 相关知识,在写配置同步脚本时,驱动我去学习写脚本(我真的是边学边写 Seata 配置同步脚本的),在研究 Seata 配置中心实现原理时,驱动我去研究 Seata SPI 机制,并且要了解各个配置中心框架的特性等等,人性往往是懒惰的,如果你为了学而去学,很多时候你会半途而废,很多时候你做着某件事半途而废,往往就是因为没有外界驱动力,去驱动你去坚持。学过物理的都知道,世上没有永动机,外界驱动力就是你坚持下去的动力源泉。

同时,你在研究源码或者进行 PR CodeReview 时,可以看到很多大牛的编程思想,这也是你最宝贵的经验源泉,比如 Seata RPC 模块的 Processor 处理器设计思想就是我从 RocketMQ 源码中参透而来。如果你想摆脱日常 CRUD,想增进自己的编码水平,来开源做点贡献吧!

开源项目中的大牛很多,参与开源会使自己变得更加谦卑,还会让自己的思维变得更开阔,不会局限于自我。

以上就是我暂时想到的从开源项目中能够学到的一些东西以及感悟。

PS:怕后台有很多人问起怎么进入丁老师知识星球,我在这里提前说下,公号回复「星球」即获取进入星球二维码,一起交流源码,探讨架构,打造高质量的技术交流圈。

PSS:Seata 社区欢迎你,和一群优秀的人做一件有趣的事!

相关阅读:

分布式事务中间件Seata的设计原理

作者简介

作者张乘辉,擅长消息中间件技能,负责公司百万 TPS 级别 Kafka 集群的维护,作者维护的公号「后端进阶」不定期分享 Kafka、RocketMQ 系列不讲概念直接真刀真枪的实战总结以及细节上的源码分析;同时作者也是阿里开源分布式事务框架 Seata Contributor,因此也会分享关于 Seata 的相关知识;当然公号也会分享 WEB 相关知识比如 Spring 全家桶等。内容不一定面面俱到,但一定让你感受到作者对于技术的追求是认真的!

公众号:后端进阶

技术博客:https://objcoding.com/

GitHub:https://github.com/objcoding/

我参与 Seata 开源项目的一些感悟的更多相关文章

  1. 如何参与flink开源项目

    参与flink开源项目 https://flink.apache.org/how-to-contribute.html 1.回答社区问题 2.撰写bug报告 3.对于改进建议或新的特征 4.帮助别人并 ...

  2. 使用github参与到开源项目的维护

    参与到开源项目的维护工作一般分两种,一种是由项目建立者拉入到贡献者列表中,拥有对项目的读写权限,而普通用户对项目仅有读取权限,另一种是fork项目到自己仓库,然后把修改后的内容发送给项目管理者者请求合 ...

  3. 怎样在Github参与一个开源项目

    转载:http://www.csdn.net/article/2014-04-14/2819293-Contributing-to-Open-Source-on-GitHub 最近一年开源项目特别的热 ...

  4. 参与.net开源项目开发

    EntityFramework6 https://github.com/aspnet/EntityFramework6 https://github.com/aspnet/EntityFramewor ...

  5. 关于如何参与到开源项目中《How To Succeed In Open Source ( In Ways You Haven't Considered Yet )》

    转自:http://gaslight.co/blog/how-to-succeed-in-open-source-in-ways-you-havent-considered-yet It’s Easy ...

  6. 参与github上开源项目的大致流程和注意事项

    Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源 ...

  7. 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐

    ​ 写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...

  8. .NET开发人员值得关注的七个开源项目 .

    NET开发人员值得关注的七个开源项目 软近几年在.NET社区开源项目方面投入了相当多的时间和资源,不禁让原本对峙的开源社区阵营大吃一惊,从微软.NET社区中的反应来看,微软.NET开发阵营对开源工具的 ...

  9. .net 开源项目

    .NET开发人员值得关注的七个开源项目 [IT168技术分析]微软近几年在.NET社区开源项目方面投入了相当多的时间和资源,不禁让原本对峙的开源社区阵营大吃一惊,从微软.NET社区中的反应来看,微软. ...

随机推荐

  1. react: typescript integrate withRouter

    define interface: export interface INav { nav: string } export interface IModuleItem { state?: strin ...

  2. java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

    什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...

  3. Java 排序算法-冒泡排序及其优化

    Java 排序算法-冒泡排序及其优化 什么是冒泡排序 基本写法 优化后写法 终极版本 源码及测试 什么是冒泡排序 这里引用一下百度百科上的定义: 冒泡排序(Bubble Sort),是一种计算机科学领 ...

  4. Hadoop的下载和安装

    Hadoop的下载和安装 一:Hadoop的简介 Apache的Hadoop是一个开源的.可靠的.可扩展的系统架构,可利用分布式架构来存储海量数据,以及实现分布式的计算. Hadoop许使用简单的编程 ...

  5. ThinkPHP3.2自定义配置和加载

    有时候我们会有一些规则定义每个数字对应的实际内容,比如说在下拉菜单的时候: <select name="reasonAndType" id=""> ...

  6. 2019-2020-1 20199325《Linux内核原理与分析》第八周作业

    Linux内核如何装载和启动一个可执行程序 1.理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节:​ 2.编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链 ...

  7. opencv-4-成像系统与Mat图像颜色空间

    opencv-4-成像系统与Mat图像颜色空间 opencvc++qtmat 目标 知道 opencv 处理图像数据的格式 介绍 mat 基础内容 知道 BGR 颜色 显示 颜色转换 BGR 到 灰度 ...

  8. 面试题总结-Java部分

    1 集合 1.1 hashmap原理 HashMap是基于哈希表实现的,每一个元素是一个key-value对,实现了Serializable.Cloneable接口,允许使用null值和null键.不 ...

  9. windows右键没有新建选项的解决办法

    1 以管理员身份运行cmd 2 cmd /k reg add "HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandl ...

  10. R 语言命令行参数处理

    在unix.windows外部需要调用R脚本执行,然后又需要输入不同的参数,类似shell脚本的命令行参数输入,可以使用Rcript命令实现. 命令格式:Rscript [options] [-e e ...