請(qǐng)注意:這不是你寫(xiě) Bug 的理由。
調(diào)試代碼是件很無(wú)聊的事,,但是由 Facebook 工程師創(chuàng)建的新型人工智能混合工具——SapFix 可以大大節(jié)約工程師的時(shí)間,,同時(shí)還加快了新軟件的推出過(guò)程。該工具可以為特定 Bug 自動(dòng)生成修復(fù)程序,,然后將其提交給工程師批準(zhǔn)并部署到生產(chǎn)中。
SapFix 被用來(lái)加速向裝有 Facebook Android 應(yīng)用程序的數(shù)百萬(wàn)設(shè)備傳輸穩(wěn)定代碼更新的過(guò)程,,這是人工智能測(cè)試和調(diào)試工具在此類(lèi)大規(guī)模生產(chǎn)中的首次應(yīng)用,。Facebook 打算與工程界分享 SapFix,因?yàn)檫@是自動(dòng)化調(diào)試發(fā)展的下一步,,可能為很多公司和研究機(jī)構(gòu)促進(jìn)新代碼的產(chǎn)量和穩(wěn)定性,。
SapFix 被設(shè)計(jì)成一個(gè)獨(dú)立的工具,,無(wú)論有或沒(méi)有 Sapienz(Facebook 的一款智能自動(dòng)化軟件測(cè)試工具,在 F8 版本時(shí)發(fā)布,,已部署到生產(chǎn)中),,它都可以運(yùn)行。在目前的概念驗(yàn)證狀態(tài),,SapFix 在部署到生成前專(zhuān)注于修復(fù) Sapienz 發(fā)現(xiàn)的 Bug,。此過(guò)程從 Sapienz 開(kāi)始,連同 Facebook 的推斷靜態(tài)分析工具一起,,能幫助定位代碼中需要修復(fù)的 Bug,。一旦 Sapienz 發(fā)現(xiàn)并推斷出與 Bug 相關(guān)的特定部分代碼,它就可以將該信息傳遞給 SapFix,,后者會(huì)自動(dòng)參考一些策略并生成補(bǔ)丁,。
SapFix 是如何 debug 的
上圖說(shuō)明 SapFix 如何為軟件 Bug 生成補(bǔ)丁。
為了解決高觸發(fā) bug,,SapFix 創(chuàng)建的補(bǔ)丁可以完全或部分還原初始代碼,。對(duì)于更復(fù)雜的問(wèn)題,SapFix 通過(guò)從模板修復(fù)集合中提取素材生成補(bǔ)丁,。這些模板是從人類(lèi)工程師創(chuàng)建的模板中自動(dòng)獲取的,,而后者則是基于過(guò)去的修復(fù)庫(kù)創(chuàng)建的。
當(dāng)以前用過(guò)的由人類(lèi)設(shè)計(jì)的模板不合適時(shí),,SapFix 將嘗試基于突變進(jìn)行修復(fù),。為此,它將對(duì)導(dǎo)致崩潰的語(yǔ)句的抽象語(yǔ)法樹(shù)(AST)執(zhí)行小型代碼修復(fù),,調(diào)整補(bǔ)丁,,直到找到可能的解決方案。
自主驗(yàn)證和人工審批
即使 SapFix 找到了特定的補(bǔ)丁,,它的工作還遠(yuǎn)遠(yuǎn)沒(méi)有結(jié)束,。該工具為每個(gè) Bug 生成多個(gè)潛在的補(bǔ)丁,并通過(guò)三個(gè)問(wèn)題評(píng)價(jià)補(bǔ)丁的質(zhì)量,。即是否存在編譯錯(cuò)誤,、程序是否仍然會(huì)崩潰,以及補(bǔ)丁是否引入了新的沖突,?
為了解決最后兩個(gè)問(wèn)題,,SapFix 在修復(fù)版本上運(yùn)行已存的、開(kāi)發(fā)者編寫(xiě)的測(cè)試,,同時(shí)還會(huì)運(yùn)行由 Sapienz 創(chuàng)建的測(cè)試,。與之前補(bǔ)丁生成步驟一樣,驗(yàn)證過(guò)程會(huì)自動(dòng)執(zhí)行,,且與更大的代碼庫(kù)實(shí)現(xiàn)分離,。SapFix 正在復(fù)制目前由人工完成的調(diào)試工作,,但它并不是為了將補(bǔ)丁部署到產(chǎn)品代碼中而設(shè)計(jì)的。
當(dāng)自動(dòng)生成的補(bǔ)丁經(jīng)過(guò)全面測(cè)試后,,SapFix 會(huì)將它們發(fā)送給人工評(píng)審員進(jìn)行批準(zhǔn),。這有些類(lèi)似于人工生成的報(bào)告需要由其他開(kāi)發(fā)者進(jìn)行檢查與審批,此外系統(tǒng)除了會(huì)自動(dòng)追蹤評(píng)審者的反饋外,,它還會(huì)接受經(jīng)批準(zhǔn)的補(bǔ)丁,、清理其它未經(jīng)批準(zhǔn)的補(bǔ)丁。在某些情況下,,SapFix 可以從多個(gè)候選補(bǔ)丁中選擇最佳的解決方案,,并向工程師提出建議。
該工作流展示了 SapFix 如何基于它生成的補(bǔ)丁尋求工程師的反饋,。
如果修補(bǔ)方案被拒絕,,它將丟棄補(bǔ)丁,如果被接受,,則加載,。由于 SapFix 的底層技術(shù)非常強(qiáng)大,且自動(dòng)運(yùn)行節(jié)省了大量時(shí)間和精力,,因此 SapFix 無(wú)法實(shí)現(xiàn)自己提出的補(bǔ)丁,。工程師通常比較專(zhuān)業(yè),該工具依賴(lài)工程師的專(zhuān)業(yè)知識(shí)來(lái)確認(rèn)是否應(yīng)該部署提出的補(bǔ)丁,。
由于 SapFix 仍在開(kāi)發(fā)階段,,因此它無(wú)法像 Sapienz 那樣投入大規(guī)模使用,Sapienz 現(xiàn)在每月生成數(shù)百個(gè) Bug 報(bào)告,,精準(zhǔn)定位有 Bug 的代碼行,,它審核與安卓設(shè)備上的 Facebook、Instagram,、Workplace 和 Messenger 等 app 相關(guān)的代碼,。Sapienz 的報(bào)告中大約有 3/4 的 bug 是由開(kāi)發(fā)者修復(fù)的。而 Facebook 八月份開(kāi)始測(cè)試 SapFix,,該工具可以成功生成能夠被人類(lèi)工程師接受的補(bǔ)丁,,并進(jìn)入生產(chǎn)階段。
為完全自動(dòng)化 debug 奠定基礎(chǔ)
Facebook 稱(chēng),,這標(biāo)志著機(jī)器生成的補(bǔ)?。ń?jīng)過(guò)自動(dòng)化端到端測(cè)試和修補(bǔ))首次部署到 Facebook 規(guī)模的代碼庫(kù)。這是 AI 技術(shù)的重要里程碑,,進(jìn)一步證明了基于搜索的軟件工程可以減少軟件開(kāi)發(fā)中的問(wèn)題,。Facebook 開(kāi)發(fā) SapFix 用于處理不同種類(lèi)的 bug 和軟件,因此該工具有可能改變代碼生成的速度和質(zhì)量。這不僅適用于大規(guī)模運(yùn)營(yíng)的企業(yè),,還適用于幾乎所有寫(xiě)代碼的個(gè)人。不管是用于組織還是個(gè)體,,SapFix 和 Sapienz 都能幫開(kāi)發(fā)者減少花在 debug 上的時(shí)間,,把精力用在生成更多的代碼上。
即使有了這項(xiàng)工作,,F(xiàn)acebook 仍想鼓勵(lì)社區(qū)繼續(xù)研究自動(dòng)調(diào)整,、改進(jìn)代碼。在這一領(lǐng)域,,已經(jīng)有了很多激動(dòng)人心的研究,,包括技術(shù)的實(shí)證研究、供社區(qū)研究解決的開(kāi)放性難題與挑戰(zhàn),,以及對(duì)近期自動(dòng)改進(jìn)代碼的調(diào)查,。作為在 Facebook 規(guī)模下部署的首個(gè)工具,SapFix 將為此挑戰(zhàn)性研究提供新的動(dòng)力與能量,。
Facebook 稱(chēng),,將在完成額外的工程部分后,開(kāi)源 Sapienz 和 SapFix,。而有關(guān)這些工具的反饋會(huì)幫助相關(guān)研究者,,也會(huì)幫助更廣泛的 AI 社區(qū)改進(jìn)自動(dòng)尋找、修改代碼 Bug 的任務(wù),。Facebook 目前聚焦在 SapFix 如何自動(dòng)制止代碼崩潰,,但更長(zhǎng)期的應(yīng)用應(yīng)該包括如何讓軟件更快、反應(yīng)更敏捷,。這些系統(tǒng)提供了極大的基線(xiàn)收益,,開(kāi)發(fā)者使用它們時(shí)效果是多變、寬泛的,。