阿里云云效智慧化程式碼平臺的探索與實踐

Yvonne發表於2020-06-22

2020年6月13日,在 2020 阿里巴巴研發效能峰會 “架構設計與程式碼智慧專場” 中阿里巴巴高階技術專家張玉明(玄壇)發表題為《阿里巴巴智慧化程式碼平臺的探索與實踐》的主題演講,詳細介紹了阿里巴巴打造智慧化程式碼管理平臺的起因、技術難點和解決思路以及應用案例,併發布雲效智慧研發助手 “雲豆”。本文節選自玄壇的分享,為方便開發者閱讀,刪除 “背景” 介紹部分,將集中講解雲效程式碼管理平臺中智慧化技術的應用以及實現原理。
人工智慧賦能開發者 解決軟體研發問題
作為一名開發者,在日常工作中會遇到哪些問題?主要有以下四點:需求不明確或需求經常變動;缺陷難發現:在開發的程式碼中經常隱藏難以發現的 BUG;編碼效率低:編碼效率不夠高,沒辦法合理安排編碼時間;線上問題難定位。

有沒有解決以上問題的靈丹妙藥呢?雲效團隊給出的解法是 “工具 + 資料 + 智慧”。其實我們每天在使用的雲效程式碼管理平臺、釘釘等都是非常好用的工具。在這些工具基礎之上,結合大資料、智慧化手段是否可以在程式碼編寫提效、程式碼質量、安全提升方面做一些探索呢?

首先看一下我們在 “大資料” 方面是如何做的。在阿里巴巴集團內部的程式碼管理平臺上每天都會產生大量程式碼資料,我們將其中公開的程式碼離線儲存到程式碼倉庫中去構建程式碼數倉。基於程式碼數倉可以構建程式碼圖譜,比如我們會以程式碼、使用者、程式碼庫這些維度進行抽象,將其轉化為實體,並透過對這些實體關係的標籤化,從而構建程式碼畫像、使用者畫像、程式碼庫畫像。進而為上層的智慧化服務提供有力的資料支撐。同時我們以程式碼為中心,去拉通研發資料、協作資料、應用執行資料,去構建研發圖譜,圍繞整個研發生命週期去提供資料方面的支撐。

那麼有了這些資料,我們可以做什麼事情?基於評論資料,結合智慧化手段,可以做到需求分析自動化,比如可以基於前臺使用者諮詢的問題,結合智慧化手段來幫助產品經理明確使用者訴求,提煉產品文件。基於程式碼資料,可以實現程式碼分析自動化,如可以應用到程式碼缺陷檢測和程式碼自動編寫等領域中。基於使用者的運算元據,可以做到軟體測試自動化,如現在很火爆的 UI 測試、Mock 測試等。基於日誌資料,可以實現故障診斷自動化,如日誌自動打點、日誌智慧分析以及服務智慧降級等。

雲效推智慧研發助手 “雲豆” 程式碼評審更智慧

接下來看一下我們是如何在雲效程式碼管理平臺(Codeup)中將程式碼智慧化能力進行落地的。首先來看程式碼評審。

傳統的程式碼評審分為三個階段:新建評審、評審中、評審結束。在這三個階段中,使用者都會產生哪些行為呢?在新建評審階段,首先需要選定某個分支,然後選擇評審人,最後需要填寫評審描述,透過這三步操作就新建了一個評審任務。在評審中,評審者首先要檢視評審檔案,然後提出問題,最後由開發者解決問題。如果評審透過,並完成合並程式碼,則評審結束。

在上述過程中存在哪些痛點呢?在選擇評審人環節,開發者經常不知道應該選擇誰作為這段程式碼的評審者;在評審環節,評審者寫不清評審描述;變更檔案過多,無法有效評審;在評審結束環節,經常需要人工去解決程式碼衝突這類問題。

其實有 “痛點” 就有 “機會點”,針對這些在程式碼評審過程中的痛點,我們還可以做什麼呢?比如,是否可以智慧推薦評審人?智慧生成評審描述?是否可以對改動過多的 “大評審” 進行自動化拆解?在出現程式碼衝突時,是否可以進行智慧化修復?

“雲豆” 可以在智慧引導環節分享更規範的工作方法,在智慧評審環節快速定位問題高效完成工作,在智慧答疑環節推薦最優解法。比如在新建評審環節,當選擇好評審分支後,雲豆可以智慧推薦最佳評審者;雲豆支援預估評審耗時,並可以根據預估評審耗時合理安排評審優先順序,幫助開發者利用好碎片時間評審。在程式碼質量方面,雲豆具備自動化質量和安全檢測能力,並可自動推薦修復方案。

我們可以將雲效智慧研發助手 “雲豆” 提供的智慧化評審過程抽象為上面這張圖,當一個開發者新建了一個程式碼評審,雲豆可以結合智慧化及傳統自動化檢測手段對這段程式碼進行全方位的檢測,並給出一個非常綜合的評審意見。此時評審者只需要在雲豆提供的評審意見之上,結合自己的工作經驗及對業務邏輯的理解給出補充的評審意見即可。

智慧研發助手雲豆背後的能力:程式碼缺陷檢測與補丁推薦-PRECFIX
在雲效智慧研發助手雲豆提供的智慧評審過程中,究竟涉及哪些智慧化的能力呢?首先,我們來看程式碼缺陷檢測與補丁推薦技術-PRECFIX。

在日常研發工作中,我們經常會用到 P3C、PMD、FindBugs 等傳統自動化檢測工具,但這些工具並不能完全解決阿里巴巴面臨的程式碼質量問題。因為傳統工具多是基於規則匹配,泛化能力不強,基於業務場景的缺陷很難識別出來。因此我們希望有一種對缺陷型別泛化能力比較強的缺陷檢測方法或者工具,於是提出 PRECFIX 方法(Patch Recommendation by Empirically Clustering)。PRECFIX 的目標是透過智慧化手段,可以實現毫秒級檢測,能夠修復部分偏業務缺陷,並給出對應的補丁推薦方案。

PRECFIX 程式碼檢測過程主要分為三個階段:風險識別、缺陷定位、補丁推薦。這個過程會涉及行為資料、程式碼資料、日誌資料的處理,以及聚類演算法、推薦演算法、程式碼建模、特徵提取、深度學習等演算法技術。

PRECFIX 的技術實現思路其實並不複雜,首先我們從阿里巴巴集團內部海量的公開程式碼資料中提取程式碼提交(Commit)資訊,基於一定規則挖掘出 “缺陷修復對”(缺陷程式碼片段和補丁程式碼片段的組合),然後透過聚類演算法將相似的 “缺陷修復對” 聚類,提取出對應的程式碼模板。在使用者發起評審時,系統會自動掃描變更程式碼,若與缺陷模板庫匹配,則會推薦給使用者補丁模板用於修復。

PRECFIX 方法已經在阿里巴巴集團內部落地,其誤報率在 5% 以下,在內部公開程式碼庫中掃描出了 800 多種缺陷型別,3 萬多個缺陷,提取出了 3000 多個補丁模板。

智慧研發助手雲豆背後的能力:評審耗時預估

當存在多個待處理評審的情況時,“評審耗時預估” 可以幫助評審人預知評審的工作量,合理安排評審時間,利用碎片化時間進行充分的評審,提升評審效率。

“評審耗時預估” 的技術實現思路是怎樣的呢?首先從幾百萬次的程式碼評審歷史瀏覽資料中抽取特徵,包括評審總行數、程式語言、歷史評審時長、歷史逐行時長等幾十個維度的特徵,從而去訓練機器學習模型。當一個開發者提交了程式碼評審時,“雲豆” 會從他提交的 diff 檔案中提取這些特徵,從而估算這次評審需要的耗時。

智慧研發助手雲豆背後的能力:敏感資訊檢測 SecretRadar

近年來,業內發生多起敏感資訊(API Key、 Database credential、Private token)透過某些站點被無意識地洩露出去的事件,給企業帶來了安全風險。開發者和企業管理者亟需一款穩定健全的敏感資訊檢測方法和系統。透過調研我們瞭解到,目前已有的敏感資訊檢工具要麼單純考慮規則匹配,要麼採用資訊熵技術實現,其召回率或準確率均無法滿足預期。因此我們在規則匹配和資訊熵技術的基礎上,結合了多層檢測模型和上下文語義檢測,打造了一款敏感資訊檢測工具 ——SecretRadar。

SecretRadar 的技術實現思路主要分為三層,第一層採用規則匹配這種傳統敏感資訊識別技術,“規則匹配” 具有良好的準確度和擴充套件性,但是非常依賴比較固化的長度、字首、變數名,難以應對不同開發者的不同編碼風格,容易造成漏報。針對難以固定規則捕捉的場景,在第二層我們採用了資訊熵演算法。資訊熵演算法用於衡量程式碼行混亂程度,對隨機生成型金鑰和隨機身份資訊識別效果良好。但資訊熵演算法也有其侷限性,伴隨召回的提升是誤報率的增加。因此在第三層我們採用了模板聚類的方法進行過濾最佳化。針對資訊熵結果集聚合提取常見關鍵字,並結合上下文分析完成二次過濾。同時透過問題的修復情況建立二分類資料集,完成演算法最佳化。進而從詞法識別迭代為語義識別。

智慧研發助手雲豆背後的能力:程式碼補全
程式碼補全是當前程式碼智慧化領域研究的熱點。目前程式碼補全工具主要分為三種:基於語法解析器的程式碼補全;基於統計機器學習的程式碼補全;基於深度學習的程式碼補全。基於語法解析器的程式碼補全工具最為大家熟知,我們平時使用的 IDE 中內建的補全工具基本都屬於這類。這種補全工具有個問題,就是補全結果沒有進行合理排序。基於統計機器學習的程式碼補全工具不僅可以給出更加合理的補全候選方案,還可以從 “補全機率” 的維度對候選方案進行排序。但這種補全方式也有其侷限性,推薦的結果比較固定。

最近幾年,隨著 NLP(自然語言處理)領域對自然語言建模能力的大幅度提升,這種能力也被應用到程式碼補全上。相對於基於統計機器學習的程式碼補全工具而言,基於深度學習的程式碼補全系統能夠更大範圍的瞭解上下文語義,並結合大量資料,給開發者提供動態的程式碼補全推薦。當然這種方式在訓練階段以及推理計算時會需要更強大的算力,因此在普通的 PC 機上基本沒辦法使用這種系統。業內通常的做法是將訓練好的模型部署到遠端伺服器上,本地去進行實時查詢,因此對網路的依賴比較強。

在程式碼補全的探索中我們遇到很多挑戰和難點,主要有四個方面:不完整程式碼上下文理解難度大;程式碼片段補全準確率要求極高,對錯誤的容忍度非常低;多 Token 補全搜尋空間無限大,演算法效率和準確度難以提升;程式碼中單詞的數目是無限大的,一般模型難以處理如此大的詞表。

針對以上問題,我們的策略是採用 “演算法手段 + 工程手段” 相結合的解決方案。演算法方面,採用本地 + 深度模型共同補全,挑選合適的分詞演算法(如 BPE 分詞演算法),並結合規則匹配的手段進行實現。在工程方面,透過整合現有語法服務給使用者帶來綜合體驗的提升。

我們的程式碼補全流程設計如圖所示,分為預處理階段、實時補全階段、後處理階段。在預處理階段,會進行變數/字串替換、分詞、索引變數等處理。在實時補全階段,採取本地個性化補全模型和雲端深度補全模型相結合的方法,然後對多模型候選項進行合併、篩選和重排。在後處理階段,會進行變數名替換和填充、語義格式化等操作,並將最終補全候選方案推薦給開發者。

總結:
目前雲效智慧研發助手 “雲豆” 主要可提供智慧程式碼評審、評審耗時預估、智慧推薦評審人、程式碼補全等智慧化能力,未來 “雲豆” 還可以結合開發者個人研發習慣,提供更多功能。雲豆已經整合在雲效程式碼管理平臺(Codeup)中,大家可以登入雲效官網免費 “領養”。

以上內容節選自張玉明(玄壇)的主題演講《阿里巴巴智慧化程式碼平臺的探索與實踐》,如果想了解完整分享內容可以進入 2020 阿里巴巴研發效能峰會官方網站收看回放影片。

想要了解更多資訊,點選連結觀看阿里巴巴研發效能精彩回放:https://developer.aliyun.com/live/2734

相關文章