实现可以自动化,评估也可以自动化。但判断,始终只能由人来做。

这是“AI 原生软件工程”系列的第四篇。

本文接续上一篇:AI 原生软件工程(三):软件即搜索

第一篇追问,我们如何形成理解。

第二篇追问,我们如何获得正确性。

第三篇提出,软件正在变成一种搜索过程。

但有一个危险的误解,必须说清楚:

只要有智能体、验证框架和约束,
软件就能自行生产出来。

事实并非如此。

在第二篇里,约束帮助我们获得正确性。

在第三篇里,约束塑造了实现方案的搜索过程。

这一篇要继续追问:谁来为约束本身负责?

谁来决定该优化什么,
该拒绝什么,
又有哪些东西从一开始就值得做?

开始采用 AI 辅助的软件开发流程后,我注意到一个出乎意料的现象。

实现能力越强,判断反而越有价值。

起初,我觉得这有些反常。

AI 越强,人的决策不应该越不重要吗?

结果恰恰相反。

实现不再是瓶颈。

方向才是。

氛围编程:好用,直到失控 链接到标题

大多数开发者都经历过这样的过程。

一开始,你只有一个简单的想法:

把 X 做出来。

AI 生成代码。

你稍作调整。

跑通了。

于是继续往下做。

一个个小胜利不断累积。

项目也渐渐变大。

直到某个时刻,问题突然一股脑冒了出来:

  • 架构渐渐偏离原来的方向
  • 抽象层越堆越多
  • 调试越来越慢
  • 对系统的信心彻底崩塌

系统依然能运行。

但已经没人说得清,它为什么能运行。

项目陷入一种奇怪的状态:

好像一切都能推倒重来。

却没有任何东西真正处于掌控之中。

我把这叫作氛围编程。

并不是因为 AI 不好。

而是因为,每一步进展都不再对应一个经过认真权衡的决定。

测试通过带来的错觉 链接到标题

面对这种问题,一个常见的回答是:

多加一些测试就好了。

我也这样做过。

验证框架确实让流程更可靠。

验收关卡也确实让产出更稳定。

但后来我意识到:

通过评估,不等于真正交付了价值。

比如:

目标:
提高点击率

结果:
激进的通知推送

指标:
有所提升

后果:
用户流失

系统确实正确地完成了优化。

错的是目标本身。

这不是工程执行出了问题。

而是判断出了问题。

约束本身也是人的决定 链接到标题

在这个系列前面的文章里,我提出过:

约束塑造搜索的方向。

我现在依然认同这一点。

但约束本身,也是人做出的选择。

总得有人决定:

优化什么
忽略什么
接受哪些取舍
重视哪些失败

这些都不是客观给定的答案。

做出这些决定,需要:

  • 对具体情境的理解
  • 对结果负责的意识
  • 价值判断
  • 经验

正是在这里,工程仍然高度依赖人。

AI 时代,责任归属为何更重要 链接到标题

在传统软件开发中,责任往往会自然落到具体的人身上。

代码由你来写。

也由你来维护。

所以你自然会觉得,自己应当对它负责。

智能体式工作流削弱了实现与责任之间的联系。

如今的流程变成:

提示
-> 生成
-> 审查
-> 合并

结果是,没人真正对实现负责。

于是,一个危险的缺口出现了:

手握决定权,却不了解实现。

进度不断向前,却无人承担责任。

因此,必须明确由谁负责。

判断发生在边界上 链接到标题

我开始换一个角度理解人的判断。

人不需要事事决定。

真正需要人决定的,是边界。

比如:

这个功能是否应该存在?
怎样的取舍可以接受?
性能达到什么程度才算够用?
哪些风险可以承担?
哪些事情绝不能发生?

正是这些边界,定义了整个系统。

边界之内的其余工作,都可以委托出去。

工程师的新角色 链接到标题

或许,工程师并没有变得不那么重要。

只是职责正在向少数更关键的事情集中。

过去的要求是:

理解一切

这不可能做到。

现在的责任是:

做出正确的决定

依然很难。

甚至可能更难。

我现在遵守的原则 链接到标题

使用 AI 时,每次准备合并代码之前,我都会问自己三个问题。

如果出了问题,我知道该从哪里着手调试吗?

我愿意公开为这个设计辩护吗?

如果 AI 明天就消失,我仍然愿意接受这份成果吗?

只要有一题的答案是否定的,我大概就还没有理解得足够深入。

结语 链接到标题

未来,AI 或许会生成绝大多数软件。

验证框架或许能检查绝大多数行为。

评估循环或许能让绝大部分正确性检查自动完成。

但仍然要有人回答一个问题:

这个系统应该存在吗?

而这个问题,很少只是技术问题。

判断力,或许会成为工程领域最后一项无法委托出去的能力。