自動刪除舊代碼?Uber 開源利器「食人魚」

場景描述:開發人員必須要面對的一個問題,就是要處理在不斷完善中積累的過時代碼,近日 Uber 開源了一個自動刪除舊代碼的工具,它可以尋找代碼庫中廢棄的功能標誌模塊,在配合開發者的情況下,進行代碼刪除或者重構操作。

關鍵詞:Uber 代碼整理 開源工具


整理代碼是一件藝術,對於一些過時的陳舊代碼,如何優雅又快速地刪除,是一件讓無數人傷神的事情,但在最近, Uber 給出了一種解決的方案。

近日,Uber 推出了一款可以掃描源代碼並刪除過時代碼的工具,形象地命名為 了 Piranha(食人魚)。

自動刪除舊代碼?Uber 開源利器「食人魚」

Uber 官方推文介紹 Piranha

Piranha 可以在 Uber 的 Android 和 iOS 代碼庫中運行,目前支持 Objective-C、Swift 和 Java 三種編程語言。

項目地址:https://github.com/uber/piranha

功能標誌引發的陳舊代碼之痛

Piranha 刪除過時代碼,究竟是如何實現的呢?這還要從 Uber 代碼的一個標準說起。

為了方便系統的更新的開發,Uber 採用了功能標誌(Feature Flag),也稱為功能切換,這是一種允許控制線上功能開啟或關閉的方法,在互聯網大廠中被廣泛採用。

自動刪除舊代碼?Uber 開源利器「食人魚」

功能標誌的優點舉例

使用這個方式擁有諸多優點,它可以將新功能測試完善之後,再將其發佈為全面可用,還能夠針對不同用戶定製差異化服務(A/B 測試),當出現 Bug 時支持回滾,工程師還可以遠程禁用應用程序的故障部分。

據介紹,在 Uber 所有的程序代碼庫中,就有超過 6000 個功能標誌。

但功能標誌的增多,也會導致代碼庫的複雜性增加,一旦該標誌過時,則需要將其刪除,否則會帶來技術層面的負擔。

自動刪除舊代碼?Uber 開源利器「食人魚」

過時的標誌會造成編程負擔

但這個看似簡單的清理步驟,往往會被很多開發者忽略,進而在代碼容量、測試周期等多個維度上影響軟件的開發。

為了解決這個問題,Uber 設計並推出了代碼優化工具 Piranha。它可以分析並找出過時的代碼標誌,將可刪除的部分反饋給原作者,配合其他的工具進行處理或刪除。

用 Piranha 自動檢測並刪除

具體來說,Piranha 需要自動檢測出過時標誌,並刪除其關聯代碼,這個過程的難點在於,要確定標誌是否被人使用,以及該標誌的所有者,並且要了解代碼的具體細節。

考慮到 Piranha 的應用背景,Uber 採用了應用靜態分析,即通過代碼審查,來查找因過時標誌遺留下來的廢舊代碼。

自動刪除舊代碼?Uber 開源利器「食人魚」

使用 Piranha 可以刪除或重構代碼

其中可清理的三個關鍵維度分別是:

  • 刪除緊鄰功能標誌 API 的代碼。
  • 刪除由於執行上一步而無法訪問的代碼,稱為深度清潔。
  • 刪除與功能標誌有關的測試代碼。

其中的關鍵在於,根據在代碼庫中觀察到的編碼模式,選擇了迭代設計技術的實用方法,以觀察和鎖定三種標誌 API:

  • 返回布爾值的布爾型 API ,用於確定執行所採用的控制路徑。
  • 更新 API ,用於更新正在運行的系統中的功能標誌值。
  • 返回非布爾值原始值(整數、雙精度等)的參數 API 。

通過重構技術解析輸入源代碼的 AST(抽象語法樹),以檢測使用功能標誌 API 的存在。

如果標記註釋與輸入處理行為匹配,只需刪除測試的註釋,如果不匹配,則要丟棄整個測試以處理標記註釋測試。

自動刪除舊代碼?Uber 開源利器「食人魚」

使用 Piranha 精簡代碼示例

通過這套方案的實施,能夠從代碼中找出過時的功能標誌,並進行刪除或者重構。

已刪除 2000 多過時的標誌

這個方法在 Uber 的代碼庫中被證明是廣泛有效的,已經用來刪除了 2000 多個功能標誌及相關的代碼。

Piranha 已經在 Objective-C、Swift 和 Java 程序中運行良好,但為了讓其工作更高效,以實現 Piranha 自動進行標誌清除,還需要搭建一個更完善的系統。

於是 Uber 建立了工作流 pipeline,該 pipeline 可定期生成差異和任務,以清除陳舊的功能標誌。

自動刪除舊代碼?Uber 開源利器「食人魚」

Pipeline 的結構示意圖

Piranha pipeline 在標誌管理系統中,自動查詢陳舊標誌列表,並對每個標誌,通過輸入陳舊標誌的名稱、其所有人以及預期的輸出行為(處理或控制),以啟動 Piranha。

經過算法分析和處理之後,Piranha 生成一個 diff (即拉取請求),並將其放入代碼審閱系統中,該標誌的原始作者為默認審閱者。

作者可以接受 diff ,或者根據需要對其進行修改,也可以拒絕修改並將該標誌標記為未過期。pipeline 還在任務管理系統中生成了一個清理任務,以跟蹤每個生成 diff 的狀態。

此外,系統該配備了提醒機器人 PiranhaTidy,可定期添加打開 Piranha 相關任務的提醒。目前使用 Piranha 自動生成 diff 的時間不超過 3 分鐘。

通過這一系列的操作,即可輕鬆實現對代碼的審閱和處理,將過時的代碼一網打盡。

自動刪除舊代碼?Uber 開源利器「食人魚」

Piranha 的特性和優點總結

刪除舊代碼,就用食人魚吧

當然,在上述的介紹中可知,要使用 Piranha,代碼需滿足以下條件:

  • 廣泛使用功能標誌;
  • 具有特定的 API 以控制功能標誌的行為;
  • 代碼用 Java、Swift 或 Objective-C 實現;

此外,Piranha 還有一些計劃正在進行中,比如改進 Piranha 產生的重構代碼,擴充 Piranha 以支援 Kotlin 和 Go 等其他語言。

目前項目已經開源,可在以下地址獲取,你想要試試嗎?

https://github.com/uber/piranha


分享到:


相關文章: