AI 时代代码交付的新范式
Simon Willison 在《Your job is to deliver code you have proven to work》中提出了一个看似简单却深刻的观点:在 LLM 工具普及的今天,软件工程师的核心职责不再是 "编写代码",而是 "交付经过验证的代码"。这一转变背后反映了一个根本性的行业变化 —— 当 AI 能够生成大量看似合理的代码时,真正的价值创造点从代码生成转移到了代码验证。
正如 Willison 指出的:"提交未经测试的大型 PR 是浪费他人时间且不负责任的行为。你的工作是交付经过验证的代码。" 这一观点在 Hacker News 社区引发了广泛讨论,许多资深工程师分享了类似的观察:AI 代码生成工具让 "vibe coding" 变得更容易,但也让未经验证的代码提交变得更加普遍。
渐进式验证流水线:四个层次的防御体系
第一层:手动验证(Human Verification)
手动验证是验证金字塔的基石。Willison 强调:"如果你没有亲眼看到代码正常工作,那这段代码就是无效的。如果它碰巧能工作,那纯粹是运气。"
可落地实践清单:
- 终端命令序列记录:将测试步骤转化为可复现的终端命令序列,并附上输出结果
- 屏幕录制与截图:对于 UI 变更,提供前后对比截图或简短录屏
- 状态机验证:明确记录系统的初始状态、操作步骤和预期结果
- 边界条件探索:主动寻找可能破坏系统的边缘情况
技术参数建议:
- 最小验证覆盖率:每个功能变更至少 1 个手动验证场景
- 验证文档化:所有手动验证步骤必须可复现、可文档化
- 时间预算:手动验证应占开发时间的 15-25%
第二层:自动化测试(Automated Testing)
自动化测试确保代码在未来持续工作。Willison 指出:"现在有了 LLM 工具,编写自动化测试变得前所未有的容易,没有任何借口跳过这一步。"
分层测试策略:
- 单元测试层:覆盖率目标 80-90%,关注纯函数和独立模块
- 集成测试层:覆盖率目标 60-70%,验证模块间交互
- 端到端测试层:覆盖率目标 40-50%,模拟真实用户场景
- 属性测试:使用 QuickCheck 等工具验证代码属性
工具链集成参数:
- 测试执行时间:单元测试 < 5 分钟,完整测试套件 < 30 分钟
- 失败反馈延迟:测试失败应在 5 分钟内通知相关开发者
- 测试维护成本:测试代码与生产代码比例建议 1:2 到 1:3
第三层:静态分析与代码质量门禁
静态分析在编译时捕获潜在问题,提供早期反馈。
静态分析检查清单:
- 类型安全验证:使用 TypeScript、Rust 等强类型语言或类型检查器
- 代码规范检查:ESLint、Pylint、Checkstyle 等工具配置
- 安全漏洞扫描:SAST 工具集成(SonarQube、Snyk Code)
- 依赖漏洞检测:SCA 工具定期扫描第三方依赖
- 架构约束验证:ArchUnit、TLA + 等形式化规范
质量门禁阈值:
- 代码重复率:<3%
- 圈复杂度:函数级 < 15,类级 < 50
- 认知复杂度:<25
- 安全漏洞:零高危漏洞,中危漏洞 < 5
第四层:形式验证与模型检查
对于关键系统组件,形式验证提供数学上的正确性保证。
适用场景与工具选择:
- 并发系统:TLA+、Alloy 用于验证分布式协议
- 安全关键系统:Coq、Isabelle 用于证明加密算法
- 实时系统:UPPAAL、Timed Automata 验证时间约束
- 智能合约:Formal verification of Solidity contracts
实施路线图:
- 阶段 1:对核心算法进行形式化规约(3-6 个月)
- 阶段 2:建立验证框架和工具链(6-12 个月)
- 阶段 3:关键路径形式验证(持续进行)
基于风险的测试优先级框架
并非所有代码都需要同等程度的验证。基于风险的测试优先级框架帮助团队合理分配验证资源。
风险维度评估矩阵
| 风险维度 | 低风险 | 中风险 | 高风险 |
|---|---|---|---|
| 业务影响 | 功能增强 | 核心功能 | 支付 / 安全 |
| 变更范围 | 局部修改 | 模块重构 | 架构迁移 |
| 依赖复杂度 | 独立模块 | 中度耦合 | 深度耦合 |
| 用户影响 | 少量用户 | 部分用户 | 全体用户 |
验证强度配置表
| 风险等级 | 手动验证 | 自动化测试 | 静态分析 | 形式验证 |
|---|---|---|---|---|
| 低风险 | 基础验证 | 单元测试 | 基础检查 | 可选 |
| 中风险 | 完整验证 | 集成测试 | 完整检查 | 建议 |
| 高风险 | 深度验证 | E2E 测试 | 严格检查 | 必需 |
度量指标与持续改进
核心度量指标
-
验证覆盖率指标
- 代码覆盖率:行覆盖率、分支覆盖率、函数覆盖率
- 需求覆盖率:用户故事到测试用例的映射
- 风险覆盖率:高风险区域验证完整性
-
质量趋势指标
- 缺陷密度:每千行代码的缺陷数
- 逃逸缺陷率:生产环境发现的缺陷比例
- 平均修复时间:从发现到修复的时间
-
效率指标
- 验证执行时间:完整测试套件运行时间
- 反馈周期:代码提交到验证结果的时间
- 维护成本:测试代码维护工作量
持续改进循环
- 度量收集:自动化收集所有验证相关指标
- 根因分析:对验证失败进行根本原因分析
- 流程优化:基于数据分析优化验证流程
- 工具改进:根据团队需求定制验证工具链
- 文化培育:建立验证优先的工程文化
AI 代码生成时代的验证策略调整
AI 生成代码的特殊挑战
- 理解缺失风险:开发者可能不理解 AI 生成的代码逻辑
- 模式不一致:AI 可能引入与现有代码库不一致的模式
- 隐藏假设:AI 代码可能基于未声明的假设
- 测试完整性:AI 生成的测试可能不完整或有误导性
针对 AI 代码的验证强化措施
- 强制代码审查:AI 生成的代码必须经过人工深度审查
- 理解验证:开发者必须能够解释每一行 AI 生成代码
- 模式一致性检查:增加代码风格和模式一致性验证
- 假设显式化:要求显式声明 AI 代码的所有假设
- 测试验证:不仅验证 AI 生成的测试通过,还要验证测试本身的正确性
工具链集成方案
现代验证工具栈
开发环境层:
- IDE集成:测试运行器、静态分析插件
- 本地预提交钩子:代码格式化、基础检查
持续集成层:
- 测试执行:并行测试运行、结果聚合
- 质量门禁:覆盖率检查、安全扫描
- 性能测试:基准测试、负载测试
持续部署层:
- 金丝雀发布:渐进式流量切换
- 功能标记:特性开关控制
- 监控告警:生产环境异常检测
配置示例:GitHub Actions 工作流
name: Verifiable Code Delivery Pipeline
on: [push, pull_request]
jobs:
verification:
runs-on: ubuntu-latest
steps:
- name: 代码检查
run: |
npm run lint
npm run type-check
npm run security-scan
- name: 单元测试
run: npm test -- --coverage
- name: 集成测试
run: npm run integration-test
- name: E2E测试
run: npm run e2e-test
- name: 质量门禁
run: |
# 检查覆盖率阈值
coverage=$(cat coverage/coverage-summary.json | jq '.total.lines.pct')
if (( $(echo "$coverage < 80" | bc -l) )); then
echo "覆盖率不足80%: $coverage%"
exit 1
fi
组织与文化变革
工程师角色重新定义
在 AI 代码生成时代,软件工程师的角色需要重新定义:
- 验证专家:精通各种验证技术和工具
- 系统思考者:理解业务需求与技术实现的映射
- 质量倡导者:在团队中推动质量文化
- AI 协作师:有效指导 AI 工具生成高质量代码
团队实践变革
- 结对编程演进:从 "人 - 人结对" 到 "人 - AI 结对"
- 代码审查重点转移:从语法检查到逻辑验证
- 知识管理强化:显式化隐式知识和假设
- 学习文化培育:持续学习新的验证技术和方法
结论:构建验证优先的工程文化
Simon Willison 的观点为我们指明了 AI 时代软件工程的发展方向:当代码生成变得廉价时,代码验证的价值急剧上升。构建可验证代码交付的工程实践框架不是一次性项目,而是需要持续投入和演进的系统工程。
关键成功因素:
- 领导层支持:管理层必须理解并支持验证工作的重要性
- 工具链投资:为团队提供现代化的验证工具和基础设施
- 技能发展:持续培训工程师的验证技能和思维
- 度量驱动:基于数据做出验证策略的调整决策
- 文化培育:建立 "验证优先" 的团队文化
最终,可验证代码交付框架的目标不是追求 100% 的完美验证,而是在业务速度和质量保证之间找到最佳平衡点。正如 Hacker News 讨论中一位工程师所言:"你的工作不是交付完美代码,而是交付在给定约束下最优的解决方案。" 渐进式验证框架正是实现这一目标的有效路径。
资料来源:
- Simon Willison. "Your job is to deliver code you have proven to work." December 18, 2025. https://simonwillison.net/2025/Dec/18/code-proven-to-work/
- Hacker News 讨论. "Your job is to deliver code you have proven to work." December 18, 2025. https://news.ycombinator.com/item?id=46313297
延伸阅读:
- 《The Pragmatic Programmer》中的 "正交性" 和 "可测试性" 原则
- Martin Fowler 关于测试金字塔的论述
- Google 的《Software Engineering at Google》中的质量保证实践
- 《Building Evolutionary Architectures》中的适应度函数概念