给开源项目尤其是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. SpringMvc怎么和AJAX相互调用的?

    通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象.具体步骤如下 : (1)加入Jackson.jar (2)在配置文件中配置json的映射 (3)在接受Ajax方法 ...

  2. PCB设计常见规则及基本原则

    一.PCB基础知识 1.全称:印制电路板或者印制线路板 2.分类 材质分类:硬板(Rigid PCB).软板FPC(Flexible PCB).软硬结合板(Rigid-Flex PCB).HDI板(含 ...

  3. Flutter入门教程(四)第一个flutter项目解析

    一.创建一个Flutter工程 1.1 命令行创建 首先我们找一个空目录用来专门存放flutter项目,然后在路径中直接输入cmd: 使用 flutter create <projectname ...

  4. Canvas 核心技术

    最近项目需求中要写较多H5小游戏,游戏本身体量不是很复杂,主要是承载较多业务逻辑,所以决定用canvas来完成游戏部分.之前只是知道H5中有canvas这个东西,也知道它大概是画图的,但具体怎么用,还 ...

  5. PAT B1056组合数的和

    给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 2 位数字的和.例如给定 2.5.8,则可以组合出:25.28.52.58.82.85 ...

  6. Jar 包下载以及 maven jar 包配置

    学习内容: jar包下载是我们必须掌握的一个内容,不管是使用Maven项目还是其他项目,一般都需要引入外部的 jar 包 jar包下载 下载地址(打不开网址的直接百度搜索 maven reposito ...

  7. Idea导出jar包和使用自定义API

    自定义jar简单实现案例 学习内容 1. 自定义工具类 2. 导出jar 3. 加载Jar包 4. 调用自定义的API方法 总结 学习内容 1. 自定义工具类 新建一个java项目,然后创建包和工具类 ...

  8. 微信小程序animation动画2种方法

    这里介绍 2 种方法一种是常规的小程序方法操作,另一种是引入动画库 1. 常规动画操作设置 wxml: <view> <view bindtap="clickMe" ...

  9. 谈谈Spring中都用到了哪些设计模式?

    谈谈Spring中都用到了哪些设计模式? JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是 ...

  10. js判断json数据是否存在某字段的方法

    方式一 !("key" in obj) if("name" in json){//json就是数组,name是你要找的值 console.log("有 ...