天天看點

阿裡巴巴智能化代碼平台的探索與實踐

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阿裡巴巴研發效能峰會官方網站收看回放視訊。

關于雲效:

雲效,企業級一站式DevOps平台,源于阿裡巴巴先進的管理理念和工程實踐,緻力于成為數字企業的研發效能引擎!雲效提供從“需求->開發->測試->釋出->運維->營運”端到端的線上協同服務和研發工具,通過人工智能、雲原生技術的應用助力開發者提升研發效能,持續傳遞有效價值。

繼續閱讀