【CSDN 編者按】如今生成式 AI 逐漸融入軟件開(kāi)發(fā)流程,越來(lái)越多 AI 生成的代碼出現(xiàn)在實(shí)際工程中——但你有沒(méi)有想過(guò),這些由 AI 寫(xiě)出來(lái)的代碼,從一開(kāi)始就可能被視為“遺留代碼”?本文作者從工程經(jīng)驗(yàn)出發(fā),結(jié)合 AI 的生成機(jī)制,提出一個(gè)頗具啟發(fā)性的觀點(diǎn):AI 生成的代碼缺乏上下文記憶和維護(hù)連續(xù)性,因此一誕生就處于“他人舊作”的狀態(tài)。這不僅是對(duì)當(dāng)前 AI 編碼能力的冷靜觀察,也為我們理解未來(lái)軟件開(kāi)發(fā)形態(tài)提供了一種新視角。
原文鏈接:https://text-incubation.com/AI+code+is+legacy+code+from+day+one
翻譯 | 鄭麗媛
出品 | CSDN(ID:CSDNnews)
在軟件開(kāi)發(fā)中,代碼的“可改進(jìn)性”往往取決于其所處的生命周期階段。通常可以分為以下幾類(lèi)情況:
當(dāng)某段代碼是你自己剛寫(xiě)的:“哦,確實(shí)可以改成那種寫(xiě)法,應(yīng)該不難。”
當(dāng)某段代碼是別人剛寫(xiě)的:“可能是出于最近的一些臨時(shí)情況才這么寫(xiě)的吧。如果真有需要,我可以考慮調(diào)整一下。”
當(dāng)某段代碼是你以前寫(xiě)的:“嗯,其實(shí)當(dāng)時(shí)應(yīng)該那樣寫(xiě)。如果有必要,等忙完手頭工作了我再優(yōu)先處理吧。”
當(dāng)某段代碼是別人以前寫(xiě)的:“他為什么要這么寫(xiě)呢?不過(guò)應(yīng)該沒(méi)必要?jiǎng)樱日娴某鰡?wèn)題再說(shuō)。”
總的來(lái)看,代碼的演進(jìn)速度,通常取決于離它的編寫(xiě)時(shí)間有多近、維護(hù)者是不是原作者。
其實(shí),這種狀態(tài)是合理的:對(duì)于一個(gè)運(yùn)行穩(wěn)定、經(jīng)過(guò)驗(yàn)證的軟件系統(tǒng)而言,貿(mào)然進(jìn)行“改進(jìn)”往往帶來(lái)額外風(fēng)險(xiǎn),尤其是當(dāng)你對(duì)系統(tǒng)的整體脈絡(luò)不甚了解時(shí),原作者通常才最清楚其潛在邏輯和開(kāi)發(fā)背景。
AI 生成的代碼,處在什么階段?
那么換個(gè)角度看,AI 生成的代碼具體處在什么階段呢?在我看來(lái),它有幾個(gè)關(guān)鍵的特點(diǎn):
(1)即使AI擁有上下文窗口,它也是“無(wú)狀態(tài)”的(stateless)。也就是說(shuō),AI 可以推測(cè)一段代碼為什么這樣寫(xiě),但它無(wú)法真正“知道”作者當(dāng)時(shí)的具體意圖,也無(wú)法像人類(lèi)維護(hù)者那樣擁有真實(shí)的時(shí)間點(diǎn)記憶。
(2)每一次 AI生成的代碼,其實(shí)都是“由別人寫(xiě)的”。AI 就像一個(gè)第一次閱讀你代碼的新人,從零構(gòu)建對(duì)上下文的理解,它不會(huì)真的“記得”當(dāng)初的輸入是如何經(jīng)過(guò)某種“電路”轉(zhuǎn)化為某個(gè)輸出。
(3)AI 生成的代碼,一出生就已經(jīng)“變老”了。它跳過(guò)了“新代碼”的階段,直接進(jìn)入了“別人寫(xiě)的舊代碼”的模式——沒(méi)有時(shí)間上的“新鮮感”,也沒(méi)有原作者持續(xù)維護(hù)的加成。這種代碼,從一開(kāi)始就可以被視作“遺留代碼(legacy code)”。
當(dāng)然,也有熟練 AI 的開(kāi)發(fā)者在嘗試解決這個(gè)問(wèn)題。比如通過(guò)精心構(gòu)造的提示(prompts)、設(shè)計(jì)合理的上下文窗口、詳細(xì)注釋等手段,來(lái)彌補(bǔ) AI 缺乏狀態(tài)記憶的問(wèn)題。但總體上,這些做法更像是順應(yīng)慣性、朝著某一個(gè)方向在緩慢優(yōu)化。
不過(guò)我個(gè)人的猜測(cè)是——或許這根本不算大問(wèn)題,因?yàn)榇a本身就是一種“靜態(tài)狀態(tài)”。隨著提示工程(prompting)和上下文窗口的能力增強(qiáng),代碼會(huì)被越來(lái)越多地“提示生成”,而非長(zhǎng)期維護(hù)。未來(lái)“復(fù)雜軟件”的代碼量可能會(huì)更少,更多的邏輯會(huì)依賴(lài)于模型推理、提示而非靜態(tài)結(jié)構(gòu)。
在此背景下,AI 提示生成的代碼,更像是一個(gè)短期/中期的“過(guò)渡橋梁”。
一些值得細(xì)品的高贊評(píng)論
我把以上的觀點(diǎn)整理成稿并發(fā)布后,在Hacker News 上引發(fā)了熱烈討論。以下是幾條高贊評(píng)論,我覺(jué)得都值得細(xì)品:
(1)@dang:文章的開(kāi)頭實(shí)際上可以追溯到 Peter Naur 在 1985 年發(fā)表的經(jīng)典論文《Programming as Theory Building》。順帶補(bǔ)充一下,Naur 正是 ALGOL 語(yǔ)言和 BNF 語(yǔ)法的核心人物之一。
Naur 的觀點(diǎn)是,復(fù)雜的軟件系統(tǒng),本質(zhì)上是開(kāi)發(fā)者集體心智中構(gòu)建起來(lái)的“理論”。源碼和文檔只是這種理論的低保真表達(dá)(lossy representation)——因?yàn)槟阌肋h(yuǎn)無(wú)法僅憑代碼和注釋?zhuān)暾€原構(gòu)建這個(gè)系統(tǒng)時(shí)的全部思維脈絡(luò)。
在這種意義下,遺留代碼(legacy code)指的是:雖然你還保留著代碼和文檔這些“文物”,但支撐它們的那套“理論”已經(jīng)隨著原作者的離開(kāi)而失傳了。這也就意味著,你不再有權(quán)限對(duì)系統(tǒng)進(jìn)行“深層改進(jìn)”,只能做些修補(bǔ)和維護(hù)。
那么,這種思想對(duì)于大語(yǔ)言模型(LLM)時(shí)代意味著什么呢?
從 Naur 的角度來(lái)看,LLM 是否也必然缺乏“程序背后的理論”?這并不是一個(gè)有定論的問(wèn)題,可能存在以下幾種可能性:
LLM 在生成代碼時(shí),其實(shí)已經(jīng)隱含某種“理論”,只是我們還沒(méi)看懂;
也許 LLM 可以從已有代碼中逐步構(gòu)建這種理論,或者未來(lái)能做到;
或許 LLM 根本不需要人類(lèi)工程團(tuán)隊(duì)那樣的“理論”;
如果代碼是由 AI 生成的,那么或許 AI 才是唯一掌握了理論的存在,而不再是人類(lèi);
又或者,這套“理論”其實(shí)是掌握在寫(xiě) prompt 的人手中,而不是寫(xiě)代碼的人手中。
(2)@mrweasel:我和老板總會(huì)對(duì)新來(lái)的年輕同事“辯解”說(shuō):“這就是我們那時(shí)的寫(xiě)法”——多數(shù)情況下,這只是用來(lái)掩飾一些寫(xiě)得不咋地的代碼的接口,而“那時(shí)”可能也就是兩周前。
不過(guò)有時(shí)候我們也確實(shí)沒(méi)錯(cuò)。因?yàn)橛行┢婀值膶?xiě)法,是為了適配一些極端邊界場(chǎng)景,或者是為了集成一些老舊系統(tǒng)——它們本來(lái)就是那個(gè)時(shí)代的產(chǎn)物。所幸我們還在團(tuán)隊(duì)里,所以能判斷哪些代碼可以刪、或者至少可以試著刪。
我認(rèn)為,如果 LLM 輔助編程可以記錄下 Prompt,并與生成的代碼一起保存,那它或許比人類(lèi)更能管理技術(shù)債。舉個(gè)例子:
如果你能知道某段代碼是由這樣一個(gè) Prompt 生成的——“確保處理客戶(hù)端運(yùn)行 AIX 6 時(shí)的邊界情況”,這就能回答很多問(wèn)題。雖然你依然不知道當(dāng)初是誰(shuí)在用 AIX,但你至少知道為什么這段代碼存在,也能判斷是否還能刪。
(3)@TZubiri:原文中提到,“即使 AI 擁有上下文窗口,它也是“無(wú)狀態(tài)”的(stateless)。也就是說(shuō),AI 可以推測(cè)一段代碼為什么這樣寫(xiě),但它無(wú)法真正“知道”作者當(dāng)時(shí)的具體意圖,也無(wú)法像人類(lèi)維護(hù)者那樣擁有真實(shí)的時(shí)間點(diǎn)記憶。”
對(duì)于這句話(huà),我想說(shuō):Chain of Thought(思維鏈)技術(shù)能搞定這個(gè)問(wèn)題。
甚至就算是沒(méi)有 CoT 的模型,也能通過(guò)“閱讀”原有代碼重新激活上下文。其實(shí)這一點(diǎn)跟人類(lèi)工程師很像——我們也不是永遠(yuǎn)都能記得所有的代碼背景,但重新看一遍代碼,通常就能想起當(dāng)時(shí)的上下文。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.