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 分钟搞定!"
我瞥了一眼屏幕,问了他三个问题:
- "你怎么知道它能用?" —— 小李:"这个……我觉得逻辑应该没问题……"
- "上线之后怎么监控?" —— 小李:"呃……先上了再说?"
- "三个月后你还能看懂这段代码吗?" —— 小李:"……"
这就是当下 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. 回滚方案:
- 如何快速回滚到上一版本
- 数据兼容性注意事项
可理解性的"黄金检验"
问自己三个问题:
- 新人检验:一个刚入职的同事,能在 30 分钟内理解这个系统的核心逻辑吗?
- 深夜检验:凌晨 3 点收到告警,你能在 10 分钟内定位问题吗?
- 半年检验:半年后你回来改这段代码,能快速上手吗?
如果答案是"不能",说明可理解性还不够。
三大护法的"黄金三角"
三大护法不是孤立的,它们相互支撑:
可验证性(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}
核心设计要点:
- 强制顺序:先
tests,再metrics,再implementation,最后docs - 约束传递:生成实现时,把前两步的输出作为约束条件传入
- 可 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 倍速度制造技术债。
想了解更多?
- 微服务之道:度量驱动开发 —— MDD 的系统介绍
- Test-Driven Development by Example - Kent Beck —— TDD 的经典之作
- 活文档:与代码共同演进 —— 活文档的系统方法论
- Site Reliability Engineering - Google —— 可观测性的实践指南
你在用 AI 辅助编程时,遇到过哪些"代码看起来对,但跑起来不对"的坑? 在评论区聊聊你的经验,或者分享你的 TDD/MDD 实践。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。