劉 晶 韓振東 王瀏明
1 中國聯(lián)通研究院 北京 100176
2 中國聯(lián)合網(wǎng)絡通信集團有限公司 北京 100033
3 中國聯(lián)通軟件研究院 北京 100176
云計算的飛速發(fā)展和上云企業(yè)軟件規(guī)模、業(yè)務多樣性的日益增長,對資源利用率、快速迭代、軟件質量等提出越來越高的要求。云原生技術具有敏捷研發(fā)與部署、資源利用率高、快速使能創(chuàng)新和降本增效的優(yōu)勢,是企業(yè)全面數(shù)字化轉型的核心技術和關鍵抓手[1]。云原生主要包含微服務、容器化、DevOps和持續(xù)交付等技術特征。2019年Stackrox調查指出,云原生逐漸得到應用和完善,Kubernetes在容器編排中占據(jù)主導地位,容器管理正在進入企業(yè)IT主流[2]。其中,DevOps是開發(fā)和運維兩個領域的組合,通過自動化流程使軟件開發(fā)、測試、發(fā)布更加快捷、頻繁和可靠[3]。根據(jù)Puppet Lab在2017年的調查研究,來自全球如AWS、Google等企業(yè)的DevOps采用率逐步增加[4]。
DevOps逐漸成為業(yè)界的研究熱點,越來越多的企業(yè)開始使用并推出多種DevOps平臺及基于DevOps的交付解決方案。廣東移動通過在OSS的DevOps實踐,構建了DevOps能力成熟度評估體系,包括發(fā)布組織和方法論、精益交付治理和流程、持續(xù)集成、持續(xù)交付、軟件定義基礎設施等多個方面[5]。阿里云推出云效DevOps平臺,通過項目協(xié)作、代碼管理、持續(xù)交付流水線等產品,助力快速實現(xiàn)研發(fā)敏捷和組織敏捷[6]。騰訊云發(fā)布CODING DevOps系統(tǒng),提供包括項目管理、代碼托管、測試管理、持續(xù)集成等產品和服務,實現(xiàn)了研發(fā)團隊的高效協(xié)同和敏捷開發(fā),提升軟件交付質量與速度[7]。在DevOps實踐過程中,出現(xiàn)了許多自動化工具,使得DevOps在各種軟件項目中得以實現(xiàn),如Docker、Kubernetes、Ansible、Terraform、Packer等[8]。隨著云原生技術的快速發(fā)展以及DevOps在行業(yè)內的廣泛應用,關于研發(fā)效能統(tǒng)一度量方面的研究目前是云原生行業(yè)內的重點研究領域之一。
此外,隨著云應用軟件規(guī)模和系統(tǒng)復雜程度逐步增加,軟件缺陷的數(shù)量也大幅度增長,檢測難度不斷加大。軟件缺陷將會對業(yè)務和系統(tǒng)的安全、生產、運營產生嚴重的影響,甚至造成難以估量的經濟損失。目前代碼審查在速度和效率上已難以滿足軟件發(fā)展的要求,因此,為了提高軟件測試效率,保證軟件可靠性,軟件缺陷預測成為研發(fā)過程的重要一環(huán)。目前已有很多關于軟件缺陷預測的研究[9-11],然而絕大部分只是針對軟件代碼的特征做出預測,很少有與研發(fā)過程特征相關的預測模型。本文提出的云原生研發(fā)效能框架可以采集軟件研發(fā)過程中的度量指標,為提取研發(fā)過程相關的預測特征提供了有利條件。
研發(fā)效能沒有統(tǒng)一的定義,直觀理解為在從需求、設計、開發(fā)、測試到發(fā)布、運維的整個研發(fā)過程中交付產品的“效率”與“能力”?;谠圃难邪l(fā)效能框架旨在對整個研發(fā)過程進行統(tǒng)一管理,可視化呈現(xiàn)和多維度度量,并可對內部一線研發(fā)或對外部團隊提供問題定位、分析、預測、咨詢等服務?;谠圃难邪l(fā)效能框架包括基礎設施層、能力平臺層、研發(fā)效能平臺層和應用層,如圖1所示。
圖1 基于云原生的研發(fā)效能框架
1)基礎設施層
基礎設施層通過容器化和基于Kubernetes的服務編排,提供包括計算、存儲和網(wǎng)絡等基礎設施資源,同時融入微服務架構與DevOps集成管理工具鏈,將需求、開發(fā)、測試、運維等流程協(xié)同合作,細化管理粒度,對云應用的完整生命周期進行統(tǒng)一管理,以達到敏捷迭代、持續(xù)交付、更高資源利用率和可擴展性的目標。
2)能力平臺層
能力平臺層是部署在云原生基礎資源上的大數(shù)據(jù)、AI、調度、消息隊列等能力和中間件,為上層提供可用的能力和服務。大數(shù)據(jù)服務將研發(fā)過程中各階段數(shù)據(jù)進行收集、采樣、預處理和存儲等,并可提供定制的數(shù)據(jù)建模和分析等能力;AI服務提供包括如回歸、分類、聚類等模型算法庫,和特征分析、建模、訓練等能力;調度服務按照既定資源分配策略對基礎設施資源進行統(tǒng)一配置;消息隊列則用于實現(xiàn)具備高可用性能的接收、存儲和轉發(fā)消息、數(shù)據(jù)。
3)研發(fā)效能平臺層
研發(fā)效能平臺層從能力平臺層(如大數(shù)據(jù)、AI)獲取源數(shù)據(jù),提取和抽象為度量研發(fā)過程每個階段的可量化指標,并進行多維分析和可視化,用來評估交付價值和效能。研發(fā)效能平臺層包括構建度量體系、算法模型、問題診斷和賦能提升。①度量體系分為對項目過程、團隊和工程能力的評估,其中項目過程又可分為需求交付、代碼質量、缺陷修復率等度量指標;團隊能力是對人的產出、活動的評估,包含代碼提交頻率、合并頻率、人均提交代碼量等指標;工程能力指標包括代碼管理能力、構建成功率、部署和發(fā)布頻率等。②研發(fā)效能的算法模型是基于上述大量的度量指標通過機器學習、模式識別、神經網(wǎng)絡算法等建模,形成面向不同目標的匹配模型、預測模型、學習規(guī)則庫等。③問題診斷結合度量數(shù)據(jù)通過模型分析和判斷,發(fā)現(xiàn)研發(fā)過程中存在的問題和可能的原因。④賦能提效則是將診斷問題推送到對應團隊,反推關聯(lián)到研發(fā)過程中的活動、行為,定位可能的問題環(huán)節(jié)進行優(yōu)化。
良好的數(shù)據(jù)庫設計,會使系統(tǒng)開發(fā)工作變得相對簡單,使得后期開發(fā)工作能夠很好地進行下去,縮短開發(fā)周期。根據(jù)需求分析,該系統(tǒng)總共包括12張表,分別為用戶角色表、權限分配表、基本權限表、管理員表、用戶表、部門表、審核記錄表、地震應急信息表、應急圖片表、地震應急信息狀態(tài)表、應急欄目表、發(fā)布狀態(tài)表。
4)應用層
應用層通過調用研發(fā)效能平臺層的數(shù)據(jù)與算法模型,為用戶提供多種服務,如畫像分析、風險管控、智能推薦、缺陷預測等。①畫像分析:通過大數(shù)據(jù)分析研發(fā)人員的活動、行為習慣(如編碼時間、交互活動等),提取特征,為團隊人員構建研發(fā)畫像,便于對團隊的評價。②風險管控:通過分析業(yè)務的使用量、調用量、關鍵程度等數(shù)據(jù),判斷潛在的風險,定位到相關團隊與環(huán)節(jié),幫助降低版本迭代風險。③智能推薦:通過關聯(lián)分析算法和根因分析法及時發(fā)現(xiàn)線上故障與研發(fā)過程各階段活動之間的關系,把影響線上質量的關鍵因子反饋至用戶,幫助其提升研發(fā)效率。④缺陷預測:在研發(fā)任務緊急,測試資源有限的情況下,通過缺陷預測模型對未上線的代碼進行分析預測,有針對性地對可能出現(xiàn)缺陷的代碼段進行測試,節(jié)省資源的同時也能提高交付效率。
為合理分配測試資源,提高測試效率,從而進一步提升研發(fā)效能,研發(fā)效能框架中的缺陷預測應用對軟件上線之前進行缺陷預測。缺陷預測的粒度可以分為包、模塊、文件、方法等,本文選取模塊為預測對象。從模塊開發(fā)的歷史數(shù)據(jù)中訓練預測模型,在目標模塊進行預測和驗證。軟件模塊的數(shù)據(jù)可以從不同項目或同一項目的同一版本、不同版本中獲取。本節(jié)將基于研發(fā)效能框架,結合研發(fā)過程特征和代碼特征的軟件缺陷預測方案進行詳細介紹,其過程如圖2所示,步驟分別為:1)從軟件代碼倉庫和研發(fā)效能數(shù)據(jù)庫中取得盡可能合適的歷史數(shù)據(jù);2)將源數(shù)據(jù)進行分類、標記,提取為度量元指標;3)對度量元進行補全缺失值、提出離群值等數(shù)據(jù)預處理;4)根據(jù)機器學習或者統(tǒng)計分析方法構建預測模型;5)對目標模塊進行缺陷預測,并將結果輸出以提高研發(fā)效能,形成閉環(huán)。
本文選用了軟件項目的代碼倉庫和研發(fā)效能數(shù)據(jù)庫中與研發(fā)過程中代碼開發(fā)者相關的數(shù)據(jù)作為缺陷預測的數(shù)據(jù)集,包含了多種度量元,將有缺陷的數(shù)據(jù)樣本稱為正例,無缺陷的數(shù)據(jù)樣本稱為負例。通過調研參考文獻和結合研發(fā)效能度量指標,選取了13種度量元指標作為預測特征和1種缺陷標記屬性,所選數(shù)據(jù)集的度量元名稱如表1所示。代碼倉庫度量元種類有7種,分別是代碼行總數(shù)、注釋行數(shù)、代碼與注釋行數(shù)、操作數(shù)數(shù)量、操作符數(shù)量、唯一操作數(shù)數(shù)量和唯一操作符數(shù)量;研發(fā)效能度量元有6種,分別是參與開發(fā)者數(shù)量、開發(fā)者提交代碼頻率、開發(fā)者歷史bug率、開發(fā)者人均代碼量、同一模塊開發(fā)者中介中心性和同一模塊開發(fā)者接近中心性。
為提升預測模型的準確率和數(shù)據(jù)集的簡潔化,將原始度量元數(shù)據(jù)進行預處理。數(shù)據(jù)預處理過程包含數(shù)值化、正態(tài)化、離群值剔除、標準化、填充缺失值和離散化六個步驟,詳細過程如下。
第二步,通過利用Python數(shù)據(jù)分析工具pandas進行分析數(shù)據(jù)的集中趨勢和離散化程度,根據(jù)計算數(shù)據(jù)集的均值mean(A)與標準差std,并統(tǒng)計其分布,發(fā)現(xiàn)數(shù)據(jù)都集中在[max{0|mean(A)-std},mean(A)+std]的較小區(qū)間內,占94%,且分布密度不均,大部分區(qū)間空白。
其中,以特征代碼行總數(shù)為例,記為特征A,共有n個數(shù)據(jù),記為{a1,a2,…,an},均值計算公式為
標準差計算公式為
數(shù)據(jù)集中度高不利于連續(xù)數(shù)據(jù)離散化,且離群值將對整體判斷影響過大,因此將數(shù)據(jù)集進行正態(tài)化處理,轉換為單側偏正態(tài)分布。本文根據(jù)數(shù)據(jù)集的實際情況,采用平方根變換法。將各種類度量元數(shù)據(jù)數(shù)值均做平方根操作后,得到的數(shù)據(jù)集分布區(qū)間變大。
第三步,數(shù)據(jù)集中過大或過小的異常值(也稱為離群值)會降低整體數(shù)據(jù)的區(qū)分度,為避免離群值影響預測效果,將剔除離群值。本文通過分析,將超出[mean(A)-3×std,mean(A)+3×std]區(qū)間范圍的離群值剔除。
第四步,由于不同種類的度量元的數(shù)據(jù)實際取值范圍不同,取值大的將對預測模型影響大,取值小的影響小,而訓練模型是對數(shù)據(jù)取值的映射,與真實值無關,故對各度量元取值進行標準化。將AS記為標準化后的特征A,對特征A標準化公式為
標準化后,數(shù)據(jù)集AS的數(shù)值差距變小,降低了極大值或極小值對整體的影響。
第五步,對第三步剔除掉的離群值的缺失值進行填充。本文采用文獻[12]中提出的k-means聚類方法對缺失值補充,將數(shù)據(jù)集AS分為有缺失值ASY和無缺失值ASN兩個數(shù)據(jù)集,將ASN基于歐式距離聚類,獲得聚類中心列表CASN,對ASY中的每條數(shù)據(jù)都在ASN找到與之最近的簇,該簇的聚類中心值則填充為缺失值,然后將兩個集合合并為AT。
第六步,將連續(xù)的度量元數(shù)據(jù)進行離散化,本文采用等寬離散法,將AT度量元的取值分為10等分區(qū)間,分別映射為(0,1,2,3,…,9),在此區(qū)間內的度量元則取對應區(qū)間的映射值。
本文采用樸素貝葉斯算法構建缺陷預測模型。樸素貝葉斯算法根據(jù)概率進行決策,假設各個特征之間是相互獨立的。本文的度量元數(shù)據(jù)集共有13個特征,記為{A0,A1,…,Am,…,A12},通過離散化特征Am有10種取值,記為{Am0,Am1,…,Amk,…,Am9}。
數(shù)據(jù)集被標記為有缺陷和無缺陷2 類,記為{C0,C1}。條件概率P(Amk|Ct)表示在分類Ct的條件下Amk發(fā)生的概率,公式為
因此,采用樸素貝葉斯的計算時間復雜度低,且分類準確性趨于穩(wěn)定。樸素貝葉斯通過訓練獲得的先驗概率,來計算要預測的后驗概率。貝葉斯公式如下
其中,0≤m≤12,0≤k≤9,0≤t≤1。P(Ct)表示訓練數(shù)據(jù)集分類結果為Ct的概率,是先驗概率。P(Amk)表示訓練數(shù)據(jù)集中具有特征Amk的概率,是先驗概率。P(Amk|Ct)表示在訓練數(shù)據(jù)集中分類結果為Ct的條件下具有特征Amk的概率。而P(Ct|Amk)則是在測試數(shù)據(jù)集中,某個數(shù)據(jù)具有特征Amk,該數(shù)據(jù)是分類結果為Ct的概率,是后驗概率。
樸素貝葉斯模型是通過首先計算訓練樣本中在有缺陷類和無缺陷類的P(Ct),13種特征中的每種取值的先驗概率P(Amk|Ct);然后在測試樣本中,根據(jù)每類特征的取值從預測模型中獲得有缺陷和無缺陷的后驗概率P(Ct|Amk);最后比較有缺陷和無缺陷兩種預測概率,取值大的就是預測結果。
本文選取了NASA的MDP軟件缺陷預測開源數(shù)據(jù)集的17 000+條數(shù)據(jù)對基于貝葉斯的缺陷預測模型進行驗證。首先采用十折交叉法進行驗證,隨機將數(shù)據(jù)集分為10等份,隨機選取9份作為訓練樣本,1份作為測試樣本。我們采用Python語言及其numpy和pandas庫進行編寫預測程序,預測程序運行在ThinkPad筆記本上,英特爾i5(2.7 GHz)處理器和8GB內存,操作系統(tǒng)為Windows 64位。然后對測試樣本進行數(shù)據(jù)預處理,進行模型訓練。最后對測試樣本進行預測驗證。
針對軟件缺陷預測的評估指標有預測準確率、查準率和查全率,其中準確率為預測正確的樣本數(shù)量占測試樣本的比例,查準率為預測正確的正例樣本數(shù)量占測試集中正例的比例,查全率是指預測正確的正例樣本數(shù)量與預測正確的正例和預測錯誤的負例樣本數(shù)量之和的比[11]。
本文的軟件缺陷預測是將代碼本身特征和軟件研發(fā)過程中獲取的研發(fā)效能特征相結合進行預測,因此將本文的預測結果與目前大多數(shù)文獻采用的代碼本身特征樸素貝葉斯預測結果進行對比,經過多次驗證,對比結果如表2所示。由對比結果可知,結合研發(fā)效能特征的預測準確率比僅具有代碼特征的準確率高,查全率和查準率都有所提升,表明研發(fā)效能框架在缺陷預測方面具有優(yōu)勢。
表2 預測結果對比
本文提出一種基于云原生的研發(fā)效能框架,首先對研發(fā)過程進行全面統(tǒng)一地管理與度量,包括項目過程、團隊人員和工程能力的度量,并通過數(shù)據(jù)挖掘、機器學習方法構建模型算法;然后基于研發(fā)效能度量數(shù)據(jù)和預測分析模型算法,為用戶提供研發(fā)過程的團隊和項目提供畫像分析、決策輔助、解決方案咨詢、缺陷預測等服務。為進一步提升研發(fā)效能,合理安排測試資源,詳細介紹了研發(fā)效能框架的一種軟件缺陷預測用例,采用研發(fā)過程度量元和代碼度量元相結合的特征,首先進行數(shù)據(jù)預處理,并構建基于樸素貝葉斯的預測模型。通過預測軟件缺陷驗證,準確率達到74.3%,比僅對代碼度量元預測高2.4%,表明研發(fā)效能框架在軟件缺陷預測方面具有一定的優(yōu)勢。由于本文僅采用了樸素貝葉斯模型,獲得的預測準確率提升有限,后續(xù)工作將進一步結合深度學習算法提高預測準確率,并在研發(fā)效能框架下進一步探索研發(fā)投入產出優(yōu)化、風險分析等方案。