夜雨聆风学习资料网

ARTICLE · 1077786

Day 010|当 AI 能自己干活,真正稀缺的是“验收标准”

Day 010|当 AI 能自己干活,真正稀缺的是“验收标准”

昨天写 Day 009 时,我留下了一个判断:

Prompt 优化的是一次交互,顶级 Builder 优化的是 AI 完成任务的整个运行环境。

Context、Rules、Skills、Hooks、Tests、Subagents……

当这些东西逐渐搭起来以后,会出现一个很有意思的变化:

AI 开始真的可以自己干活了。

不是你说一句,它写一段。

而是你给它一个任务,它自己读代码、找文件、修改、运行命令、看到报错、继续修,再重新测试。

人可以慢慢退出执行循环。

但人退出以后,一个新的问题马上冒出来:

AI 到底什么时候应该停?


假设今天我要做一个注册页面。

最简单的任务描述可能是:

做一个用户注册页面。

这句话对人来说似乎已经够清楚了。

但如果把它交给一个可以连续工作半小时甚至几个小时的 Agent,问题就来了。

什么叫「做完」?

有邮箱和密码输入框算做完吗?

注册接口能调用算做完吗?

错误提示算不算?

移动端要不要适配?

重复邮箱怎么办?

密码规则是什么?

Loading 状态有没有?

接口失败以后怎么恢复?

页面长得和设计稿差多少可以接受?

TypeScript 有没有报错?

测试要不要通过?

这些问题以前其实一直存在。

只是过去写代码的人和验收的人往往是同一个人。

程序员做到某一步,看一眼页面,心里自然知道:

差不多了。

很多判断没有被写下来。

它们藏在人脑里。

AI Agent 出现以后,这部分隐性的东西突然暴露出来了。

因为 AI 不知道什么叫「差不多」。


这也是我现在觉得很有意思的一件事。

我们一直以为 AI Coding 最大的瓶颈,是 AI 会不会写代码。

但模型越来越强以后,另一个瓶颈开始浮出来:

人能不能准确描述什么叫“正确”。

这和写需求还不完全一样。

需求描述的是:

我要什么。

验收标准描述的是:

我凭什么知道你已经做对了。

这两个东西看起来很接近,实际上完全不同。

「做一个搜索功能」是需求。

「输入关键词后 300ms 内出现结果;空结果有提示;网络失败允许重试;搜索条件刷新页面后保留;现有测试全部通过」才逐渐接近可执行的验收条件。

前者告诉 AI 往哪走。

后者告诉 AI:

什么时候可以停。


这也是为什么 Tests、Evals、Lint、Type Check、Build、Screenshot Diff 这些东西,在 Agent 工作流里的位置会越来越重要。

以前我们把测试理解成代码质量工具。

现在它还有另一层作用:

测试正在变成 AI 的反馈系统。

没有测试时,Agent 写完代码以后,只能问自己:

「看起来对不对?」

于是它生成一版,觉得差不多,然后告诉你任务完成。

最后还是人打开页面。

点一遍。

发现按钮没反应。

再把错误告诉 AI。

AI 修改。

人再检查。

看起来用了 Agent,其实人依然没有离开循环。

只是从写代码的人,变成了一个不停点「再改一下」的 QA。

但如果验收条件可以被机器读取,循环会完全变掉。

目标→ AI 实现→ Test 失败→ AI 读取结果→ 修改→ 再 Test→ Pass

人不需要参与每一次失败。

这时候 Agent 才开始拥有真正意义上的自主性。

不是因为它更聪明了。

而是因为它终于知道:

错在哪里。


软件工程里有一个挺有意思的概念,叫 Oracle Problem。

这里的 Oracle 不是数据库公司,而是「判定答案是否正确的机制」。

很多问题最难的部分,并不是生成一个答案。

而是判断这个答案到底对不对。

AI 把这个问题放大了很多倍。

因为生成能力正在快速变便宜。

今天让 Agent 给我写五个实现方案,并不困难。

真正麻烦的是:

哪一个方案可以上线?

哪一个破坏了已有逻辑?

哪一个只是 Demo 能跑?

哪一个在数据量上来以后会炸?

哪一个虽然测试通过,但用户体验很差?

生成速度越快,验收能力的重要性反而越高。

因为以前一个工程师一天写 300 行代码,你还能认真 Review。

未来几个 Agent 并行跑,一下午给你提交几千行 Diff。

如果质量判断还停留在「我打开看看」,人很快会成为整个系统里最慢的节点。

所以我现在越来越觉得:

AI 把 Coding 自动化以后,Builder 的工作不会消失,而是会向上移动到 Specification 和 Evaluation。


这里还有一个容易混淆的地方。

验收标准不等于「多写测试」。

有些东西很好验证。

比如:

接口返回 200。

单元测试通过。

Build 成功。

没有 Type Error。

这些属于机器特别擅长判断的东西。

但另一些标准没有那么容易写成 assert()。

比如:

这个页面是不是让人一眼看懂?

这个交互是不是太绕?

这个文案有没有让用户困惑?

这个产品方案是不是解决了最重要的问题?

这个功能值不值得做?

这时候人依然非常重要。

只不过人的角色变了。

以前人负责生产答案。

以后很多时候,人负责定义评价答案的尺度。

我甚至觉得,这会成为 AI Builder 很核心的一项能力:

把模糊的“我觉得这样比较好”,逐渐翻译成 AI 可以检查的信号。

有些信号是 Test。

有些是 Eval。

有些是设计稿 Diff。

有些是性能阈值。

有些是用户行为。

还有一些实在无法自动化,就明确标记:

这里必须由人判断。

不是所有判断都应该交给 AI。

但至少我们要知道,判断发生在哪里。


从这个角度再回头看 Prompt,会发现一个很微妙的变化。

很多人现在还在努力把 Prompt 写得越来越详细:

「你一定要认真。」

「请充分思考。」

「写完后检查三遍。」

「确保代码健壮、优雅、可维护。」

这些要求读起来很正确。

但它们最大的问题是:

没有反馈信号。

什么叫健壮?

什么叫优雅?

什么叫充分思考?

AI 很难从这些词里知道自己到底差了多少。

相比之下:

npm test 必须全部通过。

Lighthouse Performance ≥ 90。

接口 P95 < 300ms。

视觉 Diff 超过阈值就继续修改。

禁止新增 TypeScript Error。

核心流程必须覆盖这 6 个 User Story。

这些要求反而没那么「高级」。

但 Agent 真能拿它们工作。

我越来越喜欢这种思路:

少告诉 AI“你要做好一点”,多告诉它“我怎么知道你做好了”。


这件事最后会反过来改变产品经理、设计师和工程师写需求的方式。

以前一份 PRD 很容易写成:

支持用户管理。

优化体验。

提高稳定性。

改善加载速度。

增强安全性。

这些词在人类团队里还能靠会议、经验和默契把空白补上。

Agent 不会天然拥有这些默契。

所以当越来越多执行工作交给 Agent,模糊需求的成本反而会变高。

一个好的任务定义,可能会越来越像这样:

Goal:

我们想得到什么结果。

Constraints:

哪些事情绝对不能发生。

Evidence:

用什么证据证明结果正确。

Stop Condition:

满足什么条件以后可以停止。

我觉得最后这一项特别重要。

因为过去绝大多数软件流程,都默认「人会知道什么时候该停」。

未来未必。

当 Agent 可以一直运行、不断修改、不断优化的时候,停止条件本身就是系统设计的一部分。

相关学习资料