反馈循环就是一切

AI 模型自己写代码并不是最有趣的部分。有趣的是它生成代码之后发生的事情。模型能以多快的速度知道代码是否正确?生成与验证之间的反馈循环有多紧密?

这个循环决定了一切。它决定了模型能否对自己的输出进行迭代。它决定了人类是否可以在不经手动检查的情况下信任输出。它决定了 AI 编码在哪些领域真正有效。

循环速度并不均匀。它沿着一条光谱分布。而这条光谱由一个更简单的事实决定:AI 天生就是文本原生的。

后端代码是文本。API 响应是文本。数据库 schema 是文本。整个领域都以字符串的形式呈现,语言模型无需离开其原生媒介就能读取、生成和验证。即使后端涉及 CLI 命令,这些命令也是文本。模型不需要看。它需要读。

视觉界面则不同。UI 不是静态图像。它是时间性的。状态会变化。动画会过渡。手势会触发级联反应。模型可以对按钮截图,但无法感受按下的时机。它可以阅读 CSS,但无法观察 easing 曲线随时间展开。视觉正确性是体验性的,而体验发生在时间之中。

后端:几毫秒

后端代码以确定性的方式验证。函数有输入和输出。类型检查器在编译时验证 contract。测试套件在几毫秒内演练行为。API 端点返回的响应要么匹配 schema,要么不匹配。数据库迁移要么干净地应用,要么回滚。

每一个验证信号都是文本性的、确定性的且快速的。模型可以在几秒钟内生成函数、运行类型检查器、看到错误并重新生成。它可以编写测试、运行测试、看到失败并修复实现。迭代周期足够紧密,使得模型可以在有限的后端任务中半自主地运作。

这就是为什么今天后端是 AI 编码感觉最神奇的地方。这个领域是纯粹的逻辑。验证是即时的。模型知道自己什么时候错了——这正是确定性 guardrails试图为 codebase 其余部分提供的东西。

Web:几分钟

Web 开发增加了视觉正确性。一个组件可能有正确的 props 但错误的 padding。一个布局可能通过了所有类型检查,但看起来仍然是坏的。验证面不再纯粹是确定性的。

Playwright 能帮上忙。你可以渲染组件、截图并与基线做 diff。但这很慢。后端测试套件在几秒钟内运行。Playwright 视觉回归套件需要几分钟。AI 无法以同样的速度对自己的输出进行迭代,因为验证步骤慢了一个数量级。

模型可以生成能通过编译的 React 代码。但如果不运行浏览器、渲染 DOM 并比较像素,它无法告诉你生成的 UI 看起来是否正确。这个瓶颈是真实存在的。Web 上的 AI 编码是可行的,但反馈循环更松散。

移动端:几小时

移动端增加了物理现实。手势有时机和物理特性。动画有 easing 曲线,感觉要么对要么错。屏幕在 iOS 16 和 iOS 18 上渲染不同。Bluetooth、摄像头、GPS 和推送通知的行为因设备、操作系统版本和厂商定制皮肤而异。

没有快速验证这些东西的方法。单元测试覆盖了业务逻辑,但覆盖不了滑动的感觉。模拟器上的 UI 测试能捕获布局问题,但捕获不了三年前的 Android 设备上的掉帧。真正的验证需要构建、签名、安装并在实体硬件上与 app 交互。反馈循环以小时为单位,而不是秒。

模型可以生成能通过编译的 SwiftUI 或 Jetpack Compose 代码。但它无法告诉你 app 感觉是否原生。这需要人类的手在真实设备上操作。迭代周期太慢,模型无法有效地自我纠正——这就是为什么 AI 编写的 React Native app 需要 guardrails 才能扩展

这条光谱意味着什么

AI 编码不是以模型能力的速度扩展的。它是以验证的速度扩展的。

模型今天就能写移动端代码。它做不到的是知道那段代码好不好。知道需要移动端所没有的验证基础设施。后端有。Web 正在构建。移动端落后了数年。

对于正在选择在哪里应用 AI 编码的团队来说,答案是显而易见的。从验证最快的地方开始。后端优先。Web 其次,并投资于视觉测试。移动端最后,仍然由人类的手来做最终验证。这个选择的维护成本会随着时间复利增长——这就是为什么第一版从来不是真正的问题

模型在后端并不更聪明。它只是信息更充分而已。