李 敏,趙海燕,陳慶奎,曹 健
1(上海市現(xiàn)代光學系統(tǒng)重點實驗室,光學儀器與系統(tǒng)教育部工程研究中心,上海理工大學光電信息與計算機工程學院,上海 200093) 2(上海交通大學 計算機科學與技術系,上海 200030)
代碼評審是指讓其他團隊成員檢查軟件質量的過程,其目的是用來提高工作的質量.目前代碼評審分為兩種方式:1)傳統(tǒng)代碼評審;2)現(xiàn)代代碼評審.由于傳統(tǒng)代碼評審整個流程比較繁瑣和費時,一定程度上阻礙了它在實踐中的運用.現(xiàn)代代碼評審是一種作為非正式的、輕量級的、基于工具的代碼評審方法,比傳統(tǒng)評審更節(jié)約成本和時間,因而在專有軟件和開源軟件開發(fā)中得到廣泛使用[1].
在開源軟件開發(fā)中,經(jīng)常以Pull請求的方式提交代碼,然后Pull請求需要被評審以確定是否可以合并到軟件中.找到積極且在對應的專業(yè)知識領域具有豐富經(jīng)驗的評審人員成為一大難題.從開發(fā)者的角度來說,每個軟件開發(fā)者希望自己提交的代碼能夠在最短的時間內(nèi)得到有效的評審;從候選評審者的角度來說,在安排合適工作量的前提下,更傾向于評審屬于自己擅長領域的代碼.然而事實并非如此,Thongtanunam等人員發(fā)現(xiàn)在進行代碼評審時,相比不進行評審人員分配,進行評審人員分配往往還需要多消耗12天的時間[2,3].所以,在代碼評審中,自動推薦合適的代碼評審人員,具有重要意義.
近年來,研究代碼評審人員的自動推薦受到了學術界廣泛的關注.例如,某些研究者提出基于文件路徑相似度、基于社交關系、基于信息檢索及基于活躍度等推薦算法.這些算法通過分析Pull請求歷史評論信息,在歷史記錄中,挑選出和新Pull請求最相似的Pull請求,將挑選出Pull請求的評論者作為推薦人選.這些算法歸根到底是以不同方面的相似度作為推薦的最終條件,但并沒有考慮到不同候選評審者在這些方面有不同的興趣偏好.
基于以上推薦算法存在的不足,本文提出了基于貝葉斯個性化排序(Bayesian Personalized Ranking簡稱BPR)的評審者偏好獲取模型,以更為個性化的的方式對代碼評審人員進行推薦.該算法的思想是當評審人員評審了Pull請求i,卻沒有評審Pull請求j,則表明相比j,用戶更愿意評審i.此模型從評審者的專業(yè)知識、積極性、社交關系和對相關代碼的熟悉程度4個維度出發(fā),獲取評審者的個性化興趣,以實現(xiàn)更為準確的推薦.
在早期的代碼評審人員推薦研究中,THONGTANUNAM等人提出基于文件路徑相似度算法[4].該算法假設基于同一個目錄下的文件密切相關且函數(shù)功能相似,則工作相似文件路徑下的評審人員適合作為代碼評審候選人.此算法的優(yōu)點簡單易行,缺點是對于那些雖然工作在不同目錄、但是從技能上看也是合適的評審用戶容易被忽略.JEONG等人利用開發(fā)者和候選評審者之間的社會關系進行推薦[5].通過分析開發(fā)者和代碼評審人員的歷史互動情況,得知兩人之間的關系密切程度,關系越密切越適合作為候選人.該算法的不足是所利用的社交信息并不那么容易獲取且存在信息不全等因素,導致并未將某些潛在的評審者納入推薦的范圍.Huzefa Kagdi1等人提出基于開發(fā)者所提交的內(nèi)容信息進行推薦,該方法稱之為信息檢索的方法[6-8].通過TF-IDF及SVM支持向量機等方法將重要信息提取并進行向量化,最終根據(jù)文本相似度進行推薦.但是這些算法的考慮比較單一,沒有結合開發(fā)者和評審人員本身屬性,導致泛化性能不是很好.Jiang等人根據(jù)候選評審人員的活躍度進行推薦,該方法假設如果評審人員在某段時間內(nèi)參與代碼評審越多,認為此評審者在這段時間內(nèi)越活躍,也就越愿意進行更多的評審[8,9].該算法只考慮評審者在某段時間內(nèi)是否活躍,并沒有考慮到代碼評審領域與候選人所擅長的專業(yè)知識領域是否符合.
顯然,在推薦算法中把多種因素結合起來可以提高推薦效果.如Xia等人提出基于文件路徑和文本信息相結合的TIE算法[10],Yu等人提出基于社交關系與文本內(nèi)容相結合的算法[11,12].進一步,Ouni等人把評審人員推薦問題定義為優(yōu)化問題,提出RevRec算法[13].YANG Chen等人提出基于文件路徑和文本內(nèi)容信息和評審人經(jīng)驗相混合的二層推薦混合算法Hybrid mendth[14],Zhengli,n Xia等人提出混合模型PR-CF算法[15].Emre S 等根據(jù)對特定程序的熟悉程度自動推薦最適合的審閱者[16].這些混合型的算法雖然綜合考慮了不同方面因素的影響,但并沒有從評審人員的角度深入分析.不同評審人員的興趣偏好不同,會對相同的Pull請求作出不同的反應,并且興趣偏好作為評審人員的內(nèi)在屬性,并不會因Pull請求的變化而發(fā)生相應的改變,因此把掌握評審用戶的興趣偏好顯得至關重要,所以在本文中提出了基于貝葉斯個性化排序模型的推薦算法來改進代碼評審人員的推薦效果.
在代碼評審者推薦時,必須綜合考慮各方面因素,影響推薦效果有許多因素[17],本文考慮選出具有代表性的因素進行獲?。?/p>
1)評審者的知識領域與Pull請求的匹配性:Pull請求中的代碼涉及的知識應該是評審者比較熟悉的.由于Pull請求涉及的知識難以直接刻畫,我們利用Pull請求的文本對其涉及的知識進行表示;
2)評審者本身的活躍性:評審者是否積極是推薦能夠成功的重要因素;
3)評審者與Pull請求提出者的社交關系:一般而言,人們更愿意評審熟人的Pull請求;
4)評審者對代碼的熟悉程度:在大多數(shù)大型系統(tǒng)中,具有類似功能的文件通常位于相同或相接近的目錄,所以通過文件路徑之間的相似性能夠反映評審者對代碼的熟悉程度.
評審者在選擇Pull請求時,將綜合考慮以上因素,通過一定的系數(shù)對這些因素進行加權并不能反映不同評審者對這些因素具有不同的敏感性.因此,本文提出了一種基于貝葉斯個性化排序思想,學習評審者對不同因素的選擇偏好,從而能夠計算評審者對某一Pull請求的意愿的模型BPR-CR2(Bayesian Personalized Ranking based Code Reviewer Recommendation Model).整個模型分為參數(shù)學習階段和預測階段組成,參數(shù)學習階段的目標是根據(jù)歷史數(shù)據(jù)學習出每個評審者的選擇偏好,為預測階段做準備,而預測階段是針對每個Pull請求推薦評審者.
3.2.1 Pull請求的評審者因素度量
正如前文所述,我們從4個方面對評審Pull請求的因素進行衡量.
1)評審者的知識領域與Pull請求的匹配性
我們將Pull請求的歷史數(shù)據(jù)作為輸入,并提取出每個Pull請求的描述及標題并形成語料庫,然后使用TF-IDF算法將Pull請求進行向量化處理,其中TF-IDF算法如公式(1)所示:
tfidf(t,pr,corpusPR)=
(1)
其中,t是某個Pull請求中抽取的技術術語,pr為某個Pull請求,corpusPR是由歷史數(shù)據(jù)的Pull請求的描述及標題形成的語料庫,nt是技術術語t在pr中出現(xiàn)的總次數(shù),Npr是技術術語在語料庫中出現(xiàn)的總的次數(shù).
利用余弦相似度衡量評審者之前評審過的Pull請求與目標Pull請求之間的相似性如公式(2)所示:
(2)
其中,pnew及p′分別代表目標Pull請求和歷史記錄中的Pull請求,vnew及v′分別為pnew及p′對應的向量.
則評審人員的興趣與pnew的內(nèi)容的相似性值記為SimCont(Revieweri,pnew)如公式(3)所示:
(3)
上式中Revieweri表示第i個候選評審者,PRi是候選評審者Revieweri以前審核過的Pull請求集合.
2)評審者本身的活躍性
據(jù)調查顯示,候選評審者的積極性會隨時間的變化而變化,某些代碼評審者可能不活躍或短期時間內(nèi)不活躍,最近活躍的代碼評審者傾向于對新的Pull請求做出評論[18].
本文中使用最近的評論來衡量用戶的活躍度,如公式(4)所示:
Act(Revieweri,pnew)=
(4)
其中,ComSi為評審者Revieweri各個Pull請求中的所有評論集合,γ是時間窗口的長度,λ是時間衰減因子,timepnew為新Pull請求的創(chuàng)建時間,timeCj為代碼評審者Revieweri的某條評論Cj的創(chuàng)建時間.
3)評審者與Pull請求提出者的社交關系
通過社交關系可以快速獲取具有參考價值的候選代碼評審者.開發(fā)人員之間的社交關系緊密程度可直接通過評審者和貢獻者之間的評論關系來體現(xiàn),其社交關系影響程度如公式(5)所示:
(5)
提交新Pull請求的貢獻者為Submitter,由貢獻者Submitter提交且處于新Pull請求之前的所有Pull請求集合定義為PRSubmitter,PRi是包含用戶Revieweri發(fā)表過評論的所有Pull請求集合,nij表示代碼評審者Revieweri在Pull請求pj中一共留下第nij條評論.β是其中的調節(jié)參數(shù),經(jīng)實驗將值設置為0.8最為合適.
4)評審者對代碼的熟悉程度
基于同一個目錄下的文件密切相關且代碼功能相關的思想,計算用戶評審過的Pull請求與新Pull請求的文件路徑相關性如公式(6)所示:
FileRel(Revieweri,pnew)=
(6)
其中,F(xiàn)p′表示歷史Pull請求p′更改的相關文件,F(xiàn)pnew表示為新Pull請求pnew更改的相關文件,similarity(f,f′)表示兩個文件之間相似度.可以采用字符串比較具體計算文件目錄的相似性,具體如公式(7)所示:
(7)
上式中f,f′分別表示在歷史Pull請求和新Pull請求涉及到的兩個文件,max(Length(f),Length(f′))取兩個文件的長度的最大值,其中commonPath(f,f′)計算兩個文件路徑中的公共目錄的數(shù)量,具體計算方法如下:首先,根據(jù)文件路徑,將路徑字符串其目錄分隔符進行切分,得到該文件所處位置的目錄層次列表;然后比較兩文件的目錄前綴,取重合的公共目錄數(shù)為得到的結果.例如,對于某安卓項目,有以下兩個文件,分別為/src/camera/photo/a.java和/src/camera/video/a.java,則可得兩者公共祖先目錄為/src/camera文件夾,因而兩路徑的公共目錄數(shù)量為2.
對于評審者集U和Pull請求集PR,其中的某一評審用戶Revieweru與某一Pull請求p,將Revieweru與p之間的相關性用向量spu表示,由上文中的Pull請求的文本特征相似度、評審者活躍度、社交關系影響程度及文件路徑相似性值組成,具體表達式如公式(8)所示:
(8)
3.2.2 基于BPR的評審者選擇偏好建模
BPR是基于貝葉斯理論在先驗知識下極大化后驗概率,由Steffen Rendle提出的一種面向隱式反饋偏好數(shù)據(jù)的排序模型[19].這種排序模型能夠較好的對用戶的正負反饋進行建模,且可以與傳統(tǒng)的協(xié)同過濾模型如矩陣分解模型相互結合[20].
將評審者的偏好用權重矩陣記作W,其維度為4×‖U‖,4代表評審者特征維數(shù):
(9)
wu是矩陣W的第u列元素構成的列向量(u=1,2,3,…,‖U‖),表示Revieweru在文本特征相似度、評審者活躍度、社交關系影響程度及文件路徑相似性值四個維度上的權重,具體表示如公式(10)所示:
(10)
其中,代碼評審者的偏好權重,屬于評審者的自身屬性,不會因Pull請求的更改發(fā)生相應的變化.
評審者的偏好信息可從評審者是否參與評審的行為直接體現(xiàn).因此,在求解用戶偏好向量前,需對評審者的行為進行記錄,用來作為求解模型參數(shù)W.具體記錄方式為當評審者參與過目標Pull請求的評審,記為數(shù)字1,反之記為0,整個記錄用矩陣A表示,該矩陣是一個‖PR‖×‖U‖的二維矩陣,其值由0、1組成.使用變量S代表評審者對不同pull請求之間的關系矩陣,其維度為‖PR‖×‖U‖×4,具體表達式形式如公式(11)所示:
(11)
其中,各個元素spu(p=1,2,3,…,‖PR‖;u=1,2,3,…,‖U‖)代表pull請求PRp和用戶Revieweru之間的特征向量,定義于公式(8).
(12)
(13)
針對某個特定的Pull請求,需滿足評審者分數(shù)高于未評審者分數(shù),這里借助貝葉斯個性化排序思想,從已記錄的矩陣A中將評審者對Pull請求的評論進行標記,如果評審者Revieweru同時面對pri和prj時,評論了pri卻沒有評論prj,則記錄一個三元組,其含義針對評審者Revieweru來說,pri的排序要比prj靠前.如果針對評審者Revieweru,這樣的反饋有m組,則可得到m組評審者Revieweru對應的訓練樣本.
這里有兩個假設:1)每個代碼候選評審者的偏好行為相互獨立即代碼評審者Revieweru在pri和prj之間的偏好和其他代碼評審者無關;2)同一代碼評審者對不同pri和prj之間的偏好和其他的Pull請求無關.對用戶Revieweru的偏好用符號>u表示,則表示為i>uj.其中針對候選評審者集U和Pull請求集PR,排序關系符號>u滿足完整性,反對稱性和傳遞性如下[21]:
完整性:?i,j∈I:i≠j?i>uj∪j>ui
對稱性:?i,j∈I:i>uj∩j>ui?i=j
反對稱:?i,j,k∈I:i>uj∩j>uk?i>uk
基于最大后驗估計P(wu|>u),用>u表示候選代碼評審者Revieweru對應的所有Pull請求的全序關系,則優(yōu)化目標是P(wu|>u).根據(jù)貝葉斯公式可知公式(14):
(14)
由每個代碼評審者的偏好行為相互獨立,則對于任意一位代碼評審者Revieweru來說,P(>u)對所有的Pull請求一樣,則有如公式(15):
P(wu|>u)∝P(>u|wu)P(wu)
(15)
根據(jù)公式(15)可將優(yōu)化目標轉化為兩部分.第1部分和樣本數(shù)據(jù)集D有關,第2部分和樣本數(shù)據(jù)集D無關.針對第1部分,根據(jù)代碼評審者的偏好行為相互獨立及同一候選評審者對不同Pull請求的偏序相互獨立,可推到公式(16):
(16)
其中δ(b)公式(17)如下:
(17)
由排序關系滿足的完整性和反對稱性,將第1部分優(yōu)化目標簡化為公式(18):
(18)
為進一步優(yōu)化計算及滿足排序的3個性質,將優(yōu)化目標轉化為公式(19):
(19)
(20)
基于貝葉斯假設,可知第2部分P(wu)符合正態(tài)分布,其均值為0,協(xié)方差矩陣是λwS,λwu是模型中的正則化參數(shù),如公式(21)所示:
P(wu)~N(0,λwS)
(21)
P(wu)的對數(shù)和‖wu‖2成正比,如公式(22)所示:
lnP(wu)=λ‖wu‖2
(22)
最終根據(jù)最大對數(shù)后驗估計函數(shù)將優(yōu)化目標成公式(23):
(23)
將優(yōu)化目標函數(shù)推導之后,使用梯度上升法求解參數(shù),對W求導如公式(24)所示:
(24)
由于
(25)
(26)
在優(yōu)化過程中,對矩陣W進行隨機初始化,并迭代更新模型參數(shù),當W達到收斂狀態(tài)可得用戶權重矩陣W,設α為梯度步長,正則化參數(shù)λ,由公式(24)-公式(26)可得W參數(shù)梯度迭代如公式(27)所示:
(27)
以上階段為本模型的訓練階段,從訓練階段可得評審者權重向量wu,針對模型預測階段,本文使用預測階段的數(shù)據(jù)集作為模型的輸入,從輸入的數(shù)據(jù)集中提取出評審者與目標Pull請求之間的關系向量spu,則評審者Revieweru對目標Pull請求的得分為:
(28)
通過對所有的評審者計算該得分,分數(shù)越高的評審12者越適合作為推薦人員,最終使用降序排序,取前top-K作為推薦候選人選.
為了驗證本模型的有效性,本文使用Github提供的REST API,通過調用這些API接口,獲取了目前流行的angular、ipython、netty、salt及symfony的5個大型項目的原始數(shù)據(jù).其中angular/angular.js項目是一種構建動態(tài)Web應用的結構化框架,ipython項目是一個升級版的交互式python命令行工具,netty項目是由JBOSS提供的一個java開源框架,saltstack項目是一個服務器基礎架構集中化管理平臺,具備配置管理、遠程執(zhí)行、監(jiān)控等功能,symfony項目是一款基于MVC架構的PHP框架.所有這些項目都是各自領域的代表性項目.這些項目在Github平臺非常受歡迎,每個項目平均有1643個人進行關注,19850個人進行點贊,9017個人進行拷貝,另外,這些項目開發(fā)的軟件被得到廣泛的應用,在各自領域發(fā)揮著重要作用.
獲得的數(shù)據(jù)中包含了近9年的信息,即2010年12月-2019年6月.在實驗過程中,針對Pull請求數(shù)據(jù),將其評論數(shù)量小于2和未合并的數(shù)據(jù)給剔除,經(jīng)篩選之后的統(tǒng)計實驗數(shù)據(jù)如表1所示.
表1 實驗數(shù)據(jù)統(tǒng)計Table1 Experimental data statistics
對于評審者推薦結果的評價,研究者們主要使用精確率(Precision)、召回率(Recall)、綜合評價指標(F-Measure)等[22-24].當模型返回的是排序的K個推薦結果,然后可以根據(jù)Top1到TopK的精確率和召回率以及F-Measure來得到對模型的進行評價.
1)精確率:又稱查準率,正確推薦的評審者數(shù)目占模型預測的評審者總數(shù)的比例.其計算公式如公式(29)所示:
(29)
上式中,Recom_Reviewers(i)代表給第i個Pull請求推薦的評審者,Actual_Reviewers(i)是第i個Pull請求的實際評審員,m是每個項目中測試Pull請求的數(shù)量.
2)召回率:又稱查全率,正確推薦的評審者數(shù)目占所有評審者數(shù)目的比例.其計算公式如公式(30)所示:
(30)
上式中的各變量含義同上.
3)F-Measure:是Precision和Recall加權調和平均.綜合了以上兩個指標的結果,當F值較高時則說明實驗方法比較有效.
(31)
為了驗證該算法的性能,選取近年來較流行的Hybrid Method算法[14]、Actiness算法[10]、IR+CN算法[12]、IR-based算法[7]、File-Path[4]算法作為對比實驗.
為方便查看,在統(tǒng)計實驗結果時,將性能指標值表現(xiàn)最佳的用粗體顯示,如表2所示.
表2 不同算法間性能對比Table 2 Performance comparison results between different algorithms
同時為直觀顯示BPR-CR2算法的性能,本文給出不同算法在不同項目topK推薦的性能指標統(tǒng)計圖,指標分別包括精確率,召回率及f值,5個項目分別為圖1-圖5所示.
從實驗結果可以看出,BPR-CR2算法在不同項目中的性能表現(xiàn)不一樣,從圖1-圖5顯示BPR-CR2算法在5不同項目中的指標性能均比對比算法高.
圖1 Symfony項目Fig.1 Symfony project
圖2 Saltstack項目Fig.2 Saltstack project
圖3 Netty項目Fig.3 Netty project
圖4 Angular項目Fig.4 Angular project
圖5 Ipython項目Fig.5 Ipython project
實驗結果表明,BPR-CR2算法優(yōu)于其他算法.具體而言,從表2中觀察可知,BPR-CR2算法在25次模型預測中獲得23次最佳的結果.從圖1-圖5可以觀察出BPR-CR2算法性能在不同項目之間表現(xiàn)不同,同時其他算法也類似,并且BPR-CR2算法總處于最上端,并且在這些項目中,隨著推薦個數(shù)均勻上升,項目的推薦召回率和準確率都會達到收斂的狀態(tài).與推薦前2名的IR+CN算法、IR-based算法、File-Path算法、Act算法、Hybrid算法提高了8.3%、5.8%、4.7%、3%、2%的召回率.由此可見,本文提出的BPR-CR2推薦模型可以達到較高準確率,證明本模型的有效性.
本實驗結果較好可以追溯為兩個方面的原因.第1個方面是本模型考慮的因素較為全面.分別涉及到評審者的專業(yè)知識、評審者對代碼的熟悉程度、評審者的社交關系、評審者在某段時間內(nèi)的活躍度,通過將這些因素有效的結合,最終實驗結果比考慮單一因素的實驗結果要好.第2個方面是本文從評審人員的角度出發(fā),考慮到每個評審者在不同因素方面占據(jù)不同的偏好權重,并且不會因目標pull request的更改發(fā)生變化,本模型利用基于貝葉斯個性化排序的思想,求取每位用戶在不同興趣方面的權重偏好,相比其他的實驗模型,本實驗更能體現(xiàn)出個性化,從而實驗結果比其他實驗結果要好.由此可見,綜合上述兩方面原因,本文提出的BPR-CR2推薦模型可以達到較高準確率,證明本模型的有效性.
本文針對如何提高代碼評審效率的問題,提出BPR-CR2推薦模型,該模型借助貝葉斯個性化排序的思想,融入了評審者在專業(yè)知識領域、活躍度、社交相關性、及文件路徑相關性四個維度的偏好,同時,根據(jù)歷史數(shù)據(jù)信息,將評審者與目標Pull請求之間的關系進行了量化.通過在5個流行的開源項目數(shù)據(jù)集上進行的對比實驗,實驗結果表明本模型比IR+CN算法、IR-based算法、File-Path算法、Act算法、Hybrid算法要好,分別提高了9.1%、7.0%、5.2%,4%,2.3%的召回率,證明本模型能夠有效的提高代碼評審的效率以及完成更為準確的推薦.
本模型首先使用的數(shù)據(jù)集來自Github平臺,但不清楚該模型應用在其他平臺效果如何,所以在后續(xù)工作可以進一步優(yōu)化本模型和驗證其他平臺的項目的數(shù)據(jù).其次,本模型對專業(yè)知識領域、活躍度、社交相關性、及文件路徑相關性及評審者的選擇偏好因素進行了考量,在未來工作中,可以從多方面角度分析,將其他有效因素也納入考量的范圍內(nèi).