我把同一个需求分别交给初级程序员、高级程序员和AI,结果让我沉默了
上个月我们有个新功能要做实现一个订单退款接口。需求不复杂但涉及金额变更、库存回滚、状态流转刚好是个能拉开差距的典型场景。当时团队有点忙我临时把这个需求分别交给了三个人小王工作1年半的初级开发老陈工作6年的高级开发Cursor我给它写了一个详细的Prompt三份代码我都仔细看过了。看完之后我沉默了很久。第一个小王工作1年半我把需求文档发给他他没有追问当天下午就说做完了测试通过了。速度确实快。打开代码一看PostMapping(/refund) Transactional public ResultBoolean refund(RequestBody RefundRequest request) { Order order orderMapper.selectById(request.getOrderId()); if (order null) { throw new BusinessException(订单不存在); } if (order.getStatus() ! OrderStatus.PAID) { throw new BusinessException(订单状态不支持退款); } // 退款金额写回 order.setStatus(OrderStatus.REFUNDED); order.setRefundAmount(request.getRefundAmount()); orderMapper.updateById(order); // 调用支付退款接口 payService.refund(order.getPaymentNo(), request.getRefundAmount()); // 库存回滚 inventoryService.rollback(order.getProductId(), order.getQuantity()); return Result.success(true); }功能逻辑是对的基本流程都有单元测试也过了。但我看了两分钟发现了几个问题问题1没有幂等控制。如果这个接口被重复调用两次网络超时重试是很常见的订单会被退款两次库存回滚两次。这是生产事故级别的bug。问题2退款金额没有校验上限。request.getRefundAmount()没有和订单实际支付金额做比对理论上可以传一个比实际支付金额更大的数字。问题3payService.refund失败后没有补偿机制。调用第三方支付退款失败了怎么办状态已经改了但钱没退出去这个烂摊子谁来收拾我去找小王聊。他说我以为测试通过了就行。这就是问题所在。他交付的是一个能跑的功能不是一个可以上生产的方案。他想到了正常流程但没有想过任何一个异常流程。第二个老陈工作6年老陈拿到需求之后没有立刻动手。他先发了一条消息给我问了3个问题退款是全额退款还是支持部分退款退款金额打回原路还是可以退到其他账户退款后库存需要实时回滚还是等退款成功回调之后再回滚我当时看到这3个问题愣了一下。这3个问题需求文档里都没写清楚。我去问了产品产品想了半天说支持部分退款退回原路库存等退款成功回调之后再回滚。这3个答案直接影响了整个接口的设计。如果不提前搞清楚后面改起来成本极高。老陈花了半天设计画了一个退款状态机PAID → REFUNDING → REFUNDED退款成功 → REFUND_FAILED退款失败然后核心实现加了分布式锁防并发加了幂等Key防重复提交支付回调之后再触发库存回滚PostMapping(/refund) Transactional public ResultBoolean refund(RequestBody RefundRequest request) { // 幂等校验 String idempotentKey refund: request.getOrderId() : request.getRefundNo(); if (!redisLock.tryLock(idempotentKey, 10, TimeUnit.SECONDS)) { throw new BusinessException(请勿重复提交退款申请); } try { Order order orderMapper.selectById(request.getOrderId()); // 金额校验退款金额不能超过实际支付金额 if (request.getRefundAmount().compareTo(order.getPayAmount()) 0) { throw new BusinessException(退款金额不能超过支付金额); } // 更新状态为退款中 order.setStatus(OrderStatus.REFUNDING); orderMapper.updateById(order); // 调用支付退款异步等待回调 payService.refund(order.getPaymentNo(), request.getRefundAmount(), request.getRefundNo()); return Result.success(true); } finally { redisLock.unlock(idempotentKey); } }代码质量明显比小王高了一个档次。但我也发现了一个问题他额外设计了一套退款规则引擎支持按商品类型配置不同的退款策略。我问他这个规则引擎现在用得上吗他说现在用不上但以后可能会扩展。我沉默了一下。这个功能我们至少6个月内不会用到。提前设计意味着提前写代码、提前测试、提前维护。这不是严谨这是过度设计。他交付的是一个高质量的方案但在某些地方超出了当前的实际需要。第三个CursorAI我给Cursor写了一个比较详细的Prompt实现一个订单退款接口要求 1. 支持部分退款退款金额不能超过支付金额 2. 加分布式锁防并发加幂等Key防重复提交 3. 退款成功后的库存回滚由支付回调触发本接口只负责发起退款 4. 退款状态REFUNDING → REFUNDED / REFUND_FAILED 5. 技术栈Spring Boot 3, MyBatis-Plus, Redis 6. 异常用BusinessException返回值用ResultT5分钟后Cursor生成了一份代码大约200行。代码结构清晰异常处理很全面甚至考虑了我没有提到的一些边界情况比如订单不存在、订单已经在退款中等等。但我发现了一个问题。它生成的幂等Key是这样的String idempotentKey refund: request.getOrderId();只用了订单ID。这意味着同一个订单如果第一次退款50元失败了第二次想重新发起退款请求会被直接拦截——因为幂等Key一样。正确的做法是用订单ID 退款单号作为幂等Key每次退款请求都有独立的退款单号互不影响。这不是一个语法错误测试也不会暴露它。这是一个业务逻辑错误只有理解了退款业务流程的人才能发现它。除此之外AI还有一个地方明显不足它不知道我们公司有一条内部规定——VIP用户的退款走单独的优先通道需要先判断用户等级。这条规则在任何文档里都没有只存在于老员工的脑子里。AI不知道所以它没有处理。它交付的是一段逻辑正确、结构清晰的代码但不是一个理解了我们业务的方案。我为什么沉默了看完三份代码我坐在那里想了很久。我沉默不是因为AI赢了。也不是因为高级程序员赢了。我沉默是因为我意识到一件事小王能做的事AI已经做得更快、更全面了。小王花了半天写的代码Cursor用了5分钟而且覆盖了更多边界情况。如果小王继续只是接需求、写代码、测试通过就交差他的竞争对手已经不是其他初级程序员了而是每个人手里的AI工具。但老陈的价值也不在于他写的那200行代码。他的价值在于那3个追问。这3个问题AI问不出来因为AI不知道哪些地方需要追问。这3个问题小王也没想到因为他的经验还不够。只有老陈在拿到需求的第一时间就知道这里有3个坑需要先搞清楚再动手。这才是高级程序员真正值钱的地方。不是他写代码的速度不是他记住了多少API而是他理解业务的深度以及由此产生的判断力——知道哪里有坑知道哪里要追问知道哪里可以简化知道哪里不能省。这个判断力是AI替代不了的。3点真实的建议做完这个对比我想说3件具体的事。第一如果你是初级程序员现在最重要的一件事是养成追问需求的习惯。拿到需求先别动手写代码。先问自己这里有没有没写清楚的地方有没有异常情况没有覆盖有没有将来可能变化的部分这个习惯是从初级到高级最关键的跨越。代码写得快不快不是差距所在。第二用AI提升执行效率但把省出来的时间投入到理解业务上而不是摸鱼。AI帮你把写代码的时间从半天压缩到1小时这1小时不是用来早点下班的是用来去跟产品聊、去理解这个功能背后的业务逻辑、去想那些代码之外的问题。第三学会review AI的代码重点找那20%它不懂的地方。AI的代码功能逻辑通常是对的结构通常是清晰的。但它不知道你们公司的内部规定不知道你们业务的特殊场景不知道这个幂等Key的设计是否符合你们的退款流程。这20%就是你的价值所在。最后说一句让我印象最深的话。事后我问老陈你怎么看AI写的代码他看了一眼说代码写得不错。但它不知道我们昨天刚开完会决定把VIP退款改成异步处理。我笑了。AI让写代码变容易了但让成为一个好程序员变得更难了。因为你再也没有借口说我没时间思考了。你们团队有没有类似的经历欢迎评论区聊聊。后端AI实验室不讲概念只谈实战 代码开源每周更新

相关新闻

说说对象分配规则

说说对象分配规则

面试 1、新对象优先分配到Eden区,如果Eden区空间不足,虚拟机进行一次MinorGC。 2、大对象直接进入老年代,其他对象进入Survivor区,并放置一个年龄计数器,每经过一次minorGC,年龄计数器增加1,达到…

2026/7/3 11:45:57 阅读更多 →
如何快速搭建自己的知识付费平台?

如何快速搭建自己的知识付费平台?

温馨提示:文末有资源获取方式 在知识付费领域,品牌辨识度是建立用户信任的关键一环。如果你的知识店铺界面和成千上万家同行长得大同小异,用户很难对你产生深刻的品牌印象。然而,对于大多数内容创作者而言,聘请专业UI设…

2026/7/3 13:17:17 阅读更多 →
跨网文件安全交换系统哪个好?网闸与专业系统比一比便知答案

跨网文件安全交换系统哪个好?网闸与专业系统比一比便知答案

在数字化办公与跨网协作成为企业常态的当下,跨网文件安全交换的需求持续激增,而跨网文件安全交换系统哪个好也成为企业选型的核心问题。网闸作为传统跨网传输设备曾被广泛应用,Ftrans Ferry跨网文件安全交换系统则是专业跨网传输系统的代表&a…

2026/7/4 16:58:52 阅读更多 →

最新新闻

从3D雕塑到方块宇宙:ObjToSchematic如何重塑数字创意的边界

从3D雕塑到方块宇宙:ObjToSchematic如何重塑数字创意的边界

从3D雕塑到方块宇宙:ObjToSchematic如何重塑数字创意的边界 【免费下载链接】ObjToSchematic A tool to convert 3D models into Minecraft formats such as .schematic, .litematic, .schem and .nbt 项目地址: https://gitcode.com/gh_mirrors/ob/ObjToSchemati…

2026/7/6 11:34:03 阅读更多 →
锂离子电池过压保护与STM32L031C6系统设计

锂离子电池过压保护与STM32L031C6系统设计

1. 锂离子电池过压保护的必要性与BQ29200特性解析 两节串联锂离子电池组在充电过程中,由于电芯个体差异、充电器故障或均衡电路失效等原因,可能出现单节电池电压超过安全阈值的情况。当电压超过4.35V时,电解液会开始分解产生气体,…

2026/7/6 11:34:03 阅读更多 →
HS工具箱深度评测:一站式在线工具平台如何提升开发与办公效率

HS工具箱深度评测:一站式在线工具平台如何提升开发与办公效率

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 你是不是也遇到过这样的场景:开发时突然需要把图片转成Base64编码,临时去搜在线工具,结果要么广告…

2026/7/6 11:29:59 阅读更多 →
数字图像处理 2.6 节:图像采样量化实战,Python 实现 8-bit 灰度图转换与伪轮廓分析

数字图像处理 2.6 节:图像采样量化实战,Python 实现 8-bit 灰度图转换与伪轮廓分析

数字图像处理实战:Python实现8-bit灰度图转换与伪轮廓分析当一张风景照片在显示器上呈现出明显的阶梯状色块时,我们看到的正是数字图像处理中典型的"伪轮廓"现象。这种现象源于图像量化过程中的信息损失,而理解其背后的原理对于从事…

2026/7/6 11:27:57 阅读更多 →
STM32L152RE与TPAFE0808构建多通道信号采集系统

STM32L152RE与TPAFE0808构建多通道信号采集系统

1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是常见需求。TPAFE0808作为8通道模拟前端芯片,配合STM32L152RE低功耗MCU,能够构建高效的多通道信号控制系统。这种组合特别适合需要同时监测多个传感器…

2026/7/6 11:25:53 阅读更多 →
4万星和5.7万星的两个框架,我焊在一起后它们封神了

4万星和5.7万星的两个框架,我焊在一起后它们封神了

第一个,AI 在「要构建什么」还没想清楚的时候就开始写代码。你跟它讨论需求,聊了三轮,它突然来一句「我来帮你实现吧」,然后一顿输出,写完一看,方向跑偏了。代码能跑,但不是你想要的。删了重来&…

2026/7/6 11:25:53 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻