跳转至

當 coding 越來越便宜,我們該如何工程化「共識」?

這篇是討論筆記,不是結論。

一句話版本:當 coding agent 執行得越來越可靠,整條流程裡最不可靠的一段,可能變成人寫給它的 specification;而還沒被工程化的,是 agent 開始之前的理解與共識。

起點是我最近在 harness 上做的事,終點是一堆我還答不出來的問題。中間則是我跟手邊的 coding agent 一路來回攻防的過程。

先記下來。

系統裡最不可靠的那一段,可能換位置了

過去一年,我花了很多力氣在 harness 上:先讓 agent 理解 repository、再規劃、改完跑測試、查 regression、做 code review、失敗了重新規劃。

從零打造、再砍掉一半,這兩篇其實都在處理同一件事:只要願意多付出一些計算、token 和時間,agent 的執行過程確實可以被限制得越來越可靠。

但這也讓我開始注意到一個奇怪的問題。

如果 agent 執行任務已經越來越可靠,那整個系統裡最不可靠的部分,會不會反而變成人類寫給它的 specification?

換句話說,如果我們一開始根本沒有把事情講清楚,那 agent 執行得越好,也可能只是越有效率地把錯的東西做出來。

回頭看我自己的 harness,Stage 1 其實一直有一道「人類輸入 gate」:planner 會列出需要人拍板的問題,問題沒有清空以前,不准開始拆 feature list。

這道 gate 一直都在。

但它也是整套流程裡最沒有被工程化的一環。

Gate 後面的每一步都有 sensor、有 trace、有硬邊界;gate 本身往往只是一個人看一眼,然後說:

可以。

這開始讓我懷疑:我們是不是把大量工程力氣花在了 gate 後面,卻沒有認真處理 gate 本身的可靠性?

「Approved」不等於「我們有共識」

今天多數 coding agent 的工作流程,仍然從一張 GitHub issue 或 Jira ticket 開始。

Issue 裡可能有需求、背景、acceptance criteria、implementation notes、edge cases、過去的討論,然後 agent 讀這些文字開始工作。

這裡隱含了一個很大的假設:

這張 issue 已經準確表達了大家真正想做的事。

現實未必如此。

寫 issue 的人腦中有一個 mental model,變成文字時損失一部分;另一個 engineer 讀完以後,產生自己的版本;agent 再讀一次,又形成第三個版本。

Author's intent
      ↓
Written issue
      ↓
Reviewer's understanding
      ↓
Agent's understanding
      ↓
Implementation

每一層都可能有 information loss。

而我們目前把大量工程力氣花在最後一段,也就是:

Agent's understanding → Implementation

卻比較少問:

Human intent → Shared understanding

這一段到底可靠不可靠?

想像有人丟給你一張很長的 ticket,十幾段文字、一堆 acceptance criteria、幾十條 comments,然後問:

Looks good?

你看了一下,大致理解,回答:

LGTM.

從流程上來說,consensus 已經產生了。

但其實這裡有兩種完全不同的「同意」。

第一種是:

我沒有看到明顯的問題,所以我同意。

第二種是:

我理解這個 change 要把系統從什麼狀態變成什麼狀態,也知道什麼不會變。我確認這就是我們要的。

後者才是我真正關心的東西。

我暫時把它叫作 informed consensus。

這件事以前就重要,但在 coding agent 時代可能更重要。

以前一張模糊的 issue 交給 engineer,他可能花兩天實作,中間不斷回來問問題。現在同樣的 issue 交給 agent,兩分鐘後它可能已經開始修改幾十個檔案。

Implementation 越來越便宜之後,「我們到底有沒有先確認要做什麼」這件事,在整個成本結構裡就會變得越來越顯眼。

第一塊踏板:UML 會不會復興?

我最早想到的是 UML。

原因很簡單:討論 software design 時,我一直覺得 sequence diagram 很有用。

同一段 payment retry 的流程,如果寫成自然語言,可能要好幾段;畫成 sequence diagram,幾秒鐘就能形成 mental model。

UML 過去的問題是生產和維護成本太高。

人要學、人要畫、code 改了以後要記得更新。最後 diagram 和 code 不同步,engineer 開始不相信 diagram,然後又回到:

Just read the code.

AI 改變了這個 cost structure。

未來可能變成:

Human conversation
      ↓
Agent generates diagram
      ↓
Humans review
      ↓
Agreement
      ↓
Coding agent implements

人甚至不一定需要會畫 UML。

Agent 負責產生 representation,人只要看懂並確認:

對,這就是我要的。

所以我一開始覺得,UML 也許會重新成為人和 coding agent 之間很好的 intermediate representation。

但繼續想下去以後,我開始懷疑自己。

我們很容易假設:

圖比文字容易理解。

但這不一定是真的。

UML 本身也是一種語言。

簡單的 sequence diagram 可能很直覺,但複雜的 class diagram、state diagram 一樣需要學習。AI 把「畫 UML 的成本」壓到接近零,不代表「讀懂 UML 的成本」也接近零。

這讓問題轉了一個彎。

我真正想解決的從來不是:

該用 UML 還是自然語言?

而是:

對一個特定的 change,什麼 representation 可以讓相關的人用最低的認知成本,建立足夠正確的共同理解?

UML 只是候選之一。

其他還有 natural language、before/after、given/when/then、examples、state machine、API contract、executable tests。

不同的 change,可能該用完全不同的 representation。

而 AI 的價值也許正是在這裡:我們不需要先決定 representation,AI 可以幫我們選。

Current state 和 change intent 是兩件不同的事

還有一個區別值得先分開。

軟體系統其實需要兩種不同的 representation。

第一種描述:

系統現在是什麼樣子?

這是長期存在、隨著 codebase 演化的 current state model。

另一種描述:

我們準備改變什麼?

這是一張 issue 真正在做的事,我暫時叫它 change model。

Current state
      ↓
Change proposal
      ↓
Human consensus
      ↓
Agent implementation
      ↓
Verification
      ↓
New current state

Change model 不需要永久存在。

它的任務只是讓相關的人確認:

對,這就是我們同意要發生的 change。

然後 agent 執行。

做完以後,target state 成為新的 current state。

這比試圖把整個 codebase 完整 UML 化現實得多。

第二塊踏板:30 秒

如果真正稀缺的是 human attention,那是不是該給 issue 一個 attention budget?

例如:

一個 engineer 應該能在 30 秒內理解一張 issue 的 change intent。

重點不是 30 秒。

30 秒只是一個刻意激進的數字。

重點是第一次把 human attention 當成 engineering constraint。

不是要求人在 30 秒內理解 implementation,也不是理解所有 edge cases,而只是理解:

What is changing?

例如:

Retry payment once on timeout

Order Service       Payment Service
      |                     |
      |------ Pay --------->|
      |<----- Timeout ------|
      |------ Retry ------->|
      |<----- Success ------|
      |-- Complete Order    |

Rules:
  Retry only on timeout
  Maximum retry: 1
  Never retry declined payment

如果相關的人都能快速回答:

我知道你要改什麼,而且我同意。

Agent 才開始工作。

然後開始攻擊自己的想法

30 秒可能製造 illusion of understanding

還是 payment retry。

大家看到:

timeout → retry once

全部點頭。

但一個 engineer 可能馬上問:

什麼叫 timeout?

TCP timeout、HTTP 504、還是 SDK timeout?

如果 payment 其實已經成功,只是 response 丟了呢?

Retry 會不會 double charge?

Payment API 是 idempotent 的嗎?

突然間我們發現,30 秒之所以容易理解,也許只是因為真正困難的資訊被刪掉了。

Compression 可以降低 cognitive load。

但 compression removes information。

如果被刪掉的是 decision-critical information,我們只是讓所有人更快達成一個錯的共識。

所以目標絕對不能是:

把 spec 壓到 30 秒。

真正的問題應該是:

在不損失關鍵決策資訊的前提下,change intent 能壓縮到什麼程度?

有些複雜度根本不能被壓縮

重複的文字、不必要的背景、混亂的結構、歷史 discussion,這些是可以被減少的 accidental cognitive load。

但 authentication、distributed transaction、migration、backward compatibility 本來就複雜。

這是 intrinsic complexity。

AI 可以幫我們減少前者,卻不能假裝後者不存在。

真正值得研究的問題是:

How do we minimize accidental cognitive load without hiding intrinsic complexity?

這已經比「30 秒 issue」嚴格很多。

拆小也不一定是答案

一個 change 無法在 30 秒內理解,很自然會想把它拆成幾個小 change。

每個都很好懂。

但局部都理解,不代表整體被理解。

A → B 看懂了。

B → C 看懂了。

C → D 也看懂了。

最後卻沒有任何一個人理解 A → D 的整體行為。

如果真的存在這種 agreement unit,它大概必須是 hierarchical 的:

          Change narrative
                 │
      ┌──────────┼──────────┐
      ↓          ↓          ↓
   Unit A      Unit B      Unit C

先理解整體 intent,再進入自己需要確認的局部。

Atomic comprehension 不能取代 system-level comprehension。

甚至 shared mental model 可能就是錯的目標

為什麼每個人一定要擁有一樣的 mental model?

Product manager 不需要理解 cache invalidation。

Security engineer 不需要理解 UI animation。

Backend engineer 也不需要知道每一個 product detail。

真正需要的也許不是:

Everyone has the same mental model.

而是:

Everyone has a sufficient and compatible mental model.

這兩個差很多。

AI 甚至可能對同一個 change 產生不同的 view:

                 Change
                   │
        ┌──────────┼──────────┐
        ↓          ↓          ↓
     Product     Backend    Security
       View        View        View
        │          │          │
        └──────────┼──────────┘
                   ↓
          Compatible consensus

PM 看行為。

Backend 看 sequence。

Security 看 trust boundary。

大家看到的東西不一樣,但對關鍵 intent 和 constraints 沒有衝突。

這可能才是真正的 consensus。

最強的反方:既然便宜,先做再看不就好了?

這是我覺得最難接的一個反駁。

Coding 便宜的另一個推論,就是試錯也變便宜。

既然 agent 三分鐘能做出來,何必在做之前折騰 representation 和共識?

讓它先做。

跑起來的行為、測試、demo,甚至 diff,本身就是最誠實的 representation。

不對就丟掉重來。

我想過以後,覺得它有一部分是對的。

對小的、可逆的 change,implementation 本身可能就是最好的 change model。任何 diagram 都比不上一個能點的 demo。

但它沒有解掉問題,只是把問題搬了位置。

第一,你還是要有人看。

看 diff、看 demo、判斷「這是不是我們要的」,一樣需要 human attention。而且對 non-trivial change,看一份幾十個檔案的 diff,可能比看一張好的 change model 更貴。

第二,做出來的東西會產生 anchoring。

一個已經跑起來的 implementation,很容易讓 reviewer 從:

這是不是我們真正要的?

滑向:

這個版本可不可以接受?

先做再看,很容易最後變成先做再同意。

第三,有些 change 根本不能隨便試。

Schema migration、對外 API、計費邏輯、任何有 side effect 的東西,「不對就丟掉」這個前提本身就不成立。

所以繞了一圈,問題還是在:

在做出決定的那個點上,人到底需要投入多少 attention 才夠?

先做再看只是改變了 representation 從哪裡來。

甚至也許最好的 change model,不是事前寫出來的,而是 agent 先產生一版 disposable implementation,再從 diff 和行為反推、壓縮成一個 representation 給人確認。

這條路我還沒試。

但它反而讓我更確定:真正值得研究的不是某一種特定 representation,而是 decision point 前的人類理解成本。

目前走到的地方:Minimum Viable Consensus

暫時給這個東西一個名字:

Minimum Viable Consensus,MVC。

在 coding agent 被允許執行一個 change 以前,相關的人至少需要知道什麼,才能安全地說:

我理解,而且我同意做這件事。

這裡的 minimum 很重要。

它不是 maximum understanding。

不要求所有人理解所有 implementation details。

它找的是 sufficient understanding。

少於這個點,風險太高。

超過這個點,可能只是在浪費稀缺的注意力。

於是 software engineering pipeline 多出了兩個值得被工程化的 stage:

Intent
  ↓
Representation
  ↓
Comprehension
  ↓
Consensus
  ↓
Execution
  ↓
Verification

今天大部分 harness engineering 集中在最後兩個。

Agent 越來越強以後,也許該開始認真處理中間兩個。

這也讓我重新想 AI 在這裡扮演的角色。

我們一直在問 AI 能產生多少 code。

但也許另一個同樣重要的能力是:

AI 能不能把複雜的 software intent,轉成最適合某一個人理解的 representation?

這不是 summarization。

Summary 按長度最佳化。

這裡真正要最佳化的是:

每單位 human attention,可以換到多少 decision quality。

AI 可以讀 customer conversation、requirement、architecture、existing code、past decisions、tests、constraints,然後對 PM 產生一個短的 behavior change,對 backend 產生 sequence diagram,對 security 產生 trust-boundary change。

如果 change 本身太複雜,AI 甚至應該拒絕繼續壓縮:

This change cannot be safely represented within the requested attention budget.

這裡真的需要五分鐘。

這反而是一個好的結果。

當 coding 越來越便宜,什麼會變貴?

過去最昂貴的資源之一,是 engineer 的 implementation time。

一個 feature 可能需要幾個 engineer 做幾天甚至幾週,所以 requirement discussion 花幾個小時,並不顯眼。

但如果 implementation 從三天變成三十分鐘,再從三十分鐘變成三分鐘,specification、review、decision、alignment 和 human attention 在整個成本結構裡所佔的比例就會越來越大。

瓶頸可能會從:

多快能做出來?

逐漸轉成:

我們到底同不同意要做什麼?

我們已經開始用 harness、evaluation、tracing、testing 和 verification,系統性地提高 agent reliability。

下一步,也許該問:

我們能不能同樣系統性地測量和工程化 human consensus?

下一代 harness 不該只管 agent 開始 coding 之後發生的事。

它也許還應該管:

Agent 被允許開始 coding 以前,人到底有沒有達到足夠的理解與共識?

還答不出來的問題

  • 對誰、用什麼 representation 才有效? 同一個 change,sequence diagram 對 backend 有用,對 PM 未必。這件事有沒有可以歸納的規律,還是只能逐案讓 AI 猜?

  • 「足夠的理解」怎麼量? 如果要做實驗,目前我想到的一種方式是 prediction task:看完 representation 後,回答「輸入 X 時系統會怎樣」、「哪個 component 應該改」、「哪個 constraint 不能被破壞」,再跟 ground truth 對照。但這真的足夠代表 understanding 嗎?

  • Attention 和 decision quality 的關係長什麼樣? 15 秒、30 秒、60 秒、2 分鐘、5 分鐘,理解正確率會怎麼變?是否存在一個明顯的 diminishing return point?

  • 拒絕壓縮的門檻怎麼定? AI 說「這個 change 需要五分鐘」的依據是什麼?誰來校準它?

  • 先做再看和先同意再做,邊界在哪裡? 可逆性顯然是一個變數,但可逆性本身又應該怎麼判斷?

  • 局部 consensus 和 system-level understanding 怎麼一起維持? 如果大型 change 被拆成多個 agreement units,誰負責保證整體 narrative 沒有在拆分過程中消失?

這些目前都還沒有答案。

但我越想越覺得,當 coding agent 讓 implementation 越來越便宜以後,真正稀缺的東西可能會慢慢換位置。

不是 code。

而是 human attention。

以及用這份 attention 換來的 informed consensus。