AI 辅助编程的三大护法:可验证性、可观测性、可理解性

Posted on Fri 30 January 2026 in Journal

Abstract AI 辅助编程的三大护法
Authors Walter Fan
Category 编程方法论
Status v1.1
Updated 2026-01-30
License CC-BY-NC-ND 4.0

AI 辅助编程的三大护法:可验证性、可观测性、可理解性

开篇:AI 写代码快,但你怎么确定它写对了?

周五下午,小李兴冲冲地给我演示他的新技能:

"看!我让 Claude 帮我生成了一个 WebRTC 的连接管理模块,500 行代码,5 分钟搞定!"

我瞥了一眼屏幕,问了他三个问题:

  1. "你怎么知道它能用?" —— 小李:"这个……我觉得逻辑应该没问题……"
  2. "上线之后怎么监控?" —— 小李:"呃……先上了再说?"
  3. "三个月后你还能看懂这段代码吗?" —— 小李:"……"

这就是当下 AI 辅助编程最大的悖论:AI 能让你写代码快 10 倍,但如果配套方法跟不上,你可能在以 10 倍速度制造技术债。

要驯服 AI 这匹烈马,你需要三大护法:

护法 核心问题 实现方法
可验证性 AI 写对了吗? TDD(测试驱动开发)
可观测性 代码跑得怎样? MDD(度量驱动开发)
可理解性 人能看懂吗? 活文档(Living Documentation)

它们不仅能帮你确认"AI 写对了吗",更能在一开始就让 AI "带着镣铐跳舞",生成更可靠、更易维护的代码。

今天我们就聊聊:如何让 AI 一开始就 Build in 这三大护法?


为什么这三大特性在 AI 时代更重要了?

传统开发 vs AI 辅助开发的本质差异

维度 传统开发 AI 辅助开发
代码来源 你自己写,边写边想 AI 生成,你可能看都没仔细看
理解程度 每行代码都在你脑子里 可能只理解了大概逻辑
验证方式 边写边测,出问题立刻知道 生成完了才发现,调试成本高
质量控制 靠经验和 Code Review 靠测试用例和指标监控
维护成本 自己写的,改起来有底 AI 写的,改的时候怕牵一发动全身

问题在哪?

AI 生成代码的速度远超人类阅读和理解的速度。你可能还没搞清楚第 100 行在干什么,AI 已经给你写完 500 行了。

这时候: - 没有可验证性(测试用例)→ 你根本不知道 AI 的理解和你的预期是否一致 - 没有可观测性(度量指标)→ 你不知道代码上线后会不会崩、会不会慢、会不会漏内存 - 没有可理解性(活文档)→ 三个月后你看这段代码,就像看别人写的一样陌生

三大护法的价值就在于:它们把"质量保障"前置了,而不是等出了问题再补救。


护法一:可验证性(TDD)

"不能验证的代码,就是薛定谔的代码——你不跑测试,永远不知道它是对是错。"

什么是 TDD?(60 秒回顾)

测试驱动开发的核心流程: 1. Red:先写一个会失败的测试(因为功能还不存在) 2. Green:写最少的代码让测试通过 3. Refactor:在测试保护下重构代码

听起来很基础?但在 AI 时代,它变成了"约束 AI 行为的最佳工具"。

如何让 AI Build in TDD?

场景 1:给 AI 一个"测试先行"的 Prompt

错误示范

帮我写一个 WebRTC PeerConnection 的封装类,支持音视频通话。

AI 会给你一大堆代码,但你不知道: - 它处理了哪些边界情况? - 异常场景会不会崩? - 能不能处理网络抖动?

正确示范

我需要一个 WebRTC PeerConnection 的封装类。

请按照 TDD 流程:
1. 先写出关键场景的测试用例(至少包括正常流程、网络中断、对端离线三个场景)
2. 再实现代码让测试通过
3. 确保测试覆盖率 > 80%

测试用例应该包括:
- 正常建立连接
- Offer/Answer 交换失败
- ICE 候选收集超时
- 网络中断后重连
- 优雅关闭连接

用 pytest 框架,给我可直接运行的代码。

变化在哪? - AI 需要先理解验收标准(测试用例),再写实现 - 你可以在 AI 开始写代码前,先Review 测试用例,确认理解一致 - 测试用例就是"可执行的需求文档"

场景 2:让 AI 生成"自证清白"的代码

很多时候,你不是要 AI 写测试,而是要它生成带测试的代码

Prompt 模板

请用 TDD 方式实现一个 [功能描述]。

要求:
1. 先给出测试用例(用 [测试框架] 编写)
2. 测试用例要覆盖:正常流程、边界条件、异常场景
3. 实现代码要让所有测试通过
4. 给出运行测试的命令

输出格式:
- test_[模块名].py:测试代码
- [模块名].py:实现代码
- README.md:如何运行测试

示例输出

# AI 生成的测试
pytest test_webrtc_manager.py -v --cov=webrtc_manager --cov-report=html

你可以立刻验证 AI 的理解是否正确,而不是等到集成测试才发现问题。


护法二:可观测性(MDD)

"不可测量的,就无法改进。不可观测的,就无法排障。"

什么是 MDD?(用一个故事说清楚)

上周我们的服务出了个诡异的问题:用户投诉卡顿,但 CPU、内存、网络指标都正常。

排查了一整天,最后发现是:WebSocket 连接数超过了系统限制,但我们没监控这个指标。

"不可测量的,就无法改进。"

MDD 的核心思想:代码上线时,就应该自带关键指标的监控能力。

如何让 AI Build in MDD?

场景 1:在 Prompt 里明确度量需求

错误示范

帮我写一个 HTTP 请求重试逻辑。

AI 会给你一个能用的实现,但你不知道: - 重试了几次? - 哪些请求在重试? - 重试成功率多少?

正确示范

我需要一个带指标监控的 HTTP 请求重试逻辑。

功能要求:
- 支持指数退避重试(最多 3 次)
- 可配置重试条件(哪些状态码需要重试)

度量要求(用 Prometheus metrics):
- http_request_total: 总请求数(按 method, path, status_code 分类)
- http_request_retry_total: 重试次数
- http_request_retry_success_rate: 重试成功率
- http_request_duration_seconds: 请求耗时分布

请生成:
1. 实现代码(包含埋点)
2. Grafana 监控面板配置(JSON)
3. 告警规则(重试成功率 < 50% 时告警)

AI 会给你什么? - 一个带埋点的实现 - 可直接导入的 Grafana 面板 - 现成的告警规则

你的收益? - 代码上线第一天,就能看到关键指标 - 出问题时,5 分钟定位,而不是 5 小时

场景 2:让 AI 生成"度量设计文档"

对于复杂系统,可以让 AI 先设计度量方案:

我要实现一个分布式任务调度系统。

请先给出度量设计方案,包括:
1. 关键指标清单(Golden Signals: Latency, Traffic, Errors, Saturation)
2. 每个指标的采集方式(Gauge / Counter / Histogram)
3. 监控面板布局建议
4. SLO 定义(可用性目标、性能目标)

然后再实现代码。

为什么要这样?

因为度量设计比代码实现更难。如果一开始方向错了,埋再多点也没用。


实战:一个完整的 AI 辅助开发流程

假设你要让 AI 帮你实现一个"实时消息推送服务"。

Step 1:定义验收测试(TDD)

## 验收测试用例

### 正常流程
- 用户 A 发送消息,用户 B 能在 100ms 内收到
- 支持 10000 个并发连接

### 边界条件
- 用户离线时,消息能缓存 24 小时
- 单个用户消息队列 > 1000 条时,触发限流

### 异常场景
- WebSocket 连接中断,自动重连(最多 3 次)
- Redis 挂掉,降级到内存队列

发给 AI 的 Prompt

请根据以上验收测试用例,用 pytest 写出测试代码。

包括:
- 单元测试(测试消息队列、限流逻辑)
- 集成测试(测试完整推送流程)
- 性能测试(用 locust 模拟 10000 并发)

Step 2:定义度量指标(MDD)

## 关键指标

### RED Metrics
- **Request Rate**: 每秒推送消息数
- **Error Rate**: 推送失败率(目标 < 0.1%)
- **Duration**: P99 推送延迟(目标 < 100ms)

### 业务指标
- active_connections: 当前活跃连接数
- message_queue_depth: 待推送消息队列深度
- offline_message_count: 离线消息数量

### 资源指标
- CPU 使用率
- 内存使用率
- Redis 连接数

发给 AI 的 Prompt

请在实现代码中加入以上指标的埋点(用 Prometheus Python Client)。

并生成:
1. Grafana 监控面板配置
2. 告警规则(推送失败率 > 1% 或 P99 延迟 > 200ms 时告警)

Step 3:让 AI 生成代码

请实现实时消息推送服务,要求:

1. 按照之前的测试用例,确保所有测试通过
2. 按照之前的度量方案,加入指标埋点
3. 使用 FastAPI + Redis + WebSocket
4. 代码要包含:
   - 核心实现(message_service.py)
   - 测试代码(test_message_service.py)
   - 度量埋点(metrics.py)
   - Docker Compose 配置(包含 Prometheus + Grafana)
   - README(如何运行、如何查看监控)

给我可以直接运行的完整项目。

Step 4:验证和迭代

# 1. 运行测试
pytest test_message_service.py -v --cov

# 2. 启动服务
docker-compose up -d

# 3. 查看监控面板
open http://localhost:3000  # Grafana

# 4. 运行性能测试
locust -f load_test.py

如果测试失败或指标异常?

给 AI 反馈:

测试用例 test_offline_message_cache 失败了,错误信息:
[粘贴错误日志]

请修复代码,并解释为什么会失败。

护法三:可理解性(活文档)

"代码写完能跑只是开始,能被人理解才是真正的结束。"

前两个护法解决了"AI 写对了吗"和"跑起来怎么样",但还有一个问题:三个月后你还能看懂这段代码吗?

AI 生成的代码有个特点:它可能在逻辑上完全正确,但阅读体验很糟糕——变量命名随意、逻辑跳跃、缺少解释。你当时觉得"能跑就行",三个月后改需求时欲哭无泪。

什么是活文档?

活文档(Living Documentation) 的概念来自 Cyrille Martraire 的《活文档:与代码共同演进》一书。

最初的灵感来自 BDD(行为驱动开发):团队编写的测试用例既是需求说明,又是自动化测试。只要测试全部通过,这个文档就始终保持最新——这就是"活"的含义。

活文档的四个原则

原则 含义
可靠 无论何时,活文档都是准确的,与所交付的软件保持同步
省力 最小化文档工作量,软件变更时只需极少的额外工作
协作 促进所有参与者之间的对话和知识共享
有见地 引导注意力,提供反馈机会,鼓励深入思考

活文档的两种形式: - 外部文档:README、Wiki、架构图、运维手册 - 固有文档:注解、注释、测试用例、配置文件

关键观点:存储文档的最佳位置是被记录的事物本身。比如 API 文档最好就写在 API 定义旁边(OpenAPI),而不是单独维护一个 Word。

另一个重要原则:文档应该尽量自动化生成,不仅要让人容易阅读,还要让机器容易阅读。这在 AI 辅助编程时代尤为重要——AI 可以帮你从代码生成文档,也可以从文档理解代码。

SDD:实现活文档的一种方法

SDD(Spec-Driven Development,规格驱动开发) 是实现活文档的有效方法:先写规格说明,再写代码实现。

方法 核心思想 产出物
TDD 先写测试,再写实现 测试用例
MDD 先定指标,再写实现 度量方案
SDD 先写规格,再写实现 规格文档

SDD 的"规格"(Spec)可以是: - API 规格:OpenAPI/Swagger 定义接口契约 - 数据规格:JSON Schema 定义数据结构 - 架构规格:ADR(Architecture Decision Record)记录设计决策 - 行为规格:用 Gherkin 语法描述用户故事

SDD 在 AI 编程中的价值:当你先写清楚"系统应该是什么样",AI 就能生成更符合预期的代码,而且这些规格本身就成为了活文档。

可理解性的三个层次

              架构文档
          (系统是怎么设计的?)
                 │
                 ▼
              运维手册
          (怎么部署、怎么排障?)
                 │
                 ▼
              代码注释
          (这段代码为什么这样写?)

如何让 AI Build in 可理解性?

层次 1:代码注释——解释"为什么"而不是"做什么"

错误示范(AI 默认生成的):

# 计算重试延迟
delay = base_delay * (2 ** attempt)

正确示范(你应该要求的):

# 使用指数退避策略避免雪崩效应
# 为什么选择 2 倍增长?实测发现线性增长在高并发下效果不好
# 为什么有上限?防止单次重试等待时间过长,影响用户体验
delay = min(base_delay * (2 ** attempt), max_delay)

Prompt 模板

请在代码中加入注释,要求:
1. 每个函数有 docstring(包括参数、返回值、可能的异常)
2. 复杂逻辑要解释"为什么这样设计",而不是重复代码在做什么
3. 关键的设计决策要用注释记录(比如为什么选择这个算法、这个阈值)
4. 不要写废话注释(如 "# 循环遍历列表")

层次 2:架构文档——让人 5 分钟看懂系统全貌

Prompt 模板

请为这个系统生成架构文档,包括:

1. 系统架构图(用 Mermaid 绘制):
   - 核心组件及其职责
   - 组件之间的调用关系
   - 外部依赖(数据库、消息队列、第三方服务)

2. 数据流图:
   - 请求从进入到响应的完整路径
   - 数据在各组件间的转换

3. 关键设计决策:
   - 为什么选择这个技术栈?
   - 有哪些 trade-off?
   - 未来可能的扩展点?

示例输出(AI 生成的 Mermaid 架构图):

graph TB
    subgraph Client
        A[Web Client] --> B[API Gateway]
        C[Mobile App] --> B
    end

    subgraph Backend
        B --> D[Auth Service]
        B --> E[Message Service]
        E --> F[(Redis)]
        E --> G[(PostgreSQL)]
        E --> H[Notification Worker]
    end

    subgraph Monitoring
        E --> I[Prometheus]
        I --> J[Grafana]
    end

层次 3:运维手册——让人 10 分钟能排障

Prompt 模板

请生成一个 RUNBOOK.md 运维手册,包括:

1. 快速启动:
   - 环境要求
   - 一键部署命令
   - 健康检查方法

2. 常见问题排查:
   - 问题现象 → 可能原因 → 排查步骤 → 解决方案
   - 至少覆盖 5 个常见问题

3. 监控告警:
   - 关键指标说明
   - 告警处理 SOP
   - 扩缩容建议

4. 回滚方案:
   - 如何快速回滚到上一版本
   - 数据兼容性注意事项

可理解性的"黄金检验"

问自己三个问题:

  1. 新人检验:一个刚入职的同事,能在 30 分钟内理解这个系统的核心逻辑吗?
  2. 深夜检验:凌晨 3 点收到告警,你能在 10 分钟内定位问题吗?
  3. 半年检验:半年后你回来改这段代码,能快速上手吗?

如果答案是"不能",说明可理解性还不够。


三大护法的"黄金三角"

三大护法不是孤立的,它们相互支撑:

              可验证性(TDD)
             "确保写对了"
                   ▲
                  / \
                 /   \
                /     \
               /       \
              /    ◉    \
             /   质量    \
            /   保障     \
           ▼             ▼
   可观测性(MDD)    可理解性(活文档)
  "确保跑得好"       "确保看得懂"
缺少哪个? 会怎样?
缺可验证性 不知道对不对,线上出问题才发现
缺可观测性 出了问题定位不了,只能瞪眼
缺可理解性 改不动,越改越乱,最后只能重写

一个都不能少。


代码示例:用 LangChain 实现"三大护法先行"

理论讲完了,来看一个简短的代码示例。核心思路:让 AI 按顺序生成测试 → 指标 → 实现 → 文档,而不是一上来就写代码。

"""三大护法代码生成器(简化版)"""
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

llm = ChatOpenAI(model="gpt-4o")

def generate_with_three_guards(requirement: str):
    """按顺序生成:测试 → 指标 → 实现 → 文档"""

    # Step 1: 可验证性 - 先生成测试用例
    test_prompt = ChatPromptTemplate.from_template(
        "根据需求生成 pytest 测试用例,覆盖正常/边界/异常场景:\n{requirement}"
    )
    tests = (test_prompt | llm).invoke({"requirement": requirement})

    # Step 2: 可观测性 - 设计度量指标
    metrics_prompt = ChatPromptTemplate.from_template(
        "为以下需求设计 Prometheus 指标(包含 RED Metrics):\n{requirement}"
    )
    metrics = (metrics_prompt | llm).invoke({"requirement": requirement})

    # Step 3: 生成实现 - 带约束!
    impl_prompt = ChatPromptTemplate.from_template("""
根据需求实现代码,必须满足:
1. 让以下测试通过:{tests}
2. 包含以下指标埋点:{metrics}
3. 关键函数要有 docstring
需求:{requirement}
""")
    implementation = (impl_prompt | llm).invoke({
        "requirement": requirement, 
        "tests": tests.content,
        "metrics": metrics.content
    })

    # Step 4: 可理解性 - 生成活文档
    doc_prompt = ChatPromptTemplate.from_template(
        "用 Mermaid 画出以下代码的架构图,并写一个 RUNBOOK.md:\n{code}"
    )
    docs = (doc_prompt | llm).invoke({"code": implementation.content})

    return {"tests": tests, "metrics": metrics, "code": implementation, "docs": docs}

核心设计要点

  1. 强制顺序:先 tests,再 metrics,再 implementation,最后 docs
  2. 约束传递:生成实现时,把前两步的输出作为约束条件传入
  3. 可 Review:每一步的输出都可以人工检查,发现问题及早纠正

运行效果

Step 1: ✅ 生成了 7 个测试用例(正常 3 + 边界 2 + 异常 2)
Step 2: ✅ 定义了 5 个指标(rate, errors, duration, 业务指标 x2)
Step 3: ✅ 生成了实现代码(含埋点)
Step 4: ✅ 生成了架构图和 RUNBOOK.md

这就是"带着镣铐跳舞":AI 不是自由发挥,而是在测试用例和度量指标的约束下生成代码。


实战检查清单:让 AI 自带"三大护法"

下次让 AI 帮你写代码时,带上这份清单:

✅ 可验证性检查项(TDD)

  • [ ] 明确验收标准(正常流程、边界条件、异常场景)
  • [ ] 让 AI 先写测试用例,你 Review 后再实现
  • [ ] 确保测试覆盖率 > 80%
  • [ ] 包含单元测试、集成测试、性能测试
  • [ ] 提供一键运行测试的脚本

✅ 可观测性检查项(MDD)

  • [ ] 定义关键指标(RED Metrics + 业务指标 + 资源指标)
  • [ ] 在代码中加入埋点(Prometheus / StatsD / OpenTelemetry)
  • [ ] 生成监控面板(Grafana / Datadog)
  • [ ] 配置告警规则(SLO 违反时触发)
  • [ ] 写出指标查询示例(PromQL / Grafana 变量)

✅ 可理解性检查项(活文档)

  • [ ] 考虑用 SDD 方式:先写规格说明(OpenAPI / JSON Schema / ADR)
  • [ ] 关键函数有清晰的 docstring(参数、返回值、异常)
  • [ ] 复杂逻辑有"为什么这样设计"的注释
  • [ ] 有系统架构图(Mermaid / PlantUML)
  • [ ] 有运维手册 RUNBOOK.md(部署、监控、排查)
  • [ ] README 包含快速开始指南和设计决策说明

结语:AI 是助手,但方向盘在你手里

三大护法不是什么新东西,但在 AI 辅助编程时代,它们的价值被重新放大了:

  • 可验证性 让你在 AI 写代码前,就明确"什么叫做对"
  • 可观测性 让你在代码上线后,能快速知道"它运行得怎么样"
  • 可理解性 让你在三个月后,还能看懂并修改这段代码

换句话说: - 可验证性是"事前控制":确保 AI 朝着正确的方向跑 - 可观测性是"事后监控":确保代码在生产环境不翻车 - 可理解性是"长期维护":确保代码不会变成没人敢动的"祖传代码"

最后一个建议

不要一上来就让 AI 生成 500 行代码。先让它: 1. 写 10 个测试用例(你 Review)—— 可验证性 2. 定义 5 个关键指标(你确认)—— 可观测性 3. 画一张架构图(你理解)—— 可理解性 4. 再开始写实现

这样你花 15 分钟前期准备,能省下 3 小时后期调试和维护时间。


核心要点回顾

护法 核心问题 实现方法 如何让 AI Build in
可验证性 AI 写对了吗? TDD 在 Prompt 里先要求测试用例,再要求实现
可观测性 代码跑得怎样? MDD 在 Prompt 里明确度量指标和埋点要求
可理解性 人能看懂吗? 活文档 在 Prompt 里要求注释、架构图、运维手册,或先写规格再实现

一句话总结

"在 AI 时代,测试用例是你的'验收报告',度量指标是你的'仪表盘',文档是你的'地图'。三者缺一,你就是在用 10 倍速度制造技术债。"


行动清单

下次让 AI 帮你写代码时,按顺序做这些事:

🔴 可验证性(先做)

  • [ ] 在 Prompt 里加上"请先写测试用例"
  • [ ] Review 测试用例,确认覆盖正常流程、边界条件、异常场景
  • [ ] 确认后,再让 AI 写实现
  • [ ] 运行测试,验证全部通过

🟡 可观测性(同步做)

  • [ ] 明确关键度量指标(至少 RED Metrics)
  • [ ] 要求代码包含埋点(Prometheus / OpenTelemetry)
  • [ ] 生成监控面板配置
  • [ ] 配置告警规则

🟢 可理解性(活文档)

  • [ ] 要求关键函数有 docstring
  • [ ] 复杂逻辑要有"为什么"的注释
  • [ ] 生成架构图(Mermaid / PlantUML)
  • [ ] 生成 RUNBOOK.md 运维手册
  • [ ] (可选)用 SDD 方式:先写规格说明再实现

思维导图:一图总结三大护法

@startmindmap
<style>
mindmapDiagram {
  .root {
    BackgroundColor #2C3E50
    FontColor white
    FontSize 16
    FontStyle bold
  }
  .problem {
    BackgroundColor #E74C3C
    FontColor white
  }
  .tdd {
    BackgroundColor #3498DB
    FontColor white
  }
  .mdd {
    BackgroundColor #27AE60
    FontColor white
  }
  .doc {
    BackgroundColor #9B59B6
    FontColor white
  }
  .action {
    BackgroundColor #F39C12
    FontColor white
  }
}
</style>

*[#2C3E50] AI 辅助编程\n三大护法 <<root>>

left side

**[#E74C3C] 核心问题 <<problem>>
*** AI 写代码快 10 倍
*** 但验证方法跟不上
*** 可能 10 倍速制造技术债
****_ 不知道写对没
****_ 不知道跑得怎样
****_ 三个月后看不懂

**[#3498DB] 护法一:可验证性\n(TDD) <<tdd>>
*** 核心问题
****_ AI 写对了吗?
*** 实现方法
****_ 先写测试用例
****_ 再让 AI 写实现
****_ 测试通过 = 验收通过
*** 关键要点
****_ Red → Green → Refactor
****_ 覆盖正常/边界/异常
****_ 测试覆盖率 > 80%

right side

**[#27AE60] 护法二:可观测性\n(MDD) <<mdd>>
*** 核心问题
****_ 代码跑得怎样?
*** 实现方法
****_ 先定义度量指标
****_ 再让 AI 加埋点
****_ 生成监控面板
*** 关键要点
****_ RED Metrics
****_ 业务指标 + 资源指标
****_ 告警规则

**[#9B59B6] 护法三:可理解性\n(活文档) <<doc>>
*** 核心问题
****_ 人能看懂吗?
*** 四个原则
****_ 可靠:与代码同步
****_ 省力:自动化生成
****_ 协作:促进知识共享
****_ 有见地:引导思考
*** 三个层次
****_ 代码注释(为什么)
****_ 架构文档(全貌)
****_ 运维手册(排障)

**[#F39C12] 行动要点 <<action>>
*** 不要一上来就让 AI 写 500 行
*** 先让 AI 写 10 个测试用例
*** 再定义 5 个关键指标
*** 要求注释和架构图
*** 最后才写实现
@endmindmap

一句话总结:测试用例是"验收报告",度量指标是"仪表盘",活文档是"地图"。三者缺一,你就是在用 10 倍速度制造技术债。


想了解更多?


你在用 AI 辅助编程时,遇到过哪些"代码看起来对,但跑起来不对"的坑? 在评论区聊聊你的经验,或者分享你的 TDD/MDD 实践。



本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。