集團編碼規約P3C項目Ali-IDE規約插件開源心得
大家好,我是研發效能事業部-天基-應用和基礎運維平台的駿烈,集團編碼規約P3C項目IDE插件主要開發者,家有一隻小邊牧,叫駿骨。

10月14號,雲棲大會研發效能專場,《阿裏巴巴Java開發手冊》IDE插件(包括PMD規則實現庫)正式對外開源,並且迅速占領Github開源熱度周排行榜第一的位置,作為項目組的一員,看到業界對該項目的關注及認可,發自內心的高興。高興之餘,分享一下在整個過程中的一些心得體會。

如果把每個人當成是一個分支,那麼從我個人的分支視角而言,P3C經曆了規則實現、IDEA集成、Eclipse集成、開源準備等幾個曆程。其他分支如Aone實驗室集成、Code Review集成等就不過多描述了。
PMD規則實現
經過幾次的討論、調研,項目組決定在一期實現並發、注釋、命名、OOP、集合等方麵的41條規則,並且選用PMD作為主要實現框架(CheckStyle主要解決代碼風格的問題;而Findbugs需要事先編譯工程,不太友好;PMD已經有很多通用的規則實現,某些規則我們改改就可以用或者是直接使用)。PMD原生不支持跨文件掃描,所以一些特殊的需要跨文件掃描的規則需要基於IDE、Sonar各自平台的能力去實現(如:所有的覆寫方法,必須加@Override注解)。
在實現規則的時候始終遵循一個原則:對於錯誤,另可少報也不誤報,誤報很有可能會讓開發同學產生陰影,並從此不再信任;雖然不能100%的消除誤報,但一定要盡最大努力去往靠近這個目標。
IDE插件集成
IDEA
規則陸續實現,我也開始準備IDE插件的開發工作,由於集團內部大部分人使用的都是IDEA,所以就先實現IDEA的插件吧。
我們的規則基本是基於PMD實現的,那麼是不是該基於IDEA的PMD插件去做集成呢?一開始我也是這麼想的,但是卻發現PMD插件好像不漂亮,基於這個去集成會有人用嗎?如果是我自己,我會喜歡嗎?答案是否定的!如果我自己都不喜歡的產品,幹嘛還要去做。
經過多方搜索、調研,我選擇了基於IDEA的Inspection機製來提供實時檢測功能;同時基於PMD實現的每一條規則需要單獨成為一個Inspection,這樣才方便用戶對規則的進行靈活配置;最後需要提供對文件、目錄、工程的掃描機製,並且要有靈活美觀的結果展示界麵,處於這樣的考慮我決定基於Running Inspection by Name 的功能來實現,他不僅能夠指定需要執行的Inspection(規則),還有一個現成的界麵供我使用,我可不認為我在UI方麵的感覺會比Jetbrains的設計師們強。
看到這裏,大家是不是一陣噓聲,我靠,原來這個牛逼的界麵不是你實現的啊!怪我咯,隻能怪你們對IDEA不夠了解,哈哈哈。不過,雖然看似簡單,但是真正在集成的時候會遇到各種各樣的問題——PMD規則轉換、性能優化方案、Inspection創建機製等,在加上Running Inspection By Name的代碼不是open api帶來的兼容問題,很多東西都得不斷嚐試,IDEA的插件開發不像我們常用框架那樣文檔豐富,很多東西得自己去找,搜代碼、看示例,甚至有時候你得去試。
在IDEA插件集成期間,螞蟻同學從Jetbrains邀請到了IDEA的主要開發康斯坦丁來做了為期一天半的插件開發培訓,我也有幸參加了這次培訓。除了更加係統、全麵的學習IDEA插件開發外,並基於事前的準備與積累,獲得了一個定製充電寶作為前幾名完成任務的獎勵,不過收獲最大的是認識了許多對插件開發感興趣的同學們。
IDEA插件最終在2月下旬順利發布,並且反響不錯。看到大家的評價,內心一陣竊喜。

Eclipse
Eclipse插件是基於已有的PMD插件開發的,PMD插件就像一部很久沒開的汽車一樣總是存在這樣或那樣的問題,官方在幾年之間除了一些bug的修複,也僅僅是對PMD包的升級了吧,但由於時間緊迫加上我平時工作不用Eclipse,也沒有發現類似IDEA Run Insection By Name的東西可以供我直接使用,所以很抱歉,並沒有提供一個體驗良好的插件給你們。
Eclipse使用OSGI模塊的形式來管理各個插件,任何東西總是存在其利弊,如果你習慣了IDEA簡單粗暴的ClassLoader機製,你會有點難以接受——“因為簡單,所以美好”。因為對Eclipse不熟的原因,所以配置了一套Gradle的依賴管理,在IDEA寫代碼、遠程調試,Eclipse裏麵編譯啟動插件,是不是很蛋疼o(╯□╰)o。此外Eclipse的集成工作沒什麼好說的,改代碼、集成規則、修bug,終於跟IDEA一樣在二月下旬對大家發布了。
開源
其實在我開始做插件的時候,就有同學說,規約這個東西之前就有人搞過,沒一個搞起來的。但是孤盡不僅搞起來了,還在業界產生了巨大的影響力,情懷、毅力缺一不可。隨著《阿裏巴巴Java開發手冊》在業界的影響力逐漸擴大,我們決定要把規約掃描插件開源出去,希望能幫助到更多的開發者,同時進一步擴大在業界的影響力。
代碼注釋、代碼重構、國際化、以及新增規則等工作都按計劃進行著。IDE插件方麵,原有的PMD插件相對於我們的規約來說有很多冗餘功能,並且原來的PMD代碼其實有很多違反規約的地方,國際化改造估計也需要額外花上一些時間,直接開源出去也會有不好的影響,所以幹脆花了一周多的時間重寫了一版,界麵相對簡潔、功能剛好,看起來不錯,可能是對插件的開發相對熟悉了吧,感覺這次重構出奇的順利。但即便如此,Eclipse插件還是需要更好的體驗,以及實時檢測方麵的一些擴展。
總結
P3C項目能夠取得目前的成果,主要應該歸功於《阿裏巴巴Java開發手冊》在業界的影響力以及項目組所有小夥伴的努力。不過就插件本身來說,我覺得應該把自己當做用戶來看待,不論開源與否一定要從產品層麵把體驗做好;技術是為大家服務的,如果產品做得不夠好,技術再牛也是白搭,P3C項目就是一個很好的例子——IDEA插件的整體反響非常不錯,而Eclipse卻因為體驗上的欠缺不斷的收到用戶改進意見。希望其他同學以此為戒,P3C項目需要在各個方麵繼續努力,尤其是在Eclipse插件體驗、功能方麵,這樣才能走得更遠。
謹以此文獻給所有的同學們,同時著重感謝P3C項目組的小夥伴們的辛苦付出,@玄壇、@如柏、@勝燕、@可期、@曾候、@昶樂、@孤盡、@否泰。
歡迎加入我們,P3C規約檢測項目組邀你一起變得更加強大。
最後更新:2017-10-30 12:04:49