互联网降薪潮下普通程序员收入持续缩水
互联网降薪潮下普通程序员收入持续缩水
凌晨 1 点,你还在工位上改一个退款接口。白天leader说“这个需求明天上”,你打开 Cursor,敲了一句:“帮我实现订单退款,要幂等,要事务。”它哗哗生成 80 行代码,看起来像模像样。你粘进去,编译报错,字段对不上,Mapper 方法不存在,事务注解还加错了位置。你又花了两个小时回滚、重写、补测试。
第二天复盘,需求没提前,bug 多了一个。工资没涨,绩效还悬。
降薪潮下,普通程序员最怕的不是活多,是活多还返工。AI 编程工具本应帮你省时间,但很多人用成了“返工加速器”。我见过两类典型误区:
误区一:把 Cursor 当许愿池。 一句“帮我写个功能”就等它吐完整代码,不给上下文、不给约束、不给验收标准。它只能猜,猜错你就跟着错。
误区二:把 Cursor 当编译器。 生成什么就粘什么,不跑测试、不看 diff、不查依赖版本。等上线炸了,才发现它写的 API 在你们项目里根本不存在。
下面这些实战技巧和避坑点,都是我踩过坑之后留下来的。你不需要全盘照搬,但至少能少熬几个凌晨。
一、高效实战技巧:把 Cursor 从“许愿池”变成“结对程序员”
1. 先喂上下文,再让它动手
操作步骤:
- 在 Cursor 里用
@Files或@Codebase指定相关文件,别让它全库乱翻。 - 把接口定义、DDL、错误日志、现有调用链一起贴进去。
- 要求它先输出修改计划,再改代码。
- 计划里必须写清楚:改哪些文件、为什么改、风险点在哪。
真实项目案例:
我之前做一个退款接口,需求是“同一笔订单重复退款只成功一次”。如果直接让 AI 写,它会给你一段 if (order.getStatus() == REFUNDED) 就完事。但真实项目里,退款状态和退款流水是两张表,并发下还会插重。
我这样喂:
“只读以下文件:
OrderRefundService.java、RefundMapper.xml、RefundDTO.java、order_refund表 DDL。目标:实现退款幂等。约束:不能改表结构;只能用现有 Mapper;并发下同一订单重复请求返回已退款。先给出修改计划,不要写代码。”
它先列了计划:加 Redis 分布式锁、查退款流水、状态机判断、插入退款记录。我挑了“查退款流水 + 唯一索引兜底”的方案,让它只改 OrderRefundService 和 RefundMapper。一次编译通过,单测补了 3 个分支。
【金句:AI 不缺代码能力,缺的是你项目里的上下文;你不喂,它就瞎编。】
2. 用验收标准和失败样例驱动
操作步骤:
- 把“优化一下”换成“输入 X,返回 Y,异常 Z 抛 BizException”。
- 给一条期望输出样例,再给一条失败样例。
- 让它先写单测,再写实现。
- 单测必须覆盖空值、边界、重复调用。
真实项目案例:
一个分页查询慢,SQL 在测试环境跑 2.3 秒。我让 Cursor 看 EXPLAIN 结果,它第一反应是加索引。我拦住它,要求先输出:“现有索引、命中情况、建议索引、预期扫描行数、回滚方案。”
它发现 status + create_time 的联合索引顺序反了,建议调整。我让它先写一个对比测试,分别在旧索引和新索引下跑 1000 次查询,记录平均耗时。最后索引调整后降到 180ms。没有直接改生产表,先在预发演练。
【金句:别让 AI 直接改代码,先让它写清楚“怎么证明改对了”。】
3. 小步改、看 diff、立刻跑测试
操作步骤:
- 每次只让它改一个方法或一个文件。
- 要求返回 patch,不要直接 apply。
- 你逐行看 diff,重点看事务、循环、空值、并发。
- 跑单测 + 本地集成测试,通过后再提交。
- 用新分支,保留回滚点。
真实项目案例:
重构用户余额扣减时,AI 一开始把 @Transactional 加在 Controller 上,还顺手改了三个 DTO。我直接拒绝,要求:“只改 BalanceService.deduct(),事务加在 Service 方法,异常必须回滚,只输出 diff。”
它第二次只改了 12 行。我看 diff 发现它把 BigDecimal 比较用了 equals,实际应该用 compareTo。如果直接粘,金额精度问题会在上线后变成客诉。
【金句:AI 生成的代码不是资产,经过你 review 和测试的 diff 才是。
二、高频避坑要点:这 5 个坑,踩一次返工半天
1. 幻觉 API 和包版本
现象: AI 生成不存在的注解、方法、依赖版本,比如 @CacheEvict 参数写错,或者引入你们没有的 Hutool 工具类。
危害: 编译失败,或者本地能跑、线上缺包。
规避方案: 把 pom.xml 或 build.gradle 贴给它,要求“只使用项目已有依赖”。让它先列出可用类,再写代码。版本不确定就写“请用 Java 8 和 Spring Boot 2.7 语法”。
2. 全局替换,改坏原有工程
现象: 你让它“优化订单逻辑”,它把其他模块的 Order 类也改了,或者重命名了公共方法。
危害: 编译大面积报错,代码 review 变成灾难。
规避方案: 明确“只允许修改指定文件”。要求输出 diff,不要直接 apply。禁止全局搜索替换。改完先跑 git diff --stat,超过预期文件数就回滚。
3. 忽略事务、并发和幂等
现象: AI 写出“查库存、扣库存、


