選自code.Facebook,做者:Yue Jia、Ke Mao、Mark Harman,機器之心編譯。api
請注意:這不是你寫 Bug 的理由。app
調試代碼是件很無聊的事,可是由 Facebook 工程師建立的新型人工智能混合工具——SapFix 能夠大大節約工程師的時間,同時還加快了新軟件的推出過程。該工具能夠爲特定 Bug 自動生成修復程序,而後將其提交給工程師批准並部署到生產中。工具
SapFix 被用來加速向裝有 Facebook Android 應用程序的數百萬設備傳輸穩定代碼更新的過程,這是人工智能測試和調試工具在此類大規模生產中的首次應用。Facebook 打算與工程界分享 SapFix,由於這是自動化調試發展的下一步,可能爲不少公司和研究機構促進新代碼的產量和穩定性。測試
SapFix 被設計成一個獨立的工具,不管有或沒有 Sapienz(Facebook 的一款智能自動化軟件測試工具,在 F8 版本時發佈,已部署到生產中),它均可以運行。在目前的概念驗證狀態,SapFix 在部署到生成前專一於修復 Sapienz 發現的 Bug。此過程從 Sapienz 開始,連同 Facebook 的推斷靜態分析工具一塊兒,能幫助定位代碼中須要修復的 Bug。一旦 Sapienz 發現並推斷出與 Bug 相關的特定部分代碼,它就能夠將該信息傳遞給 SapFix,後者會自動參考一些策略並生成補丁。人工智能
上圖說明 SapFix 如何爲軟件 Bug 生成補丁。debug
爲了解決高觸發 bug,SapFix 建立的補丁能夠徹底或部分還原初始代碼。對於更復雜的問題,SapFix 經過從模板修復集合中提取素材生成補丁。這些模板是從人類工程師建立的模板中自動獲取的,然後者則是基於過去的修復庫建立的。設計
當之前用過的由人類設計的模板不合適時,SapFix 將嘗試基於突變進行修復。爲此,它將對致使崩潰的語句的抽象語法樹(AST)執行小型代碼修復,調整補丁,直到找到可能的解決方案。3d
即便 SapFix 找到了特定的補丁,它的工做還遠遠沒有結束。該工具爲每一個 Bug 生成多個潛在的補丁,並經過三個問題評價補丁的質量。便是否存在編譯錯誤、程序是否仍然會崩潰,以及補丁是否引入了新的衝突?調試
爲了解決最後兩個問題,SapFix 在修復版本上運行已存的、開發者編寫的測試,同時還會運行由 Sapienz 建立的測試。與以前補丁生成步驟同樣,驗證過程會自動執行,且與更大的代碼庫實現分離。SapFix 正在複製目前由人工完成的調試工做,但它並非爲了將補丁部署到產品代碼中而設計的。code
當自動生成的補丁通過全面測試後,SapFix 會將它們發送給人工評審員進行批准。這有些相似於人工生成的報告須要由其餘開發者進行檢查與審批,此外系統除了會自動追蹤評審者的反饋外,它還會接受經批准的補丁、清理其它未經批准的補丁。在某些狀況下,SapFix 能夠從多個候選補丁中選擇最佳的解決方案,並向工程師提出建議。
若是修補方案被拒絕,它將丟棄補丁,若是被接受,則加載。因爲 SapFix 的底層技術很是強大,且自動運行節省了大量時間和精力,所以 SapFix 沒法實現本身提出的補丁。工程師一般比較專業,該工具依賴工程師的專業知識來確認是否應該部署提出的補丁。
因爲 SapFix 仍在開發階段,所以它沒法像 Sapienz 那樣投入大規模使用,Sapienz 如今每個月生成數百個 Bug 報告,精準定位有 Bug 的代碼行,它審覈與安卓設備上的 Facebook、Instagram、Workplace 和 Messenger 等 app 相關的代碼。Sapienz 的報告中大約有 3/4 的 bug 是由開發者修復的。而 Facebook 八月份開始測試 SapFix,該工具能夠成功生成可以被人類工程師接受的補丁,並進入生產階段。
Facebook 稱,這標誌着機器生成的補丁(通過自動化端到端測試和修補)首次部署到 Facebook 規模的代碼庫。這是 AI 技術的重要里程碑,進一步證實了基於搜索的軟件工程能夠減小軟件開發中的問題。Facebook 開發 SapFix 用於處理不一樣種類的 bug 和軟件,所以該工具備可能改變代碼生成的速度和質量。這不只適用於大規模運營的企業,還適用於幾乎全部寫代碼的我的。不論是用於組織仍是個體,SapFix 和 Sapienz 都能幫開發者減小花在 debug 上的時間,把精力用在生成更多的代碼上。
即便有了這項工做,Facebook 仍想鼓勵社區繼續研究自動調整、改進代碼。在這一領域,已經有了不少激動人心的研究,包括技術的實證研究、供社區研究解決的開放性難題與挑戰,以及對近期自動改進代碼的調查。做爲在 Facebook 規模下部署的首個工具,SapFix 將爲此挑戰性研究提供新的動力與能量。
Facebook 稱,將在完成額外的工程部分後,開源 Sapienz 和 SapFix。而有關這些工具的反饋會幫助相關研究者,也會幫助更普遍的 AI 社區改進自動尋找、修改代碼 Bug 的任務。Facebook 目前聚焦在 SapFix 如何自動制止代碼崩潰,但更長期的應用應該包括如何讓軟件更快、反應更敏捷。這些系統提供了極大的基線收益,開發者使用它們時效果是多變、寬泛的。