編譯丨諾亞
出品 | 51CTO技術(shù)棧(微信號:blog51cto)
隨著AI技術(shù)的發(fā)展,如今學習編程或許比以往任何時候都更加容易。但最新研究揭示了AI輔助編程工具對代碼質(zhì)量的影響并不盡如人意。
一、代碼攪動上升至7.1%
該研究由開發(fā)者分析公司GitClear基于對1.5億行代碼變更數(shù)據(jù)的深入分析得出,其中三分之二的數(shù)據(jù)來源于同意匿名共享數(shù)據(jù)的私營企業(yè),三分之一則主要來自谷歌、臉書和微軟等公司的開源項目。
值得注意的是,GitHub的Copilot自2021年6月進入測試階段以來,迅速引領(lǐng)了AI編碼潮流,目前已有超過百萬名付費訂閱用戶,并且據(jù)其CEO托馬斯·多姆克透露,在啟用Copilot功能的文件中,開發(fā)者完成任務(wù)的速度提升了55%,并且46%的代碼內(nèi)容是由Copilot協(xié)助完成的。
然而,GitClear的研究重點并非單純關(guān)注代碼的數(shù)量,而是更加關(guān)注代碼質(zhì)量本身。研究發(fā)現(xiàn),AI助手傾向于提供“新增代碼的建議,但從未給出更新、移動或刪除代碼的建議”。研究人員還推測,“代碼建議算法傾向于提出最有可能被采納的建議”,而忽視了編寫簡潔易讀代碼的重要性。
圖片
由GitClear分析的代碼變更趨勢(如上圖)表明,新增、刪除、更新和復制粘貼的代碼數(shù)量達到了前所未有的高度,而代碼被移動的情況卻在減少。他們還注意到“代碼攪動”(指一定時間范圍內(nèi)對同一段代碼的改動,是“異常”的代碼改動,體現(xiàn)代碼的返工程度)上升到了7.1%,相較于2020年的3.3%有顯著增長。
這些趨勢背后的原因尚未明確,但研究人員認為這可能與日益普遍采用AI編碼技術(shù)有關(guān)。對于更多復制粘貼代碼的現(xiàn)象,他們嚴厲批評稱“對長期代碼可維護性而言,沒有比這更大的禍患了”。
過度使用復制粘貼并不是一個新問題。開發(fā)人員這樣做可能是因為當時覺得這種方式比找出如何重用現(xiàn)有代碼更快更容易,或是因為項目中多位開發(fā)者之間溝通不暢,或者從示例或編程問答網(wǎng)站上復制了過多代碼。
GitClear的研究人員并未就如何解決識別出的問題提供太多解決方案,而是將這些問題留作后續(xù)研究的課題,盡管他們建議工程負責人應(yīng)“監(jiān)測輸入數(shù)據(jù)并考慮其對未來產(chǎn)品維護的影響”。
二、不要簡單地復制和粘貼
AI編碼助手并不會消失,反而可能會不斷改進,如同所有新興工具一樣,開發(fā)者要學習如何優(yōu)化它們的使用方法。但對于一部分開發(fā)人員包括初學編程的新手來說,如何理性使用這種工具并防止養(yǎng)成依賴性屬實是一個難題。
正如一個開發(fā)人員所說:“我在某個問題上卡住時,很容易就會想求助于ChatGPT這樣的工具,它能輕易幫我找到正確答案。這類輔助工具擅長生成簡單的代碼,其中一些甚至能在你描述問題后直接給出完整的解決方案?!辈贿^,他很快意識到,這種習慣一旦養(yǎng)成,實際上弊大于利。
如前文所述,機器生成的代碼并不總是有用,并且可能會降低代碼庫的質(zhì)量。如果只是簡單復制并粘貼AI助手生成的代碼到源代碼中,往往會導致新的錯誤出現(xiàn),因為這段代碼可能與程序其余部分不協(xié)調(diào)。嘗試修復這些錯誤可能會相當棘手,特別是當你不清楚生成的代碼具體含義時。很多人有時很難分辨錯誤是因為代碼本身有問題,還是因為在錯誤的上下文中使用了它。
《笨辦法學Python》的作者Zed Shaw建議:“如果有人想要利用當前這一批AI工具學習編程,他們應(yīng)該帶著兩個目標來著手:首先,花時間學習足夠多的編程知識,以便了解工具生成的是什么內(nèi)容;其次,承擔起‘代碼審查員’的角色,學會如何識別并改進低質(zhì)量代碼。”
程序員應(yīng)當具備發(fā)現(xiàn)機器生成代碼中的錯誤的能力,而不應(yīng)完全依賴于這些智能助手。他們尤其需要注意防止明顯的版權(quán)代碼未經(jīng)許可混入模型輸出的結(jié)果中。
密歇根大學信息學院計算機科學教授Charles Severance指出:“ChatGPT給出解決方案的速度非??欤⑶移浠卮鹜ǔ0b在諸如‘我認為這應(yīng)該能解決你的問題……’這樣令人安心的措辭中,這使我們?nèi)菀钻P(guān)閉批判性思考模式,不再像應(yīng)該的那樣仔細審視其提供的解決方案。”
Severance補充說:“始終假設(shè)ChatGPT是一個比你技能較低的程序員。使用AI工具的唯一安全方法是當你確信它產(chǎn)生的解決方案是正確的時候。”這意味著作為開發(fā)者,我們要保持警覺和獨立判斷,確保AI提出的方案既符合需求也無潛在風險,同時通過自身的專業(yè)知識進行驗證和完善。
三、明確問題并進行準確的表述
GitHub的首席產(chǎn)品官Inbal Shani強調(diào),要有效地使用AI編程工具,用戶首先必須明確自己的問題,并在輸入提示中清晰地表述出來。GitHub Copilot等工具返回代碼的質(zhì)量直接取決于提問的方式和問題的描述準確性。
她建議,用戶應(yīng)當像與同事交談那樣與Copilot互動,提供盡可能詳盡的上下文信息,包括解決問題的目標、意圖以及所處階段,這樣就能獲得更好的反饋,因為AI能夠基于更多背景信息進行更深入的搜索,從而找到合適的代碼片段或推薦相應(yīng)的測試架構(gòu)。
卡內(nèi)基梅隆大學的助理教授Phillip Compeau對此觀點表示贊同。他認為現(xiàn)今使用的編程語言越來越趨向于人類自然語言的表達方式,而聊天工具正是這一演變過程中的下一步。在教學過程中,Compeau會引導初學編程的學生先不依賴AI技術(shù),但對已掌握基礎(chǔ)編程知識的高級學生,則教導他們?nèi)绾斡行Ю眠@類工具提高工作效率。
Compeau表示:“我向?qū)W生們展示的一點是,從AI工具生成代碼中獲取簡潔、正確答案的最佳方法是你能夠準確無誤地闡述計算機需要執(zhí)行的具體任務(wù)。這恰恰是對編程的定義,隨著時代的發(fā)展,我們所使用的編程語言已經(jīng)愈發(fā)貼近人類語言;聊天工具則是這種演進道路上的一個新階段。”
在編程中,確定程序應(yīng)完成什么功能、如何運作及出現(xiàn)問題時的排查至關(guān)重要。這些核心技能只能通過長期堅持實踐逐漸培養(yǎng)起來。如果想成為一名合格的軟件開發(fā)者,單純依賴AI是無法繞過這個學習過程的。然而,若能明智地運用AI工具,的確可以加速提升編程能力,并有望成為一個優(yōu)秀的程序員——甚至可能在這個過程中享受到樂趣。
參考鏈接:
https://www.theregister.com/2024/01/27/ai_coding_automatic/
https://devclass.com/2024/01/24/ai-assistance-is-leading-to-lower-code-quality-claim-researchers/






















