AI编程思考2

AI 编程越用到后面,越会发现真正的瓶颈通常不是“模型够不够强”,而是两个更基础的问题:

  1. 你能不能把问题描述清楚。
  2. 你能不能把结果验收清楚。

如果这两个问题没解决,模型越强,往往只是越快地产生更多看起来正确、实际上不可用的代码。反过来,只要描述足够清晰、验收足够具体,即使不是最强模型,也能稳定产出可用结果。

1. 如何清楚地描述问题

很多人说自己“不会写 prompt”,本质上往往不是不会写提示词,而是没有把任务定义清楚。对 AI 来说,模糊的问题只会得到模糊的实现。

1.1 先说目标,不要先说方案

一个常见误区是,一上来就告诉 AI “你帮我这样改、那样改”。但如果方案本身就不成熟,AI 只会忠实地执行错误方案。

更好的方式是先描述:

  • 背景是什么。
  • 目标是什么。
  • 现在遇到的具体问题是什么。
  • 哪些东西不能改。

比如不要说:

“帮我把这个接口改成异步的。”

而可以说:

“这个接口现在平均耗时 4 秒,主要卡在第三方调用。目标是把用户请求响应时间降到 500ms 内,但不能影响最终一致性,也不能修改现有 API 返回结构。”

前者是在给实现指令,后者是在定义问题。对于复杂任务,定义问题比指定实现更重要

1.2 给足上下文,但只给相关上下文

AI 不是天然懂你的项目,它需要上下文才能做对事。但上下文也不是越多越好,太多无关信息反而会污染判断。

我一般会把上下文拆成四类:

  • 业务上下文:这段代码在整个系统里负责什么。
  • 技术上下文:使用什么语言、框架、目录约定。
  • 局部上下文:相关文件、函数、接口、报错信息。
  • 约束上下文:哪些地方不能动,兼容性要求是什么。

经验是:给 AI 看“完成任务所必需的最小上下文”。如果任务只是修一个 handler,就不要把整个仓库历史、无关日志、几十个文件一股脑塞进去。

1.3 把“做好”翻译成可执行标准

“帮我优化一下”“帮我重构得更优雅”“帮我提高代码质量”这类话,人都很难理解一致,AI 更不可能理解一致。

要把抽象目标翻译成具体标准,例如:

  • 重构后 API 行为不变。
  • 保持数据库 schema 不变。
  • 新增单元测试覆盖正常路径和异常路径。
  • go test ./... 必须通过。
  • 时间复杂度从 O(n²) 降到 O(n)。

一句话:少用形容词,多用可验证条件

1.4 给示例,往往比解释十句话更有效

示例是非常高效的沟通方式。你给一个输入输出示例,AI 往往立刻就知道你要什么。

适合给示例的场景包括:

  • 返回 JSON 的结构。
  • SQL 或 DSL 的写法。
  • 新代码需要遵循的风格。
  • 单测应该覆盖的用例。

尤其在“按现有风格扩展”这个场景里,一个参考实现胜过大量抽象描述

1.5 先让 AI 复述,再开始写代码

对于稍复杂的任务,我很少第一句就让 AI 直接写。我更常用的流程是:

  1. 先描述目标与约束。
  2. 让 AI 复述它的理解。
  3. 让 AI 给出实现计划。
  4. 我确认方向后,再让它开始改。

这样做的价值很大:如果 AI 理解偏了,最好在写代码前就发现,而不是等它改了十几个文件之后再返工。

2. 如何验收 AI 代码

AI 编程最大的风险,不是它不会写代码,而是它会写出“看起来像对的代码”。因此,验收能力比生成能力更重要。

2.1 不要用“看起来不错”验收代码

AI 写出来的代码通常可读性不差,结构甚至比很多人手写的还整齐。但“整齐”不等于“正确”。

验收时至少要看三层:

  • 功能是否满足最初目标。
  • 约束是否被遵守。
  • 改动范围是否失控。

也就是说,不能只看代码本身,还要对照最初定义的 Done 条件来检查。

2.2 把验收尽量工程化

最稳定的验收方式,不是人工盯着聊天记录,而是把验收标准外化成工程信号:

  • 单元测试。
  • 集成测试。
  • lint。
  • type check。
  • e2e / smoke test。
  • benchmark。

只要这些检查可以自动执行,AI 就有机会形成“修改 → 运行验证 → 继续修正”的闭环。没有这些信号,AI 只能靠猜。

所以一个很现实的结论是:不是 AI 需要测试,而是用了 AI 之后,你更需要测试

2.3 用 spec 约束“做什么”,用 CI 验证“做成没有”

我越来越倾向于把 AI 编程拆成两个层次:

  • 用 spec 定义需求、边界、验收标准。
  • 用 CI / test 验证实现是否满足 spec。

spec 解决的是“我们到底要什么”,CI 解决的是“这次提交是否达标”。

两者缺一不可。只有 spec 没有自动验证,容易停留在文档层;只有 CI 没有清晰 spec,测试通过也可能只是测了错误目标。

2.4 把 AI 当同事审,而不是当工具信

一个很有用的心态是:把 AI 的产出当成同事提的 PR。

这意味着你要重点检查:

  • 有没有误解业务。
  • 有没有偷偷引入额外抽象。
  • 有没有改到不该改的文件。
  • 有没有把异常路径、边界条件漏掉。
  • 有没有为了“通过测试”写出投机实现。

AI 的代码可以很快,但 review 不能省。

2.5 最终验收要落到真实场景

测试和 CI 很重要,但最后仍然要回到真实使用场景。尤其是以下类型的问题,光靠静态检查很难发现:

  • 页面交互是否顺手。
  • 接口联调时序是否正确。
  • 日志、监控、报错信息是否足够可运维。
  • 性能在真实数据量下是否达标。

所以我会把验收分成两层:

  • 第一层是自动化验收,让机器快速兜底。
  • 第二层是场景化验收,让人确认结果真的可用。

3. 一套实用工作流

如果让我把 AI 编程总结成一句操作建议,那就是:

先把问题写清楚,再把验收写清楚,最后才让 AI 动手。

一个简单但很好用的模板是:

  1. 背景:现在是什么情况。
  2. 目标:要解决什么问题。
  3. 约束:哪些行为、接口、文件不能变。
  4. 验收:什么条件下算完成。
  5. 示例:给 1 到 2 个输入输出或参考实现。
  6. 执行:让 AI 先出 plan,再改代码。
  7. 验证:跑 test、lint、CI,再做人工 review。

这个流程听起来朴素,但它本质上是在把 AI 编程从“碰运气”变成“工程化协作”。

4. 小结

AI 编程真正稀缺的,不是“生成代码”的能力,而是两种更高阶的能力:

  • 把问题描述清楚的能力。
  • 把结果验收清楚的能力。

前者决定 AI 会不会朝着正确方向努力,后者决定你能不能把 AI 产出安全地合进工程。

所以与其持续研究“怎么写神奇 prompt”,不如优先训练两件事:

  • 用清晰语言定义任务。
  • 用工程化方式定义验收标准。

当这两件事做扎实之后,AI 才会真正从“写代码的玩具”变成“能进入生产流程的工程助手”。


AI编程思考2
https://a3d21.github.io/2026/05/23/2026-05-23-AI-Coding-Reflections-2/
作者
a3d21
发布于
2026年5月23日
许可协议