Java 程序员的 AI 进化论 | AI 写代码再快,这四样能力替代不了
上周组里来了个新人,看我用 AI 五分钟撸完一个 Controller,眼睛都直了,说"哥你这太快了吧,那我还学啥"。我当时没接话,因为这个问题我自己琢磨了大半年。
用 AI 写代码这一年多,我最大的感受是:写代码这件事确实变快了,但"会写代码"这个能力的权重在往下掉。真正拉开差距的,反而是 AI 干不好的那几样。今天就把我自己踩过的坑和想明白的事聊聊。
一、系统设计:AI 会写类,画不出边界
我让 AI 设计过一个"订单履约模块"。需求说得挺清楚——下单、支付、发货、收货四个状态流转。AI 给我的方案是这样的:
代码能跑,单测也能过。但我拿去做架构评审的时候被老张一句话问住了:"支付和库存扣减在一个事务里,物流系统挂了你回滚不?"
AI 没考虑这个。它不知道我们物流走的是第三方接口,超时率 3%,一旦物流超时,整个支付事务就卡死。这就是边界设计的问题——哪些该在一个事务里,哪些该拆成异步,哪些该做补偿,这些判断 AI 给不了。
| 设计任务 | AI 表现 | 人工必须把关的点 |
|---|---|---|
| 单个类的方法实现 | 好,快且准 | 命名规范、异常粒度 |
| 模块间职责划分 | 一般,容易堆砌 | 事务边界、耦合方向 |
| 跨服务调用编排 | 差,不懂你的基础设施 | 同步异步、补偿机制 |
| 长期演进路径 | 几乎给不了 | 扩展点预留、废弃策略 |
踩坑一:我图省事直接用了 AI 给的方案上线,结果物流接口超时把支付事务拖垮,当天下了 17 个异常单。后来拆成"支付同步 + 物流异步 + 补偿队列"才稳。这事让我明白,AI 能帮你把砖搬快,但房子怎么搭,图纸还得自己画。
二、业务理解:代码跑得通,跑的是什么业务它不知道
这块我感受最深。AI 写 CRUD 没问题,但你让它处理"细胞标本管理"这种垂直业务,它就抓瞎。
公司有个细胞标本生命周期系统,标本从入库到销毁有 11 个状态,其中"复核中"和"待复审"是两个完全不同的业务节点——前者是技术员初检,后者是主管抽检。AI 每次写状态机都把这俩搞混,因为它觉得语义差不多。
这种业务规则,文档里写了一页纸,AI 读了也抓不住重点。为什么?因为业务理解的难点不在"知道有这个规则",而在"知道这个规则为什么存在"。主管复审这一步,是因为合规要求——涉及人体标本的检测必须有双人复核。AI 不知道这个"为什么",所以它觉得可以省掉。
| 业务理解层次 | AI 能做到 | 人必须做的 |
|---|---|---|
| 读需求文档 | 能读,抓不住重点 | 提炼隐含约束 |
| 知道规则 | 能复述规则文字 | 理解规则背后的原因 |
| 判断边界场景 | 容易遗漏 | 补充反例和异常路径 |
| 跨模块业务关联 | 基本不懂 | 串通上下游影响 |
踩坑二:有一次我让 AI 写标本销毁的审批流,它把"销毁不可逆"这个关键约束当普通状态变更处理了,没有加二次确认和审计日志。测试环境没发现,差点带到生产。幸亏 code review 的时候我自己多看了一眼。从那以后,涉及业务核心流程的代码,AI 写完我一定逐行过一遍,尤其是状态流转和权限校验。
三、调试能力:AI 能写 bug,定位 bug 还得靠人
说个真事。上个月线上偶发空指针,一天出两三次,每次栈都不一样。我把异常堆栈丢给 AI,它给了 5 个可能原因:
| AI 给的原因 | 实际情况 |
|---|---|
| 返回值未判空 | 已判空,不是这个 |
| 集合元素为 null | 有防护,排除 |
| 并发修改 | 有锁,但…… |
| 反序列化失败 | 日志没报错,排除 |
| 代理对象问题 | 不涉及,排除 |
前 4 个都不是。真正的原因是第 6 个——AI 压根没列出来的那个:一个 @Async 方法拿到的 ThreadLocal 上下文是空的,导致下游取用户 ID 时返回 null,而 null 又被自动拆箱成了空指针。
AI 没想到这个,因为它不知道我们的 UserContext 是基于 ThreadLocal 的,也不知道 @Async 会换线程。这种 bug,你得对整个调用链有全局认知才能定位,不是看一段代码能看出来的。
后来我加了 TaskDecorator 把上下文透传到异步线程,问题才解决:
调试这事,AI 能帮你缩小范围,但拍板的还是你自己。你得知道系统怎么跑的、数据怎么流的、哪些组件有坑。这些知识不在代码里,在脑子里。
| Bug 类型 | AI 定位效果 | 关键依赖 |
|---|---|---|
| 语法/逻辑错误 | 好,基本秒定位 | 读代码即可 |
| 空指针/越界 | 一般,给一堆可能 | 需要你筛 |
| 并发/时序问题 | 差,不懂你的上下文 | 全链路认知 |
| 环境相关(配置/网络) | 几乎没用 | 运维经验 |
四、架构思维:AI 看眼前,人看三年
AI 写代码有个特点:它永远在解决你当前问的那个问题,不会替你想下一步。
我做过一个反面案例。智慧农村数据统计表,一开始数据量小,我让 AI 写查询,它直接全表扫描加 group by,能跑。半年后数据涨到 800 万行,查询从 200 毫秒飙到 12 秒。
回头看我当时的决策,问题在于:我只问了 AI"怎么查",没问"这么查以后会不会慢"。AI 不会主动提醒你加索引、做分区、考虑数据增长。这些是架构思维——你要预判系统半年后、一年后的样子。
后来我按 tx_date 做了 PostgreSQL 按月 RANGE 分区,查询回到 300 毫秒以内。这个方案 AI 给不了,因为它不知道你的数据增长曲线、不知道你用 PG 还是 MySQL、不知道你能不能停机迁移。
还有一类情况更隐蔽——技术债的取舍。有个老模块,AI 建议我"全部重写更干净"。听着挺有道理,但那模块跑了三年,有 14 个隐式依赖藏在注释都没写的地方。全推倒重来,光回归测试就得两周,上线风险不可控。我做的是局部抽接口、逐步替换,花了三周但零故障。AI 不会帮你算这笔账,它只看到代码烂,看不到重写的代价。
| 思维维度 | AI 的视角 | 架构师的视角 |
|---|---|---|
| 时间跨度 | 当前这个需求 | 未来 6-12 个月演进 |
| 决策依据 | 代码能不能跑 | 性能、成本、可维护性 |
| 权衡取舍 | 倾向"先实现" | 在速度和质量间找平衡 |
| 技术债 | 不主动提 | 主动评估并排期还 |
说白了,AI 是个执行效率极高的"战术兵",但"战略规划"这块,它还够不着边。
五、总结
用了一年多 AI,我给自己定了条规矩:让 AI 干执行的活,自己留决策的活。
具体怎么分,我整理成一张清单:
| 能力 | 该不该交给 AI | 建议 |
|---|---|---|
| 写 CRUD / 模板代码 | 该交 | 省时间,但 review 一遍 |
| 单个算法实现 | 该交 | 补上边界测试 |
| 模块边界设计 | 别全交 | AI 出初稿,自己定事务和耦合 |
| 业务规则实现 | 别交 | AI 不懂你的业务为什么这样 |
| Bug 定位 | 半交 | AI 缩小范围,你来拍板 |
| 架构和技术选型 | 别交 | 这是你的核心竞争力 |
有个事我想明白了:AI 不会淘汰程序员,但会用 AI 的程序员,会淘汰不会用的。而"会用"不是"用得快",是"知道什么该用、什么不该用、用了之后怎么兜底"。
这些判断力,靠的是系统设计、业务理解、调试经验、架构思维——四样 AI 短期内替代不了的东西。与其焦虑被 AI 取代,不如把这几样练扎实。代码写得快慢,那是工具的事;想得清楚不清楚,才是人的事。
夜雨聆风