重構(gòu)人工智能代碼:好的、壞的和奇怪的
在軟件開發(fā)領(lǐng)域,生成式人工智能不再是一個(gè)新鮮事物:它越來越多地被用作編寫在現(xiàn)實(shí)生產(chǎn)中運(yùn)行的代碼的助手。但是每個(gè)開發(fā)人員都知道從頭開始編寫新代碼只是他們?nèi)粘9ぷ鞯囊恍〔糠?。開發(fā)人員的大部分時(shí)間都花在維護(hù)現(xiàn)有代碼庫(kù)和重構(gòu)其他人編寫的代碼上。
當(dāng)這些手不是人類的,或者由人工智能副駕駛生成的時(shí)候,做維修工作是什么感覺?像GitHub Copilot,Vercel的v0或CursorIDE這樣的人工智能工具可以用來減輕負(fù)載嗎?以下了解人工智能革命的下一階段是如何進(jìn)行的。
人工智能編寫代碼:有用,有時(shí)也很奇怪
很多開發(fā)者都對(duì)生成式人工智能作為開發(fā)過程一部分的有用性表達(dá)了不同程度的熱情。他們也承認(rèn)人工智能生成的代碼有其怪癖,而這些怪癖可能會(huì)使其難以維護(hù)和重構(gòu)。
DevNag多年來一直在人工智能編碼工具領(lǐng)域工作,他是Query Pal的首席執(zhí)行官,這是一家專注于人工智能票證生成的軟件公司。他將重構(gòu)和維護(hù)人工智能生成代碼的過程描述為令人驚訝的挑戰(zhàn)。他說:“代碼通常在風(fēng)格和命名約定上缺乏一致性,這會(huì)使代碼庫(kù)感覺脫節(jié)。”“我花了很多時(shí)間清理和標(biāo)準(zhǔn)化人工智能生成的代碼,以適應(yīng)項(xiàng)目的慣例?!?/p>
IT服務(wù)和咨詢公司Pranshtech Solutions的首席執(zhí)行官、SaaS開發(fā)公司Textdrip的首席技術(shù)官、經(jīng)驗(yàn)豐富的軟件開發(fā)人員Dhaval Gajjar對(duì)此表示贊同。他說:“基于人工智能的代碼通常在語法上是正確的,但往往缺乏人類開發(fā)人員對(duì)最佳實(shí)踐的理解所帶來的清晰度或潤(rùn)色。”開發(fā)人員經(jīng)常需要清理變量名、簡(jiǎn)化邏輯或重構(gòu)代碼以獲得更好的可讀性。
Innovative Solutions公司的首席技術(shù)官Travis Rehl致力于在云端遷移、現(xiàn)代化和構(gòu)建下一代系統(tǒng),對(duì)于他來說,使用人工智能編寫的代碼來重構(gòu)或維護(hù)它的奇怪之處可能會(huì)更深入。他說:“當(dāng)人工智能使用了不熟悉的模式或庫(kù)時(shí),如果沒有對(duì)這些選擇的深刻理解,重構(gòu)可能會(huì)很有挑戰(zhàn)性。”“還存在打破人工智能可能創(chuàng)造的復(fù)雜依賴關(guān)系的風(fēng)險(xiǎn)。這絕對(duì)是一種不同的體驗(yàn)。您經(jīng)常使用既熟悉又陌生的代碼。人工智能可能會(huì)使用對(duì)人類開發(fā)者來說似乎不尋常的方法?!?/p>
Nag和Gajjar都注意到,人工智能生成的代碼可能比實(shí)現(xiàn)相同結(jié)果的人類編寫的代碼更復(fù)雜。根據(jù)Gajjar的說法,“眾所周知,人工智能工具會(huì)過度設(shè)計(jì)解決方案,因此生成的代碼比用于簡(jiǎn)單任務(wù)的實(shí)際代碼更龐大。開發(fā)人員必須刪減一些多余的步驟,或者為了效率和可維護(hù)性,必須實(shí)現(xiàn)一個(gè)簡(jiǎn)化的結(jié)構(gòu)。人工智能可以拋出一些并不總是必要的錯(cuò)誤處理和邊緣情況。就好像它試圖炫耀它所知道的一切,即使一個(gè)更簡(jiǎn)單的解決方案就足夠了?!?/p>
創(chuàng)新解決方案公司的Rehl很欣賞這種炫耀方式?!叭斯ぶ悄苓€會(huì)做一些事情,比如圍繞功能添加大量評(píng)論。這是一把雙刃劍。它對(duì)人類很有用,但它也給代碼庫(kù)增加了很多膨脹。但想想下次你使用人工智能的時(shí)候:你想要一些關(guān)于該功能目的的描述,以便人工智能稍后可以再次閱讀,以理解圍繞它的業(yè)務(wù)環(huán)境。”
人工智能克服自己的缺陷
盡管存在這些怪癖,但與我交談過的開發(fā)人員認(rèn)為人工智能生成的代碼在軟件開發(fā)生命周期中占有一席之地。事實(shí)上,他們說人工智能工具在代碼維護(hù)和重構(gòu)過程中可能會(huì)有所幫助。具有諷刺意味的是,人工智能工具甚至可以用來克服人工智能代碼中的一些缺陷。
例如,Rehl在Innovative Solutions部署了用于代碼分析和自動(dòng)重構(gòu)的人工智能工具。他說:“人工智能可以快速分析大型代碼庫(kù),并識(shí)別需要重構(gòu)、潛在bug或優(yōu)化機(jī)會(huì)的區(qū)域?!皩?duì)于更簡(jiǎn)單的重構(gòu)任務(wù),比如重命名變量或提取方法,人工智能工具可以在整個(gè)代碼庫(kù)中以高精度執(zhí)行這些操作?!盦uery Pal的Nag指出,他在代碼庫(kù)的變化中使用了人工智能,比如更新過時(shí)的API調(diào)用。
因?yàn)樯虡I(yè)上可用的人工智能工具是根據(jù)他們從大量代碼庫(kù)中學(xué)到的最佳實(shí)踐和模式進(jìn)行培訓(xùn)的,所以它們也可以被部署來提出對(duì)人眼來說可能不太明顯的改進(jìn)建議。Nag說:“人工智能工具在識(shí)別模式和提出改進(jìn)建議方面非常出色,這可以顯著加快重構(gòu)過程。”
Pranshtech的Gajjar補(bǔ)充說:“像GitHub Copilot這樣的工具可以簡(jiǎn)化代碼,糾正效率低下的問題,甚至可以在從某些模式中識(shí)別出邏輯后重新構(gòu)建邏輯。它可以幫助完成自動(dòng)重復(fù)的任務(wù),清理樣板代碼,甚至提示那些需要重構(gòu)的部分?!?/p>
Rehl描述了一個(gè)他能夠使用人工智能工具重構(gòu)人工智能輔助代碼的實(shí)際情況。他解釋說:“人工智能創(chuàng)建了一個(gè)復(fù)雜的React組件結(jié)構(gòu),但它與我在后端設(shè)置的數(shù)據(jù)模型并不完全一致?!?/p>
重構(gòu)這一過程需要謹(jǐn)慎地保持人工智能的有效組件設(shè)計(jì),同時(shí)調(diào)整它以適應(yīng)我們的特定數(shù)據(jù)流。我發(fā)現(xiàn)特別有用的是使用人工智能(在本例中是CursorIDE)來輔助重構(gòu)過程本身。我可以用自然語言描述我需要的改變,人工智能會(huì)建議修改代碼。這創(chuàng)造了一個(gè)有趣的循環(huán),即人工智能生成的代碼在人工智能的幫助下被重構(gòu),而人類監(jiān)督指導(dǎo)著這一過程。
仍然需要人類參與其中
很多開發(fā)者沒有人認(rèn)為人工智能已經(jīng)準(zhǔn)備好在代碼庫(kù)中釋放出來了——至少現(xiàn)在還沒有。品牌開發(fā)公司Emerald OceanLtd.的開發(fā)人員兼首席執(zhí)行官Jason Wingate表示,人工智能工具使他能夠加速重構(gòu),但人類的監(jiān)督仍然是關(guān)鍵。他說:“總是審查和完善人工智能生成的代碼更改。
Wingate描述了在人工智能幫助下進(jìn)行編碼的基本迭代過程。他說,“最基本的方法是請(qǐng)求重構(gòu)建議,并給它一大塊代碼。包括關(guān)于語言、編碼標(biāo)準(zhǔn)和約定的基本信息。根據(jù)你真正想要的東西,你可以深入研究更多你真正想要實(shí)現(xiàn)的問題。你可以自己執(zhí)行這些建議,也可以讓人工智能來執(zhí)行。然后回顧一下,有可能再做一次?!?/p>
Wingate還提醒開發(fā)人員注意幻覺,并運(yùn)行測(cè)試以確保工具正確地遵循提示。
QueryPal的Nag還指出,有必要仔細(xì)審查人工智能生成的代碼。他說,“根據(jù)我的經(jīng)驗(yàn),在初始開發(fā)和重構(gòu)中成功使用人工智能的關(guān)鍵是將其視為知識(shí)淵博但有時(shí)不可靠的初級(jí)團(tuán)隊(duì)成員。你不會(huì)讓新員工在沒有審查的情況下直接將代碼推送到產(chǎn)品中,人工智能生成的代碼也是如此。我總是確保團(tuán)隊(duì)中有經(jīng)驗(yàn)的開發(fā)者審查并調(diào)整人工智能的輸出?!?/p>
Rehl也不認(rèn)為這種人類監(jiān)督是暫時(shí)的。他說:“我相信重構(gòu)過程確實(shí)需要人在循環(huán)中的體驗(yàn)。在人工智能模型中,系統(tǒng)設(shè)計(jì)的商業(yè)背景可能會(huì)丟失,因此,人類將需要引導(dǎo)它。我開始相信QA工程師可能是未來的‘重構(gòu)工程師’,他們負(fù)責(zé)驗(yàn)證需求,比較輸出,并將內(nèi)容反饋給人工智能?!?/p>
未來還沒有完全確定
與我交談過的每個(gè)開發(fā)人員和IT領(lǐng)導(dǎo)者都強(qiáng)調(diào),人們?nèi)蕴幱谏墒饺斯ぶ悄艿脑缙陔A段。對(duì)于大多數(shù)商店來說,其代碼庫(kù)中人工智能輔助(或完全人工智能編寫)的代碼數(shù)量相對(duì)較少。但隨著人工智能輔助重構(gòu)的雪球般滾雪球,它將不可避免地增長(zhǎng)。
Rehl引用了絞藤的模式來解釋他是如何看待這個(gè)過程的:
當(dāng)人們喜歡舊技術(shù)并想要?jiǎng)?chuàng)造新技術(shù)時(shí),可以在舊系統(tǒng)的基礎(chǔ)上構(gòu)建一個(gè)全新的系統(tǒng),或者你可以在舊系統(tǒng)的基礎(chǔ)上構(gòu)建新系統(tǒng)的組件。你開始交換組件樹和它的絞藤。他們進(jìn)來掐死那棵樹。認(rèn)為隨著時(shí)間的推移,這將會(huì)發(fā)生,因?yàn)槿斯ぶ悄?。?dāng)人工智能作為副駕駛員暴露在現(xiàn)有系統(tǒng)中時(shí),它將開始自動(dòng)記錄樹周圍的情況。然后在一年后,它將有足夠的評(píng)論來理解它試圖實(shí)現(xiàn)的業(yè)務(wù)環(huán)境,然后它就可以接管了。
但對(duì)大多數(shù)商店來說,這一天還沒有到來。QueryPal的Nag表示:“總的來說,雖然人工智能編碼工具確實(shí)提高了我們?cè)谠S多領(lǐng)域的生產(chǎn)力,但它們也在代碼一致性和維護(hù)方面帶來了新的挑戰(zhàn)?!彼鼈儾⒉皇悄承┤怂M撵`丹妙藥,而是一種強(qiáng)大的工具,如果使用得當(dāng),可以顯著提高開發(fā)人員的能力。關(guān)鍵是找到適當(dāng)?shù)钠胶猓⑹冀K在代碼庫(kù)中保持人情味。