
譯者 | 核子可樂
審校 | 重樓
憑借GitHub Copilt、Amazon Q等AI驅(qū)動(dòng)編程工具的助力,如今企業(yè)團(tuán)隊(duì)的代碼交付量與交付頻率均創(chuàng)下歷史新高。
但這也帶來了新的問題。
AI協(xié)助團(tuán)隊(duì)產(chǎn)出更多代碼的同時(shí),原有遺留系統(tǒng)以及長期累積下的技術(shù)債也日益惡化。架構(gòu)的現(xiàn)代化轉(zhuǎn)型需求,就成了必須直面的關(guān)鍵挑戰(zhàn)。
換言之,仍有大量開發(fā)者需要將時(shí)間耗費(fèi)在維護(hù)過時(shí)代碼、舊框架和累積架構(gòu)上,導(dǎo)致遺留系統(tǒng)的運(yùn)維成本越來越高。
更糟糕的是,AI工具幾乎完全不了解遺留軟件架構(gòu),因此在嘗試對接的過程中,不僅沒有改善舊有體系、反而令形勢每況愈下。
本文將探討如何運(yùn)用AI輔助實(shí)現(xiàn)軟件架構(gòu)現(xiàn)代化,結(jié)合具體示例展示AI如何協(xié)助達(dá)成這一目標(biāo),包括提供一致且正確的架構(gòu)建議、幫助軟件團(tuán)隊(duì)逐步從遺留系統(tǒng)的泥潭中抽身出來。
AI與軟件架構(gòu)之問
AI極其高效的代碼產(chǎn)出能力已經(jīng)得到全球開發(fā)者的肯定,可問題在于,對AI的持續(xù)使用也會(huì)對架構(gòu)產(chǎn)生影響。
開發(fā)者在編碼時(shí),會(huì)持續(xù)思考并解決以下問題:
- 如何組織類?
- 如何處理緩存?
- 將業(yè)務(wù)邏輯放在哪里?
- 存在哪些外部依賴項(xiàng)?
- 業(yè)務(wù)邏輯應(yīng)如何融入整體軟件架構(gòu)?
- 諸如此類……
AI智能體其實(shí)也會(huì)思考這些問題,并在生成的每行代碼中悄悄做出架構(gòu)決策。
而其中的風(fēng)險(xiǎn),在于這些聰明且不知疲倦的編程助手經(jīng)常做出局部最優(yōu)選擇——即在當(dāng)前場景下看似正確,但卻給整體軟件架構(gòu)增加了更多負(fù)擔(dān)。
更可怕的是,這些錯(cuò)誤往往不會(huì)立刻顯現(xiàn)——畢竟軟件架構(gòu)不會(huì)立刻崩潰,監(jiān)控和測試工具也不會(huì)將此視為嚴(yán)重破壞。
軟件架構(gòu)漂移
架構(gòu)漂移(即緩慢且持續(xù)的結(jié)構(gòu)化架構(gòu)侵蝕)就是其中一種典型表現(xiàn)。以大型銀行為例,他們在對龐大Java單體系統(tǒng)進(jìn)行現(xiàn)代化改造的過程中,發(fā)現(xiàn)原有架構(gòu)極其復(fù)雜、整個(gè)周期須持續(xù)數(shù)年。加上種種隱藏的架構(gòu)陷阱,改造工作屢屢停滯。
也就是說,架構(gòu)問題可能比代碼bug更不易察覺,但造成的影響卻更為嚴(yán)重。
AI如何助力實(shí)現(xiàn)軟件架構(gòu)現(xiàn)代化
但問題并非沒有解決辦法。
一個(gè)令人欣慰的消息是,不理解現(xiàn)代化改造背景的不只是AI,還包括很多開發(fā)者和架構(gòu)師。在同樣迷茫的探索中,AI往往能夠發(fā)揮令人驚嘆的作用。
只要讓AI根據(jù)運(yùn)行時(shí)分析并獲取架構(gòu)上下文,它就能在現(xiàn)代化進(jìn)程中檢測并修復(fù)各類架構(gòu)問題。
只要使用得當(dāng),結(jié)合運(yùn)行時(shí)上下文加上初步領(lǐng)域驅(qū)動(dòng)結(jié)構(gòu)分析,AI完全可以:
- 搶先檢測出架構(gòu)反模式并予以糾正;
- 提供精準(zhǔn)的重構(gòu)策略;
- 確定修復(fù)優(yōu)先級,幫助工程團(tuán)隊(duì)節(jié)約時(shí)間;
- 厘清復(fù)雜的依賴關(guān)系;
- 自動(dòng)修復(fù)架構(gòu)漂移,有效實(shí)現(xiàn)系統(tǒng)自我修復(fù)。
高效推動(dòng)現(xiàn)代化改造
運(yùn)用AI推動(dòng)架構(gòu)改造的第一步,在于確定有效的提示詞。提示詞的質(zhì)量取決于AI獲得的上下文與具象化前提,且直接決定架構(gòu)改造結(jié)果。
那么,行之有效的提示詞該是什么樣?
1. 盡量具體
不要使用“構(gòu)建REST API來管理訂單”這類模糊的表述,而應(yīng)包含更具體的架構(gòu)設(shè)計(jì)思路:
“使用Flask和SQLAlchemy構(gòu)建一個(gè)Python REST API來管理訂單,應(yīng)用結(jié)構(gòu)如下:
- 用于處理HTTP請求的控制器層(由Flask實(shí)現(xiàn)路由);
- 用于業(yè)務(wù)邏輯的服務(wù)層;
- 使用SQLAlchemy ORM進(jìn)行數(shù)據(jù)訪問的存儲(chǔ)庫層?!?/span>
2. 盡量詳盡
不要只提供代碼邏輯,還應(yīng)包含非功能性需求。
“擴(kuò)展Python Flask REST API以支持運(yùn)維穩(wěn)健性與可維護(hù)性。具體包括:
- 記錄每條傳入的HTTP請求及其響應(yīng)狀態(tài)。使用Python內(nèi)置的日志模塊記錄每條請求的執(zhí)行時(shí)間。日志應(yīng)采取結(jié)構(gòu)化設(shè)計(jì),包含時(shí)間戳、端點(diǎn)、狀態(tài)碼和延遲時(shí)間。
- 使用 Pydantic 模型在控制器層驗(yàn)證所有傳入的請求負(fù)載。確保驗(yàn)證錯(cuò)誤返回標(biāo)準(zhǔn)化的 JSON 錯(cuò)誤響應(yīng),其中包含清晰的消息和相應(yīng)的 HTTP 狀態(tài)碼。
- 在存儲(chǔ)庫層中,針對瞬時(shí)數(shù)據(jù)庫錯(cuò)誤實(shí)現(xiàn)帶有指數(shù)退避的重試邏輯。使用 Tenacity 處理重試,避免在業(yè)務(wù)層重復(fù)邏輯。
- 確保所有錯(cuò)誤響應(yīng)遵循一致的JSON模式,包括錯(cuò)誤代碼、消息和可選的調(diào)試詳細(xì)信息。”
3. 始終保持架構(gòu)師思維
傳達(dá)架構(gòu)設(shè)計(jì)與目標(biāo),包括如何將其融入系統(tǒng)。假定需要為訂單系統(tǒng)開發(fā)一套模塊化的郵件傳遞系統(tǒng),其須具備橫向擴(kuò)展能力并可后續(xù)拆分成獨(dú)立微服務(wù),則系統(tǒng)應(yīng)遵循以下要求:
1)清晰的關(guān)注點(diǎn)分離——構(gòu)建時(shí)將代碼庫拆分成多個(gè)明確的層:
a.控制器層(即Flask路由):接收并驗(yàn)證郵件發(fā)送請求。
b.服務(wù)層:處理業(yè)務(wù)規(guī)則,如速率限制、內(nèi)容模板和重試等。
c.存儲(chǔ)庫層:使用SQLAlchemy管理郵件發(fā)送嘗試、狀態(tài)及投遞日志的持久化。
2)無狀態(tài)性:
a.調(diào)用間不維持特定的會(huì)話或請求狀態(tài)。
b.所有上下文(如發(fā)件人ID、郵件內(nèi)容、標(biāo)頭)必須在每條請求中獨(dú)立攜帶。
c.將所有狀態(tài)持久化至外部存儲(chǔ)(數(shù)據(jù)庫、緩存或隊(duì)列)中,以維護(hù)無狀態(tài)計(jì)算節(jié)點(diǎn)。
3)可擴(kuò)展性與微服務(wù)兼容性:
a.將各主要關(guān)注點(diǎn)(如發(fā)送隊(duì)列、郵件渲染、狀態(tài)跟蹤)設(shè)計(jì)為內(nèi)部模塊,后續(xù)可輕松拆分為獨(dú)立服務(wù)。
b.避免硬編碼實(shí)現(xiàn)——應(yīng)為各主要組件(如EmailProvider、EmailQueue、TemplateEngine)定義接口。
c.通過構(gòu)建函數(shù)或簡單的DI容器注入所有服務(wù)及存儲(chǔ)庫依賴項(xiàng)。
4)非功能性需求:
a.彈性:使用退避策略優(yōu)雅處理SMTP錯(cuò)誤與重試失敗。
b.可觀察性:使用請求ID及投遞元數(shù)據(jù)記錄所有郵件活動(dòng)。
c.可擴(kuò)展性:通過接口抽象輕松支持多個(gè)提供程序(如SendGrid、SES)。”
請注意:提示詞代表的就是我們想要的架構(gòu),因此務(wù)必具體、提供上下文且保證描述全面。
為提示詞添加架構(gòu)上下文
之前我們提到了“添加上下文”,但卻一直沒有具體論述。
這里我們以vFunction為例,使用這款用于分析應(yīng)用架構(gòu)并為生成式AI助手提供結(jié)構(gòu)化重構(gòu)指引的工具。如此一來,我們將把靜態(tài)/動(dòng)態(tài)分析與數(shù)據(jù)科學(xué)結(jié)合起來以理解應(yīng)用程序的邏輯域,再反過來借此在復(fù)雜的Java和.NET應(yīng)用程序中發(fā)現(xiàn)架構(gòu)問題。例如:
- 循環(huán)依賴
- 反模式
- 架構(gòu)技術(shù)債
- 域邊界違規(guī)
- 死代碼
- 其他
將這些信息輸入智能體,即可為其提供編寫代碼所需要的信息。
分步示例
下面我們將逐步把以上流程走一遍,了解如何為代碼助手提供架構(gòu)上下文。
分析整個(gè)應(yīng)用
先從應(yīng)用中收集靜態(tài)和動(dòng)態(tài)數(shù)據(jù),這里使用vFunction識別應(yīng)用中潛在的邏輯域及其邊界。這一結(jié)果可以識別相關(guān)架構(gòu)問題,例如次優(yōu)域邊界、域間類依賴關(guān)系、資源依賴關(guān)系、技術(shù)債集中的類、循環(huán)依賴以及跨域共享代碼。之后即可查詢分析結(jié)果、找到需要立即重構(gòu)的錯(cuò)誤,并提出類似以下問題:哪些域中包含的通用類數(shù)量最多?

對一款中型應(yīng)用及其相互交織的業(yè)務(wù)域(圓形部分)進(jìn)行分析,理解其技術(shù)債。
審查架構(gòu)待辦事項(xiàng)
下面制作一份按優(yōu)先級排序的架構(gòu)待辦事項(xiàng)清單,每個(gè)條目均包含上下文說明和一條可在Amazon Q或GitHub Copilot等工具中直接使用的提示詞。

在AI助手中使用提示詞
在向IDE或代碼助手發(fā)出提示詞后,它會(huì)理解上下文并幫助拆分上帝類、解決領(lǐng)域污染問題或提供變更建議,嘗試提高代碼的模塊化水平。以上一張截圖為例,可以看到關(guān)于重構(gòu)循環(huán)流依賴項(xiàng)的建議。

驗(yàn)證并重復(fù)
應(yīng)用變更后重新運(yùn)行分析,AI系統(tǒng)會(huì)顯示模塊化程度是否提升、哪些待辦事項(xiàng)已經(jīng)解決、哪些尚未解決,再給出下一步重構(gòu)建議。
通過將這些洞察與大模型相結(jié)合,就能建立起一個(gè)強(qiáng)大的上下文感知助手,隨時(shí)為重構(gòu)中的難題提供指引。
AI——你的軟件架構(gòu)合作伙伴
AI編程只是這項(xiàng)技術(shù)的應(yīng)用方向之一,它更可以成為全面的合作伙伴,幫助我們對現(xiàn)有軟件架構(gòu)做出現(xiàn)代化改造。
通過使用架構(gòu)感知、基于運(yùn)行時(shí)的上下文來生成高效、一致且精確的提示詞,AI有望幫助大家克服遺留技術(shù)債、提高代碼模塊化水平,最終建立起可擴(kuò)展、云原生的現(xiàn)代化系統(tǒng)。
原文標(biāo)題:Beyond Code: How to Use AI to Modernize Software Architecture,作者:John Vester


























