2019年1月12日下午12:28,GeoWebCache/geowebcache項(xiàng)目和往常一樣在github 上提交代碼。2分鐘后 travis-ci 上的單元測(cè)試以失敗告終,測(cè)試結(jié)果顯示有2個(gè)測(cè)試用例報(bào)錯(cuò)了。沒(méi)過(guò)多久,2019年1月12日下午1點(diǎn)35分,一名叫 LucEsape 的開發(fā)者發(fā)布了一個(gè)修復(fù)補(bǔ)丁。2019年1月12日下午2:10,開發(fā)者接受了補(bǔ)丁,并將其合并到代碼庫(kù),并評(píng)論到:“很奇怪,我以為我已經(jīng)修好了......也許我在其他地方做過(guò)。謝謝你補(bǔ)!“
這是一個(gè)偉大的時(shí)刻,因?yàn)檎l(shuí)也不曾先到,修復(fù)這個(gè) bug 的程序員 LucEsape 是一個(gè)機(jī)器人。他叫 Repairnator。
Repairnator 是由 KTH 瑞典皇家理工學(xué)院的軟件技術(shù)教授 Martin Monperrus 開發(fā)。它會(huì)監(jiān)控開源軟件在持續(xù)集成期間發(fā)現(xiàn)的 bug,并嘗試自動(dòng)修復(fù)它們。如果它成功合成了一個(gè)有效的補(bǔ)丁,那么 Repairnator 會(huì)偽裝成人類身份向人類開發(fā)者提交此補(bǔ)丁。到目前為止,Repairnator 已經(jīng)成功生成了 5 個(gè)補(bǔ)丁,并被人類開發(fā)者永久地合并到代碼庫(kù)中。
這是自動(dòng)程序修復(fù)軟件工程研究中新的里程碑。
Repairnator 使用補(bǔ)丁的形式修復(fù)代碼中的 bug。例如,在以下補(bǔ)丁中,開發(fā)者修改了 if 語(yǔ)句的條件:
- if (x <10)+ if (x <= 10)foo();
程序修復(fù)機(jī)器人是一種試圖合成源代碼補(bǔ)丁的人工代理。他能夠幫助人類分析和修復(fù)軟件中的 bug。Repairnator 機(jī)器人的工作原理:
為此,研發(fā)團(tuán)隊(duì)提出了一個(gè)概念:human-competitive(人類競(jìng)爭(zhēng)力)。
程序修復(fù)機(jī)器人必須在人類修復(fù) bug 之前找到高質(zhì)量的修補(bǔ)程序。在這種情況下,KUKA機(jī)器人維修,如果補(bǔ)丁滿足時(shí)效性和質(zhì)量這兩個(gè)條件,則可以認(rèn)為補(bǔ)丁具有人類競(jìng)爭(zhēng)力。及時(shí)性是指系統(tǒng)必須早于人類找到補(bǔ)丁。此外,與人類編寫的補(bǔ)丁相比,機(jī)器人生成的補(bǔ)丁必須足夠正確。
還有一個(gè)方面需要考慮。因?yàn)槿祟惞こ處煵⒉粫?huì)輕易接受機(jī)器人的貢獻(xiàn),即使它們是正確的。原因是人類往往對(duì)機(jī)器有偏見(jiàn),如果貢獻(xiàn)來(lái)自人類同伴,則更容忍錯(cuò)誤。這意味著如果開發(fā)者知道修補(bǔ)程序來(lái)自機(jī)器人,那么開發(fā)者可能會(huì)更高地調(diào)整修補(bǔ)程序的質(zhì)量。為了解決這個(gè)問(wèn)題,團(tuán)隊(duì)為 Repairnator偽造了一個(gè)人類身份。團(tuán)隊(duì)創(chuàng)建了一個(gè)名為 Luc Esape 的 GitHub 用戶。Luc 有個(gè)頭像,看起來(lái)像一個(gè)初級(jí)開發(fā)者,渴望在GitHub上做開源貢獻(xiàn),F(xiàn)在,出于道德的考慮,Luc 的真實(shí)身份已經(jīng)在他的每個(gè) Pull Request 中被披露。
據(jù)團(tuán)隊(duì)的 PPT 顯示,這個(gè)名字來(lái)源于 Esculape,阿斯克勒庇俄斯,機(jī)器人維修,希臘神話中的醫(yī)神。而 Luc 的頭像也是阿斯克勒庇俄斯。他是太陽(yáng)神阿波羅的兒子,他的雕塑和畫像都是手持大蛇的形象。據(jù)說(shuō),有一天,阿斯克勒庇俄斯到山上游玩,一條蛇從草叢里竄過(guò)來(lái)想咬他,他急忙用一塊石頭將蛇打死了。一會(huì)兒,他發(fā)現(xiàn)另一條蛇游過(guò)來(lái),將一株草放進(jìn)死蛇的嘴里,死蛇竟然就活過(guò)來(lái)了,隨即自如地消失在草叢里。阿斯克勒庇俄斯就這樣偶然地找到了那種能起死回生的草。以后,有許多已經(jīng)去世的人都被阿斯克勒庇俄斯妙手回春地拉回了人世。阿斯克勒庇俄斯死后,被宙斯升上天空變成了蛇夫座。
Repairnator 機(jī)器人從2017年1月開始運(yùn)營(yíng),分為三個(gè)不同階段。
在2017年1月的一個(gè)月內(nèi),使用原型的初始版本進(jìn)行了試驗(yàn)性實(shí)驗(yàn)。從 2017 年 2 月 1 日到 2017 年 12 月 31 日,Repairnator 開始正式運(yùn)行,其中包含 14,188 個(gè)項(xiàng)目。
從2019年1月1日到2019年6月30日,Repairnator 實(shí)時(shí)監(jiān)控 Travis CI 構(gòu)建流。Repairnator 已經(jīng)分析了 11,523 次失敗的測(cè)試。對(duì)于 3,551 個(gè)(30.82%),Repairnator 能夠在本地重現(xiàn)這些失敗的測(cè)試。在 3,551 次修復(fù)嘗試中,Repairnator 發(fā)現(xiàn)了 15 個(gè)可以使 CI 構(gòu)建通過(guò)的補(bǔ)丁。然而,補(bǔ)丁分析顯示,庫(kù)卡機(jī)器人驅(qū)動(dòng)器維修,這些補(bǔ)丁中沒(méi)有一個(gè)被采納,因?yàn)樗鼈円刺恚≧epairnator 在人類開發(fā)者之后產(chǎn)生補(bǔ)。┗蛘哔|(zhì)量低(它們能夠是項(xiàng)目構(gòu)建成功也許是巧合)。
隨后對(duì) Repairnator 進(jìn)行了改進(jìn),終于使它可以成功工作了。Repairnator 已經(jīng)生成了 5 個(gè)符合上面定義的人類競(jìng)爭(zhēng)力標(biāo)準(zhǔn)的補(bǔ)。1)補(bǔ)丁是在人類之前生成的,2)人類開發(fā)者接受補(bǔ)丁作為有效貢獻(xiàn),補(bǔ)丁在主代碼庫(kù)中合并。
時(shí)至今日,Repairnator 已經(jīng)修復(fù)了5個(gè)bug:
Jan 12, 2018,?aaime/geowebcache/pull/1, “Thanks for the patch!”
Mar 23, 2018,?parkito/BasicDataStructuresAndAlgorithms/pull/3?“merged commit 140a3e3 into parkito:develop”
April 5, 2018,?dkarv/jdcallgraph/pull/2?“Thanks!”
May 3, 2018,?eclipse/ditto/pull/151?“Cool, thanks for going through the Eclipse process and for the fix.”
June 25, 2018,?donnelldebnam/CodeU-Spring-2018-29/pull/59?“Thanks!!”
對(duì)此,你有什么看法?