經過一個多月的等待我有幸成為Spring相關專案的Contributor

語言: CN / TW / HK

給開源專案尤其是 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