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