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