最近这一年,我面了不少候选人,也跟圈里很多技术总监喝过茶。大家聊到一个话题时,态度出奇地两极分化:

一部分人兴奋得像打了鸡血,觉得用了 Cursor、Devin 或者各种套壳 Agent,以后一个人就能顶一个研发团队,程序员马上要大面积失业了;另一部分人则嗤之以鼻,觉得这玩意儿写个“贪吃蛇”或者“Todo List”还行,一碰到真实的业务逻辑、复杂的表关联,立马变成“人工智障”,最后还得人类去给它擦屁股。

说实话,这两种人都没摸到 AI Agent 的门道。

作为在一线带过团队、也亲自用 AI 重构过几十万行老项目的“包工头”,我想掏心掏肺地说一句:AI Agent 绝对能开发出像样的、甚至生产级别的项目,但前提是你得把自己的角色从“写代码的”变成“Tech Lead(技术主管)”。

如果你还抱着“我输入一句 Prompt,它给我吐出一个完整项目”的甩手掌柜心态,趁早洗洗睡吧。下面这些血泪经验,是我用无数个深夜 debug 和飙升的血压换来的。


一、 最大的错觉:把 AI 当“全栈架构师”

很多人用 AI 写项目,上来就是:“帮我写一个类似小红书的电商系统,要有用户、商品、购物车、支付,用 Spring Boot + Vue3。”

结果呢?AI 会给你生成一个看似完美的目录结构,写几个 Controller,然后你在本地一跑,发现数据库连不上、跨域报错、依赖冲突,稍微改一个 Bug,它又把另外三个文件给改崩了。最后你看着那堆“屎山”,骂了一句“垃圾”,然后默默切回了自己手敲。

记住第一条铁律:AI 没有全局观,它的“脑容量”(上下文窗口)是极其有限的。

当你把一个庞大的系统扔给它时,它根本记不住 A 模块的修改会不会影响 B 模块。它只会根据概率去“猜”下一步该写什么。

正确的姿势是:你来做架构师,让它做“高级外包”。

在动手写第一行代码前,你必须自己(或者借助 AI 的头脑风暴能力,但最终由你拍板)把项目拆解成极其明确的模块和接口。你要在脑子里(或者在文档里)定义好:

  1. 数据库表结构是什么样的?
  2. 模块之间的边界在哪里?
  3. 核心接口的入参和出参是什么?

把这些“契约”定死,然后每次只让 AI 专注完成一个极小颗粒度的任务。比如:“根据这个 User 表结构,帮我生成 MyBatis-Plus 的 Entity 和 Mapper,并加上 Swagger 注解。”

颗粒度越细,AI 的产出质量越高。 让它写一个完整的“登录功能”,它会给你瞎编;让它写“校验密码并生成 JWT Token 的工具类”,它能写得比你还漂亮。


二、 喂饭的艺术:Context(上下文)就是王道

AI 写出“弱智代码”的 90% 的原因,是因为你给的信息不够。它不知道你们团队的代码规范,不知道项目里用了哪些自定义的异常类,不知道你数据库的字段命名习惯是驼峰还是下划线。

不要指望 AI 会“读心术”,你必须建立一套“喂饭”机制。

1. 制定“宪法”(Rules / System Prompt)

如果你用的是 Cursor,一定要用好 .cursorrules 文件;如果是其他 Agent,一定要配好 System Prompt。
在这个文件里,不要写废话,直接写硬性约束。比如我的项目里是这么写的:

- 你是资深 Java 后端专家。
- 所有的 Controller 返回值必须使用全局统一的 Result<T> 包装类。
- 严禁在 Controller 层写业务逻辑,必须下沉到 Service 层。
- 数据库时间字段统一使用 LocalDateTime,不要用 Date。
- 遇到未知异常,统一抛出 BizException,并传入对应的 ErrorCode 枚举。
- 不要使用 System.out.println,必须使用 @Slf4j 的 log.info/error。

有了这个“宪法”,AI 生成的代码瞬间就有了“人味儿”,而且直接符合团队的 Code Review 标准。

2. 提供“优秀范文”(Few-Shot Prompting)

AI 是极其优秀的“模仿者”。当你让它写一个新的 Service 时,不要只给需求,要把你之前写过的、最满意的一个 Service 代码贴给它看。

“请参考 OrderServiceImpl.java 的代码风格和事务控制方式,帮我编写 PaymentServiceImpl.java。”

这一招,能让 AI 的产出质量产生质的飞跃。


三、 护栏机制:别让 AI “自由发挥”

AI 有个致命的毛病:幻觉(Hallucination)。当它遇到不会写的逻辑,或者找不到某个第三方库的方法时,它不会说“我不会”,它会面不改色地给你编一个不存在的方法名,甚至自己造一个 API。

如果你不盯着,项目一跑起来就是满屏的 NoSuchMethodError。

怎么防?必须给 AI 加上工程化的护栏。

1. 测试驱动(TDD)的变种

让 AI 写业务代码前,先让它写单元测试;或者你自己写好单元测试,让 AI 去实现代码直到测试通过。

“这是 UserServiceTest.java,里面有 5 个测试用例。请实现 UserService 中的方法,确保所有测试通过。如果测试失败,请分析原因并修改代码。”

当 AI 有了“测试用例”这个裁判,它的自我纠错能力会强得可怕。

2. 强制 Lint 和静态检查

在 Agent 的工作流里,一定要接入 ESLint、SonarQube 或者阿里的 P3C 插件。告诉 AI:“每次写完代码,必须运行 npm run lint(或相应的检查命令),如果有报错,请自行修复,直到没有 Error 为止。”

把这种机械的、折磨人的“修格式”工作全甩给 AI,你会感觉极其舒适。

3. 锁死依赖版本

AI 训练数据是有截止时间的,它经常会给你引入一些已经废弃的库,或者使用旧版本的 API。

在 Prompt 里明确告诉它当前项目的依赖版本:“当前项目使用的是 Spring Boot 3.2 和 JDK 21,请不要使用 Spring Boot 2.x 的废弃 API,不要引入 javax 包,统一使用 jakarta。”


四、 人类的价值:做“清道夫”和“抽象者”

用了 AI 之后,很多人会产生一种惰性:只要代码能跑,就不去深究它是怎么实现的。

这是极其危险的。AI 写的代码,往往是“面向当前需求”的直线逻辑,缺乏抽象和复用。它可能会在三个不同的 Service 里,写三段几乎一模一样的复杂 Stream 过滤逻辑。

这时候,就是你这个 Tech Lead 出场的时候了。

AI 负责“铺砖”,你负责“勾缝”和“承重墙设计”。
每隔一段时间(比如完成了一个大模块后),你要停下来,做这几件事:

  1. Code Review:逐行看 AI 写的核心逻辑,检查有没有并发问题、有没有内存泄漏的隐患、SQL 有没有走索引。
  2. 提取公共组件:把 AI 写重复的代码,抽象成 Utils 工具类、自定义注解或者 AOP 切面。
  3. 重构目录结构:随着功能增加,AI 可能会把文件放错位置,你需要手动去调整包结构,保持架构的整洁。

AI 决定了你开发的下限(不会写出语法错误、能跑通的代码),但你对业务的理解和架构能力,决定了项目的上限。


五、 心态转变:从“键盘侠”到“指挥官”

最后,聊聊心态。

很多老程序员一开始用 AI,会有一种“失落感”或者“较劲感”。看到 AI 写出了一段自己没想到的巧妙算法,会觉得“卧槽它比我牛逼”;看到 AI 犯了一个极其低级的错误,又会觉得“这人工智障还不如我”。

其实大可不必。

你要把 AI Agent 当成一个精力无限、不知疲倦、但缺乏社会经验和业务常识的“超级实习生”。

未来的软件开发,“写代码”这个动作本身的权重会越来越低,而“定义问题”、“拆解任务”、“审查代码”和“系统架构”的能力将成为核心壁垒。

别再对着 AI 许愿了。拿起你的架构刀,把项目切碎,把规矩立好,然后像个真正的 Tech Lead 一样,指挥你的 AI 大军去冲锋陷阵吧。

当你看着终端里一行行自动跑通的测试用例,和 CI/CD 管道里亮起的绿灯时,你会发现:

AI 没有淘汰程序员,它只是淘汰了那些只会机械敲键盘的“代码纺织工”,并奖赏了那些真正懂软件工程的“架构师”。

转载请注明出处