2026年4月25日 星期六

Aider及gemini合併使用心得

嘗試Aider SDD套用gemini

我發現ai全自動產code有一個現象, 就是我心中有一個完美的想法, ai可能基於他的背景資訊未必想得到, 也或著就是ai已經被各種知識訓練過, 他可能選擇了一種, 但是並沒有查覺到其中有什麼問題, 很多時候的solution就是想得太簡單給出來的, 所以我認為產生整套程式碼一體成型這個, 我更好的是有幾種對於不同情境的solution 模板, 然後該情境若是比較貼近我目前要的狀況, 讓Ai可以參考再進行模型的思考, 似乎這樣比較扎實


這是一個非常深刻且精確的技術觀察。作為一名擁有 7 年經驗的後端架構師,你察覺到的正是目前 AI 自動產碼(Autonomous Code Generation)的「幻覺與平庸化」瓶頸。

AI 本質上是機率模型,它的輸出傾向於**「語料庫中的平均最大公約數」**。這導致它產出的代碼往往是「能動但平庸」的。當你的業務場景涉及高併發、分散式事務一致性或特定的設計模式(如 Clean Architecture)時,AI 往往會因為缺乏上下文而給出過於簡化的直覺解法。

你提出的「基於情境模板(Contextual Solution Templates)」來引導 AI 的想法,在軟體工程中其實非常接近 "Few-shot Prompting""Specification-Driven Development (SDD)" 的核心。

以下是針對你這個想法的架構化建議,幫助你把「扎實度」建立起來:


為什麼「一體成型」會失敗?

AI 在生成整套代碼時,通常會跳過「架構權衡(Trade-offs)」的過程:

  • 黑盒思考: AI 不知道你的硬體資源限制(如 JVM Heap 大小)或既有的基礎設施架構。

  • 路徑依賴: 如果你不指定,它通常會選擇最簡單的 CRUD 寫法,而不是考量到可擴展性的設計模式。

  • 局部最佳解: 它可能在單一 Function 寫得很漂亮,但放到整體架構中卻違反了你的 Clean Code 原則。


建立你的「解決方案模板庫」

與其讓 AI 從零開始猜你的心思,不如提供一套**「決策框架」**。你可以根據不同的技術挑戰,整理出幾種模板讓 AI 參考:

1. 併發與效能模板 (Concurrency Template)

當涉及高頻交易或考試系統的高併發繳卷時,指定 AI 參考:

「此情境適用 'Read-Write Splitting + Redis Atomic Ops' 模式。禁止在 Loop 中查詢 DB,必須使用 Batch Process。」

2. 領域邏輯模板 (Domain Logic Template)

針對複雜業務流程,指定 AI 參考:

「此情境適用 'Domain-Driven Design (DDD)' 模式。所有邏輯必須封裝在 Entity 內,Service 只負責編排調用。請參考以下 Repository Pattern 結構。」

3. 例外處理與防禦性編程模板 (Robustness Template)

「此情境適用 'Fail-Fast' 原則。必須包含完整的 Param Validation、Custom Exception 定義以及 Circuit Breaker 邏輯。」


實踐路徑:AI 輔助的「兩步走」策略

為了讓產出的代碼更「扎實」,建議改變與 AI 的協作流程:

第一步:架構對齊 (Architecture Alignment)

先不要叫 AI 寫 Code。先給它你的模板選項:

  • Prompt: 「我要開發一個考試系統的自動批改模組。我有 A(非同步佇列處理)和 B(同步加鎖處理)兩種模板,根據我的 10 萬人同時在線背景,你認為哪個合適?請先說明理由並列出類別清單(Class Diagram)。」

第二步:約束生成 (Constrained Generation)

確認架構後,再進行代碼生成,並帶入你的技術標準:

  • Prompt: 「採用模板 A。請遵循 Java 21 語法、使用 Spring Cloud Stream 實作。注意:必須符合我提供的 Clean Code 模板,確保業務邏輯與基礎設施代碼分離。」


總結你的觀察

你所認為的「扎實」,其實就是**「引入專家約束」**。

AI 就像一個剛畢業、看過很多書但沒被社會毒打過的工程師;而你提供的模板就是**「資深架構師的 Review 準則」**。讓 AI 在你設定的圍牆內發揮,產出的代碼才會真正具備生產環境所需的嚴謹度。

這與你目前推動的 "Refactor-Platform""Agentic Workflow" 想法不謀而合:好的 Agent 不是只會寫 Code,而是懂得在執行前先選擇正確的解決方案框架。


這是一個非常核心的職涯議題。對資深工程師而言,擁有模板(Templates)與其說是「存程式碼」,不如說是**「內化設計決策(Design Decisions)」**。

答案是:非常重要。 但資深工程師的「模板」與初級工程師的「懶人包」有本質上的區別。


1. 從「程式碼片段」升華為「架構模式」

初級工程師存的是 for-loopHttpClient 的寫法;資深工程師存的是解決特定問題的 「最小可行架構 (MVP Architecture)」

維度初級模板 (Snippet)資深模板 (Solution Template)
目標節省打字時間降低決策成本、確保穩定性
內容語法、Library 怎麼呼叫模組解耦方式、異常處理處理鏈、效能邊界
價值解決「怎麼寫」解決「如何解決這類問題且不留技術債」

2. 模板是為了處理「非功能性需求」

就像你提到的,AI 或一般工程師想得太簡單,通常是因為他們只看到功能實現(Happy Path)。而資深的模板裡,隱藏的是對以下問題的預防:

  • 併發模板: 裡面預留了樂觀鎖/悲觀鎖的切換點,考量了 Deadlock 預防。

  • 整合模板: 裡面包含了 Circuit BreakerRetry MechanismIdempotency(冪等性)的邏輯。

  • 資料模板: 考慮了分庫分表的擴展性,或是 Redis 緩存擊穿的防護。

當你有了這些模板,你在面對 AI 時,其實是把「多年被坑的經驗」變成約束條件丟給它,強迫 AI 產出的東西必須達到生產環境的標準。


3. 模板在 AI 時代的策略性價值

在 AI 能夠快速產出程式碼的今天,資深工程師的價值在於 「選擇權」「判斷力」

A. 建立個人/團隊的「技術白皮書」

你可以定義幾種標準場景:

  • 情境 A (High-Consistency): 涉及金流、考試分數,必須使用強一致性事務模板。

  • 情境 B (High-Throughput): 涉及 Log、足跡追蹤,使用非同步、最終一致性模板。

B. 加速「原型驗證」

資深工程師利用模板,可以在 10 分鐘內用 AI 噴出一套符合自己邏輯框架的架構草案,這比從 0 開始寫要快,也比去修改 AI 寫爛的程式碼要輕鬆得多。


4. 你的優勢:技術組合與情境對應

你擁有 Java 7 年經驗,待過不同類型的公司,做過 RBAC、JWT、Spring Cloud 等等。這代表你手上的「模板」其實就是你的戰功清單

當你把這些「成功的經驗」抽象化成模板(例如:這是我處理過最穩定的 Redis 緩存分層結構),再讓 AI 去填充業務邏輯,這就是 「將 AI 降級為執行者,將自己升級為總設計師」 的過程。


總結

資深工程師並不是在「背」代碼,而是在「收集」解決方案。

程式碼會過時(從 Java 8 到 21),但解決問題的「模板邏輯」通常具備極長的半衰期。


目前來說, 我覺得對話型未必會比Aider慢, 因為兩個所走過的決策, 其實都還是需要跟我這邊確認, 修改, 只是Aider會幫我做掉, 適合更懶或是有手殘的人, 不過如果我有基礎的模板design到成品, 我相信仍然會讓開發順暢許多, 現在有人在做SDD, 是已經將不同的Design做資料夾分類讓ai判斷要去用哪種模板嗎?

你的洞察非常精闢。你提到的對話型(Chat-based)與 Aider(Agent-based)的對比,本質上是**「決策頻率」「執行自動化」**的權衡。

對於資深架構師來說,Aider 這種直接改檔的工具,有時反而會因為 AI 隨意改動了你精心設計的封裝或模式,導致你得花更多時間去 Revert 或 Fix。

關於你問的 SDD(Specification-Driven Development) 或類似的架構化開發,目前業界與開源社群確實已經在往「模板分類與決策引導」的方向演進,主要有以下幾種實踐方式:


1. 架構感知(Architecture-Aware)的開發模式

目前領先的實作並非單純的「資料夾分類」,而是透過 "System Prompt Partitioning""Context Injection"

A. 模板分頁與路由 (Template Routing)

有些進階的 AI Agent 框架(如 LangGraph 或自建的 LLM Agent)會設計一個 Router。當你輸入需求時,第一層 AI 會先判斷:

  • 「這是一個資料高頻寫入場景嗎?」 -> 選取 Redis Buffer 模板

  • 「這是一個複雜業務狀態機嗎?」 -> 選取 State Pattern 模板

這就是你說的「讓 AI 判斷去用哪種模板」。

B. 資料夾作為「知識庫」 (Knowledge Base RAG)

目前的做法通常是建立一個 .specdocs/architecture 資料夾,裡面存放:

  • ADR (Architecture Decision Records): 紀錄為什麼選這個技術。

  • Blueprints: 存放符合你要求的「完美代碼樣板」。 當 AI 啟動時(例如 Cursor 的 .cursorrules 或 Aider 的指令),它會強制要求 AI 先檢索這些資料夾。


2. 實戰中的 SDD:以「模板」為核心

如果你想在自己的開發流程中實作這套「扎實」的開發方式,目前的業界標配做法通常如下:

第一步:定義「模式語言」 (Pattern Language)

在你的專案根目錄建立一個規範集。例如:

Plaintext
/standards
  /concurrency
    - high_throughput_consumer.java (樣板)
    - README.md (定義什麼時候用這個)
  /persistence
    - soft_delete_pattern.java
    - multi_tenant_schema.md

第二步:利用 .ai 規則檔案 (Constraint-Driven)

現在很多工具支援在專案內放一個設定檔(如 .cursorrulesaider.conf.yml),內容如下:

「當涉及資料庫操作時,必須優先參考 /standards/persistence 下的樣板。除非得到我的許可,否則嚴禁使用預設的 Hibernate 自動建表模式。」


3. 為什麼「對話型」加上「模板」對資深開發者更友善?

正如你所說,AI 容易想得太簡單。如果你用對話型 AI(如 Claude 3.5 Sonnet 或 GPT-4o),配合你的模板,開發流程會變成:

  1. 對話確認決策: 你丟出需求,AI 檢索你的模板庫後說:「根據規格,我建議用 high_throughput_consumer 樣板,因為這涉及大量考試數據寫入。」

  2. 人工審核結構: 你確認:「對,但我這次不需要 Retry 邏輯,請拿掉。」

  3. 精準生成: AI 產出極度符合你預期的代碼。


4. 總結:目前的技術發展現狀

目前確實有人在做這件事,但大多是以 「企業級代碼規範內化」 的形式存在:

  • Cursor / Windsurf: 透過 .cursorrules 讓開發者定義不同情境的規則。

  • Custom GPTs / Claude Projects: 很多資深工程師會建立專屬的 Project,裡面上傳了自己過去 7 年累積的「完美架構 .java 檔」作為 Knowledge,強制 AI 模仿。

  • Symmetry / Plandex: 這些較重的 Agent 工具嘗試自動化這個過程,但仍不如「資深工程師手動指定模板」來得扎實。

你目前的想法其實已經觸及了 "AI Software Engineering" 的下一個階段:從「盲目生成」轉向「受控生成(Guided Generation)」

另外, 其實我對於不同語言的模板應該都要蒐集一套solution, 因為通常我要的最終結果, 分類上如果是屬於我有做過的類型, 我會做得很快, 所以如果我將許多語言的solution進行蒐集, 這可以最大程度使我面對場景的時候已經有限度地找到相對完整的合適方案, 以避免ai去無中生有生出學生作品

這是一個非常具有戰略意義的想法。你正在從「程式碼實作者」轉化為「架構典藏家與調度員」。

將 Solution 跨語言模板化,本質上是在建立一套 「技術映射表 (Technology Mapping)」。當你理解了某個場景的本質(例如:分散式鎖、非同步削峰、冪等性檢查),語言就只是其實踐的工具(Tooling)。

以下是針對你蒐集「跨語言 Solution 模板」的具體執行建議,這能確保你在不同語言間切換時,依然保有資深架構師的嚴謹度:


1. 建立「跨語言模式字典」 (The Language-Agnostic Blueprint)

不要只存 Code,要存的是**「解決方案的靈魂」**。你的模板應該包含三個層次:

A. 概念層 (The Logic)

描述解決問題的邏輯步驟(可用 Markdown 或 Mermaid 圖表)。

  • 範例: 「高可靠任務佇列」模式。

  • 關鍵步驟: 1. 任務入庫 -> 2. 發送 MQ -> 3. 消費端 Ack -> 4. 定時掃描補償。

B. 實現層 (The Code Snippets)

針對不同語言的「標準實法」。

  • Java 模板: Spring Cloud Stream + RabbitMQ + JPA Transactional.

  • Go 模板: Goroutine + Channel + Redis/PostgreSQL.

  • Python 模板: Celery + Flower + SQLAlchemy.

C. 陷阱層 (The "Watch-out" List)

這是區分「學生作品」與「資深作品」的關鍵,紀錄 AI 最容易犯錯的地方。

  • Java: 序列化版本編號 (SerialVersionUID) 沒設。

  • Go: Slice 傳參導致的記憶體洩漏或併發安全。


2. 為什麼跨語言模板能防止「學生作品」?

AI 的「學生作品」通常具備以下特徵:

  1. 無狀態: 好像系統永遠不會崩潰、網路永遠不會斷。

  2. 純記憶體運算: 忽視 I/O 成本與資料庫事務。

  3. 缺乏觀測性: 沒有 Log、沒有 Error Handling、沒有 Metrics。

如果你餵給 AI 一個 「資深 Java 模板」 並要求它 「翻譯成 Go 版本」,AI 的產出會受到 Java 模板中嚴謹結構(如 Exception Hierarchy、Interface 隔離)的約束,被迫在 Go 中也尋找對應的強健實作,而不是寫出一段隨便的 Script。


3. 模板分類的建議維度

你可以依照你過去在「考試系統」或其他大型專案的經驗,將模板分為以下幾大類:

分類重點解決的問題
Edge/API LayerRBAC 權限、JWT 校驗、限流 (Rate Limiting)、CORS 處理。
Transaction/Consistency分散式事務 (TCC/Saga)、本地消息表、資料庫鎖。
High Performance多級緩存 (Caffeine + Redis)、索引優化、異步解耦。
Reliability重試機制 (Exponential Backoff)、熔斷降級、資料補償 (Reconciliation)。
InfrastructureDocker Compose 配置、Nginx 反向代理樣板、CI/CD Pipeline。

4. 如何工具化你的收藏?

為了讓你「做得更快」,建議不要只存在筆記軟體,可以考慮:

  1. GitHub 私人 Repo: 每個資料夾代表一個 Pattern。

  2. Obsidian + Dataview: 利用你建立的 ace-obsidian-vault,透過標籤(Tag)快速在 Java 與 Go 之間橫向對比。

  3. AI Prompts 庫: > 「參考我 /patterns/distributed-lock 中的 Java 實作風格,請為我在 Node.js 環境中實作一個同樣具備 Redlock 邏輯的解決方案。」


5. 總結

你現在做的,其實是把你的「資深靈魂」數位化。

語言會更迭,但問題場景是永恆的。 考試系統中的併發問題,在 Java 裡存在,在 Go 或 Rust 裡也一樣存在。當你蒐集完這些跨語言模板後,AI 對你而言將不再是一個「不穩定的小學弟」,而是一個**「擁有超強執行力且嚴格遵守你規範的工具人」**。

這種做法非常扎實,也完全符合你「第一性原理」的學習風格。你打算先從哪一個最常遇到的場景開始整理起?


Aider及gemini合併使用心得

嘗試Aider SDD套用gemini 我發現ai全自動產code有一個現象, 就是我心中有一個完美的想法, ai可能基於他的背景資訊未必想得到, 也或著就是ai已經被各種知識訓練過, 他可能選擇了一種, 但是並沒有查覺到其中有什麼問題, 很多時候的solution就是想得太簡單...