2026年9月3日 星期四

AI-First Coding:如何讓 AI 更有效率地幫你寫 Code

 AI-First Coding:如何讓 AI 更有效率地幫你寫 Code

現在的軟體開發方式正在發生根本性的轉變。

以前我們思考的核心問題是:

「怎麼把程式碼寫得最漂亮、最容易讓人維護?」

但如果現在主要由 AI 協助,甚至直接產生 Code,問題應該改成:

「怎麼讓 AI 下一次修改這份 Code 時,需要理解的 Context 最少?」

這兩件事情並不完全相同。

對 AI Coding 而言,真正昂貴的不是 Code 行數,而是:

  • AI 需要讀多少 Code
  • AI 需要理解多少關聯
  • AI 需要跨多少檔案
  • AI 需要猜多少隱藏規則
  • 修改後需要重新測試多少功能
  • 一次修改產生多少 Diff

因此,AI-first 的程式設計原則應該從「程式碼漂亮」轉向:Low Context、Low Coupling、Small Diff、Small Regression Scope


一、AI Coding 最重要的不是「少寫 Code」,而是「少讀 Code」

人類工程師可以花半小時閱讀一個專案。
AI 則會受到 Context Window、Token 成本以及推理成本的影響。

舉例來說:

需求:修改 Landing Page 的 B12 流程步驟

做法 A(傳統寫法):

text
LandingPageSchema.php
    B02
    B03
    B04
    B06
    B07
    B08
    B09
    B10
    B11
    B12
    B13
    B14
    B15
    B16

AI 必須先理解大量無關的 Block。

更好的架構是讓 AI 可以快速定位:

text
B12 → b12Steps()

然後只理解:

PHP
protected static function b12Steps(): Block
{
    ...
}

這就是 AI-first 的核心:

不是讓 Code 最小,而是讓 AI 每次修改時需要理解的 Context 最小。


二、不要過度拆檔案

傳統工程習慣很容易變成:

text
LandingPage/
├── B02.php
├── B03.php
├── B04.php
├── B06.php
├── B07.php
├── B08.php
├── B09.php
├── B10.php
├── B11.php
├── B12.php
├── B13.php
├── B14.php
├── B15.php
└── B16.php

看起來很乾淨,但 AI 修改 B12 時可能需要:

找到 B12 → 找到 Registry → 找到引用 → 找到 Base Schema → 找到 Helper → 找到相關設定

Context 反而增加。

因此:不要為了「檔案看起來乾淨」而拆檔。

比較適合 AI 的方式通常是:

text
LandingPageSchema.php
├── Registry
├── B02
├── B03
├── B04
├── B06
├── ...
├── B16
└── Helpers

這種「單檔、功能區塊化」有一個很大的優點:
AI 可以透過命名快速定位功能,同時避免跨檔案理解。


三、功能邊界比檔案數量更重要

AI-first 架構不是「全部塞在一個檔案」。

真正的原則是:一個功能應該有清楚的邏輯邊界。

例如:

PHP
protected static function b12Steps(): Block

就是非常好的 AI 定位點。

AI 收到:

B12 的步驟標題限制改成 12 字。

可以直接定位:

text
b12Steps() → 步驟標題 → maxLength()

而不是重新理解整個 CMS Builder。

因此,命名本身就是 AI 的 Navigation System


四、不要讓 AI 猜架構

AI 最容易出錯的情況不是 Code 寫錯,而是它不知道你的專案規則。

例如你的專案可能有:

  • SharedFields
  • BlockRegistry
  • BaseModel
  • HasTranslatable
  • Permission Convention
  • API Transformer
  • Cache Convention

如果沒有規則,AI 很容易自己發明:

NewHelper、NewService、NewTrait、NewRepository、NewBaseClass

最後變成:

原本 1 個檔案 → AI 新增 5 個檔案 → 跨檔案依賴增加 → Token 增加 → 維護成本增加

所以 AI Coding 必須有一個非常重要的規則:

Reuse Before Create

先搜尋現有:

Helper、Service、Trait、SharedField、Component、Repository、Enum、Transformer

確認不存在之後,才允許新增。


五、AI 修改 Code 時,Diff 必須最小化

這是 AI Coding 最重要的規則之一。

不要要求 AI:

「順便幫我重構這個檔案。」

除非你真的要重構。

應該要求:

「只修改造成這個問題所必要的程式碼,不要進行其他重構。」

因為 AI 很容易做:

需求:修改 B12 標題長度

AI 實際行為:

  • 重構 B12
  • 抽出 Helper
  • 修改命名
  • 整理 imports
  • 調整其他 Block
  • 順便最佳化 Registry

最後你得到的不是 +1 行,而是 +80 / -120。

這會直接增加 Review 成本、Token 成本、Bug 風險、Regression Scope。

因此應該建立:Minimal Diff Principle


六、不要為了 AI 未來好維護,現在就做大重構

這是非常重要的原則。

例如目前 B02~B16 已經功能正常、測試完成、Production 穩定。

這時候發現:

「如果拆成多個檔案,AI 以後可能比較好維護。」

不代表現在就應該重構。

因為:重構 → 整體重新測試 → 增加 Regression Risk → 增加開發時間

如果沒有實際需求,收益可能非常低。

更好的方式是:

現在維持現狀 → 下一次修改 B12 時順手改善 B12 → 只測 B12

這叫 Incremental Refactoring,而不是一次性大重構。


七、把「修改範圍」直接告訴 AI

一個好的 AI Prompt 不應該只有:

「幫我修 B12。」

應該明確指定:

text
修改範圍:
- 僅修改 LandingPageSchema::b12Steps()
- 不修改其他 Block
- 不新增檔案
- 不新增 Helper
- 不修改 SharedFields
- 不修改資料庫
- 不修改 API
- 不修改既有資料結構

這會大幅降低 AI 的探索範圍。


八、推薦使用「Think → Locate → Modify → Verify」

不要叫 AI 一開始就寫 Code。

推薦固定使用:

  1. Think
  2. Locate
  3. Modify
  4. Verify

Prompt 範例:

text
在修改 Code 前,先執行以下流程:

1. 分析需求的真正原因,不要立即修改。
2. 找出實際負責此功能的 Entry Point。
3. 找出最小必要修改範圍。
4. 優先使用現有的 Helper、Service、Component 與 Convention。
5. 不要建立新的抽象,除非現有架構無法合理支援。
6. 不要修改需求範圍以外的 Code。
7. 不要順便重構、重新命名或格式化無關程式碼。

修改完成後說明:
- 修改了哪個檔案
- 修改了哪個方法
- 為什麼需要修改
- 是否影響其他功能
- 建議測試範圍

核心原則:Small Context → Small Diff → Small Test Scope


九、讓 AI 優先搜尋,而不是閱讀整個專案

AI 最有效率的流程不是:

讀整個專案 → 理解全部架構 → 開始修改

而是:

需求 → 搜尋關鍵字 → 找到 Entry Point → 讀附近 Code → 追必要 Dependency → 修改

例如修改 B12:

先搜尋 b12Steps,再搜尋 steps,最後只讀 LandingPageSchema 與 SharedFields 真正需要的部分。

因此你的 Prompt 可以要求:

text
請採用「由需求反向定位」的方式處理:

1. 先搜尋與需求直接相關的 Class / Method / Field。
2. 找到 Entry Point 後,只追蹤完成需求所必要的 Dependency。
3. 不要為了理解整個專案而讀取無關檔案。
4. 優先使用現有架構。
5. 找不到必要資訊時再擴大搜尋範圍。

目標不是理解整個專案,而是以最小 Context 完成正確修改。

十、Prompt 最重要的不是「告訴 AI 怎麼寫」,而是「告訴 AI 不要做什麼」

這是一個非常重要的觀念。

一般 Prompt:

幫我修改 B12。

AI 有非常大的自由度。

好的 Prompt:

text
只修改 B12。

禁止:
- 修改其他 Block
- 新增檔案
- 新增 Service
- 新增 Helper
- 修改 DB
- 修改 API
- 重構現有 Code
- 修改命名
- 修改無關格式

這叫 Negative Constraints

在 AI Coding 裡面,限制條件往往比需求描述更重要。


十一、建立「AI Coding Contract」

可以把整個專案的規則濃縮成一份 AI-CODING-RULES.md:

Markdown
# AI Coding Rules

## 1. Core Principle
Think Before Code.  
目標不是產生最多 Code,而是以最小 Context、最小 Diff 完成需求。

## 2. Locate Before Modify
修改前必須先找到:
- Entry Point
- 實際負責功能的 Method
- 必要 Dependency
- 現有可重用元件

禁止未定位就直接修改。

## 3. Reuse Before Create
優先使用:
- Existing Helper
- Existing Service
- Existing Trait
- Existing Component
- Existing Convention

除非現有架構無法合理支援,否則不要新增抽象。

## 4. Minimal Diff
只修改完成需求所必要的 Code。

禁止:
- 順便重構
- 順便重新命名
- 順便格式化
- 修改無關功能
- 修改其他 Module

## 5. Minimal Context
不要閱讀整個專案。  
採用:Search → Locate → Read Relevant Context → Modify  
只有必要時才擴大 Context。

## 6. File Structure
不要為了理論上的 Clean Architecture 過度拆檔。  
優先考慮:Feature Boundary > File Count  
功能相關的 Schema、Helper 可以在同一個檔案內保持集中。

## 7. No Speculative Architecture
禁止因為「未來可能需要」而新增:
Service、Repository、Trait、Interface、Abstract Class、Helper  
除非目前需求已經證明需要。

## 8. Regression Scope
每次修改都應該盡可能縮小測試範圍。  
修改單一 Block → 優先測試該 Block。  
修改 SharedFields → 才需要測試所有使用該 SharedFields 的功能。

## 9. Refactoring Policy
不要因為 Code 不夠漂亮就主動重構。  
只有以下情況才進行重構:
- 已經影響目前需求
- 已經造成重複問題
- 已經造成維護問題
- 使用者明確要求重構

## 10. Final Response
完成修改後,只需要回答:
- 修改檔案
- 修改位置
- 修改原因
- 影響範圍
- 測試建議

不要描述與本次需求無關的架構。

十二、真正有效率的 AI Coding Prompt

最後,可以把日常開發 Prompt 簡化成這個:

text
AI Coding Task

Goal
[描述我要完成什麼]

Scope
只允許修改:
- [檔案 / Class / Method]

Constraints
- 不修改需求範圍以外的 Code
- 不新增檔案,除非確實必要
- 優先使用現有 Helper / Service / Component
- 不進行額外重構
- 不重新命名無關 Code
- 不修改 DB / API / Architecture,除非需求明確要求

Process
1. 先分析 Root Cause。
2. 找出 Entry Point。
3. 找出最小修改範圍。
4. 確認是否存在可重用的既有實作。
5. 執行最小修改。
6. 檢查是否產生不必要 Diff。
7. 說明需要測試的最小範圍。

Output
完成後只回報:
- Root Cause
- Modified Files
- Modified Methods
- What Changed
- Test Scope

核心原則:Do not optimize the architecture. Optimize the change.


十三、AI-first 的真正目標

最後可以把整套方法濃縮成一個公式:

AI 開發效率 = 正確率 × Context 效率 × 修改精準度 × 測試範圍控制

而不是:

AI 開發效率 = Code 寫得多快

所以你真正應該追求的是:

需求 → 最小 Context → 最小理解範圍 → 最小 Diff → 最小 Regression Scope

這也是為什麼有時候:

一個 800 行、但功能邊界清楚的檔案,可能比 15 個 50 行的小檔案更適合 AI 維護。

因為 AI 不需要一直跳來跳去。


結論

如果未來幾乎全部 Code 都由 AI 協助完成,那麼我們其實正在從:

Human-readable Architecture

逐漸轉向:

AI-navigable Architecture

好的 AI Code 不一定是最符合傳統 Clean Architecture 的 Code。

而是:

AI 能快速找到、快速理解、快速修改,而且每次修改只影響最小範圍的 Code。

因此真正值得建立的不是「讓 AI 寫更多 Code 的 Prompt」,而是:

讓 AI 少讀 Code、少猜東西、少改 Code、少產生 Diff、少需要重新測試。

這才是 AI-first Software Development。

沒有留言:

張貼留言

AI-First Coding:如何讓 AI 更有效率地幫你寫 Code

  AI-First Coding:如何讓 AI 更有效率地幫你寫 Code 現在的軟體開發方式正在發生根本性的轉變。 以前我們思考的核心問題是: 「怎麼把程式碼寫得最漂亮、最容易讓人維護?」 但如果現在主要由 AI 協助,甚至直接產生 Code,問題應該改成: 「怎麼...