場景描述:開發人員必須要面對的一個問題,就是要處理在不斷完善中積累的過時代碼,近日 Uber 開源了一個自動刪除舊代碼的工具,它可以尋找代碼庫中廢棄的功能標誌模塊,在配合開發者的情況下,進行代碼刪除或者重構操作。
關鍵詞:Uber 代碼整理 開源工具
整理代碼是一件藝術,對於一些過時的陳舊代碼,如何優雅又快速地刪除,是一件讓無數人傷神的事情,但在最近, Uber 給出了一種解決的方案。
近日,Uber 推出了一款可以掃描源代碼並刪除過時代碼的工具,形象地命名為 了 Piranha(食人魚)。
Piranha 可以在 Uber 的 Android 和 iOS 代碼庫中運行,目前支持 Objective-C、Swift 和 Java 三種編程語言。
項目地址:https://github.com/uber/piranha
功能標誌引發的陳舊代碼之痛
Piranha 刪除過時代碼,究竟是如何實現的呢?這還要從 Uber 代碼的一個標準說起。
為了方便系統的更新的開發,Uber 採用了功能標誌(Feature Flag),也稱為功能切換,這是一種允許控制線上功能開啟或關閉的方法,在互聯網大廠中被廣泛採用。
使用這個方式擁有諸多優點,它可以將新功能測試完善之後,再將其發佈為全面可用,還能夠針對不同用戶定製差異化服務(A/B 測試),當出現 Bug 時支持回滾,工程師還可以遠程禁用應用程序的故障部分。
據介紹,在 Uber 所有的程序代碼庫中,就有超過 6000 個功能標誌。
但功能標誌的增多,也會導致代碼庫的複雜性增加,一旦該標誌過時,則需要將其刪除,否則會帶來技術層面的負擔。
但這個看似簡單的清理步驟,往往會被很多開發者忽略,進而在代碼容量、測試周期等多個維度上影響軟件的開發。
為了解決這個問題,Uber 設計並推出了代碼優化工具 Piranha。它可以分析並找出過時的代碼標誌,將可刪除的部分反饋給原作者,配合其他的工具進行處理或刪除。
用 Piranha 自動檢測並刪除
具體來說,Piranha 需要自動檢測出過時標誌,並刪除其關聯代碼,這個過程的難點在於,要確定標誌是否被人使用,以及該標誌的所有者,並且要了解代碼的具體細節。
考慮到 Piranha 的應用背景,Uber 採用了應用靜態分析,即通過代碼審查,來查找因過時標誌遺留下來的廢舊代碼。
其中可清理的三個關鍵維度分別是:
- 刪除緊鄰功能標誌 API 的代碼。
- 刪除由於執行上一步而無法訪問的代碼,稱為深度清潔。
- 刪除與功能標誌有關的測試代碼。
其中的關鍵在於,根據在代碼庫中觀察到的編碼模式,選擇了迭代設計技術的實用方法,以觀察和鎖定三種標誌 API:
- 返回布爾值的布爾型 API ,用於確定執行所採用的控制路徑。
- 更新 API ,用於更新正在運行的系統中的功能標誌值。
- 返回非布爾值原始值(整數、雙精度等)的參數 API 。
通過重構技術解析輸入源代碼的 AST(抽象語法樹),以檢測使用功能標誌 API 的存在。
如果標記註釋與輸入處理行為匹配,只需刪除測試的註釋,如果不匹配,則要丟棄整個測試以處理標記註釋測試。
通過這套方案的實施,能夠從代碼中找出過時的功能標誌,並進行刪除或者重構。
已刪除 2000 多過時的標誌
這個方法在 Uber 的代碼庫中被證明是廣泛有效的,已經用來刪除了 2000 多個功能標誌及相關的代碼。
Piranha 已經在 Objective-C、Swift 和 Java 程序中運行良好,但為了讓其工作更高效,以實現 Piranha 自動進行標誌清除,還需要搭建一個更完善的系統。
於是 Uber 建立了工作流 pipeline,該 pipeline 可定期生成差異和任務,以清除陳舊的功能標誌。
Piranha pipeline 在標誌管理系統中,自動查詢陳舊標誌列表,並對每個標誌,通過輸入陳舊標誌的名稱、其所有人以及預期的輸出行為(處理或控制),以啟動 Piranha。
經過算法分析和處理之後,Piranha 生成一個 diff (即拉取請求),並將其放入代碼審閱系統中,該標誌的原始作者為默認審閱者。
作者可以接受 diff ,或者根據需要對其進行修改,也可以拒絕修改並將該標誌標記為未過期。pipeline 還在任務管理系統中生成了一個清理任務,以跟蹤每個生成 diff 的狀態。
此外,系統該配備了提醒機器人 PiranhaTidy,可定期添加打開 Piranha 相關任務的提醒。目前使用 Piranha 自動生成 diff 的時間不超過 3 分鐘。
通過這一系列的操作,即可輕鬆實現對代碼的審閱和處理,將過時的代碼一網打盡。
刪除舊代碼,就用食人魚吧
當然,在上述的介紹中可知,要使用 Piranha,代碼需滿足以下條件:
- 廣泛使用功能標誌;
- 具有特定的 API 以控制功能標誌的行為;
- 代碼用 Java、Swift 或 Objective-C 實現;
此外,Piranha 還有一些計劃正在進行中,比如改進 Piranha 產生的重構代碼,擴充 Piranha 以支援 Kotlin 和 Go 等其他語言。
目前項目已經開源,可在以下地址獲取,你想要試試嗎?
https://github.com/uber/piranha
閱讀更多 HyperAI超神經 的文章
關鍵字: Objective-C 食人魚 Swift語言