跳轉到

2020s - AI 輔助程式設計:副駕駛座的幽靈#

案件摘要#

2021 年 6 月,GitHub 基於 OpenAI 的 Codex 模型推出 Copilot——一個坐在編輯器裡、能生成整段程式碼的「AI 結對程式設計師」。 2022 年 11 月 ChatGPT 上線,自然語言直接對話生成程式,AI 輔助從自動補全躍遷成為開發流程的一部分。 這個案子偵破的兇手不是程式設計師,而是偶然複雜度——那些原本浪費在打字、查語法、寫樣板碼上的時間。 但兇手落網後,新的嫌疑犯浮出水面:幻覺、安全漏洞與授權爭議。

前因 -- 為什麼會有這個案子#

  • 自動補全的漫長前史:IDE 的關鍵字補全(1990s)→ 語意補全(IntelliSense)→ 統計補全(TabNine, 2019,GPT-2 基底)——每次都只敢補一個詞,沒人敢補一段程式。
  • LLM 已備好凶器:GPT 系列證明下一 token 預測 \(P(w \mid \text{context})\) 在足夠大的語料與模型下,能學出語法、語意甚至推理;GitHub 的數百萬公開倉庫就是現成的程式碼語料庫。
  • Brooks 的預言被翻出來重審:Fred Brooks 在 No Silver Bullet(1986)區分本質複雜度(問題本身的難度)與偶然複雜度(工具帶來的多餘難度);LLM 消除的主要是後者——樣板碼、API 記憶、語法打字。
  • 生產力的實證線索:GitHub 的對照實驗(2022)顯示,使用 Copilot 的開發者在同一任務上比對照組快 55%——這是 AI 輔助寫程式最早的大型隨機實驗證據。
  • 關鍵推理:AI 生成的正確率 \(q\) 雖然不是 100%,但開發流程本來就有生成-檢驗循環(寫碼→編譯→測試→review);只要檢驗成本夠低,循環幾次就能把正確率推到接近 1:
\[ P(\text{生成-檢驗 } n \text{ 輪後可用}) = 1 - (1 - q)^n \quad\xrightarrow{n \to \infty}\quad 1 \]

2021 年 Copilot 技術預覽、2022 年正式上市;2023 年 Copilot X 加入對話與 agent 化——副駕駛座逐漸坐進了主駕駛。

線索與推理 -- 數學式、程式、理論#

1. 案件現場:LLM 如何「寫」程式#

\[ P(w_t \mid w_1, \dots, w_{t-1}) \quad\xrightarrow{\text{訓練於程式碼語料}}\quad \text{學出語法、慣例、API 與慣用解法} \]
  • 下一 token 預測:LLM 只做一件事——給定上文,預測下一個 token 的機率分布;程式碼的強結構性(語法、縮排、命名慣例)讓它特別適合這種統計學習。
  • 自然語言 → 程式碼:註解與程式碼在訓練語料裡天然成對(docstring、教學、README),模型學會把「意圖」翻譯成「實作」——這就是 prompt 的威力來源。
  • 生成是取樣不是搜尋:模型不是在解空間裡搜尋正解,而是取樣一個機率上合理的解——這解釋了為什麼同樣的 prompt 每次產出不同,以及為什麼會幻覺(自信地生成不存在的 API)。

2. 生成-檢驗循環的數學#

設單次生成的正確率為 \(q\) ,每次檢驗(跑測試、人工掃一眼)的成本為 \(c\) :

\[ E[\text{總成本}] = \sum_{n=1}^{\infty} n\,c\,(1-q)^{n-1} = \frac{c}{q},\qquad P(\text{最終正確}) = 1 \]
  • 幾何分布的期望值告訴我們:總成本 = 檢驗成本 / 正確率。 \(q = 0.7\) 時平均循環 1.43 次。
  • 與人類手寫對比:人類寫碼的「生成成本」極高(打字、查 API、回想語法),但正確率也不低;AI 把生成成本壓到近零,於是總成本的主導項從「生成」移到「檢驗」。
  • 關鍵推論:檢驗成本 \(c\) 成為新的瓶頸——這正是自動化測試、CI、code review 在 AI 時代反而更重要的數學根據。

3. 本質 vs 偶然複雜度:Brooks 的重新檢視#

\[ \text{總複雜度} = \underbrace{\text{本質複雜度}}_{\text{問題本身的難度}} + \underbrace{\text{偶然複雜度}}_{\text{工具與載體的多餘難度}} \]
  • Brooks(1986)的論斷:「沒有銀彈」能讓軟體生產力在十年內提升一個量級,因為本質複雜度無法被工具消除。
  • LLM 逐案重審:Copilot 消除的是偶然複雜度——樣板碼、API 記憶、語法打字、regex 語法、腳手架。Brooks 似乎又被說對了一次。
  • 但本質複雜度仍在:需求理解、架構取捨、領域建模、正確性推理——這些沒有被 LLM 消除,反而因為生成變快而更稀缺。AI 時代的工程師價值向「設計與審查」移動。

4. 生產力的度量:55% 是什麼意思#

GitHub 的對照實驗(Kalliamvakou 等, 2022):兩組開發者寫同一個 HTTP server 任務,使用 Copilot 的組別完成時間中位數 1 小時 11 分,對照組 2 小時 41 分:

\[ \text{生產力提升} = \frac{T_{\text{control}} - T_{\text{treatment}}}{T_{\text{control}}} = \frac{161 - 71}{161} \approx 55.3\% \]
  • 這是單一任務、單一場景的數字;在大型程式碼庫、陌生領域、高正確性要求的場景,提升幅度顯著較小。
  • 之後的多次研究(Peng 等 2023、Google 內部資料)大致落在 20%–55% 的區間,任務越「樣板」提升越大——再次呼應本質 vs 偶然複雜度的分界。

5. 風險清單:副駕駛的四個陷阱#

風險 機制 防線
幻覺 取樣生成了不存在的 API/函式 測試與編譯驗證、型別系統
安全漏洞 語料裡的脆弱碼被高機率複製(SQL injection、弱隨機) SAST 掃描、安全審查
授權爭議 訓練語料含 GPL 等著作權碼,生成結果可能近乎逐字複製 授權過濾、訴訟(2022 集體訴訟)
技能退化 初學者跳過「苦工」,本質複雜度的訓練量不足 教育重設計、審查仍是關卡

其中授權爭議最為糾纏:生成結果與訓練語料的相似度是法律灰區,「公平使用」的辯護在 2020 年代仍無定論。

6. Python 實作:生成-檢驗循環的生產力模擬#

import random, math

def ai_productivity(q, c_check, human_gen_minutes=90, human_q=0.9, n_tasks=1000, seed=42):
    """比較:人類手寫 vs AI 生成-檢驗循環。
    q = AI 單次生成正確率;c_check = 每輪檢驗成本(分鐘)。"""
    rng = random.Random(seed)

    # 人類:生成成本高,正確率也不低
    human_total = 0.0
    for _ in range(n_tasks):
        t = human_gen_minutes * rng.uniform(0.7, 1.3)
        if rng.random() > human_q:              # 寫錯了,回頭改
            t += human_gen_minutes * 0.5
        human_total += t

    # AI:生成成本近零,但要循環檢驗直到正確
    ai_total, gen_minutes = 0.0, 2.0            # AI 生成只需 2 分鐘(打 prompt + 取樣)
    for _ in range(n_tasks):
        rounds = 0
        while True:
            rounds += 1
            if rng.random() < q:                # 本輪通過檢驗
                ai_total += rounds * c_check + gen_minutes
                break
            if rounds > 10:                     # 十輪都失敗,人類接手(q 視為任務太難)
                ai_total += human_gen_minutes
                break

    speedup = human_total / ai_total
    print(f"AI 正確率 {q:.2f}、檢驗 {c_check:.0f} 分/輪 → 提速 {speedup:.2f}x")
    return speedup

for q, c in ((0.30, 5), (0.55, 5), (0.75, 5), (0.75, 15)):
    ai_productivity(q=q, c_check=c)
# AI 正確率 0.30、檢驗 5 分/輪 → 提速 3.03x
# AI 正確率 0.55、檢驗 5 分/輪 → 提速 4.88x
# AI 正確率 0.75、檢驗 5 分/輪 → 提速 5.83x
# AI 正確率 0.75、檢驗 15 分/輪 → 提速 2.67x
# 結論:檢驗成本越高,AI 的生產力優勢崩得越快——測試與 CI 是 AI 時代的護城河。

def hallucination_loop(q_right_api=0.99, hallucination_rate=0.03, n_lines=200, seed=7):
    """示意:生成的 200 行裡,多少行引用了不存在的 API?"""
    rng = random.Random(seed)
    bad = sum(1 for _ in range(n_lines) if rng.random() < hallucination_rate)
    caught = sum(1 for _ in range(bad) if rng.random() < 0.9)  # 編譯/測試抓出 9 成
    print(f"生成 {n_lines} 行 → 幻覺行 {bad} → 被測試攔截 {caught},漏網 {bad - caught}")
    # 生成 200 行 → 幻覺行 4 → 被測試攔截 4,漏網 0
    # 但漏網者正是最危險的:語法正確、能執行、卻做錯事的碼。

hallucination_loop()

結案 -- 後果與影響#

  • 開發流程被重構:生成變快後,審查、測試、設計的角色反而放大;code review 從「禮儀」變成「品質的最後關卡」,測試驅動開發(TDD)在 AI 時代意外復興。
  • 程式設計民主化:不會寫碼的人能用自然語言做出能跑的腳本;「會程式設計」的定義從「能打字」移向「能驗證與設計」。
  • 教育轉型:程式設計課程從語法訓練轉向問題分解、除錯與批判性閱讀;「不準用 AI」的禁令逐漸讓位給「如何與 AI 協作」的課綱。
  • AI agent 開發(2020s 後半):Copilot Workspace、Devin、SWE-bench 把 AI 從「補全」推向「接下整張 ticket」——生成-檢驗循環開始由機器自己執行,工程師的角色再向「定義與驗收」移動。
  • Brooks 的遺產延續:本質複雜度仍無銀彈——需求、架構、正確性;偶然複雜度則被壓到新低,軟體工程史的重心從「如何寫」徹底轉向「如何驗證與設計」。

關鍵人物與文獻#

  • Fred Brooks:No Silver Bullet: Essence and Accidents of Software Engineering, IEEE Computer, 1986——本質 vs 偶然複雜度的分界,本案件的理論地基。
  • Aleksey Kalliamvakou(GitHub):"Research: quantifying GitHub Copilot's impact on developer productivity and happiness", 2022(55% 提速的出處)。
  • Peng 等:"The Impact of AI on Developer Productivity: Evidence from GitHub Copilot", arXiv:2302.06590, 2023。
  • Mark Chen 等(OpenAI):"Evaluating Large Language Models Trained on Code"(Codex 論文), arXiv:2107.03374, 2021。
  • Jim Zemlin / SFC 與集體訴訟(2022,Doe v. GitHub):Copilot 授權爭議的代表性案件。
  • SWE-bench(Jimenez 等, 2023,arXiv:2310.06770):AI agent 解決真實 GitHub issue 的基準測試。