引言:为什么AI写了50%的代码,我们反而更累了?

2025年,许多大厂的数据显示,新增代码中已有20%-30%甚至50%是由AI生成的。但作为一线开发者,你是否有这种感觉:代码产量高了,但人更累了。

我们陷入了一个怪圈:以前花时间写代码,现在花时间给AI写Prompt,然后花更多的时间Debug它生成的“看起来完美其实全是坑”的代码。我们在多个Chat窗口之间反复横跳,注意力被切得粉碎。

本文基于yousa的演讲和三年AI Coding实战经验,发现这个认知问题还是重要的值得写一些东西给大家分享,不谈虚的未来展望,只谈一个核心问题:当AI成为生产力基建时,开发者该如何设计工作流,才能真正拿到“效率增益”?


一、 心态重塑:先算账,再干活

很多开发者拒绝或抱怨AI,是因为掉进了 “准确率陷阱”。我们总期待AI像高级工程师一样,一次性给出完美代码。一旦它写出Bug,我们就会觉得“还不如自己写”。

在实战中,我们需要把心态从“追求单点完美”转变为“追求系统效率”。请记住这个公式:

效率增益 = 纯人工耗时 AI生成时间 + 人工修复/验证时间 \text{效率增益} = \frac{\text{纯人工耗时}}{\text{AI生成时间} + \text{人工修复/验证时间}} 效率增益=AI生成时间+人工修复/验证时间纯人工耗时

实战启示:
不要强求AI代码100%正确。只要(生成+修复)的时间远小于你自己手写的时间,这就是一次成功的协作。哪怕它写的代码有瑕疵,只要它是 “甜点区”任务,你就赚了。

什么是AI协作的“甜点区”?

不要把核心算法或极度复杂的业务逻辑直接丢给AI。优先将AI算力分配给以下四类任务:

  1. 高重复/模板化:CRUD接口、DTO转换、数据映射。
  2. 高耗时:手写需要2-3小时,但创造性低的工作(如编写全套单元测试)。
  3. 低风险:挂了也不会导致核心资损的非关键路径。
  4. 易验证:肉眼能看懂,或者编译器/测试脚本能直接拦截错误的。

二、 核心SOP: 管理AI协作流

要摆脱“随机试错”的痛苦,我们需要一套标准化的操作流程(SOP)。我们将这套流程称为 “指战员模式”:你是指挥官,AI是执行力超强但缺乏背景知识的实习生。

步骤 1:上下文预制 (Context Injection)

原则:Garbage In, Garbage Out。你喂给AI什么,它就吐出什么。

  • 错误做法:直接在对话框输入“帮我写个用户登录接口”。
  • SOP做法
    • 建立 Spec 文件:在项目根目录维护一个 Agent.mdSpec.md
    • 内容包含:项目的分层架构图、统一的错误码定义、数据库表结构摘要、关键的第三方库版本。
    • One-Shot 示例:永远先手写一个你认为最标准的代码范例(比如一个完美的Controller+Service实现),投喂给AI,告诉它:“后续所有接口,严格模仿这个风格。”
步骤 2:批量生成 (Batch Generation)

原则:利用AI的并发能力,而不是把它当打字机。

  • 场景:需要为10个新实体写CRUD。
  • SOP做法
    1. 确认AI理解了步骤1中的“标准范例”。
    2. 下达指令:“参照上述风格,为 User、Order、Product 实体生成对应的 Controller、Service 和 DTO 层代码。”
    3. 不要逐个审查:此时不要被打断,让AI一口气生成完。
步骤 3:验证与收敛 (Validation & Convergence)

原则:对AI的代码保持“零信任”,瓶颈从“写”转移到“验”。

  • 验证层级
    1. 静态检查 (Linter):依靠IDE插件自动修复格式、导包错误。
    2. 逻辑审查 (Review):重点看鉴权逻辑、边界条件处理(如空指针、超大数值)。
    3. 防御性测试 (Test)这一步必须做! 要求AI:“为刚才生成的代码编写单元测试,覆盖 正常路径、非法参数、数据库异常 三种场景。”
    • 实战技巧:如果测试跑不通,直接把报错日志丢回给AI,让它自己修。

三、 工程化改造:让项目变“AI友好”

如果你的项目本身代码混乱、没有文档,AI的效果会大打折扣。提高效率的终极手段是改造环境

1. 标准化 (Standardization)

AI需要清晰的“说明书”。

  • 统一规范:接口必须有OpenAPI/Swagger定义。
  • 显性知识:把脑子里的业务规则写成文档,哪怕是简单的Markdown,放在代码仓库里。AI读取这些文档后,幻觉率会显著下降。
2. 自动化 (Automation)

让机器去验证机器。

  • Pre-commit Hooks:配置强力的Lint规则,禁止不规范代码入库。让AI帮你写这套配置脚本。
  • CI/CD Pipeline:建立自动化测试流水线。AI生成的代码提交后,必须通过流水线验证。

四、 开发者生存指南:管理你的注意力

引入AI后,我们很容易陷入“沟通疲劳”。为了保持心流 (Flow),建议采用 “时分复用” 策略:

时间段 角色 任务 状态
09:00 - 10:00 架构师 定义任务,编写Spec,准备上下文,给AI下达批量指令。 高认知
10:00 - 11:30 领航员 深度工作(处理核心难题),挂起AI任务,不被弹窗打断。 心流态
11:30 - 12:00 验收员 集中验收AI在第一阶段生成的代码,运行测试,修复Bug。 交互态

黄金法则:

  1. 3分钟原则:如果AI生成的结果需要你花超过3分钟去解释和修补,说明上下文给得不够,或者这活儿不适合AI。立刻停下来,自己写,或者重写Prompt。
  2. 不再做“编译器”:不要人眼去检查分号漏没漏,那是Linter的工作。人眼只检查业务逻辑和安全漏洞。

五、 实际案例

下面我通过两个真实场景(批量业务开发防御性测试生成),展示如何通过 “上下文预制”“One-Shot(单样本)诱导”,让AI产出直接可用的代码。


场景一:批量制造“甜点” —— 30分钟搞定一套标准业务接口

背景
你正在开发一个电商后台,需要为 Order(订单)、Product(商品)、Customer(客户)三个实体写全套CRUD接口。
痛点
手写太慢,复制粘贴容易漏改变量名;直接让AI写,它生成的风格五花八门(有的用Result.ok(),有的直接返回对象,有的没加日志)。

❌ 错误示范(低效模式)

User: 帮我写一个订单的Controller,要有增删改查。
AI: 生成了一段代码,用了默认的JPA风格,没加你的错误码规范,没加Swagger注解,还得你一行行改。

✅ 正确SOP:上下文预制 + 样板诱导

第一步:建立项目级“说明书” (.cursorrulescontext.md)
在项目根目录创建一个文件(例如 context.md),把你的工程规范固化下来。

# 项目工程规范

## 1. 响应结构
所有接口必须返回 `ApiResponse<T>` 格式:
- 成功:ApiResponse.success(data)
- 失败:ApiResponse.error(BizCodeEnum.CODE, message)

## 2. 异常处理
- 业务异常抛出 `BizException`
- 参数校验失败抛出 `MethodArgumentNotValidException` (由GlobalExceptionHandler处理)

## 3. 技术栈
- Spring Boot 3.0, MyBatis Plus, Lombok, Swagger 3 (OpenAPI)

## 4. 命名规范
- Controller路径:/api/v1/{entity_name}
- 方法名:create, getById, update, deleteById, list (分页)

第二步:手写“黄金样板” (One-Shot)
不要让AI凭空发挥。你先亲自写一个最简单的 CustomerController,确保每一行代码(注解、日志、换行风格)都是你最满意的。这被称为“黄金样板”。

第三步:执行批量生成 Prompt
现在,把 context.mdCustomerController.java 作为上下文喂给AI(在Cursor/Copilot中选中它们),然后输入:

Prompt:

上下文参考:context.md (规范) 和 CustomerController.java (代码风格样板)。

任务:请完全参照 CustomerController 的代码结构、注解风格和错误处理方式,为 OrderProduct 两个实体生成对应的 Controller 层代码。

要求

  1. 保持包路径一致,仅替换实体名称。
  2. 只有实体特有的字段逻辑不同,CRUD骨架必须1:1复刻。
  3. 不要解释,直接输出代码。

结果
AI会像复印机一样,精准地把你的风格“印”到其他实体上。变量名、日志前缀、Swagger描述都会自动适配。你只需要Review一下特有的字段逻辑即可。

收益

  • 人工耗时:30分钟(写规范+写样板)。
  • AI生成:5分钟(生成剩余10个接口)。
  • 维护成本:极低(因为风格完全统一)。

场景二:从“裸奔”到“堡垒” —— 自动化生成防御性测试

背景
你接手了一段复杂的Python遗留代码(或者AI刚生成的复杂逻辑),逻辑很绕,你不敢动,也没时间写测试用例。
痛点
很多开发者只让AI写“Happy Path”(成功路径)的代码,上线后一遇到空值或异常参数就崩。

❌ 错误示范

User: 给这段代码写个单元测试。
AI: 写了一个 test_success(),运行通过。你以为稳了,上线后输入一个 -1,服务挂了。

✅ 正确SOP:基于角色的对抗式验证

第一步:让AI理解代码逻辑
选中目标函数 calculate_shipping_fee

第二步:使用“攻击者思维” Prompt
不要让AI当“保姆”,让它当“黑客”。

Prompt:

你是一个资深的QA工程师,专注于寻找代码的边界漏洞。

任务

  1. 分析 calculate_shipping_fee 函数的所有输入参数。
  2. 不要只写成功用例!请列出至少 5 种可能导致 panic、死循环或逻辑错误的极端场景(Edge Cases),例如:空值、负数、超大整数、非法的枚举值、数据库连接超时。
  3. 为这些场景编写 pytest 测试用例。
  4. 使用 pytest.raises 验证异常是否被正确捕获。

第三步:迭代修复 (The Loop)

  1. 运行AI生成的测试代码。
  2. 现象:大概率会有几个测试挂掉(Fail)。
  3. 行动:不要自己修!把错误日志直接贴回给AI。

Prompt:

运行你生成的测试后,出现了 ZeroDivisionErrorTypeError,错误日志如下:
[粘贴日志]

请修复原业务代码 calculate_shipping_fee 以通过这些测试。注意不要破坏原有的正常逻辑。

收益
通过这个流程,你不是在“写代码”,而是在 “编织安全网”。你利用AI的发散思维去穷举你没想到的Bug,然后反过来加固代码。这才是把时间花在了“验代码”上。


从“随机试错”到“标准产线”

如果我们把文章中的理论落地到日常开发,其实就是建立一套 “AI友好型”的工作流

建议你从现在开始,在项目里增加这三个具体的动作:

1. 建立 context/ 文件夹

不要每次都重新教AI什么是“Result对象”。把项目中稳定不变的代码(DTO基类、工具类、架构图)单独放在一个文件夹里。每次开新任务,先把这个文件夹作为Context投喂进去。

2. 实行“三明治”开发法
  • 上层面包(人):定义接口(Interface)、编写Prompt、设计核心数据结构。
  • 中间肉饼(AI):填充实现类(Impl)、编写转换逻辑、生成CRUD。
  • 下层面包(人+AI):人设计测试策略,AI生成测试用例,自动化流水线验证。
3. 遵守“15分钟规则”

如果一个Prompt你调整了15分钟,AI还是写不对,立刻停止。这说明:

  • 要么任务过于复杂,需要拆解。
  • 要么缺少关键的上下文信息。
  • 要么这属于AI的“幻觉区”(如复杂的数学推导或极冷门的库)。
    此时,自己手写核心逻辑,然后让AI做外围的包装和测试。

🚀 你的行动清单 (Actionable Advice)

不要试图一口气改变整个团队。今天下午,你可以做一件事:

找一个你最近写过的、觉得写得最好的后端接口(Controller + Service + Test),把它保存为 best_practice_template.md

下次再有类似需求时,试试用下面这个Prompt开局:

“阅读 best_practice_template.md。这代表了我们团队的最高代码标准。
请模仿这个模板的 命名规范、日志格式、异常处理 和 测试覆盖率,
为 [新需求] 编写代码。”

你会发现,AI 突然变得“懂你”了。

结语:从 Coder 到 Commander

AI Coding 时代的到来,并没有让程序员失业,而是强迫我们升级。

以前,你的价值体现在 “你能多快写出快速排序”
现在,你的价值体现在 “你能否定义清楚问题,并提供足够的上下文,让系统为你工作”

记住这两条铁律:

  1. 瓶颈已转移:从“生成”转移到了“验证”。
  2. 上下文为王:AI水平的高低,完全取决于你提供上下文(Context)的质量。

不要试图战胜AI的速度,要学会驾驭它的方向。


参考资料

📊 行业数据与研究报告 (Why validation matters)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐