给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的。有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅。

我曾经给Spring Security提交了一个我认为非常重要的一项优化,和作者沟通了几十个来回无法说服他。人家说留了抽象接口,你觉得不对自己实现一个就是了,默认的就是能用而已,无奈我就放弃了这个PR

想不到在Spring Authorization Server中我抓住了一个能够绝对被接受的机会,经过一个多月的等待,最终我的PR被接受了。

我在编写Spring Authorization Server相关教程中,调用授权服务器元信息端点时不小心后面带了个锚点符号#,类似http://issuer.felord.cn/#,报了一个请求错误,在追踪源码的时候我发现对这个url是进行过校验的,出现了这种非预期的结果说明规则一定有漏洞。于是我查阅了相关RFC的定义,找到了依据RFC8414

这个规范的实现没有什么技术含量,我如果告诉你,你也能做得到,甚至做得比我好,所以只要实现了,PR被接受应该是跑不了的事情,甚至可以半场开香槟。在0.3.0版本中这个优化将会实装。对这个过程,我简单总结了一下分享出来 ,或许对希望参与开源贡献的你有所帮助。

代码风格

首先是代码风格,开源项目都有一些代码风格要求,我之前有很多东西模仿(抄)了Spring的设计,所以我在实现规范的时候特别注意了这一点,命名风格、缩进等等都反复推敲。

理解项目的架构思想

在整个PR过程中,我出现的问题主要在这里。虽然我最初的实现执行起来没有问题,完全在生命周期之内,但是显然它的位置不是最佳。比如参数的校验你可以写在控制层,也可以写在服务层,结果一定是没问题的,但是过程可能有问题。作者和我沟通了一番,表明了他的设计思路,很快我就纠正了这个问题。

单元测试非常重要

实现代码确实不多,单元测试的代码几乎超过了其20倍。我们平时写个main方法简单sout打印一下就完事了,对于开源项目可不一样。尤其是这种知名开源框架,需要你测试实现的方方面面。如果你想为开源项目贡献代码,常用的断言、Mock插桩都要会,这个胖哥的博客felord.cn都有相关的介绍。

Git规范

Git 提交规范胖哥也多次强调了它的重要性,在大型开源项目中遵循一些提交规范也是一个基本要求。一些Pull Request的规则、代码Review流程也要熟悉,这些功夫都在于平时。Git你得熟练。Spring要求最小功能提交,怎么说呢?你的实现必须是一个最小粒度的完整单元,你不能在一个提交中既有增强优化(enhance)还有新特性(feature)。而且你的提交必须压缩到一个git commit内,即使被打回去修改。要多用

git commit --amend -m '你的提交信息'

在一些不得已的时候,git rebasesquash commits或许能帮到你。

但是千万不要去搞什么Git原理底层,把工具用熟练就够了。

要善于发现,敢做敢为

最重要的一点,你要善于发现,比如下面这个bug(现在还没有彻底修复),如果我说它是个bug,你一定会大吃一惊,我当时也是一样的。


public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
if (!filters.isEmpty()) {
logger.info(LogMessage.format("Will not secure %s", requestMatcher));
}
else {
logger.info(LogMessage.format("Will secure %s with %s", requestMatcher, filters));
}
this.requestMatcher = requestMatcher;
this.filters = new ArrayList<>(filters);
}

3.1版本log逻辑居然错到5.6版本!而修复它只需要改下位置,这个bug我妈应该也会改。但是没有人发现和质疑它,直到最近有人提交了修复(5.7版本会修复这个bug)。

所以你要善于发现一些问题和细节,同时也要敢于质疑,即使质疑错了又不会损失什么。

要有专长

我和大家一样,平常也是什么都学,没办法!做原创技术博主太容易内容焦虑了。但是我刻意保证了一些东西去深入学习,有些东西必须成为你的独门绝技,要一精多专,这样你在专长的领域可能有更多的机会。

TODO

对于成为开源贡献者只是一个开始,更多的挑战还在后面。有人问我最近为什么更文少了!这里也讲一下我最近在做的事。

首先,因为疫情我被隔离在家办公了。

其次,还有几个开源贡献正在进行中。

还有,我正在做一个基于Spring Authorization Server的开源项目Id Server,你可以认为是一个极简版的keycloak,甚至最初的功能比较简陋,layui都是先学的,界面我也做不好。放个截图吧。

做这个东西很有挑战,前端真是太难了!目前已经初具雏形,不日将放出预览版,也欢迎各位同学参与贡献。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

经过一个多月的等待我有幸成为Spring相关项目的Contributor的更多相关文章

  1. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  2. 09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider

    1.  编写ContentPrivider提供者的Android应用 清单文件 <?xml version="1.0" encoding="utf-8"? ...

  3. 使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)

    使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development.production) --mode 指定环境模式 ...

  4. Oracle中的自连接(self join)-当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自连接。

    http://blog.163.com/wkyuyang_001/blog/static/10802122820091751049479/ 当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自 ...

  5. 一个电商项目的Web服务化改造

    一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...

  6. SAP MM 一个含有多个账号分配对象的行项目的PO及其收货

    SAP MM 一个含有多个账号分配对象的行项目的PO及其收货 如下的采购订单,一个行项目数量为8PC,分别对应8个固定资产号, 在该ITEM的科目分配里,按数量做了拆分,每个数量对应一个固定资产号.如 ...

  7. Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现

    在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.

  8. 封闭的一个多月,老菜鸟的 机械手和AGV 自动搬运小项目总结

    最近上海疫情严重,闲赋在家无事可做,手机里不断的推送一些无脑的谩骂声音,索性找点事情做,将3月份实施的一个自动搬运小项目做一个简单的汇总,便于今后项目实施中积累一些经验.项目需求非常简单,因为能力有限 ...

  9. C#中判断一个数组中是否存在某个数组值 及相关

    声明:reference:http://www.cnblogs.com/icebutterfly/archive/2010/06/22/1762738.html:http://blog.csdn.ne ...

随机推荐

  1. 构造器注入和 setter 依赖注入,那种方式更好?

    每种方式都有它的缺点和优点.构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖.如果使用 XML 来描述依赖, Setter 注入的可读写会更强.经验法则是强制 ...

  2. Java根路径设置(在获取本地路径时会获取到这个文件夹,,这样就可以专门放配置文件了)

    在获取本地路径时会获取到这个文件夹,,这样就可以专门放配置文件了

  3. 如何解决Visual Studio 2017 运行后控制台窗口一闪就消失了

    出现这种情况的原因 安装使用Visual Studio 2017 后,用Ctrl+F5运行程序,结果控制台窗口一闪就没了,也没有出现"press any key to continue-&q ...

  4. 学习笔记 - Sass的安装与使用手册

    最近因为工作需要,自学了Sass.现在将学习笔记整理在这里,供大家参考. 1. Sass的安装 Sass的编辑器安装方法有很多,大致能分为两种:应用程序(application)和命令行界面(comm ...

  5. JS+CSS实现数字滚动

    最近在实现一个显示RGB颜色数值的动画效果时,尝试使用了writing-mode(书写模式)及 text-orientation来实现文字的竖直方向的排列,并借助CSS的transition(过渡)来 ...

  6. Android 遮罩层效果--制作圆形头像

    (用别人的代码进行分析) 不知道在开发中有没有经常使用到这种效果,所谓的遮罩层就是给一张图片不是我们想要的形状,这个时候我们就可以使用遮罩效果把这个图片变成我们想要的形状,一般使用最多就是圆形的效果, ...

  7. [ Skill ] map mapc mapcan mapcar mapcon maplist mapinto

    https://www.cnblogs.com/yeungchie/ 几种 map 函数的差异 map map( lambda(( a b ) println( list( a b )) ) list ...

  8. SpringBoot内外部配置文件加载和优先级

    直接附链接:https://www.pianshen.com/article/28711537583/

  9. Go xmas2020 学习笔记 09、Closures

    09-Closures.闭包是一种函数,调用具有来自函数外部的附加数据.闭包内的额外数据是引用封闭的

  10. 一致性Hash的原理与实现

    应用场景 在了解一致性Hash之前,我们先了解一下一致性Hash适用于什么场景,能解决什么问题?这里先放一下我自己认为适用的场景.一致性Hash适用于服务器动态扩展且需要负载均衡的场景 试想以下场景, ...