您現在的位置是:首頁 >人工智能 > 2021-05-11 17:54:03 來源:
認識那些評論和編寫Facebook代碼片段的機器人
空指針異常就像擁有一個從未構建過的房子的地址。這意味著程序員已經引用了一個實際上不存在的對象,因為它從未在代碼中描述過。實際上,空指針是非常常見的并且相對容易修復 - 很容易讓人覺得無聊。
不幸的是,發現和修復這些錯誤的繁瑣工作仍占用了開發人員的大部分時間和精力。2016年對1,000個Android應用程序的評估 [PDF]發現空指針比任何其他類型的錯誤導致更多崩潰,包括非法參數,數組索引超出范圍異常和錯誤令牌。
為了讓開發人員的工作更有價值,Facebook現在使用兩種名為Sapienz和SapFix的自動化工具來查找和修復其移動應用程序中的低級錯誤。Sapienz通過許多測試運行應用程序,以確定哪些操作會導致崩潰。然后,SapFix建議對開發人員進行修復,他們會對其進行審核并決定是否接受修復,提出自己的問題或忽略問題。
工程師們于2017年9月開始使用Sapienz審查Facebook應用程序,并逐漸開始將其用于公司的其他應用程序(包括Messenger,Instagram,Facebook Lite和Workplace)。今年5月,該團隊將在加拿大蒙特利爾舉行的國際軟件工程會議上描述其最近采用的SapFix (他們正在招聘)。
據該團隊稱,到目前為止,Sapienz和SapFix的組合運作良好。“這節省了開發人員的時間,這是我們的主要目標,” Facebook工程經理馬克哈曼說。哈曼也是倫敦大學學院的軟件工程教授,他與創始人岳佳和柯茂共同創辦了Sapienz,他們的前創業公司Majicke是Facebook于2017年2月收購的。
自首次亮相以來,Sapienz每個月都會發現數百種新方法讓每個Facebook的應用程序崩潰。雖然其中一些崩潰不是開發人員主要擔心的問題,但大約75%的崩潰事件已經受到保護。
目前,SapFix僅建議修復空指針,但團隊希望有一天能夠擴展該系統以協助處理許多不同的錯誤類型。作為其修復的起點,SapFix依賴于在Facebook開發的另一個名為Getafix的工具提供的模板 。這些模板基于人類開發人員針對類似問題所做的先前修復。
自動化錯誤修復,至少對于某些類別的錯誤,應該讓開發人員可以編寫更多代碼或解決更難的問題 - 類似于處理故事的邏輯和語義而不是修復拼寫和語法錯誤。
加州大學圣巴巴拉分校的計算機科學教授Giovanni Vigna說:“我認為在未來,這將成為主流,因為它具有重要意義。” “而不是支付昂貴的質量保證工程師找到瑣碎的錯誤,付錢給他們找到超級難題。而簡單的,自動化。“
到目前為止,關于自動化錯誤修復的大部分工作僅限于學術實驗室或DARPA競賽,但Facebook的進展表明這些技術現在已開始進入主要科技公司的工作流程。“就真實部署而言,Facebook的系統是我聽過的第一個,”維尼亞說。
Harman預測,使用像SapFix這樣的工具,可以在兩到五年內消除特定類型的錯誤 - 這意味著它們將被自動化系統完全找到并修復。本地化為幾行代碼的錯誤比更復雜的代碼更可能位于滅絕列表中。
瑞典KTH皇家理工學院軟件技術教授Martin Monperrus的前景更加保守。他說自動蟲修復“僅在開始時”,并將其與運輸史上的“早期自行車水平”進行比較。
SapFix當然還有改進的余地。“它經常會提出不好的解決方案,”哈曼說。但是,他補充說,完美不一定是目標。“我們不一定每次都是對的; 它只需要經常足以幫助開發人員。“
Sapienz幫助的一項任務是決定運行哪些測試以確定哪些用戶操作會導致應用程序崩潰。此類操作可能包括一次單擊兩個按鈕,在結帳時應用多個優惠券代碼,或從列表中選擇多個選項。提出這些測試是一個復雜的問題,因為正如哈曼所說,“即使是一個簡單的應用程序也有比宇宙中的恒星更多的測試用例。”
盡管可以通過稱為隨機模糊測試的技術自動生成測試,但這樣做計算成本高,并且可能產生極長或其他不切實際的情況(例如一次觸摸屏幕上的20個位置)。當開發人員手動設計這些測試時,他們經常會忽略他們沒有明確設計的案例。
Sapienz不是依賴于隨機生成的或開發人員設計的測試,而是生成可能的測試列表,并支持那些以最短步驟產生崩潰的測試。它還優先考慮具有更高覆蓋率的測試,這意味著他們點擊應用程序中的更多屏幕。從那里,它略微改變這些測試(通過改變點擊或交換一個步驟)來提出另一批類似的測試,并重復該過程。
在評估結束時,Sapienz將找到快速可靠地崩潰應用程序的新方法。使用預測模型,Sapienz根據他們可能的常見和嚴重程度對這些崩潰進行優先排序。系統使用一系列啟發式規則來研究可能產生問題的代碼行,并在Facebook的代碼審查工具中注釋這個位置,允許開發人員看到系統的注釋覆蓋在他們編寫的實際代碼上。
Facebook的開發者每周進行超過100,000次提交,Android的Facebook應用程序包含數百萬行代碼。Sapienz全天候運行數百個仿真器來檢查代碼發布前后的代碼,每天進行數萬次測試。
“這是這些技術如何慢慢成為主流的一個很好的例子,”維尼亞說。“我認為未來我們會看到越來越多這樣的事情。”