AI也造代碼屎山!研究發(fā)現(xiàn)GitHub Copilot代碼可維護(hù)性差,偏愛(ài)“無(wú)腦重寫(xiě)”而非重構(gòu)復(fù)用已有代碼
AI幫忙寫(xiě)代碼程序員用了都說(shuō)好,但代碼質(zhì)量真的靠譜嗎?
結(jié)果或許令你大跌眼鏡。
一家名為GitClear的公司分析了近四年超過(guò)1.5億行代碼后發(fā)現(xiàn),隨著GitHub Copilot工具的加入,代碼流失率(即代碼寫(xiě)入后不久又被返工修改、刪除的情況)出現(xiàn)了顯著上升:
2023年為7.1%,而2020年時(shí)僅為3.3%,翻了一番。
與之相應(yīng)的,代碼復(fù)用率也出現(xiàn)了明顯下降。
言外之意,AI寫(xiě)的很多內(nèi)容其實(shí)不亞于“屎山”,根本不好隨著業(yè)務(wù)的變化作相應(yīng)更改。
看起來(lái),AI編程工具還遠(yuǎn)沒(méi)有宣傳中的那么好用?
Copilot更愛(ài)直接添加代碼而不鼓勵(lì)復(fù)用
GitClear收集的1.5億行代碼中,有2/3來(lái)自匿名私企,剩下的1/3則源自于谷歌、Meta和微軟的開(kāi)源項(xiàng)目。
它們?nèi)勘慌懦恕霸肼暋睌?shù)據(jù),比如在多個(gè)分支中提交的一模一樣的代碼、空行以及其他沒(méi)有意義的代碼行。
調(diào)查的主要對(duì)象是微軟的GitHub Copilot。
它于2021年6月推出測(cè)試版,按照CEO說(shuō)法,截至2023年第三季度,該工具已有超100萬(wàn)開(kāi)發(fā)者付費(fèi)訂閱,能夠幫助開(kāi)發(fā)者編寫(xiě)46%的代碼,并將編碼速度提高55%。
不過(guò)在此,GitClear不關(guān)心編碼速度,只關(guān)心質(zhì)量。
“AI編程工具更類(lèi)似于高級(jí)開(kāi)發(fā)人員,仔細(xì)又精細(xì)?還是更像短期承包商一樣,只在乎面前的任務(wù)完成與否?”
為此,他們統(tǒng)計(jì)了這1億行+代碼的新增、刪除、更新、移動(dòng)、復(fù)制/粘貼等情況,得出了這樣一個(gè)趨勢(shì)表格:
從中我們可以發(fā)現(xiàn):
Copilot添加代碼、復(fù)制/粘貼代碼的百分比比更新、刪除和移動(dòng)增加得更明顯。
其中我們還可以清晰地看到,移動(dòng)代碼的百分比從2020年的25%下降到了13.4%,這是所有數(shù)據(jù)中唯一一個(gè)反向特例。
更少的移動(dòng)意味著更少的重構(gòu)和復(fù)用,加上大幅增長(zhǎng)的添加、復(fù)制/粘貼代碼,這表明:
AI編程工具并不鼓勵(lì)代碼復(fù)用、在已有代碼上進(jìn)行修改,而是更傾向于“無(wú)腦重寫(xiě)”。
在此,GitClear也指出,過(guò)度新增代碼、復(fù)制/粘貼對(duì)代碼的長(zhǎng)期可維護(hù)性也相當(dāng)不利。
這其實(shí)在人類(lèi)程序員中也是老問(wèn)題,可能是程序員覺(jué)得解決當(dāng)下問(wèn)題比思考如何復(fù)用、整合現(xiàn)有代碼更快更容易,也可能是因?yàn)橥瑐€(gè)項(xiàng)目組中的開(kāi)發(fā)人員溝通不暢等。
遭殃的就變成后面的維護(hù)人員。
Copilot的代碼質(zhì)量下降也體現(xiàn)在代碼流失率(Churn)這個(gè)數(shù)據(jù)上。
在此,它的標(biāo)準(zhǔn)定義是代碼編寫(xiě)后不到兩周的時(shí)間內(nèi)修改更新的百分比。
表格顯示,2020年的流失率為3.3%(那會(huì)還沒(méi)有用上Copilot),2023年增長(zhǎng)到5.5%。
GitClear預(yù)計(jì),2024年將直接相比2020年翻一番之多,達(dá)到7.1%。
這說(shuō)明AI的加速,并沒(méi)有帶來(lái)足夠高質(zhì)量的代碼。
除了以上結(jié)論,GitClear還發(fā)現(xiàn),Copilot的代碼建議算法還被設(shè)計(jì)為總是提出最有可能被用戶(hù)接受的建議——
這選擇乍一聽(tīng)沒(méi)啥毛病,但其實(shí)會(huì)忽略代碼簡(jiǎn)潔易讀的重要性。
總的來(lái)說(shuō),這項(xiàng)結(jié)果足以讓那些擔(dān)心AI編程工具會(huì)取代人類(lèi)程序員的人暫時(shí)把心放肚子里。
最近也有不少其他研究佐證了GitClear的發(fā)現(xiàn)。
比如來(lái)自CodeScene的一篇報(bào)告就表示:
在編碼任務(wù)中,AI遠(yuǎn)無(wú)法取代人類(lèi);今天的AI太容易出錯(cuò),且遠(yuǎn)未達(dá)到能夠安全修改已有代碼的程度。
網(wǎng)友體驗(yàn)大差不差
實(shí)實(shí)在在使用過(guò)Copilot的人怎么說(shuō)?
一位網(wǎng)友表示:
我用了倆個(gè)月后取消了會(huì)員,因?yàn)榛颂嗑θz查AI給出的代碼以及修復(fù)bug。
在TA看來(lái),現(xiàn)階段還是自己編寫(xiě)內(nèi)容要省力得多,因?yàn)樽约褐雷约合胍獙?xiě)什么,修復(fù)自己的bug總是比修復(fù)機(jī)器人的更容易。
有人使用的是ChatGPT而非Copilot,也對(duì)TA的話(huà)表示了贊同:
我對(duì)AI的能力感到驚訝,但還是不會(huì)稱(chēng)其為“好代碼”。
當(dāng)然,Copilot在大家眼里也并非一無(wú)是處。
一位從事web開(kāi)發(fā)20多年的程序員就表示:
用它編寫(xiě)重要的SQL或TypeScript代碼時(shí),總是失?。坏珜?duì)于編寫(xiě)測(cè)試、請(qǐng)求處理、React樣式等等來(lái)說(shuō),它還是可以幫我節(jié)省大量時(shí)間的。
你的Copilot(或者其他AI編碼工具)體驗(yàn)如何?你同意GitClear的發(fā)現(xiàn)嗎?