蔡 亮,范元瑞,鄢 萌,夏 鑫
1(浙江大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,浙江 杭州 310007)
2(Faculty of Information Technology,Monash University,Melbourne,VIC 3800,Australia)
研究表明,由于軟件系統(tǒng)的復(fù)雜性,軟件缺陷常常不可避免.根據(jù) IEEE標(biāo)準(zhǔn)定義,軟件缺陷是指軟件產(chǎn)品中存在的,導(dǎo)致產(chǎn)品無(wú)法滿足軟件需求和其規(guī)格要求,需要進(jìn)行修復(fù)的瑕疵、問(wèn)題[1].軟件缺陷的存在,極大制約了軟件的應(yīng)用與發(fā)展,帶來(lái)了大量的經(jīng)濟(jì)損失.根據(jù)美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(National Institute of Standards and Technology,簡(jiǎn)稱NIST)估算,由于軟件缺陷給美國(guó)帶來(lái)的一年經(jīng)濟(jì)損失高達(dá)600億美金,NIST通過(guò)進(jìn)一步研究發(fā)現(xiàn),識(shí)別和修復(fù)這些軟件缺陷,能幫助美國(guó)節(jié)省220億美金[2].因此,修復(fù)缺陷成為軟件維護(hù)中的關(guān)鍵活動(dòng),但它同時(shí)需要消耗大量的時(shí)間和資源[3].數(shù)據(jù)表明,修復(fù)缺陷所需要的成本占軟件開(kāi)發(fā)總成本的 50%~75%[4].及時(shí)地發(fā)現(xiàn)缺陷,有助于減少修復(fù)缺陷的成本,提高軟件質(zhì)量.
鑒于此,軟件工程領(lǐng)域的研究者提出了軟件缺陷預(yù)測(cè)技術(shù),其目的在于提前預(yù)測(cè)可能存在缺陷的軟件實(shí)體(如文件和變更)[5].其基本思路在于從軟件項(xiàng)目的歷史數(shù)據(jù)中提取特征用來(lái)表征被預(yù)測(cè)的軟件實(shí)體,然后將這些特征輸入到分類(lèi)(或回歸)器進(jìn)行訓(xùn)練獲得預(yù)測(cè)模型,從而對(duì)新產(chǎn)生的軟件實(shí)體預(yù)測(cè)其存在缺陷的可能性[6].其研究意義在于:
(1) 優(yōu)化資源分配,節(jié)省維護(hù)成本.缺陷預(yù)測(cè)技術(shù)可以對(duì)軟件的文件、模塊等計(jì)算其存在缺陷的可能性,從而實(shí)現(xiàn)對(duì)有限開(kāi)發(fā)資源的合理調(diào)度,例如,對(duì)更有可能出現(xiàn)缺陷的文件和模塊進(jìn)行更多的審查和測(cè)試工作[7].
(2) 及時(shí)發(fā)現(xiàn)缺陷,提高代碼質(zhì)量.使用缺陷預(yù)測(cè)技術(shù),能幫助開(kāi)發(fā)人員及時(shí)發(fā)現(xiàn)潛在缺陷,及時(shí)采取缺陷修復(fù)措施,有助于更好的保證軟件質(zhì)量[8].
軟件缺陷預(yù)測(cè)研究有超過(guò)40年的歷史[9].傳統(tǒng)的缺陷預(yù)測(cè)技術(shù)主要針對(duì)粗粒度的軟件實(shí)體,例如文件、模塊或包進(jìn)行預(yù)測(cè)[8,10-15].這些針對(duì)粗粒度軟件實(shí)體的技術(shù)在實(shí)際應(yīng)用中遇到了挑戰(zhàn).例如,軟件缺陷預(yù)測(cè)模型可能會(huì)預(yù)測(cè)一個(gè)巨大的文件存在缺陷,但是對(duì)于開(kāi)發(fā)者來(lái)說(shuō),查看整個(gè)文件來(lái)尋找缺陷非常耗費(fèi)精力和時(shí)間[16].同時(shí),這樣一個(gè)巨大的文件可能被很多開(kāi)發(fā)者修改過(guò),因此,尋找一個(gè)合適的開(kāi)發(fā)者來(lái)對(duì)這個(gè)文件檢查也是一個(gè)非常困難的任務(wù)[17].
為了應(yīng)對(duì)上述挑戰(zhàn),軟件工程領(lǐng)域的研究者提出了即時(shí)缺陷預(yù)測(cè)(just-in-time defect prediction)技術(shù)[17-28].即時(shí)缺陷預(yù)測(cè)技術(shù)是指預(yù)測(cè)開(kāi)發(fā)者每次提交的代碼變更(code change)是否存在缺陷的技術(shù)[19].在即時(shí)缺陷預(yù)測(cè)技術(shù)中,被預(yù)測(cè)的軟件實(shí)體是一次代碼變更.即時(shí)缺陷預(yù)測(cè)技術(shù)具有即時(shí)性,具體體現(xiàn)在這種預(yù)測(cè)技術(shù)可以在開(kāi)發(fā)者提交一次代碼變更后即對(duì)變更代碼進(jìn)行缺陷分析,預(yù)測(cè)其存在缺陷的可能性.這種技術(shù)可以有效地應(yīng)對(duì)傳統(tǒng)缺陷預(yù)測(cè)技術(shù)面臨的挑戰(zhàn),主要體現(xiàn)在以下3個(gè)方面.
(1) 細(xì)粒度.與模塊或文件級(jí)缺陷預(yù)測(cè)相比,變更級(jí)預(yù)測(cè)關(guān)注更加細(xì)粒度的軟件實(shí)體.開(kāi)發(fā)者可以花費(fèi)更少的時(shí)間和精力去審查被預(yù)測(cè)為有缺陷的代碼變更.
(2) 即時(shí)性.即時(shí)缺陷預(yù)測(cè)技術(shù)可以在代碼變更提交時(shí)進(jìn)行預(yù)測(cè),此時(shí),開(kāi)發(fā)者仍然對(duì)變更代碼具有鮮活的記憶,不必花費(fèi)時(shí)間來(lái)重新理解自己提交的代碼變更,有助于更及時(shí)的修復(fù)缺陷.
(3) 易追溯.開(kāi)發(fā)者提交的代碼變更中保存了開(kāi)發(fā)者的信息,因此,項(xiàng)目管理人員可以更便捷地找到引入缺陷的開(kāi)發(fā)者,有助于及時(shí)分析缺陷引入原因,幫助完成缺陷分派[19].
上述優(yōu)勢(shì)也吸引了軟件工程領(lǐng)域研究者的廣泛關(guān)注,產(chǎn)生了一批即時(shí)缺陷預(yù)測(cè)研究成果.其中,Mockus和Weiss首次提出了在代碼變更層次上進(jìn)行缺陷預(yù)測(cè)[29],他們提出的預(yù)測(cè)技術(shù)中,被預(yù)測(cè)軟件實(shí)體是由多次代碼變更提交組成的代碼變更組合.Kim等人在 2008年的 TSE中首次提出了對(duì)每次代碼變更進(jìn)行缺陷預(yù)測(cè)[17].Kamei等人在2013年的TSE中首次將這種缺陷預(yù)測(cè)技術(shù)稱為即時(shí)缺陷預(yù)測(cè)技術(shù)[19].近年來(lái),即時(shí)缺陷預(yù)測(cè)技術(shù)由于其細(xì)粒度、即時(shí)性和可追溯的優(yōu)勢(shì),成為了缺陷預(yù)測(cè)領(lǐng)域的研究熱點(diǎn).在大量工作中,研究者們針對(duì)數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建、模型評(píng)估等方面提出了大量有價(jià)值的理論和技術(shù),同時(shí)也產(chǎn)生了一些分歧和討論,例如,Yang等人提出了使用簡(jiǎn)單無(wú)監(jiān)督的即時(shí)缺陷預(yù)測(cè)技術(shù),取得了比有監(jiān)督缺陷預(yù)測(cè)相當(dāng)或更好的效果[25].針對(duì)該成果,有研究者針對(duì)其建模技術(shù)和模型評(píng)估等方面展開(kāi)了討論,并指出,在模型評(píng)估中,需要綜合考慮不同類(lèi)型的性能指標(biāo)[26,27].
此外,即時(shí)缺陷預(yù)測(cè)也吸引了來(lái)自工業(yè)界的關(guān)注.例如,Shihab等人針對(duì)一家大型軟件公司60個(gè)團(tuán)隊(duì)展開(kāi)了實(shí)證研究[18],Kamei等人在 5個(gè)公司項(xiàng)目上展開(kāi)了實(shí)證研究[19],展示了即時(shí)缺陷預(yù)測(cè)技術(shù)的實(shí)用性.由此可見(jiàn):即時(shí)缺陷預(yù)測(cè)技術(shù)己經(jīng)引起了軟件工程學(xué)術(shù)界和工業(yè)界的關(guān)注,產(chǎn)生了一批優(yōu)秀研究成果,同時(shí)也面臨著缺乏統(tǒng)一建模技術(shù)和評(píng)估指標(biāo)的挑戰(zhàn).然而,目前尚沒(méi)有研究工作對(duì)當(dāng)前該領(lǐng)域的研究進(jìn)展進(jìn)行梳理和歸納,鑒于此,本文擬針對(duì)當(dāng)前即時(shí)缺陷技術(shù)的研究進(jìn)展,從數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建和模型評(píng)估等方面進(jìn)行梳理、歸納和總結(jié),并總結(jié)了當(dāng)前該領(lǐng)域存在的主要問(wèn)題和未來(lái)的發(fā)展方向.
· 文獻(xiàn)選取方式.
本文采用以下流程完成對(duì)文獻(xiàn)的索引與選取.
· 首先定義文獻(xiàn)選取標(biāo)準(zhǔn):該文獻(xiàn)針對(duì)即時(shí)缺陷預(yù)測(cè)技術(shù)中的數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建、模型評(píng)估提出新理論、新技術(shù),或者該文獻(xiàn)對(duì)即時(shí)缺陷預(yù)測(cè)相關(guān)理論和技術(shù)提供實(shí)證研究支持.
· 此外,該文獻(xiàn)應(yīng)公開(kāi)發(fā)表在期刊、會(huì)議、技術(shù)報(bào)告或書(shū)籍中.
依據(jù)以上標(biāo)準(zhǔn),本文通過(guò)以下3個(gè)步驟對(duì)文獻(xiàn)進(jìn)行檢索和篩選.
1)本文文獻(xiàn)搜索主要通過(guò)ACM Digital Library、IEEE Xplore Digital Library、Springer Link Online Library以及 Google Scholar等.論文檢索的關(guān)鍵字包括 just-in-time defect prediction、change level defect prediction、buggy change prediction等,同時(shí)在標(biāo)題、摘要、關(guān)鍵詞和索引中進(jìn)行檢索.
2)本文對(duì)軟件工程領(lǐng)域的主要期刊與會(huì)議進(jìn)行在線搜索,具體包括TOSEM、TSE、EMSE、IST、ICSE、FSE、ASE、ICSME、MSR、SANER等,搜索時(shí)間從 2008年(即針對(duì)每次代碼變更預(yù)測(cè)缺陷的首次提出時(shí)間)開(kāi)始.
3)本文基于上述步驟所獲取的文獻(xiàn)集合,對(duì)文獻(xiàn)逐一查看,從文獻(xiàn)的參考文獻(xiàn)中進(jìn)一步篩選出與即時(shí)缺陷預(yù)測(cè)理論相關(guān)的文獻(xiàn).
通過(guò)以上文獻(xiàn)索引與選取,共計(jì) 34篇文獻(xiàn)納入本文后續(xù)文獻(xiàn)總結(jié)中.其中,19篇文獻(xiàn)與即時(shí)缺陷預(yù)測(cè)技術(shù)直接相關(guān),這些文獻(xiàn)為該技術(shù)中的數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建和評(píng)估等方面提出了新理論和新技術(shù);另外15篇文獻(xiàn)對(duì)即時(shí)缺陷預(yù)測(cè)相關(guān)理論和技術(shù)(如特征提取)提供實(shí)證研究支持.圖1展示了本文所總結(jié)的文獻(xiàn)分布情況,其中包含TSE論文9篇、MSR論文5篇、FSE論文4篇、ICSE論文3篇、ASE論文2篇、ICSM/ICSME論文2篇、其他期刊和會(huì)議論文各1篇.
Fig.1 Distribution of surveyed literatures圖1 文獻(xiàn)分布
· 本文整體結(jié)構(gòu).
本文第1節(jié)介紹即時(shí)缺陷預(yù)測(cè)技術(shù)的整體技術(shù)框架,并從數(shù)據(jù)標(biāo)注、特征提取和模型構(gòu)建等3個(gè)方面進(jìn)行歸納和梳理.第 2節(jié)介紹即時(shí)缺陷預(yù)測(cè)模型評(píng)估方法,主要從實(shí)驗(yàn)驗(yàn)證方法和技術(shù)評(píng)價(jià)指標(biāo)兩方面進(jìn)行總結(jié)和歸納.第 3節(jié)總結(jié)了即時(shí)缺陷預(yù)測(cè)領(lǐng)域面臨的關(guān)鍵問(wèn)題,包括科學(xué)問(wèn)題、技術(shù)難點(diǎn)和工程實(shí)現(xiàn)等3個(gè)方面.第4節(jié)介紹即時(shí)缺陷預(yù)測(cè)技術(shù)未來(lái)發(fā)展趨勢(shì).第5節(jié)是對(duì)本文的總結(jié).
圖2展示了即時(shí)缺陷預(yù)測(cè)技術(shù)的一般過(guò)程,主要包括3個(gè)階段:數(shù)據(jù)標(biāo)注、特征提取和模型構(gòu)建.其中,數(shù)據(jù)標(biāo)注階段主要依賴于版本控制系統(tǒng)(例如git)和缺陷追蹤系統(tǒng)(例如bugzlla或jira),將代碼變更標(biāo)注為缺陷變更(buggy)或非缺陷變更(clean);特征提取階段主要通過(guò)提取不同維度的特征來(lái)表示代碼變更;模型構(gòu)建階段主要依賴于機(jī)器學(xué)習(xí)技術(shù)構(gòu)建預(yù)測(cè)模型,當(dāng)新的代碼變更提交時(shí),模型將預(yù)測(cè)其缺陷可能性.本節(jié)將對(duì)上這 3個(gè)階段進(jìn)行詳細(xì)描述.
Fig.2 General framework of just-in-time defect prediction圖2 即時(shí)缺陷預(yù)測(cè)技術(shù)一般框架
即時(shí)缺陷預(yù)測(cè)技術(shù)中的數(shù)據(jù)標(biāo)注是指將代碼變更標(biāo)注為缺陷引入變更和非缺陷引入變更.準(zhǔn)確的數(shù)據(jù)標(biāo)注,是完成模型訓(xùn)練和模型評(píng)估的前提.
為了實(shí)現(xiàn)數(shù)據(jù)標(biāo)注,需要利用軟件項(xiàng)目的歷史變更數(shù)據(jù),識(shí)別缺陷引入變更.識(shí)別缺陷引入變更是一個(gè)復(fù)雜問(wèn)題,需要考慮代碼的動(dòng)態(tài)演進(jìn)和代碼變更之間的關(guān)聯(lián)關(guān)系.Sliwerski等人在2005年首次提出了用于自動(dòng)識(shí)別引入缺陷的代碼變更方法,并以它們名字的首字母命名該算法,即SZZ算法[30].
隨后,SZZ算法成為用于從軟件項(xiàng)目代碼倉(cāng)庫(kù)和缺陷倉(cāng)庫(kù)中識(shí)別缺陷引入變更的通用框架[30].為即時(shí)缺陷預(yù)測(cè)技術(shù)命名的研究者Kamei等人評(píng)價(jià)SZZ算法是修改了缺陷預(yù)測(cè)研究領(lǐng)域的游戲規(guī)則(game changer),促進(jìn)了即時(shí)缺陷預(yù)測(cè)技術(shù)誕生和發(fā)展[31].
SZZ算法的一般框架包含了4個(gè)步驟,圖3使用Apache項(xiàng)目ActiveMQ中的一個(gè)缺陷(AMQ-1381)作為一個(gè)具體的例子來(lái)詳細(xì)描述這個(gè)算法框架的4個(gè)步驟.
(1) 識(shí)別缺陷修復(fù)變更.掃描存儲(chǔ)在版本控制系統(tǒng)的所有歷史數(shù)據(jù),即所有代碼變更,識(shí)別日志中包含缺陷ID的代碼變更.這些代碼變更被識(shí)別為缺陷修復(fù)變更.如圖2所示,識(shí)別修復(fù)AMQ-1381的代碼變更ID為645599.
(2) 識(shí)別被修復(fù)的缺陷代碼.利用版本控制系統(tǒng)實(shí)現(xiàn)的 diff算法來(lái)識(shí)別上述修復(fù)缺陷的代碼變更修改的代碼行.這些被修改的代碼行被識(shí)別為缺陷代碼.如圖2所示,被代碼變更#645599修改的代碼中包含一個(gè)函數(shù)聲明,其中,Command參數(shù)類(lèi)型是錯(cuò)誤的,它的正確類(lèi)型是Object而不是Command.
(3) 識(shí)別可能的缺陷引入變更.使用代碼版本控制系統(tǒng)中的annotate命令回溯代碼變更提交歷史,第1次引入缺陷代碼的變更被識(shí)別為可能的缺陷引入變更.如圖2所示,代碼變更#447068引入了在第2步中發(fā)現(xiàn)的錯(cuò)誤函數(shù)聲明.
(4) 噪音數(shù)據(jù)消除.從可能的缺陷引入變更中去除可能存在的噪音數(shù)據(jù).噪音數(shù)據(jù)是指被誤標(biāo)記為引入缺陷而實(shí)際未引入缺陷的變更(false positive).Sliwerski等人提出,缺陷引入變更應(yīng)當(dāng)在該缺陷被報(bào)告之前被提交[30].因此,提交時(shí)間晚于缺陷報(bào)告時(shí)間的代碼變更在SZZ實(shí)現(xiàn)中會(huì)被當(dāng)作噪音去除.圖2中所示代碼變更#447608的提交時(shí)間在缺陷報(bào)告創(chuàng)建時(shí)間之前,因此,這個(gè)代碼變更最終被確認(rèn)是引入缺陷AMQ-1381的代碼變更.
Fig.3 General framework of the SZZ algorithm圖3 SZZ算法一般框架
由于SZZ算法在眾多軟件工程研究工作中的基礎(chǔ)性地位,研究者開(kāi)始關(guān)注SZZ產(chǎn)生數(shù)據(jù)的質(zhì)量[32-34].在這些工作中,研究者們發(fā)現(xiàn)原始 SZZ產(chǎn)生的數(shù)據(jù)存在噪音,進(jìn)一步地,他們對(duì) SZZ的噪音數(shù)據(jù)進(jìn)行處理,提出了不同類(lèi)型的改進(jìn)版SZZ實(shí)現(xiàn).為描述方便,本文將Sliwerski等人提出的基礎(chǔ)SZZ實(shí)現(xiàn)稱作Basic SZZ,簡(jiǎn)稱B-SZZ.
本節(jié)對(duì)研究者們?cè)贐-SZZ基礎(chǔ)上做出不同版本的改進(jìn)SZZ進(jìn)行簡(jiǎn)要概述.主要包括以下3種.
· Annotation Graph SZZ (AG-SZZ)
Kim等人注意到,B-SZZ在第2步和第3步中都引入了噪音數(shù)據(jù).他們發(fā)現(xiàn),B-SZZ在執(zhí)行第2步時(shí)會(huì)錯(cuò)誤地把空行、注釋行以及代碼風(fēng)格的修改識(shí)別為用于缺陷修復(fù)代碼;并且,B-SZZ在執(zhí)行第 3步時(shí)錯(cuò)誤地把對(duì)代碼風(fēng)格的修改識(shí)別為引入缺陷的代碼修改.而事實(shí)上,這些代碼修改不會(huì)對(duì)軟件行為造成任何影響.為了避免這些噪音,Kim等人提出 SZZ算法在第 2步中忽略對(duì)空行、注釋行以及代碼風(fēng)格的修改,并且在第 3步中使用Annotation Graph來(lái)對(duì)代碼變更提交歷史進(jìn)行追蹤,識(shí)別可能的缺陷引入變更[32].其中,Annotation Graph是一種對(duì)軟件代碼演進(jìn)過(guò)程的追蹤工具[35],其基本思路在于利用版本控制系統(tǒng)的 diff算法,追蹤每次代碼變更中對(duì)代碼的增加、刪除以及修改.因此,Annotation Graph可以幫助SZZ在第3步中發(fā)現(xiàn)對(duì)代碼風(fēng)格的修改,忽略這種修改繼續(xù)追蹤代碼提交歷史,識(shí)別真正引入缺陷的代碼變更.
· Meta-changeAware SZZ (MA-SZZ)
Da Costa等人發(fā)現(xiàn),AG-SZZ產(chǎn)生的數(shù)據(jù)中仍然存在噪音.他們發(fā)現(xiàn),AG-SZZ會(huì)把創(chuàng)建分支、合并分支以及修改文件屬性的代碼變更識(shí)別為缺陷引入變更[33].Da Costa等人將創(chuàng)建分支、合并分支以及修改文件屬性的代碼變更稱為元變更(meta-change).事實(shí)上,元變更不會(huì)對(duì)軟件行為造成影響.這種噪音的產(chǎn)生是由于 AG-SZZ在第 3步追溯代碼提交歷史的過(guò)程中遇到元變更會(huì)被阻斷,從而將元變更識(shí)別為引入缺陷的代碼變更.為了去除這些噪音,Da Costa等人在 AG-SZZ的基礎(chǔ)上進(jìn)行改進(jìn),提出元變更感知 SZZ(Meta-change Aware SZZ),簡(jiǎn)稱MA-SZZ.MA-SZZ在第3步追蹤代碼變更提交歷史的過(guò)程中會(huì)忽略元變更,識(shí)別真正引入缺陷的代碼變更.
· Refactoring Aware SZZ (RA-SZZ).
Kim等人指出,SZZ可能會(huì)將重構(gòu)代碼變更識(shí)別為引入缺陷的代碼變更[32].重構(gòu)代碼是一種既不會(huì)更改軟件的外部行為也不會(huì)提升軟件內(nèi)部結(jié)構(gòu)的代碼修改過(guò)程[36].Neto等人對(duì)重構(gòu)代碼對(duì)SZZ算法的影響進(jìn)行了分析[34].他們指出,SZZ在第2步時(shí)會(huì)錯(cuò)誤地把代碼重構(gòu)識(shí)別為用于修復(fù)缺陷的代碼修改,并且在第3步中會(huì)錯(cuò)誤地把代碼重構(gòu)識(shí)別為引入缺陷的代碼修改.為了處理這些噪音,Neto等人在MA-SZZ的基礎(chǔ)上提出了重構(gòu)感知SZZ(refactoring aware SZZ),簡(jiǎn)稱RA-SZZ.在RA-SZZ中,Neto等人通過(guò)將RefDiff工具集成到SZZ中,實(shí)現(xiàn)對(duì)重構(gòu)代碼進(jìn)行檢測(cè).RefDiff是一種用于檢測(cè)Java代碼中代碼重構(gòu)修改的工具[37].RA-SZZ在執(zhí)行第2步時(shí)會(huì)忽略由RefDiff檢測(cè)出的代碼重構(gòu)修改,并且在第3步追蹤代碼變更提交歷史過(guò)程中,忽略由RefDiff檢測(cè)出的代碼重構(gòu)修改,識(shí)別真正引入缺陷的代碼變更.然而,RefDiff在實(shí)際使用中存在局限性,因此限制了RA-SZZ的實(shí)際應(yīng)用.比如,RefDiff只能用于檢測(cè)Java代碼中的代碼重構(gòu),因此對(duì)RA-SZZ造成了程序語(yǔ)言的限制.
表1展示了現(xiàn)有工作中研究者們提出的不同數(shù)據(jù)標(biāo)注方法及其消除的噪音類(lèi)型.表中False Positive、False Negative分別指被誤標(biāo)記而實(shí)際未引入缺陷的變更、未被識(shí)別出的真正引入缺陷的變更.
Table 1 Summary of different SZZ implementations表1 不同SZZ實(shí)現(xiàn)算法概要
在即時(shí)缺陷預(yù)測(cè)技術(shù)中,特征提取是指利用代碼變更原始數(shù)據(jù)計(jì)算特征來(lái)表征變更的過(guò)程.該步驟是即時(shí)缺陷預(yù)測(cè)技術(shù)的關(guān)鍵步驟.我們分兩小節(jié)對(duì)特征提取進(jìn)行描述:第1.2.1節(jié)按照時(shí)間順序概括即時(shí)缺陷預(yù)測(cè)研究中特征提取技術(shù)的研究進(jìn)展;第 1.2.2節(jié)對(duì)現(xiàn)有工作提出的特征歸納總結(jié),并將所有特征劃分為 9個(gè)維度進(jìn)行介紹.
1.2.1 特征提取研究進(jìn)展
即時(shí)缺陷預(yù)測(cè)研究者先后提出了不同類(lèi)型的變更特征,包括基于變更元數(shù)據(jù)的特征、基于變更代碼內(nèi)容的特征、基于軟件演進(jìn)過(guò)程的特征和基于多源軟件制品的特征.本節(jié)按照時(shí)間的先后順序分別對(duì)這4種特征進(jìn)行概述.
· 基于變更元數(shù)據(jù)的特征
變更元數(shù)據(jù)是指描述變更屬性(例如開(kāi)發(fā)者、提交時(shí)間、變更日志、修改文件、每個(gè)文件增加和減少的代碼行數(shù)等)的數(shù)據(jù),這些元數(shù)據(jù)可以直接通過(guò)軟件項(xiàng)目變更提交記錄獲取.基于變更元數(shù)據(jù),Mockus等人提出了變更增加減少行數(shù)、修改文件數(shù)量、開(kāi)發(fā)者經(jīng)驗(yàn)、變更類(lèi)型等特征[29].這些特征具有堅(jiān)實(shí)的實(shí)證研究基礎(chǔ)[38-41],它們?nèi)菀桌斫馇矣?jì)算簡(jiǎn)單.由于代碼變更提交記錄可以直接通過(guò)軟件項(xiàng)目的版本控制系統(tǒng)獲取,這些特征可以應(yīng)用到大量軟件項(xiàng)目中,具有普遍性.在后續(xù)工作中,這些特征得到了廣泛的使用[17-28].
· 基于變更代碼內(nèi)容的特征
基于變更元數(shù)據(jù)的特征對(duì)于表征變更是不完整的,這些特征并沒(méi)有考慮變更具體修改的代碼內(nèi)容.因此,研究者們提出了基于變更代碼內(nèi)容的特征.Kim等人基于實(shí)證研究成果,提出了使用代碼復(fù)雜度特征來(lái)表征變更[17,42,43];同時(shí),他們還使用代碼變更代碼、日志和文件名的詞頻率特征來(lái)量化代碼變更內(nèi)容.Jiang等人提出使用變更提交前后相關(guān)代碼文件的抽象語(yǔ)法樹(shù)相同類(lèi)型節(jié)點(diǎn)數(shù)量的差值表征變更[20],這些特征依賴變更具體的代碼內(nèi)容.研究者們將這些基于變更代碼內(nèi)容的特征與基于變更元數(shù)據(jù)的特征結(jié)合,構(gòu)建預(yù)測(cè)模型[17,20].
與基于變更元數(shù)據(jù)的特征相比,基于變更代碼內(nèi)容的特征數(shù)量明顯增加.比如,變更詞頻率特征有成千上萬(wàn)個(gè)[21].特征過(guò)多容易造成著名的維度災(zāi)難問(wèn)題[44].Shivaji等人指出,特征過(guò)多對(duì)即時(shí)缺陷預(yù)測(cè)模型產(chǎn)生負(fù)面影響,使用特征選擇減少特征數(shù)量可以顯著提升預(yù)測(cè)模型的性能[21].因此,在使用基于變更代碼內(nèi)容的特征時(shí),需要進(jìn)行特征選擇.
在計(jì)算基于變更代碼內(nèi)容的特征時(shí),需要先提取變更相關(guān)文件在變更提交前后的代碼內(nèi)容,然后對(duì)變更前后的文件內(nèi)容分別計(jì)算復(fù)雜度特征和詞頻率特征及構(gòu)建抽象語(yǔ)法樹(shù)[17,20].與基于變更元數(shù)據(jù)的特征相比,這些特征計(jì)算難度較大而且比較費(fèi)時(shí).對(duì)于不同編程語(yǔ)言,代碼復(fù)雜度計(jì)算以及抽象語(yǔ)法樹(shù)構(gòu)建存在差異,使這些特征的實(shí)用性受到影響.
· 基于軟件演進(jìn)過(guò)程的特征
在后續(xù)的即時(shí)缺陷預(yù)測(cè)工作中,研究者們受傳統(tǒng)缺陷預(yù)測(cè)研究的啟發(fā),提出了基于軟件演進(jìn)過(guò)程的變更特征,即基于項(xiàng)目代碼修改歷史量化變更.
傳統(tǒng)的缺陷預(yù)測(cè)研究表明,基于軟件演進(jìn)過(guò)程的特征(例如文件修改次數(shù))比基于代碼內(nèi)容的靜態(tài)特征對(duì)于預(yù)測(cè)缺陷更加有效[45].Kamei等人提出從文件修改歷史角度提取變更特征,例如變更相關(guān)文件被修改的次數(shù)、修改變更相關(guān)文件的開(kāi)發(fā)者人數(shù)等[19].相對(duì)于基于變更代碼內(nèi)容的特征,這些特征數(shù)量顯著減少,避免了維度災(zāi)難問(wèn)題和模型構(gòu)建的大量開(kāi)銷(xiāo).同時(shí),Kamei等人提出的基于文件修改歷史的特征可以直接通過(guò)變更提交歷史記錄計(jì)算.因此,這些特征具備普遍性.在后續(xù)的即時(shí)缺陷預(yù)測(cè)工作中,這些特征被廣泛應(yīng)用[22,24-28].
· 基于多源軟件制品的特征
上述 3種變更特征的提取都是基于軟件項(xiàng)目的代碼版本控制系統(tǒng).近年來(lái),軟件工程研究者發(fā)現(xiàn),即時(shí)缺陷預(yù)測(cè)與多源軟件制品相關(guān).例如變更提交過(guò)程中,除版本控制系統(tǒng)外,開(kāi)發(fā)者會(huì)在軟件項(xiàng)目多個(gè)管理系統(tǒng)對(duì)變更進(jìn)行審查、測(cè)試等操作[46].因此,有研究者提出結(jié)合多源軟件制品提取多維代碼變更特征來(lái)增強(qiáng)即時(shí)缺陷預(yù)測(cè)性能.例如,McIntosh等人首次從項(xiàng)目的代碼審查系統(tǒng)提取特征來(lái)表征代碼變更[28].由于現(xiàn)代軟件項(xiàng)目中對(duì)代碼審查的廣泛使用,這些基于代碼審查系統(tǒng)的特征具備普遍性.在后續(xù)的工作中,它們可能會(huì)得到更多的應(yīng)用.
1.2.2 特征類(lèi)型
現(xiàn)有的工作中,研究者提取了大量特征用于表征代碼變更.本節(jié)在第1.2.1節(jié)的基礎(chǔ)上對(duì)現(xiàn)有即時(shí)缺陷預(yù)測(cè)研究提出的變更特征進(jìn)一步歸納總結(jié),第1.2.1節(jié)的4種類(lèi)型變更特征被進(jìn)一步分為9個(gè)維度,包括規(guī)模(size)、代碼分布(diffusion)、目標(biāo)(purpose)、開(kāi)發(fā)者經(jīng)驗(yàn)(developer experience)、復(fù)雜度(complexity)、文本(text)、代碼結(jié)構(gòu)(structure)、文件修改歷史(file history)和代碼審查(code review).
基于變更元數(shù)據(jù)的特征包括規(guī)模、代碼分布、目標(biāo)和開(kāi)發(fā)者經(jīng)驗(yàn)等特征維度.
· 規(guī)模維度:該維度用來(lái)表征變更修改代碼的規(guī)模.
Moser等人觀察到:變更修改代碼規(guī)模越大,越有可能引入缺陷[45].現(xiàn)有的工作中,研究者們都使用變更增加、減少代碼行數(shù)來(lái)量化變更規(guī)模[17-24,28,29].此外,研究者們使用其他粒度對(duì)變更代碼規(guī)模進(jìn)行量化.Shihab等人提出使用變更增加和減少代碼段(chunk)數(shù)來(lái)量化變更規(guī)模[18].Kamei等人提出使用變更提交前變更相關(guān)文件代碼行數(shù)量化變更規(guī)模[19].同時(shí),Kamei等人發(fā)現(xiàn),變更增加行數(shù)和減少代碼行數(shù)是高度相關(guān)的.為了避免這種相關(guān)性對(duì)預(yù)測(cè)模型造成影響,Kamei等人提出使用相對(duì)增加行數(shù)和相對(duì)減少行數(shù)量化變更規(guī)模.相對(duì)增加行數(shù)、相對(duì)減少行數(shù)分別指變更實(shí)際增加、減少行數(shù)與變更提交前其相關(guān)文件代碼行數(shù)的比值[47].
· 代碼分布維度:該維度用來(lái)表征變更修改代碼在相關(guān)文件中的分布.
研究表明,對(duì)于修改代碼分布在多個(gè)文件的變更,其開(kāi)發(fā)者需要理解更多代碼,因此,這種更加分散的代碼變更有可能引入缺陷[48].Kamei等人提出使用變更修改的文件數(shù)量、文件夾數(shù)量和子系統(tǒng)數(shù)量等特征來(lái)量化變更代碼分布[19].Hassan提出使用變更代碼分布的信息熵(entropy)預(yù)測(cè)缺陷,并且驗(yàn)證了該特征的有效性[11].因此,Kamei等人提出使用該特征對(duì)有缺陷變更進(jìn)行預(yù)測(cè)[19].
· 目標(biāo)維度:該維度用來(lái)表征提交代碼變更的目標(biāo).
開(kāi)發(fā)者提交變更的目標(biāo)包括修復(fù)缺陷、實(shí)現(xiàn)新功能、重構(gòu)、增加文檔等[49].研究表明,修改缺陷的變更比其他類(lèi)型變更更復(fù)雜,更有可能引入缺陷[30].因此,在大量即時(shí)缺陷預(yù)測(cè)工作中,研究者利用變更是否修復(fù)缺陷作為特征[18,19,22,24,28].此外,Shihab等人還提出使用變更相關(guān)缺陷報(bào)告的數(shù)量來(lái)量化代碼變更目標(biāo)[18].
· 開(kāi)發(fā)者經(jīng)驗(yàn)維度:該維度用來(lái)量化代碼變更的開(kāi)發(fā)者經(jīng)驗(yàn).
研究表明,開(kāi)發(fā)者經(jīng)驗(yàn)會(huì)影響軟件質(zhì)量[50].在即時(shí)缺陷預(yù)測(cè)工作中,研究者都利用變更開(kāi)發(fā)者己提交變更數(shù)量量化開(kāi)發(fā)者經(jīng)驗(yàn)[17-24,28].此外,Kamei等人提出使用開(kāi)發(fā)者近期提交變更的數(shù)量以及變更提交前,開(kāi)發(fā)者己提交變更中影響該變更相關(guān)子系統(tǒng)的變更數(shù)量量化開(kāi)發(fā)者經(jīng)驗(yàn)[19].McIntosh等人提出使用變更提交前,開(kāi)發(fā)者己提交變更中影響該變更相關(guān)子系統(tǒng)的變更占版本控制系統(tǒng)中所有影響這些子系統(tǒng)變更的比例,來(lái)量化開(kāi)發(fā)者對(duì)這些子系統(tǒng)的開(kāi)發(fā)經(jīng)驗(yàn)[28].
表2中歸納了基于變更元數(shù)據(jù)的特征及其使用動(dòng)機(jī).
Table 2 Summary of features based on meta-data of changes表2 基于變更元數(shù)據(jù)的特征概要
基于變更代碼內(nèi)容的特征包括復(fù)雜度、文本和代碼結(jié)構(gòu)等特征維度.
· 復(fù)雜度維度:該維度用來(lái)表征變更修改代碼的復(fù)雜度.
在傳統(tǒng)的缺陷預(yù)測(cè)工作中,研究者們通常使用文件或者模塊代碼的復(fù)雜度來(lái)預(yù)測(cè)文件或者模塊中是否存在缺陷[43,51].研究者發(fā)現(xiàn),越復(fù)雜的代碼越容易引入缺陷[52].Kim等人將描述文件代碼復(fù)雜度的特征引入到即時(shí)缺陷預(yù)測(cè)技術(shù)中[17].為了量化變更引起的代碼復(fù)雜度變化,他們對(duì)變更提交前后該變更相關(guān)文件的代碼內(nèi)容分別計(jì)算了61個(gè)復(fù)雜度指標(biāo),計(jì)算對(duì)應(yīng)復(fù)雜度指標(biāo)的差值作為特征對(duì)有缺陷變更進(jìn)行預(yù)測(cè).
· 文本維度:該維度利用詞袋(bag of words)模型從變更修改代碼、日志和文件名中提取詞頻率特征.
詞袋模型是一種將文本表示為詞頻率向量的方法[53].Kim等人將變更文本特征引入到即時(shí)缺陷預(yù)測(cè)技術(shù)中[17].對(duì)于變更日志和相關(guān)目錄名、文件名,他們利用詞袋模型將它們轉(zhuǎn)換為詞頻率向量.為了量化變更引起的代碼內(nèi)容變化,他們對(duì)變更前后該變更相關(guān)文件的代碼內(nèi)容分別計(jì)算詞頻率特征,計(jì)算相應(yīng)詞頻率的差值,并且使用這些差值作為變更特征.
· 代碼結(jié)構(gòu)維度:該維度用于量化代碼變更前后代碼結(jié)構(gòu)的差異.
即時(shí)缺陷預(yù)測(cè)研究者通過(guò)抽象語(yǔ)法樹(shù)(abstract syntax tree,簡(jiǎn)稱AST)來(lái)量化代碼的結(jié)構(gòu),從而計(jì)算代碼變更前后的代碼結(jié)構(gòu)差異[20,23].抽象語(yǔ)法樹(shù)是一種表示源代碼抽象結(jié)構(gòu)的工具[54].在抽象語(yǔ)法樹(shù)中,源代碼中的條件語(yǔ)句、循環(huán)語(yǔ)句和函數(shù)等表示為不同類(lèi)型的節(jié)點(diǎn).Jiang等人提出使用在變更提交前后,該變更相關(guān)文件抽象語(yǔ)法樹(shù)中相同類(lèi)型節(jié)點(diǎn)的數(shù)量差量化變更引起的代碼結(jié)構(gòu)變化[20].
表3中歸納了基于變更代碼內(nèi)容的特征及其使用動(dòng)機(jī).
Table 3 Summary of features based on changed code表3 基于變更代碼內(nèi)容的特征概要
基于軟件演進(jìn)過(guò)程的特征包括文本修改歷史維度.
· 文件修改歷史維度:該維度用來(lái)量化變更相關(guān)文件的修改歷史.
實(shí)證研究表明,文件修改歷史越復(fù)雜(例如被多次修改、被多個(gè)開(kāi)發(fā)者修改等),其越有可能存在缺陷[45,55,56].鑒于此,即時(shí)缺陷預(yù)測(cè)研究者提出使用變更提交前變更相關(guān)文件的修改次數(shù)、修改這些文件的開(kāi)發(fā)者人數(shù)作為特征量化文件修改歷史對(duì)有缺陷變更進(jìn)行預(yù)測(cè)[18,19,22,24,28].此外,Shihab等人提出使用修改變更相關(guān)文件的歷史變更中缺陷修復(fù)變更的數(shù)量量化變更相關(guān)文件的修改歷史[18].Kamei等人提出使用變更提交前修改該變更相關(guān)文件的最近變更與該變更的時(shí)間差作為特征量化變更文件的修改歷史[19].
表4中歸納了基于軟件演進(jìn)過(guò)程的特征及其使用動(dòng)機(jī).
Table 4 Summary of features based on software evolution process表4 基于軟件演進(jìn)過(guò)程的特征概要
基于多源軟件制品的特征包括代碼審查維度.
· 代碼審查維度:該維度用來(lái)量化變更被合并到項(xiàng)目代碼倉(cāng)庫(kù)前的代碼審查過(guò)程.
近年來(lái),現(xiàn)代代碼審查被廣泛應(yīng)用到開(kāi)源與商業(yè)項(xiàng)目中.實(shí)證研究表明,代碼審查質(zhì)量與軟件缺陷相關(guān)[57].因此,McIntosh等人將代碼審查過(guò)程的特征引入到即時(shí)缺陷預(yù)測(cè)研究中.他們提出,使用變更審查過(guò)程中變更被重復(fù)修正的次數(shù)、審查人數(shù)、審查意見(jiàn)數(shù)量以及審查時(shí)間等特征來(lái)量化對(duì)變更的代碼審查質(zhì)量[28].
表5中歸納了基于多源軟件制品的特征及其使用動(dòng)機(jī).
Table 5 Summary of features based on different artifacts of multiple repositories表5 基于多源軟件制品的特征概要
現(xiàn)有的即時(shí)缺陷預(yù)測(cè)技術(shù)模型構(gòu)建方法主要包括兩種類(lèi)型:有監(jiān)督(supervised)建模技術(shù)和無(wú)監(jiān)督(unsupervised)建模技術(shù)[27].本節(jié)將分別對(duì)有監(jiān)督和無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)兩種建模技術(shù)進(jìn)行介紹.
1.3.1 有監(jiān)督建模
有監(jiān)督即時(shí)缺陷預(yù)測(cè)是指利用有監(jiān)督機(jī)器學(xué)習(xí)方法,從己知標(biāo)簽(標(biāo)簽即是否存在缺陷)的代碼變更數(shù)據(jù)中學(xué)習(xí),從而構(gòu)建預(yù)測(cè)模型的建模技術(shù).現(xiàn)有工作中,大多數(shù)即時(shí)缺陷預(yù)測(cè)工作使用了有監(jiān)督建模技術(shù)[17-20,22-24,28].其一般過(guò)程包括:
(1) 數(shù)據(jù)標(biāo)注.利用數(shù)據(jù)標(biāo)注技術(shù),將歷史代碼變更標(biāo)記為有缺陷或無(wú)缺陷.
(2) 特征提取.從代碼變更的不同角度提取特征,并用特征向量來(lái)表示每個(gè)代碼變更.
(3) 模型訓(xùn)練.利用有監(jiān)督機(jī)器學(xué)習(xí)技術(shù),從標(biāo)注后的代碼變更數(shù)據(jù)中學(xué)習(xí),構(gòu)建分類(lèi)或回歸模型.
(4) 模型應(yīng)用.當(dāng)有新的代碼變更提交時(shí),應(yīng)用預(yù)測(cè)模型預(yù)測(cè)該代碼變更存在缺陷的可能性.
此外,根據(jù)訓(xùn)練數(shù)據(jù)的來(lái)源不同,有監(jiān)督即時(shí)缺陷預(yù)測(cè)又可以分為同項(xiàng)目(within-project)即時(shí)缺陷預(yù)測(cè)和跨項(xiàng)目(cross-project)即時(shí)缺陷預(yù)測(cè)兩種建模技術(shù).
· 同項(xiàng)目即時(shí)缺陷預(yù)測(cè).
同項(xiàng)目即時(shí)缺陷預(yù)測(cè)是指訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)來(lái)自同一個(gè)項(xiàng)目,即:使用同項(xiàng)目的歷史代碼變更數(shù)據(jù)進(jìn)行訓(xùn)練,利用有監(jiān)督學(xué)習(xí)技術(shù)構(gòu)建預(yù)測(cè)模型[17-21,23,26-28].要使預(yù)測(cè)模型取得良好的性能,其前提條件是預(yù)測(cè)目標(biāo)項(xiàng)目中擁有足夠多的歷史數(shù)據(jù).現(xiàn)代大型軟件項(xiàng)目中都存在大量變更數(shù)據(jù),為同項(xiàng)目即時(shí)缺陷預(yù)測(cè)建模技術(shù)提供了數(shù)據(jù)基礎(chǔ).而同一個(gè)項(xiàng)目中引入缺陷的代碼修改具備相似性,使用預(yù)測(cè)目標(biāo)項(xiàng)目的歷史數(shù)據(jù)來(lái)構(gòu)建預(yù)測(cè)模型可以取得較高的性能.因此,大量即時(shí)缺陷技術(shù)的應(yīng)用研究都采用了同項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)[18-21,23,28].
然而,同項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)的缺點(diǎn)在于:如果預(yù)測(cè)目標(biāo)項(xiàng)目是新項(xiàng)目,這樣的項(xiàng)目無(wú)法為同項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)提供足量已知標(biāo)簽的歷史數(shù)據(jù)用于訓(xùn)練模型[22,24].
· 跨項(xiàng)目即時(shí)缺陷預(yù)測(cè).
為應(yīng)對(duì)項(xiàng)目?jī)?nèi)的即時(shí)缺陷預(yù)測(cè)技術(shù)在對(duì)新項(xiàng)目預(yù)測(cè)時(shí)缺乏訓(xùn)練數(shù)據(jù)的問(wèn)題,軟件工程領(lǐng)域的研究者提出了跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)建模技術(shù)[22,24].跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)建模技術(shù)是指訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)來(lái)自不同項(xiàng)目,即:使用其他項(xiàng)目的歷史變更數(shù)據(jù)訓(xùn)練預(yù)測(cè)模型,利用該模型在目標(biāo)項(xiàng)目上完成預(yù)測(cè)[22,24].
Fukushima等人首次提出并研究了跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)[22],他們?cè)诤罄m(xù)工作中對(duì)這一技術(shù)進(jìn)行了進(jìn)一步分析[24].這些分析研究表明,與同項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)相比,跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)在大多數(shù)情況下存在著性能劣勢(shì).為了應(yīng)對(duì)跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)的性能劣勢(shì),他們提出了 3種方法可以有效提高跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)技術(shù)的性能:1) 使用相似的軟件項(xiàng)目變更數(shù)據(jù)作為訓(xùn)練集;2) 使用多個(gè)項(xiàng)目融合后的變更數(shù)據(jù)作為訓(xùn)練集;3) 使用多個(gè)項(xiàng)目的變更數(shù)據(jù)分別作為訓(xùn)練集訓(xùn)練模型,在預(yù)測(cè)時(shí)以投票方式獲得預(yù)測(cè)結(jié)果.這些研究成果為實(shí)踐中跨項(xiàng)目即時(shí)缺陷預(yù)測(cè)的應(yīng)用提供了指導(dǎo).
1.3.2 無(wú)監(jiān)督建模
有監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)的缺點(diǎn)在于需要消耗大量的資源,因?yàn)橛斜O(jiān)督建模技術(shù)需要利用大量已知標(biāo)簽的訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練預(yù)測(cè)模型[25].為應(yīng)對(duì)這一挑戰(zhàn),研究者提出了無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)[25].
無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)是指利用未知標(biāo)簽變更數(shù)據(jù)構(gòu)建預(yù)測(cè)模型的技術(shù).與有監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)相比,無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)的優(yōu)點(diǎn)在于更符合實(shí)際使用過(guò)程的需要.無(wú)監(jiān)督的預(yù)測(cè)模型在構(gòu)建時(shí)不需要使用有標(biāo)簽的數(shù)據(jù),因此節(jié)省了數(shù)據(jù)標(biāo)注的開(kāi)銷(xiāo).其一般過(guò)程包括:
(1) 特征提取.從代碼變更的不同角度提取特征,并用特征向量來(lái)表示每個(gè)代碼變更.
(2) 模型構(gòu)建.基于代碼變更特征構(gòu)建無(wú)監(jiān)督模型.目前,在即時(shí)缺陷預(yù)測(cè)領(lǐng)域,主要是基于變更特征排序的方法,這種方法通過(guò)對(duì)新提交的變更排序,對(duì)開(kāi)發(fā)者審查任務(wù)進(jìn)行調(diào)度,使開(kāi)發(fā)者在審查一定量代碼情況下找到更多缺陷,即工作量感知的即時(shí)缺陷預(yù)測(cè).
Yang等人首次提出了無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)[25].實(shí)證研究表明,代碼存在缺陷數(shù)量與代碼規(guī)模具有對(duì)數(shù)關(guān)系[16].因此,與規(guī)模巨大的代碼變更相比,審查小變更時(shí)發(fā)現(xiàn)缺陷所需工作量更少.Yang等人基于該發(fā)現(xiàn),提出了基于變更特征排序的方法,使開(kāi)發(fā)者按照該排序?qū)彶樽兏a時(shí),在一定審查工作量下找到更多缺陷.比如,使用變更修改文件數(shù)量作為排序的特征,將文件數(shù)量少的變更排在更高的優(yōu)先級(jí).Yang等人對(duì) 12個(gè)變更特征分別建立類(lèi)似的無(wú)監(jiān)督模型,然后在 6個(gè)項(xiàng)目數(shù)據(jù)上進(jìn)行驗(yàn)證后發(fā)現(xiàn),部分無(wú)監(jiān)督模型相對(duì)于有監(jiān)督即時(shí)缺陷預(yù)測(cè)模型能夠?qū)﹂_(kāi)發(fā)者代碼審查工作進(jìn)行更合理的調(diào)度.同樣檢查占總共修改代碼行數(shù) 20%的代碼,與有監(jiān)督即時(shí)缺陷預(yù)測(cè)模型相比,無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)模型能夠使開(kāi)發(fā)者檢查到更多缺陷引入變更.
Yang等人提出的無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)引起了相關(guān)研究者的關(guān)注,Huang等人和 Fu等人分別對(duì) Yang等人的無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)做了進(jìn)一步的分析[26,27].這些研究通過(guò)將無(wú)監(jiān)督和有監(jiān)督建模技術(shù)的分析,揭示了無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)的缺點(diǎn),主要體現(xiàn)在以下幾個(gè)方面:首先,同樣檢查 20%的代碼,無(wú)監(jiān)督缺陷預(yù)測(cè)模型向開(kāi)發(fā)者推薦的可能引入缺陷的變更數(shù)量遠(yuǎn)遠(yuǎn)超過(guò)有監(jiān)督即時(shí)缺陷預(yù)測(cè)模型,而檢查更多代碼變更需要消耗更多人力、物力[26];其次,無(wú)監(jiān)督缺陷預(yù)測(cè)模型誤報(bào)率比有監(jiān)督缺陷預(yù)測(cè)模型高很多[26].Fu等人指出先使用有標(biāo)簽的訓(xùn)練數(shù)據(jù)選擇合適的特征,然后實(shí)施Yang等人的無(wú)監(jiān)督方法,能夠達(dá)到更好的效果[27].
盡管Yang等人提出的無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)有上述缺陷,他們提出的對(duì)于有監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)所面臨的挑戰(zhàn)是需要研究者重視的,并且他們提出無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)建模技術(shù)可以作為可選解決方案在實(shí)際中運(yùn)用.
在即時(shí)缺陷預(yù)測(cè)工作中,為了驗(yàn)證和對(duì)比模型效果,研究者需要對(duì)提出的缺陷預(yù)測(cè)模型進(jìn)行實(shí)驗(yàn)驗(yàn)證,并通過(guò)不同的評(píng)價(jià)指標(biāo)對(duì)模型性能進(jìn)行評(píng)估.本節(jié)將詳細(xì)介紹在即時(shí)缺陷預(yù)測(cè)研究中使用的實(shí)驗(yàn)驗(yàn)證方法和性能指標(biāo).
實(shí)驗(yàn)驗(yàn)證方法是指在模型評(píng)估中如何將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集.本節(jié)詳細(xì)描述當(dāng)前即時(shí)缺陷預(yù)測(cè)研究中的常用的兩種實(shí)驗(yàn)驗(yàn)證方法:交叉驗(yàn)證(cross validation)和對(duì)時(shí)間感知(time-wise)的驗(yàn)證方法.
2.1.1 交叉驗(yàn)證
交叉驗(yàn)證是機(jī)器學(xué)習(xí)領(lǐng)域常用的模型驗(yàn)證方法[58].大部分的即時(shí)缺陷預(yù)測(cè)的工作都采用了10折交叉驗(yàn)證的方法[17-22,24].此外,Yang等人使用了10次10折交叉驗(yàn)證方法驗(yàn)證缺陷預(yù)測(cè)模型的性能[25].在10折交叉驗(yàn)證中,首先需要隨機(jī)打亂數(shù)據(jù)集,然后將數(shù)據(jù)集分為10等份,即10折,之后,對(duì)每1折都作為測(cè)試集,另外9折作為訓(xùn)練集,訓(xùn)練預(yù)測(cè)模型并進(jìn)行驗(yàn)證計(jì)算性能指標(biāo),一共運(yùn)行 10次實(shí)驗(yàn),最后將每次得到的性能指標(biāo)求平均值作為10折交叉驗(yàn)證的評(píng)估結(jié)果.而在10次10折交叉驗(yàn)證中,則是將上述10折交叉驗(yàn)證運(yùn)行10次,一共運(yùn)行10×10次實(shí)驗(yàn),將每次得到的性能指標(biāo)求平均值作為10次10折交叉驗(yàn)證的評(píng)估結(jié)果.
2.1.2 時(shí)間感知驗(yàn)證
近年來(lái),研究者對(duì)即時(shí)缺陷預(yù)測(cè)的驗(yàn)證方法有了更多的關(guān)注與爭(zhēng)論[23,28].Tan等人指出,交叉驗(yàn)證方法對(duì)于即時(shí)缺陷預(yù)測(cè)技術(shù)是不適合的,因?yàn)樽兏鼣?shù)據(jù)產(chǎn)生具有時(shí)間順序,在交叉驗(yàn)證中隨機(jī)打亂數(shù)據(jù)集進(jìn)行數(shù)據(jù)劃分,會(huì)導(dǎo)致預(yù)測(cè)模型使用未來(lái)代碼變更信息來(lái)預(yù)測(cè)過(guò)去代碼變更的標(biāo)簽,從而高估預(yù)測(cè)模型的性能[23].McInstosh等人發(fā)現(xiàn),引入缺陷代碼變更的性質(zhì)會(huì)隨著時(shí)間改變[28].這種改變會(huì)影響即時(shí)缺陷預(yù)測(cè)模型的性能,比如,使用一年前的變更數(shù)據(jù)構(gòu)建預(yù)測(cè)模型會(huì)顯著降低模型的性能.McIntosh等人強(qiáng)調(diào),應(yīng)當(dāng)使用近期產(chǎn)生的數(shù)據(jù)來(lái)對(duì)新變更進(jìn)行預(yù)測(cè).
Yang等人針對(duì)即時(shí)缺陷預(yù)測(cè)提出了一種時(shí)間感知的驗(yàn)證方法[25],這種驗(yàn)證方法首先對(duì)數(shù)據(jù)集按照創(chuàng)建的順序來(lái)排序,然后對(duì)數(shù)據(jù)集分組,在1個(gè)月內(nèi)創(chuàng)建的數(shù)據(jù)被分為1組.在這種驗(yàn)證方法中,訓(xùn)練模型所用的數(shù)據(jù)集和測(cè)試所用的數(shù)據(jù)都是連續(xù)兩個(gè)月內(nèi)創(chuàng)建的變更數(shù)據(jù),但是訓(xùn)練集和測(cè)試集之間則間隔了 2個(gè)月.比如,使用 1月和2月創(chuàng)建的代碼變更來(lái)預(yù)測(cè)5月和6月創(chuàng)建的代碼變更.這樣驗(yàn)證有以下4點(diǎn)考慮:1) 大多數(shù)項(xiàng)目的開(kāi)發(fā)周期是6星期~8星期;2) 每個(gè)訓(xùn)練集和測(cè)試集之間都會(huì)有兩個(gè)月的時(shí)間差,這樣訓(xùn)練集中的缺陷在這2個(gè)月中會(huì)被更多地被開(kāi)發(fā)者發(fā)現(xiàn);3) 使用連續(xù)兩個(gè)月創(chuàng)建的數(shù)據(jù),保證訓(xùn)練集中有足夠多的數(shù)據(jù)用于訓(xùn)練模型;4) 允許在一個(gè)項(xiàng)目中運(yùn)行多次實(shí)驗(yàn)保證計(jì)算出的結(jié)果的可靠性.Huang等人和Fu等人也都采用了上述這種對(duì)時(shí)間感知的驗(yàn)證方法[26,27].
針對(duì)模型預(yù)測(cè)結(jié)果,研究者提出了不同的指標(biāo)來(lái)量化模型預(yù)測(cè)效果.本節(jié)詳細(xì)闡述在即時(shí)缺陷預(yù)測(cè)研究中常用的性能指標(biāo),包括機(jī)器學(xué)習(xí)領(lǐng)域常用的查準(zhǔn)率(precision)、查全率(recall)、F1-measure、正確率(accuracy)、AUC以及軟件工程領(lǐng)域的研究者提出的工作量感知(effort-aware)指標(biāo).
2.2.1 查準(zhǔn)率、查全率、正確率和F1-measure
查準(zhǔn)率、查全率、F1-measure和正確率是機(jī)器學(xué)習(xí)領(lǐng)域常用的評(píng)估預(yù)測(cè)模型的性能指標(biāo)[58],大量的即時(shí)缺陷預(yù)測(cè)研究都使用了這些性能指標(biāo)[17-21,23],其具體計(jì)算方法如下.
預(yù)測(cè)模型對(duì)于一個(gè)代碼變更的預(yù)測(cè)結(jié)果有 4種可能性:1) 將一個(gè)有缺陷的代碼變更預(yù)測(cè)為有缺陷(true positive,簡(jiǎn)稱TP);2) 將一個(gè)有缺陷的代碼變更預(yù)測(cè)為沒(méi)有缺陷(false positive,簡(jiǎn)稱FP);3) 將一個(gè)沒(méi)有缺陷的代碼變更預(yù)測(cè)為沒(méi)有缺陷(true negative,簡(jiǎn)稱TN);4) 將一個(gè)沒(méi)有缺陷的代碼變更預(yù)測(cè)為有缺陷(false negative,簡(jiǎn)稱FN).根據(jù)預(yù)測(cè)模型在測(cè)試集中這4種預(yù)測(cè)結(jié)果的數(shù)量,即可對(duì)精確率、召回率、正確率和F1-measure進(jìn)行計(jì)算.由于即時(shí)缺陷預(yù)測(cè)研究更加關(guān)注有缺陷變更的預(yù)測(cè)效果,因此本文所描述的查準(zhǔn)率、查全率和F1-measure都是針對(duì)有缺陷的代碼變更.
· 查準(zhǔn)率(precision)是指所有被正確分類(lèi)的有缺陷變更占所有被分類(lèi)為有缺陷變更的比例.
· 查全率(recall)是指所有被正確分類(lèi)的有缺陷變更占所有真正有缺陷變更的比例.
·F1-measure是結(jié)合了精確率和召回率的綜合性性能指標(biāo),它是精確率和召回率的調(diào)和平均.
· 正確率(accuracy)是指被正確分類(lèi)的代碼變更占所有代碼變更的比例.
由于在即時(shí)缺陷預(yù)測(cè)的數(shù)據(jù)中沒(méi)有缺陷的代碼變更數(shù)量遠(yuǎn)大于有缺陷的代碼變更的數(shù)量,預(yù)測(cè)模型的正確率可能非常高,但這并不意味著預(yù)測(cè)模型性能好.在評(píng)估缺陷預(yù)測(cè)模型時(shí),即時(shí)缺陷預(yù)測(cè)技術(shù)的研究者都會(huì)綜合考慮查準(zhǔn)率、查全率、F1-measure和正確率的結(jié)果.
2.2.2 AUC
在即時(shí)缺陷預(yù)測(cè)研究中,AUC也是常用的性能指標(biāo)[19,21,22,24,28].AUC即Area Under the Curve of receiver operating characteristic,指受試者工作曲線(receiver operating characteristic curve,簡(jiǎn)稱ROC)下的面積.ROC曲線是TP的比率(true positive rate,簡(jiǎn)稱TPR)在所有的閾值(threshold)上以FP的比率(false positive rate,簡(jiǎn)稱FPR)為變量的函數(shù)曲線.預(yù)測(cè)模型需要使用一個(gè)閾值來(lái)對(duì)代碼變更的標(biāo)簽進(jìn)行判斷.閾值的取值范圍是 0到 1.在預(yù)測(cè)模型對(duì)一個(gè)代碼變更進(jìn)行預(yù)測(cè)時(shí),該模型會(huì)對(duì)代碼變更包含缺陷計(jì)算概率值.為了得到預(yù)測(cè)結(jié)果(代碼變更有缺陷或者沒(méi)有缺陷),該模型對(duì)概率值與該閾值進(jìn)行比較:如果概率值大于閾值,則模型將代碼變更預(yù)測(cè)為有缺陷;反之,則將代碼變更預(yù)測(cè)為沒(méi)有缺陷.這樣,就可以算出 TP、FP、TN和 FN的數(shù)量.因此,查準(zhǔn)率、查全率、F1-measure以及正確率的計(jì)算都依賴于預(yù)測(cè)模型的閾值[18,22].
由于ROC是TPR在所有閾值上以FPR為變量的函數(shù)曲線,因此ROC不依賴于閾值.而AUC是ROC曲線下的面積,因此AUC值也不依賴于閾值[18,22].Lessmann等人指出,AUC對(duì)于不平衡的數(shù)據(jù)是魯棒的[10].AUC的計(jì)算中自動(dòng)考慮了數(shù)據(jù)中存在的不平衡.AUC有一個(gè)統(tǒng)計(jì)上的解釋[10].在即時(shí)缺陷預(yù)測(cè)上下文中,AUC可以評(píng)估預(yù)測(cè)模型對(duì)一個(gè)隨機(jī)抽取有缺陷變更計(jì)算有缺陷概率比對(duì)一個(gè)隨機(jī)抽取沒(méi)有缺陷的代碼變更計(jì)算有缺陷概率高的可能性.而在實(shí)際應(yīng)用中,開(kāi)發(fā)者會(huì)利用預(yù)測(cè)模型的輸出結(jié)果來(lái)對(duì)工作進(jìn)行調(diào)度,AUC適合于對(duì)這種調(diào)度進(jìn)行評(píng)估.
2.2.3 工作量感知(effort-aware)指標(biāo)
軟件工程領(lǐng)域的研究者發(fā)現(xiàn),機(jī)器學(xué)習(xí)領(lǐng)域提出的性能指標(biāo)不能完全滿足他們對(duì)于模型實(shí)際應(yīng)用時(shí)的性能評(píng)估需求.由于缺陷預(yù)測(cè)是為了輔助代碼審查,在實(shí)際開(kāi)發(fā)中,開(kāi)發(fā)者只有有限的時(shí)間和資源用來(lái)審查代碼.在有限資源下,如何使開(kāi)發(fā)者檢查到更多的缺陷是即時(shí)缺陷預(yù)測(cè)的關(guān)鍵問(wèn)題.因此,研究者提出使用工作量感知(effort-aware or cost-effectiveness)指標(biāo)對(duì)即時(shí)缺陷預(yù)測(cè)技術(shù)進(jìn)行性能評(píng)估.
工作量感知指標(biāo)是指當(dāng)開(kāi)發(fā)者根據(jù)預(yù)測(cè)模型的預(yù)測(cè)結(jié)果進(jìn)行代碼審查時(shí),審查一定數(shù)量的代碼(即工作量)所能檢查到的缺陷數(shù)量或者比例[59].在即時(shí)缺陷預(yù)測(cè)工作中,研究者通常將代碼審查工作量設(shè)置為所有變更修改代碼總行的 20%,并且提出使用在檢查 20%代碼的情況下來(lái)計(jì)算查準(zhǔn)率(Precision@20%)、查全率(Recall@20%)、F1-measure(F1@20%)[19,20,25-27].這些工作量感知的性能指標(biāo)具體定義如下.
·Precision@20%是指檢查20%代碼中找到的有缺陷變更占這20%所包含全部代碼變更的比例.
·Recall@20%是指檢查20%代碼中找到的有缺陷變更占整個(gè)數(shù)據(jù)集中所有有缺陷變更的比例.
·F1@20%與第3.2.1節(jié)中F1-measure的定義類(lèi)似,是Precision20%和Recall20%的調(diào)和平均,即
這 3個(gè)性能指標(biāo)對(duì)有監(jiān)督和無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)模型都適用.在這 3個(gè)指標(biāo)中,即時(shí)缺陷預(yù)測(cè)研究中最常用的是Recall@20%[19,20,25-27].Yang等人在其研究中發(fā)現(xiàn),無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)在Recall@20%比有監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)更加出色[25].Huang等人和 Fu等人復(fù)現(xiàn)了 Yang等人的實(shí)驗(yàn),并且使用了Precision@20%,Recall@20%和F1@20%對(duì)有監(jiān)督和無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)進(jìn)行評(píng)估.他們發(fā)現(xiàn),無(wú)監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)在Precision@20%和F1@20%兩個(gè)指標(biāo)上效果比有監(jiān)督即時(shí)缺陷預(yù)測(cè)技術(shù)效果差.這些研究表明,評(píng)估即時(shí)缺陷預(yù)測(cè)技術(shù)應(yīng)當(dāng)綜合考慮Precision@20%,Recall@20%和F1@20%.
除了上述3個(gè)性能指標(biāo)外,即時(shí)缺陷預(yù)測(cè)技術(shù)研究還提出了其他性能指標(biāo).Jiang等人提出使用檢查20%代碼中找到的有缺陷變更數(shù)量來(lái)對(duì)即時(shí)缺陷預(yù)測(cè)技術(shù)進(jìn)行評(píng)估[20].Huang等人發(fā)現(xiàn),僅僅使用查看代碼的行數(shù)并不能完整地描述開(kāi)發(fā)者的工作量[26].他們指出,評(píng)估開(kāi)發(fā)者工作量還需要考慮到開(kāi)發(fā)者在查看 20%的代碼行數(shù)時(shí)所查看代碼變更的數(shù)量.開(kāi)發(fā)者在查看大量的代碼變更時(shí),可能需要頻繁地在不同代碼變更中切換,并且不同的代碼變更可能會(huì)對(duì)不同文件和模塊進(jìn)行修改,因此,審查大量變更要求開(kāi)發(fā)者之間進(jìn)行更多合作與交流.這種上下文切換和合作交流也會(huì)占用開(kāi)發(fā)資源.同時(shí),Huang等人還指出,如果預(yù)測(cè)模型將不存在缺陷的代碼變更預(yù)測(cè)為有缺陷,開(kāi)發(fā)者可能就會(huì)放棄這個(gè)預(yù)測(cè)模型[26].因此,他們提出兩個(gè)新指標(biāo)來(lái)對(duì)即時(shí)缺陷預(yù)測(cè)進(jìn)行評(píng)估:PCI@20%和IFA.PCI@20%是指檢查20%代碼中包含的代碼變更占項(xiàng)目中所有代碼變更的比例;IFA是指在找到第1個(gè)有缺陷變更之前,缺陷預(yù)測(cè)模型為開(kāi)發(fā)者推薦錯(cuò)誤代碼變更(預(yù)測(cè)為有缺陷而實(shí)際沒(méi)有缺陷)的數(shù)量.
雖然即時(shí)缺陷預(yù)測(cè)技術(shù)近年來(lái)獲得了大量研究者的關(guān)注,取得了較大進(jìn)展,但仍然存在一些亟待解決的關(guān)鍵問(wèn)題.本節(jié)將從科學(xué)問(wèn)題、技術(shù)難點(diǎn)和工程實(shí)踐這3個(gè)方面闡述目前即時(shí)缺陷預(yù)測(cè)技術(shù)中存在的問(wèn)題.
3.1.1 缺陷的可解釋性
現(xiàn)有的即時(shí)缺陷預(yù)測(cè)技術(shù)只對(duì)變更存在缺陷的可能性進(jìn)行預(yù)測(cè),而針對(duì)所預(yù)測(cè)缺陷具體是什么,如缺陷類(lèi)型和位置,目前尚沒(méi)有相關(guān)研究.缺陷類(lèi)型刻畫(huà)了缺陷產(chǎn)生的原因和特點(diǎn)[60],缺陷位置指缺陷所在的模塊、文件、函數(shù)甚至代碼行,掌握缺陷類(lèi)型和位置有助于輔助開(kāi)發(fā)人員快速修復(fù)缺陷.盡管目前研究者己提出大量缺陷分類(lèi)[60-64]和缺陷定位[65-71]技術(shù),針對(duì)即時(shí)缺陷預(yù)測(cè)的缺陷分類(lèi)和缺陷定位,目前尚沒(méi)有相關(guān)研究.其原因在于:現(xiàn)有的缺陷分類(lèi)和缺陷定位技術(shù)均依賴于缺陷具體信息,如缺陷報(bào)告或程序執(zhí)行記錄,而即時(shí)缺陷預(yù)測(cè)所預(yù)測(cè)出的缺陷由于其即時(shí)性,缺陷尚未暴露且沒(méi)有相關(guān)缺陷報(bào)告或執(zhí)行記錄,因此需要深入分析缺陷引入變更,研究缺陷的可解釋性,并進(jìn)一步研究即時(shí)缺陷定位.
3.1.2 缺陷預(yù)測(cè)結(jié)果的實(shí)用性
現(xiàn)有的即時(shí)缺陷預(yù)測(cè)技術(shù)主要有兩種類(lèi)型的結(jié)果:一種是面向分類(lèi)的預(yù)測(cè)結(jié)果,即每當(dāng)有新的代碼變更提交時(shí),模型預(yù)測(cè)其為有缺陷或沒(méi)有預(yù)測(cè)兩個(gè)類(lèi)別[17];另一種是面向優(yōu)先級(jí)排序的結(jié)果,即模型對(duì)新提交的軟件變更集合進(jìn)行排序,排在列表前面的表示缺陷可能性更高[19,25].面向分類(lèi)的預(yù)測(cè)技術(shù)常常采用分類(lèi)器指標(biāo)進(jìn)行評(píng)估,面向排序的預(yù)測(cè)技術(shù)常常采用工作量感知的指標(biāo)進(jìn)行評(píng)估.然而,針對(duì)軟件開(kāi)發(fā)或維護(hù)過(guò)程中如何有效利用即時(shí)缺陷預(yù)測(cè)結(jié)果尚沒(méi)有統(tǒng)一的觀點(diǎn),因此需要展開(kāi)深入的實(shí)證研究,以調(diào)研開(kāi)發(fā)者實(shí)際需要哪種類(lèi)型的預(yù)測(cè)結(jié)果,如何能更有效地利用即時(shí)缺陷預(yù)測(cè)結(jié)果等問(wèn)題.
3.2.1 數(shù)據(jù)標(biāo)注
如何準(zhǔn)確地標(biāo)注引入缺陷的軟件變更是即時(shí)缺陷預(yù)測(cè)中的技術(shù)難點(diǎn)之一.近年來(lái),研究者指出傳統(tǒng) SZZ算法實(shí)現(xiàn)存在噪音.傳統(tǒng) SZZ實(shí)現(xiàn)會(huì)將修改空行和注釋行以及代碼風(fēng)格的變更、重構(gòu)類(lèi)變更誤標(biāo)記為引入缺陷變更[32,34].針對(duì)這些噪音,研究者提出了多種改進(jìn)的SZZ實(shí)現(xiàn),然而這些SZZ實(shí)現(xiàn)并不能完全消除噪音[32-34].例如,Neto等人提出重構(gòu)感知 SZZ避免重構(gòu)類(lèi)變更被誤標(biāo)記為引入缺陷,但他們?nèi)匀恢赋?該 SZZ實(shí)現(xiàn)對(duì)部分重構(gòu)類(lèi)變更仍然無(wú)法識(shí)別[34].同時(shí),這些工作是基于Java代碼對(duì)SZZ實(shí)現(xiàn)進(jìn)行改進(jìn).不同編程語(yǔ)言在注釋、代碼風(fēng)格和重構(gòu)等方面存在差異.因此,研究者提出的改進(jìn)SZZ實(shí)現(xiàn)在非Java項(xiàng)目上面臨實(shí)際應(yīng)用上的挑戰(zhàn).
3.2.2 特征提取
特征提取的準(zhǔn)確性和多樣性對(duì)模型的建立有著至關(guān)重要的影響.
特征提取準(zhǔn)確性的難點(diǎn)在于代碼變更的復(fù)雜性,主要體現(xiàn)在兩個(gè)方面:一是代碼變更具有時(shí)間戳,在計(jì)算變更特征時(shí)需要考慮軟件的動(dòng)態(tài)演化,包括代碼演化和開(kāi)發(fā)者演化;二是代碼變更提交的復(fù)雜性,軟件開(kāi)發(fā)和維護(hù)常采用代碼版本控制系統(tǒng)(例如 git),在項(xiàng)目采用多個(gè)分支進(jìn)行同時(shí)開(kāi)發(fā)時(shí),提取特征時(shí)對(duì)代碼變更合并、關(guān)聯(lián)和追溯分析進(jìn)行綜合考慮是一大技術(shù)難點(diǎn).
特征提取多樣性的難點(diǎn)在于軟件制品的多源異構(gòu)特性.研究表明,軟件缺陷與多種軟件制品相關(guān),包括源代碼、缺陷報(bào)告、測(cè)試報(bào)告、代碼審查、代碼靜態(tài)掃描等,提取多源特征有助于更準(zhǔn)確地刻畫(huà)缺陷,從而建立更準(zhǔn)確的預(yù)測(cè)模型.然而上述軟件制品以多源異構(gòu)的形式存儲(chǔ)在不同的軟件倉(cāng)庫(kù)中,考慮它們之間異構(gòu)性、關(guān)聯(lián)性是一大技術(shù)難點(diǎn).
3.2.3 模型構(gòu)建
現(xiàn)有的即時(shí)缺陷預(yù)測(cè)技術(shù)在模型構(gòu)建上存在著不同的策略.研究者使用復(fù)雜的有監(jiān)督機(jī)器學(xué)習(xí)模型,包括集成學(xué)習(xí)[72]和深度學(xué)習(xí)[73],有研究者主張使用簡(jiǎn)單的無(wú)監(jiān)督模型[25].在有監(jiān)督學(xué)習(xí)模型中,有研究者使用分類(lèi)模型[17],有研究者使用回歸模型[19].不同的建模技術(shù)在模型應(yīng)用場(chǎng)景、模型輸出結(jié)果上存在差異,而關(guān)于哪種建模技術(shù)是更好的即時(shí)缺陷預(yù)測(cè)模型構(gòu)建技術(shù)尚沒(méi)有統(tǒng)一的結(jié)論,因此,在模型構(gòu)建技術(shù)上如何選擇合適的建模技術(shù),如何設(shè)計(jì)更先進(jìn)的建模技術(shù)仍然需要進(jìn)一步研究.
盡管目前存在的相關(guān)工作將即時(shí)缺陷預(yù)測(cè)引入至工業(yè)界[18,19],然而將即時(shí)缺陷預(yù)測(cè)在工程實(shí)踐中進(jìn)行大規(guī)模推廣仍然存在以下挑戰(zhàn).
(1) 缺乏準(zhǔn)確的數(shù)據(jù)環(huán)境.在即時(shí)缺陷預(yù)測(cè)的數(shù)據(jù)標(biāo)注中,識(shí)別引入缺陷的軟件變更時(shí),依賴于開(kāi)發(fā)人員撰寫(xiě)的變更提交日志(commit log)和缺陷報(bào)告.倘若在工程實(shí)踐過(guò)程中這些數(shù)據(jù)不夠準(zhǔn)確,將對(duì)模型的訓(xùn)練帶來(lái)巨大挑戰(zhàn).
(2) 缺乏多維的數(shù)據(jù)特征.由于軟件缺陷的復(fù)雜性,其產(chǎn)生機(jī)制與多源異構(gòu)的軟件制品相關(guān),如源代碼、缺陷報(bào)告、測(cè)試報(bào)告、代碼審查報(bào)告、代碼靜態(tài)掃描等,在工程實(shí)踐中,軟件制品的多樣性和準(zhǔn)確性將直接影響模型效果.
(3) 缺乏統(tǒng)一的評(píng)估方法.由于目前針對(duì)即時(shí)缺陷預(yù)測(cè)技術(shù)模型評(píng)估存在著指標(biāo)多樣化問(wèn)題,在工程實(shí)踐中也將面臨如何更客觀地評(píng)估模型這一問(wèn)題.因此,需要更多工作關(guān)注即時(shí)缺陷預(yù)測(cè)的工程實(shí)踐,將工程實(shí)踐與理論研究相結(jié)合,將實(shí)證研究和方法研究相結(jié)合,進(jìn)一步完善即時(shí)缺陷預(yù)測(cè)技術(shù).
針對(duì)上一節(jié)所總結(jié)的關(guān)鍵問(wèn)題,本節(jié)圍繞數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建和工程實(shí)踐等4個(gè)方面展望即時(shí)缺陷預(yù)測(cè)研究的未來(lái)趨勢(shì).
實(shí)證研究表明,即時(shí)缺陷預(yù)測(cè)研究中所使用的標(biāo)注數(shù)據(jù)是存在噪音的.Bachmann等人的研究表明,開(kāi)發(fā)者可能不會(huì)為修復(fù)缺陷的代碼變更記錄其對(duì)應(yīng)的缺陷報(bào)告 ID,從而導(dǎo)致部分修復(fù)缺陷的代碼變更無(wú)法被識(shí)別出來(lái)[74].這將導(dǎo)致這些修復(fù)缺陷的代碼變更所對(duì)應(yīng)的引入缺陷的代碼變更也無(wú)法識(shí)別出來(lái).Da Costa等人在他們的工作中提出了一種框架用于評(píng)估SZZ算法產(chǎn)生數(shù)據(jù)的質(zhì)量,他們使用該框架發(fā)現(xiàn),使用SZZ算法所標(biāo)注的數(shù)據(jù)中存在大量噪音[33].另外,實(shí)證研究還表明,有些缺陷在引入數(shù)年后才會(huì)被發(fā)現(xiàn)[75].這意味著在對(duì)即時(shí)缺陷預(yù)測(cè)技術(shù)進(jìn)行實(shí)際應(yīng)用時(shí),對(duì)于近期產(chǎn)生的代碼變更,其中某些缺陷引入變更可能還沒(méi)有被修復(fù),因此無(wú)法被 SZZ算法識(shí)別,這也會(huì)造成噪音數(shù)據(jù).處理這些噪音數(shù)據(jù),并且減小噪音數(shù)據(jù)對(duì)即時(shí)缺陷預(yù)測(cè)模型的影響,將進(jìn)一步提升即時(shí)缺陷預(yù)測(cè)技術(shù)的實(shí)用性.
現(xiàn)代大型軟件項(xiàng)目都會(huì)使用多個(gè)系統(tǒng)對(duì)軟件開(kāi)發(fā)和維護(hù)中產(chǎn)生的數(shù)據(jù)進(jìn)行存儲(chǔ)和管理,例如代碼版本控制系統(tǒng)(如 git)、缺陷跟蹤系統(tǒng)(如 bugzilla)、代碼審查系統(tǒng)(如 gerrit)等.這些不同的系統(tǒng)中存儲(chǔ)著不同的軟件制品,現(xiàn)有的大部分即時(shí)缺陷預(yù)測(cè)研究都只考慮了從代碼版本控制系統(tǒng)中提取特征.而研究表明,軟件缺陷的產(chǎn)生是一個(gè)復(fù)雜過(guò)程,并與多種軟件制品相關(guān),包括源代碼、缺陷報(bào)告、測(cè)試報(bào)告、代碼審查、代碼靜態(tài)掃描等,綜合考慮多源異構(gòu)的軟件制品,有助于更立體地刻畫(huà)缺陷產(chǎn)生機(jī)制,建立更準(zhǔn)確的缺陷預(yù)測(cè)模型.例如,有研究人員己經(jīng)發(fā)現(xiàn),結(jié)合代碼審查系統(tǒng),從代碼審查的角度提取新的特征,有助于增強(qiáng)現(xiàn)有即時(shí)缺陷預(yù)測(cè)模型的預(yù)測(cè)效果[28].因此,綜合考慮多源軟件制品,提取多維特征來(lái)增強(qiáng)特征表征能力,將是即時(shí)缺陷預(yù)測(cè)技術(shù)的一個(gè)發(fā)展方向.
近年來(lái),深度學(xué)習(xí)成為機(jī)器學(xué)習(xí)的熱點(diǎn)研究領(lǐng)域,被大量應(yīng)用到如圖像處理、語(yǔ)音識(shí)別等研究中[76-78].與傳統(tǒng)的機(jī)器學(xué)習(xí)技術(shù)相比,研究者發(fā)現(xiàn)深度學(xué)習(xí)在這些領(lǐng)域的應(yīng)用可以取得更好的性能.Yang等人首次在即時(shí)缺陷預(yù)測(cè)中應(yīng)用深度學(xué)習(xí)技術(shù)[73],他們使用深度學(xué)習(xí)方法對(duì)初始的變更特征進(jìn)行整合,從而生成更加復(fù)雜的特征,然后基于這些生成的特征構(gòu)建分類(lèi)器對(duì)有缺陷變更進(jìn)行預(yù)測(cè).他們發(fā)現(xiàn),使用深度學(xué)習(xí)技術(shù)顯著提升了即時(shí)缺陷預(yù)測(cè)模型的性能.但是他們僅使用了深度學(xué)習(xí)中的深度信念網(wǎng)絡(luò)[79]技術(shù)用于整合特征.而將目前機(jī)器學(xué)習(xí)領(lǐng)域大量研究與應(yīng)用的技術(shù),如卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,簡(jiǎn)稱CNN)[80]應(yīng)用到即時(shí)缺陷預(yù)測(cè)技術(shù)中,將有可能進(jìn)一步提升即時(shí)缺陷預(yù)測(cè)技術(shù)的性能.如何有效地將這些技術(shù)應(yīng)用到即時(shí)缺陷預(yù)測(cè)技術(shù)中,需要未來(lái)工作進(jìn)一步分析與研究.
在工程實(shí)踐中,實(shí)現(xiàn)自動(dòng)化、大規(guī)模的即時(shí)缺陷預(yù)測(cè),在數(shù)據(jù)環(huán)境準(zhǔn)備、特征提取和模型構(gòu)建等方面仍然面臨許多技術(shù)難點(diǎn).克服現(xiàn)有難點(diǎn)主要從以下幾方面展開(kāi):(1) 積極研究大規(guī)模代碼變更數(shù)據(jù)自動(dòng)化標(biāo)注方法,盡快構(gòu)建面向即時(shí)缺陷預(yù)測(cè)的大數(shù)據(jù)環(huán)境及其演進(jìn)方法;(2) 解決在工程實(shí)踐中多源異構(gòu)軟件制品的關(guān)聯(lián)問(wèn)題,提出代碼變更的多維特征提取方法;(3) 結(jié)合更先進(jìn)的機(jī)器學(xué)習(xí)技術(shù),提出適應(yīng)于工程實(shí)踐中面向大規(guī)模代碼變更數(shù)據(jù)的建模方法;(4) 建立即時(shí)缺陷預(yù)測(cè)的標(biāo)準(zhǔn)評(píng)估體系,推動(dòng)即時(shí)缺陷預(yù)測(cè)向更統(tǒng)一更準(zhǔn)確的方向發(fā)展;(5) 為了適應(yīng)云計(jì)算、移動(dòng)互聯(lián)網(wǎng)及人工智能的快速發(fā)展,有針對(duì)性地研究面向不同軟件類(lèi)型的即時(shí)缺陷預(yù)測(cè)技術(shù).
近年來(lái),即時(shí)缺陷預(yù)測(cè)技術(shù)由于其即時(shí)性、細(xì)粒度和可追溯的優(yōu)勢(shì),成為了軟件缺陷預(yù)測(cè)領(lǐng)域的研究熱點(diǎn).本文圍繞即時(shí)缺陷預(yù)測(cè)的數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建及模型評(píng)估等方面,梳理并總結(jié)了當(dāng)前研究進(jìn)展.基于當(dāng)前進(jìn)展分析,本文總結(jié)了當(dāng)前即時(shí)缺陷預(yù)測(cè)面臨的關(guān)鍵問(wèn)題及未來(lái)發(fā)展趨勢(shì).主要工作總結(jié)如下.
(1) 針對(duì)數(shù)據(jù)標(biāo)注,本文詳細(xì)歸納了不同數(shù)據(jù)標(biāo)注方法的提出背景及其優(yōu)缺點(diǎn);針對(duì)特征提取,本文分類(lèi)并詳細(xì)介紹了不同維度的變更特征;針對(duì)模型構(gòu)建,本文歸類(lèi)了現(xiàn)有模型構(gòu)建技術(shù),包括有監(jiān)督和無(wú)監(jiān)督建模技術(shù),其中,有監(jiān)督建模技術(shù)又分為同項(xiàng)目建模和跨項(xiàng)目建模;針對(duì)模型評(píng)估,本文總結(jié)了現(xiàn)有不同類(lèi)型的驗(yàn)證方法和評(píng)估指標(biāo).
(2) 本文從科學(xué)問(wèn)題、技術(shù)難點(diǎn)和工程實(shí)踐這3個(gè)角度總結(jié)了當(dāng)前即時(shí)缺陷預(yù)測(cè)面臨的關(guān)鍵問(wèn)題.
(3) 本文圍繞數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建和工程實(shí)踐這4個(gè)方面展望了未來(lái)即時(shí)缺陷預(yù)測(cè)技術(shù)的發(fā)展趨勢(shì).