另一个小程序 返回的支付结果如何得到_所以,你想用 $8 的价格修一个bug吗?...
disclaimer:我對于 program repair 的了解僅限于一節軟件工程的課,觀點也大多是基于課上的討論,我對于 program repair 相關的研究也沒有進行更廣泛的閱讀,所以以下的敘述可能是 biased。
今天我們要講一個和程序修復(program repair)有關的故事。看到標題熟悉程序修復的朋友可能就懂了,我要開始講 GenProg 了。
在2009年,一篇名為 Automatically finding patches using genetic programming 的論文橫空出世,介紹了如何使用進化算法進行程序修復(program repair)。所謂程序修復,就是給定一個程序和一個不能通過測試的 test,然后使用一些可以被自動化的手段來自動修復程序中的bug,使得這個程序能夠通過測試。這看起來很難實現,對吧?考慮到程序生成(program synthesis)的搜索空間之大(對于非常非常小的程序,這樣的空間就能有2的幾百次方)。更為神奇的是,他們所針對的程序往往都是非常大的,比如php和python的源碼,動輒幾十甚至幾百萬行。可能是由于這篇文章的效果實在是太好了,它一舉拿下了當年 ICSE 的 best paper,并在之后的其他會議中多次獲得獎項。同一時期的另外幾篇 paper 的出現(AutoFix,ClearView)更使得2009年可以說是成為了程序修復的元年,在這一年之后關于程序修補的論文數量激增,程序修補迅速成為了一個軟件工程中炙手可熱的領域。
所以這篇文章講的是什么呢?我當時沒有直接讀那篇文章,而是讀了他們三年之后的一篇名為A Systematic Study of Automated Program Repair: Fixing 55 out of 105 Bugs for $8 Each的回顧文章。文章中算法的基本思路很直接:在源代碼上出 bug 可能性高的位置(fault locoalization)進行隨機的突變操作來模擬人手動編寫 patch 的過程,然后在修補后的程序上再跑一遍 test,計算一個適合函數(fitness function),在看起來更有希望的程序進行交配,也就是把它們上的 patch 縫合在一起。重復進行這個過程,直到所有的 test 都通過。這里的突變操作共有三種(是不是像極了寫編程作業時候的你):
在 evaluation 的部分中,它們收集了大型軟件如 Python (407k LOC),php (1046k LOC),gzip(491k LOC),wireshark(2814k LOC)在 git 的 commit history 中出現的 105 個 bug,然后使用分布式計算來大規模的運行 GenProg。最后發現,在這 105 個 bug 中,55 個 bug 得到了修補,平均的花費僅需 $7.32。這個結果不能不讓人感到震驚,考慮到一個硅谷程序員每天的工資都要幾百美刀,這實在是好的驚人了。可以想見的是,如果這個技術能夠獲得應用,那很多程序員肯定都失業了。
最后,文章的作者公開了測試所用的數據集,并且(就像所有 paper 一樣)添加了一小節 threats to validity 的聲明,聲稱為了防止數據集是精挑細選以增強效果的,他們用來測試的軟件都是他們能夠獲得的最好努力了(如http://Sourceforge.net/Google code上行數最多的開源軟件),但是他們只 evaluate 了開源軟件,只考慮 race condition 意外的 bug 之類的云云,總之就是一些讀者看到標題就會跳過的東西。
好了,到目前為止,這篇 paper 看起來展示了遺傳算法在軟件工程領域的巨大成功。但是真的是這樣嗎?事情沒有那么簡單,2015年的 ISSTA 上發表了一篇名為 An Analysis of Patch Plausibility and Correctness for Generate-and-Validate Patch Generation Systems 的 paper。paper 中在 GenProg 和其他兩個基于“打補丁”的 Program Repair 工具上重復了那個 105 個 bug實驗,然后發現了一些十分有趣的結論:
除了文章里面提到的,GenProg 其實還生成了一些好玩的程序(以下僅憑印象復述):
最后,文章的作者提出了一個名為 Kali 的程序修補工具,這個工具只會做一件事,那就是刪除——將 GenProg 的變異算子從插入/刪除/修改三個操作變為只剩下刪除,并增加了把 if 里的condition覆蓋為恒真或恒假的操作,以及在方法中插入直接返回 NULL 和 -1的語句。結果顯示,這個 Kali 的效果甚至吊打 GenProg——GenProg只產生了兩個正確的補丁,而 Kali 產生了三個!如果我們考慮前文所有通過了測試但是不一定對的patch,那么在 GenProg 需要花費 $7.3 的價格在分布式集群上花費幾個小時才能找到patch的情況下,Kalin往往能夠在十幾分鐘就能找到 patch!也就是說,僅僅從結果來看,我們也應該使用 Kali 而不是 GenProg。嗯,可見,刪庫跑路才是正確的選擇——只要你什么都不做,你就什么都不會做錯!
讓我們再來回顧一下一些基于或是提到 GenProg 的研究:
……
當然了,這篇文章的目的顯然不是讓大家以后每次 debug 的時候把代碼都刪掉,而是思考哪里出了問題(順便一提,GenProg 還拿了去年的十年最有影響力論文獎)。 所以,GenProg弄錯了什么呢?首先它弄錯了一個假設,那就是測試正確性=正確性。事實上,現實軟件中的測試往往都是非常貧弱的,并不能夠代表真正的正確性。如果 GenProg 的作者們能夠擁有一個判斷程序正確性的神諭機(Oracle),那么他們就會早早的發現 GenProg 幾乎不能產生任何正確的補丁了。
現實中我們顯然不能擁有這樣一個神諭機,那我們要做些什么才能避免出這樣的烏龍呢?這更是值得大家思考的一個問題。給我上這門課的教授指出了以下幾點:
總結的說,這一個大烏龍的影響是很深遠的,它說明了科學研究中很多的謬誤都有可能出現在計算機科學中。對于一些應用層面的研究,我們只有引入了科學的研究方法,以及對于可解釋性的注重,才能夠去盡量的避免類似的錯誤的產生。不過話說回來,在這樣一個連接主義的人工智能盛行的年代,可解釋性似乎已經被扔進了歷史的垃圾桶里,這在某種層面上來說也許就是一種悲哀。
總結
以上是生活随笔為你收集整理的另一个小程序 返回的支付结果如何得到_所以,你想用 $8 的价格修一个bug吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hpg8服务器系列指示灯意思,HP Pr
- 下一篇: 苹果mp3软件_神技能!!!音视频制作软