給開源項(xiàng)目尤其是Spring這種知名度高的項(xiàng)目貢獻(xiàn)代碼是比較難的应媚,起碼胖哥是這么認(rèn)為的。有些時(shí)候我們的靈感未必契合作者的設(shè)計(jì)意圖横浑,即使你的代碼十分優(yōu)雅萌腿。
我曾經(jīng)給Spring Security提交了一個(gè)我認(rèn)為非常重要的一項(xiàng)優(yōu)化,和作者溝通了幾十個(gè)來回?zé)o法說服他讥珍。人家說留了抽象接口历极,你覺得不對自己實(shí)現(xiàn)一個(gè)就是了,默認(rèn)的就是能用而已衷佃,無奈我就放棄了這個(gè)PR趟卸。
想不到在Spring Authorization Server中我抓住了一個(gè)能夠絕對被接受的機(jī)會(huì),經(jīng)過一個(gè)多月的等待氏义,最終我的PR被接受了锄列。
我在編寫Spring Authorization Server相關(guān)教程中,調(diào)用授權(quán)服務(wù)器元信息端點(diǎn)時(shí)不小心后面帶了個(gè)錨點(diǎn)符號(hào)#
惯悠,類似http://issuer.felord.cn/#
邻邮,報(bào)了一個(gè)請求錯(cuò)誤,在追蹤源碼的時(shí)候我發(fā)現(xiàn)對這個(gè)url是進(jìn)行過校驗(yàn)的克婶,出現(xiàn)了這種非預(yù)期的結(jié)果說明規(guī)則一定有漏洞饶囚。于是我查閱了相關(guān)RFC的定義帕翻,找到了依據(jù)RFC8414。
這個(gè)規(guī)范的實(shí)現(xiàn)沒有什么技術(shù)含量萝风,我如果告訴你嘀掸,你也能做得到,甚至做得比我好规惰,所以只要實(shí)現(xiàn)了睬塌,PR被接受應(yīng)該是跑不了的事情,甚至可以半場開香檳歇万。在0.3.0版本中這個(gè)優(yōu)化將會(huì)實(shí)裝揩晴。對這個(gè)過程,我簡單總結(jié)了一下分享出來 贪磺,或許對希望參與開源貢獻(xiàn)的你有所幫助硫兰。
代碼風(fēng)格
首先是代碼風(fēng)格,開源項(xiàng)目都有一些代碼風(fēng)格要求寒锚,我之前有很多東西模仿(抄)了Spring的設(shè)計(jì)劫映,所以我在實(shí)現(xiàn)規(guī)范的時(shí)候特別注意了這一點(diǎn),命名風(fēng)格刹前、縮進(jìn)等等都反復(fù)推敲泳赋。
理解項(xiàng)目的架構(gòu)思想
在整個(gè)PR過程中,我出現(xiàn)的問題主要在這里喇喉。雖然我最初的實(shí)現(xiàn)執(zhí)行起來沒有問題祖今,完全在生命周期之內(nèi),但是顯然它的位置不是最佳拣技。比如參數(shù)的校驗(yàn)?zāi)憧梢詫懺诳刂茖忧埽部梢詫懺诜?wù)層,結(jié)果一定是沒問題的膏斤,但是過程可能有問題大渤。作者和我溝通了一番,表明了他的設(shè)計(jì)思路掸绞,很快我就糾正了這個(gè)問題泵三。
單元測試非常重要
實(shí)現(xiàn)代碼確實(shí)不多,單元測試的代碼幾乎超過了其20倍衔掸。我們平時(shí)寫個(gè)main
方法簡單sout
打印一下就完事了烫幕,對于開源項(xiàng)目可不一樣。尤其是這種知名開源框架敞映,需要你測試實(shí)現(xiàn)的方方面面较曼。如果你想為開源項(xiàng)目貢獻(xiàn)代碼,常用的斷言振愿、Mock插樁都要會(huì)捷犹,這個(gè)胖哥的博客felord.cn都有相關(guān)的介紹弛饭。
Git規(guī)范
Git 提交規(guī)范胖哥也多次強(qiáng)調(diào)了它的重要性,在大型開源項(xiàng)目中遵循一些提交規(guī)范也是一個(gè)基本要求萍歉。一些Pull Request的規(guī)則侣颂、代碼Review流程也要熟悉,這些功夫都在于平時(shí)枪孩。Git你得熟練憔晒。Spring要求最小功能提交,怎么說呢蔑舞?你的實(shí)現(xiàn)必須是一個(gè)最小粒度的完整單元拒担,你不能在一個(gè)提交中既有增強(qiáng)優(yōu)化(enhance)還有新特性(feature)。而且你的提交必須壓縮到一個(gè)git commit內(nèi)攻询,即使被打回去修改从撼。要多用
git commit --amend -m '你的提交信息'
在一些不得已的時(shí)候,git rebase
和squash commits或許能幫到你钧栖。
但是千萬不要去搞什么Git原理底層低零,把工具用熟練就夠了。
要善于發(fā)現(xiàn)桐经,敢做敢為
最重要的一點(diǎn),你要善于發(fā)現(xiàn)浙滤,比如下面這個(gè)bug(現(xiàn)在還沒有徹底修復(fù))阴挣,如果我說它是個(gè)bug,你一定會(huì)大吃一驚纺腊,我當(dāng)時(shí)也是一樣的畔咧。
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邏輯居然錯(cuò)到5.6版本!而修復(fù)它只需要改下位置揖膜,這個(gè)bug我媽應(yīng)該也會(huì)改誓沸。但是沒有人發(fā)現(xiàn)和質(zhì)疑它,直到最近有人提交了修復(fù)(5.7版本會(huì)修復(fù)這個(gè)bug)壹粟。
所以你要善于發(fā)現(xiàn)一些問題和細(xì)節(jié)拜隧,同時(shí)也要敢于質(zhì)疑,即使質(zhì)疑錯(cuò)了又不會(huì)損失什么趁仙。
要有專長
我和大家一樣洪添,平常也是什么都學(xué),沒辦法雀费!做原創(chuàng)技術(shù)博主太容易內(nèi)容焦慮了干奢。但是我刻意保證了一些東西去深入學(xué)習(xí),有些東西必須成為你的獨(dú)門絕技盏袄,要一精多專忿峻,這樣你在專長的領(lǐng)域可能有更多的機(jī)會(huì)薄啥。
TODO
對于成為開源貢獻(xiàn)者只是一個(gè)開始,更多的挑戰(zhàn)還在后面逛尚。有人問我最近為什么更文少了垄惧!這里也講一下我最近在做的事。
首先黑低,因?yàn)橐咔槲冶桓綦x在家辦公了赘艳。
其次,還有幾個(gè)開源貢獻(xiàn)正在進(jìn)行中克握。
還有蕾管,我正在做一個(gè)基于Spring Authorization Server的開源項(xiàng)目Id Server,你可以認(rèn)為是一個(gè)極簡版的keycloak菩暗,甚至最初的功能比較簡陋掰曾,layui都是先學(xué)的,界面我也做不好停团。放個(gè)截圖吧旷坦。
做這個(gè)東西很有挑戰(zhàn),前端真是太難了佑稠!目前已經(jīng)初具雛形秒梅,不日將放出預(yù)覽版,也歡迎各位同學(xué)參與貢獻(xiàn)舌胶。
關(guān)注公眾號(hào):碼農(nóng)小胖哥捆蜀,獲取更多資訊