胖哥成为Spring官方项目的Contributor
给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的。有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅。
我曾经给Spring Security提交了一个我认为非常重要的一项优化,和作者沟通了几十个来回无法说服他。人家说留了抽象接口,你觉得不对自己实现一个就是了,默认的就是能用而已。于是我就放弃了这个PR。
在Spring Authorization Server中我抓住了一个能够绝对被接受的机会,我在编写Spring Authorization Server教程中,调用授权服务器元信息端点时不小心后面带了个锚点符号#
,类似http://issuer.felord.cn/#
。在客户端启动的时候请求授权服务器会报了一个请求错误,在追踪源码的时候我发现对授权服务器issuer
实际上是进行校验的,那么规则一定有漏洞,于是我查阅了相关RFC的定义,找到了不完善的依据RFC8414,所以这次只要实现了,PR被接受应该是跑不了的事情,甚至可以半场开香槟。这个规范的实现没有什么技术含量,我如果告诉你,你也能做得到,甚至做得比我好。
那么难点在哪里?
代码风格
首先是代码风格,开源项目都有一些代码风格要求,我之前有很多东西模仿(抄)了Spring的设计,所以我在实现规范的时候特别注意了这一点,命名风格、缩进等等都反复推敲。
理解项目的架构思想
在整个PR过程中,我出现的问题主要在这里。虽然我最初的实现执行起来没有问题,完全在生命周期之内,但是显然它的位置不是最佳。比如参数的校验你可以写在控制层,也可以写在服务层,结果一定是没问题的,但是过程可能有问题。作者和我沟通了一番,表明了他的设计思路,很快我就纠正了这个问题。
单元测试非常重要
实现代码确实不多,单元测试的代码几乎超过了其20倍。我们平时写个main
方法简单sout
打印一下就完事了,对于开源项目可不一样。尤其是这种知名开源框架,需要你测试实现的方方面面。如果你想为开源项目贡献代码,常用的断言、Mock插桩都要会,这个胖哥的博客felord.cn都有相关的介绍。
Git规范
Git 提交规范胖哥也多次强调了它的重要性,在大型开源项目中遵循一些提交规范也是一个基本要求。Spring要求最小功能提交,怎么说呢?你的实现必须是一个最小粒度的完整单元,你不能在一个提交中既有增强优化(enchance)还有新特性(feature)。而且你的提交必须压缩到一个git commit内,即使被打回去修改。要多用
git commit --amend -m '你的提交信息'
在一些不得已的时候,git rebase
和squash commits或许能帮到你。
要善于发现,敢做敢为
最重要的一点,你要善于发现,比如下面这个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,甚至最初的功能比较简陋。放个截图吧。
做这个东西很有挑战,前端真是太难了!目前已经初具雏形,不日将放出预览版。
评论系统未开启,无法评论!