ROI 背后的问题
“助手是否让开发者更快”过于模糊。严谨的评估应问:
对于哪类任务,在什么工作流下,干预是否提升了成功交付,同时没有带来不可接受的质量、安全、隐私、学习或运营成本?
助手可能减少打字,却增加 Review、调试、上下文切换或依赖风险。PR 数量增加也可能只是变更更碎,而不是价值更高。ROI 是关于某个工作负载的经验判断,不是产品名称的固有属性。
把已发布数字当作背景
厂商实验、内部报告、现场研究和独立受控试验回答的是不同问题。比较数字前应记录:
| 维度 | 需要问什么 |
|---|---|
| 结果 | 时间、采纳 Patch、合并变更、问题解决还是用户价值? |
| 任务 | 玩具任务、陌生代码库、维护、功能还是事故? |
| 参与者 | 经验、筛选、培训和自愿参与影响? |
| 对照 | 不使用工具、使用另一工具还是历史基线? |
| 协议 | 随机化、观察窗口、排除规则和重试? |
| 质量 | Tests、Review、缺陷、回滚和重工? |
| 范围 | 个人、团队、代码库还是组织? |
| 不确定性 | 置信区间、缺失数据和敏感性? |
窄任务上的受控结果不能预测公司级结果。内部报告可以作为背景,但仍可能受选择和报告偏差影响。不要把异质研究拼成工具排行榜。
METR 2025 年 7 月的随机试验很好地说明了边界为何重要。16 名经验丰富的开源开发者在熟悉的代码库中完成 246 个任务,使用当时的 Early-2025 工具后,预计耗时增加 19%。METR 现在已明确把该结果标为“过时”,并指出它不能反映当前模型对这类开发者的影响。
2026 年 2 月的后续研究也没有用一个可信的通用提效数字取代旧结果。原始估计转向更快,但 METR 认为新估计不可靠:重视 AI 的开发者更不愿进入禁用 AI 的实验条件,30% 至 50% 的受访开发者因此没有提交部分任务,报酬标准发生变化,同时运行多个 Agent 也让任务工时难以测量。正确结论不是“AI 会拖慢开发者”,也不是“AI 现在一定提效”,而是模型代际、参与者选择、任务选择、质量与工时口径都会改变真正被测量的对象。
试点前先建立基线
选择有边界的工作负载,例如 Bug 修复、依赖升级、写测试、文档变更或某个服务。定义纳入和排除规则,再记录足以包含日常波动的基线。
记录:
- 人工主动工作时间、Agent 墙钟时间、排队时间、首个可用 Patch 和合并耗时;
- 任务成功率和放弃率;
- Review 轮次、Review 分钟数和重工;
- Tests、安全检查和缺陷结果;
- 回滚或发布后事故;
- 开发者中断与满意度;
- Model、Tool、Repository 和 Policy 版本。
不要强行规定通用周数或样本量。根据工作负载做 Power Analysis,或设定可接受的实际精度目标;如果样本不足以支持结论,应明确报告。
从 Issue 分配、Agent Run、Commit、CI、Review、Merge、Deployment 和 Incident 系统收集只追加事件。不要只根据 PR 时间戳反推全部投入:开发者可能同时监督多个 Agent、等待 CI,或切换到无关任务。分析前必须声明重叠工时如何归属。
结果矩阵
| 层级 | 示例指标 | 不能证明什么 |
|---|---|---|
| 交付 | 每工程师小时成功任务数 | 长期产品价值 |
| 流程 | 交付周期、排队、Review 时间 | 单独证明代码正确 |
| 质量 | Tests、线上缺陷、重工、回滚 | 所有未来版本的可维护性 |
| 安全 | Secret、依赖风险、Policy 违规 | 不存在未知漏洞 |
| 体验 | 中断、心智负担、满意度 | 客户影响 |
| 经济 | 每成功任务成本 | 没有假设时的机会成本 |
| 学习 | 解释质量、独立后续修改 | 持久技能成长 |
保持分子和分母可见。“生成代码量”和“建议采纳率”是活动信号,不是结果。
可辩护的 ROI 模型
区分测量值和假设:
package main
import (
"errors"
"fmt"
)
type ROIInput struct {
IncrementalSuccessfulOutcomes float64
ValuePerOutcome float64
AssistantCost float64
TrainingCost float64
ReviewCost float64
ReworkCost float64
SecurityCost float64
MigrationCost float64
}
type ROIResult struct {
IncrementalValue float64
NetValue float64
ROI float64
}
func calculateROI(input ROIInput) (ROIResult, error) {
value := input.IncrementalSuccessfulOutcomes * input.ValuePerOutcome
investment := input.AssistantCost + input.TrainingCost +
input.ReviewCost + input.ReworkCost +
input.SecurityCost + input.MigrationCost
if investment <= 0 {
return ROIResult{}, errors.New("investment must be positive")
}
return ROIResult{
IncrementalValue: value,
NetValue: value - investment,
ROI: (value - investment) / investment,
}, nil
}
func main() {
result, err := calculateROI(ROIInput{
IncrementalSuccessfulOutcomes: 18,
ValuePerOutcome: 240,
AssistantCost: 900,
TrainingCost: 700,
ReviewCost: 850,
ReworkCost: 500,
SecurityCost: 600,
MigrationCost: 300,
})
if err != nil {
panic(err)
}
fmt.Printf("net=%.2f roi=%.2f\n", result.NetValue, result.ROI)
}
这是结构性示例,不代表任何货币、工资或节省结论。ValuePerOutcome 必须有记录的业务假设,IncrementalSuccessfulOutcomes 也必须相对于声明的对照条件估计。对合理区间做敏感性分析,并纳入容易被隐藏的成本:
- 订阅与推理;
- 培训与 Policy 工作;
- Review 与重工;
- Tests、安全评估和事件响应;
- Provider 迁移与锁定;
- 学习时间和独立实践减少;
- 隐私、License 和数据处理义务。
报告每个成功、经过 Review 的可接受结果成本,而不是每行生成代码成本。
设计试点
- 预先登记问题。 例如:干预是否降低某类维护任务耗时,同时不增加 Review 重工?
- 选择可比工作。 按语言、代码库熟悉度、变更规模和风险分层。
- 声明处理条件。 记录 Model、Tool 版本、Context 文件、权限、Prompt 和允许动作。
- 选择对照。 随机分配最强;无法随机时可用匹配或中断时间序列设计。
- 定义工时口径。 区分人工主动投入、无人值守 Agent 运行、等待和并行工作。
- 保持质量门禁不变。 Tests、Review、安全扫描和合并审批不能为了展示速度而放宽。
- 收集失败。 记录放弃、虚构 API、不安全 Patch、重复工作和回滚。
- 分析切片。 报告不确定性和异质性,而不只看平均值。
- 做出可逆决策。 根据预先声明的证据扩大、调整、暂停或回滚。
不要隐藏负面结果。一个工具可能帮助陌生迁移,却拖慢日常修改,这说明它有更窄的采用边界。
采纳不等于质量
建议采纳率可能受到以下因素混淆:
- 界面默认行为和自动提交;
- 开发者 Review 习惯;
- 任务难度;
- Code Owner;
- 后续重写和缺陷发现。
把它作为诊断信号,并结合 Tests、Review 重工、线上缺陷和成功任务。没有工作负载证据,不应定义“健康”采纳区间。
采用是社会技术变革
Repository 与数据 Policy
启用 Provider 前给代码库和数据分级。决定 Prompt、代码、日志或依赖是否可以离开环境,记录留存、训练使用、驻留、删除和事件通知。Secret 与个人数据应在生产端脱敏。
能力边界
Coding Agent 可能读取文件、运行命令、修改依赖、调用服务和产生外部副作用。先采用最小权限:
- 默认只读;
- 隔离 Worktree 或 Sandbox;
- 命令和网络 Egress Allowlist;
- Pin 依赖与可复现构建;
- Merge、Release、凭证变更和外部写入需要人工审批;
- 使用可审计的身份与 Tenant Context。
Prompt 指令、生成计划、Tool Annotation 或模型拒答都不是授权。
Review 与责任
作者仍需理解和测试变更。要求有意义的 Diff、Tests、依赖与 License 检查、Secret 扫描,并按风险 Review。不要让初级工程师复制无法解释的代码。
团队学习
分享失败案例和有效模式,而不只是成功故事。测量工程师是否能在没有助手时维护、调试和修改结果代码。学习是需要观察的结果,不是强制或禁止工具的理由。
不做销售排行榜的工具选型
针对真实工作负载建立比较表:
| 标准 | 需要收集的证据 |
|---|---|
| 编码质量 | 盲测任务、Tests、Review 结果 |
| Context 处理 | Repository 切片、Retrieval 错误、过期 Context |
| Agent 控制 | 权限、Sandbox、取消、审计 Event |
| 隐私 | 留存、训练条款、驻留、删除 |
| 运营 | 延迟、配额、故障、版本固定 |
| 经济 | 订阅、推理、Review、迁移成本 |
| 退出成本 | 导出、工作流可迁移性、锁定 |
价格和能力会变化。应直接核对当前条款,并记录日期和方案,不要在方法论文章中嵌入永久价格表。
常见失败模式
- 比较来自不兼容任务的厂商数字;
- 把 LOC、采纳率或 PR 数量当作客户价值;
- 假设个人速度会传导为组织吞吐;
- 为展示速度取消 Review 或安全门禁;
- 给 Agent 过宽的 Shell、Network 或凭证权限;
- 没有数据 Policy 就向 Provider 发送源码或 Secret;
- 忽视重工、调试、排队和事故成本;
- 对所有 Repository 强制同一 Tool 或工作流;
- 用短试点宣称持久技能或生产力提升;
- 没有不确定性或失败案例却发布点估计。
决策记录模板
问题:
工作负载与风险:
基线窗口与对照:
处理版本与权限:
主要结果与分母:
质量/安全门禁:
纳入的成本:
不确定性与切片计划:
扩大、暂停和回滚条件:
负责人和复查日期:
这份记录让试点可审计,避免有利的个案变成组织 Policy。
总结
AI 编程 ROI 不是通用百分比,也不能从产品名称推导。应在明确的工作负载上测量成功结果,保持质量和安全门禁,计算 Review 与重工,纳入隐私和学习成本,并报告不确定性。只有证据支持时才扩大采用,保持权限收敛,并让决策可逆。