阿川私房教材:
學 JavaScript 前端,帶作品集去面試!

63 個專案實戰,寫出作品集,讓面試官眼前一亮!

立即開始免費試讀!

簡而言之:AI 代理可以產生通過測試且看起來熟悉的程式碼,但最後 10% 的理解、審查和維護卻變得不可能。透過運用 Rich Hickey 在「Simple Made Easy」演講中提出的原則,我們的團隊限制了我們的架構,只留下一種解決每個問題的方法,從而使 AI 生成的程式碼易於審查和維護。

兩個月前,YouTube 的推薦演算法為我提供了 Rich Hickey 的 2011 QCon 演講「 Simple Made Easy 」。

我們都經歷過人工智慧編碼代理的這種情況,我現在稱之為人工智慧 90/10 問題:代理可以產生語法正確、測試通過的程式碼,讓我們以極快的速度完成 90% 的任務,但最後的 10%,即人類必須理解、審查和維護程式碼的部分,變得不可能。

人工智慧生成

正如希基所說:「我們只能希望使那些我們理解的事物變得可靠。」而且通常存在一個權衡:當改進一個系統以使其更具可擴展性和動態性時,它可能會變得更難理解和判斷它是否正確。

人工智慧的 90/10 問題:速度為何會成為阻礙

空間

AI代理是優化機器,傾向於在生成過程中選擇阻力最小的路徑,而不是在審查過程中選擇阻力最小的路徑。

當 AI 代理程式產生程式碼時,它會針對以下方面進行最佳化:

✅ 語法正確性

✅ 測驗段落

✅ 熟悉的模式

✅ 只需極少的提示

但你必須使用針對以下方面進行最佳化的程式碼:

❌ 人類的理解

❌ 改變速度

❌可除錯性

❌長期維護

這就產生了一個真正的問題:人工智慧代理產生程式碼的速度越快,團隊審查程式碼的速度就越慢。

根本原因:我們沒有用架構來約束我們的人工智慧。我們為它提供了無數種方法來解決每個問題,然後卻想知道為什麼它選擇了最複雜的路徑。

人工智慧

簡單 vs. 輕鬆:人工智慧友善架構的基礎

Hickey 的核心差異改變了我對 Agent 生成程式碼的看法:

簡單:「一折,一辮,一扭」。指不交織或編織在一起的事物。簡單是客觀的,你可以數出辮子的數量。正如希基所解釋的,“簡單”的詞根是“sim”和“plex”,意思是“一扭”——與“複雜”相反,後者的意思是“多重扭動”或“編織在一起”。

簡單:「近在咫尺,附近」。指熟悉的事物,你工具箱裡已有的,與你現有技能相近的事物。簡單是相對的,對你來說容易的事情,對我來說可能很難。 「簡單」的拉丁文詞源與「相鄰」有關,意為「靠近」和「在附近」。

人工智慧傾向於選擇簡單而不是簡單,因為它優化的是生成速度,而不是維護清晰度。

我的智能體生成的模式很熟悉(很簡單),但卻製造了錯綜複雜、錯綜複雜的局面(並不簡單)。解決方案不是讓智能體更智能,而是讓我們的架構更具約束力。

可維護的程式碼具有一個定義特徵:非常容易審查。

當只有一種方法來解決問題時,審查就變成了模式匹配,而不是考古。

五

五項原則:希基的藍圖

從演講中,我提煉出了五個核心原則,它們成為了我的軟體的架構限制:

原則一:避免完成

「Complect 的意思是交織、纏繞、編織。Complex 的意思是編織在一起、折疊在一起。Simple 的意思是折疊一次、編織一次、扭轉一次。”

複雜化是指將簡單的元件交織成複雜的結。每當你將兩個概念複雜化,你就失去了獨立推理它們的能力。正如 Hickey 所說:“複雜化會導致糟糕的軟體。”

🚀嘗試 AI Shell

>

您的智能編碼伴侶可無縫整合到您的工作流程中。

登入 Forge →

原則 2:將狀態與價值分離

“狀態完成價值和時間。”

當你將某物是什麼(價值)與其何時發生變化(時間)混合在一起時,你就會創造出無法單獨推理的產物。

原則 3:資料就是資料,不是物件

“訊息很簡單。你對訊息唯一能做的事情就是毀掉它。”

物件包含狀態、身分和值。它們將資訊隱藏在方法和封裝之後,使得無法對資料進行通用操作。

原則 4:函數優於方法

“方法包括功能和狀態、命名空間。”

方法將其依賴項隱藏在所附加的物件中。純函數則將所有相依性明確化。正如 Hickey 所解釋的,方法將函數邏輯與物件狀態和命名空間問題交織在一起。

原則 5:組合優於繼承

“繼承使類型完整。它說這兩種類型是完整的,這就是它的意思。”

當你繼承時,你就是在說這些類型被編織在一起了。組合可以讓你組合各種功能,而無需將它們完全合併。

建築學

讓建築更具約束力:一種獲勝方式

解決方案並非讓AI更智能,而是讓架構更具約束性。我們的團隊設計系統時,並沒有為AI Agent提供數千種實作功能的方法,而是只留下一個顯而易見的方法。

這種方法改變了人工智慧生成問題:當只有一個有效模式可遵循時,人工智慧自然會產生可維護的程式碼,因為它別無選擇。

以下是我們團隊將每個原則轉化為架構約束的方法:

限制 1:不可變資料,零異常

將狀態與值分離。所有領域實體都是不可變的。當只有一種改變狀態的方式(傳回一個新值)時,AI 無法產生隱藏的、使審核複雜化的突變。

約束2:資料與行為分離

資料就是資料,而非物件。資料結構只包含資料。行為存在於無狀態服務中。

限制 3:顯式錯誤上下文,無異常

避免過度糾結。每個錯誤都必須完整地說明哪裡出了問題以及在哪裡出錯。當錯誤明確且與上下文相關時,代理不能容忍失敗,也不能建立掩蓋問題的通用錯誤處理機制。

約束 4:純函數優於方法

函數優先於方法。業務邏輯必須是具有明確依賴關係的純函數。當所有依賴關係都明確時,AI 就無法將複雜性隱藏在物件狀態或方法鏈中。

約束 5:組合優於繼承

組合優於繼承。能力透過聚焦特質進行組合,而非繼承。當類型組合而非繼承時,AI 無法建立包含無關關注點的層次結構。

Hickey 的建議很明確:「把佇列放進去。佇列是解決這個問題的正確方法。」他強調,佇列透過將「何時」與「何地」分離來幫助解耦元件,從而避免了物件之間直接連接帶來的複雜性。

服務之間的協調只能透過事件佇列進行。當服務無法直接相互呼叫時,AI 就無法建立時間耦合,導致系統無法推理。

約束

約束如何教導人工智慧更好的模式

有趣的是,我們的架構限制不僅加快了程式碼審查速度,還能主動教導我們的代理人產生更優的程式碼。每次代理看到我們的模式,它都會學習並將其加入到記憶體中。在Forge中,我們稱之為自訂規則。其他代理則稱為記憶體、規則等。

  • 關注點分離可防止功能糾纏

  • 顯式依賴使測試變得簡單

  • 不可變資料消除了所有類型的錯誤

  • 純函數的組成是可預測的

  • 資料即資料支援通用操作

人工智慧已經透過自訂規則/記憶將我們的約束內化。

如果您遇到了 AI 90/10 問題,以下是我們了解到的資訊:

1. 限制生成,不引導評論

不要試圖教你的人工智慧產生更好的程式碼。設計架構應該會讓糟糕的程式碼無法表達。

2. 獲勝之道

對於你的AI可能遇到的每一個問題,都應該只有一個顯而易見的方法來解決它。多種有效的方法會增加審核的複雜性。

3. 好的程式碼 = 可審查的程式碼

對於人工智慧生成的程式碼來說,唯一重要指標是:“人類能多快驗證它是否正確?”

4. 透過結構進行教學

你的AI從程式碼結構學習的程度遠高於系統提示。確保你的架構能夠反映你想要複製的限制。

結論

結果:限制創造自由

我們實施的架構約束需要前期成本,但報酬卻非常豐厚:

  • 審查速度加快:過去需要幾個小時才能完成的工作現在只需幾分鐘的模式匹配

  • 加速入職:新團隊成員可以立即做出貢獻,因為每個問題只有一種方法可以解決

  • 人工智慧學習得到改進:我們的代理商開始產生更好的程式碼,因為我們的架構教會了他們良好的模式

結論:解決 90/10 問題

AI 90/10 問題不是目前 AI 代理的限制,而是架構設計的失敗。

當您的架構透過設計約束 AI 行為時,AI 將成為您建立可維護軟體的合作夥伴,而不是您製造技術債的對手。

在人工智慧時代,獲勝的團隊不會是那些擁有最複雜人工智慧代理商的團隊,而是那些擁有最具約束力的架構的團隊。

好的程式碼有一個顯著的特徵:易於審查。當你設計約束條件,讓每個問題都只剩下一種解決方法時,審查就變成了模式匹配,而不是考古。


原文出處:https://dev.to/forgecode/simple-over-easy-architectural-constraints-that-make-ai-generated-code-maintainable-4o77

按讚的人:

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。

阿川私房教材:
學 JavaScript 前端,帶作品集去面試!

63 個專案實戰,寫出作品集,讓面試官眼前一亮!

立即開始免費試讀!