ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI写代码之后,软件工程的瓶颈转移到了哪里

AI写代码之后,软件工程的瓶颈转移到了哪里 这两年,只要打开技术社区,满屏都是AI写代码的消息。我自己所在的团队,从去年开始就把Copilot、Claude Code、Cursor这类工具真正用进了日常开发流程,而不是停留在“装个插件玩玩”的阶段。说实话,变化是颠覆性的——以前一个CRUD接口从建表到联调,怎么也得小半天,现在跟AI把表结构一描述,几分钟就能生成一版能跑的代码,连单元测试都顺手给你补上。但用得越深,我越发现一个反常识的现象:代码的“产量”问题解决之后,软件开发的瓶颈,根本不在“写”这件事上了。这个标题是我最近和几个做架构师的老朋友反复聊出来的话题。我们的共识是:AI让“实现”变得极其廉价之后,整个软件工程的重心正在发生一次剧烈的迁移。过去我们花80%的精力在“怎么写代码”,现在这个比例被AI大幅压缩,而需求定义、系统设计、逻辑验证、代码审查、技术债务管理这些“看不见的环节”,变成了新的卡脖子点。这篇文章,我就想结合我自己团队这一年的实操经历,把“AI写代码之后,瓶颈到底变成了什么”这件事拆开聊透,希望能给正在被代码量裹挟的同学一些参考。1. AI写代码的真实能力边界:它到底替你解决了什么在聊瓶颈之前,得先认清一个事实:AI写代码这件事,已经不是一个“能不能用”的问题,而是“怎么用才不翻车”的问题。我也见过不少团队,AD钙奶式地把AI生成代码直接怼进生产环境,结果线上事故频发,又跑回来唱衰AI。这里面最核心的误解,是把AI当成了一个“全知全能的程序员”,而实际上,它更像一个“极其熟练但不太懂业务的实习生”——手速快、知识面广、模仿能力强,但你要是没把需求和边界条件交代清楚,它能一本正经地给你写出一个能在测试环境跑通、却完全不符合业务语义的功能。1.1 三类主流AI编程工具,各自擅长什么我先把团队里实测下来比较好用的几类工具归个类,大家可以根据自己的场景对号入座。工具类型典型代表核心优势明显短板行级/函数级补全GitHub Copilot、通义灵码在已写好的上下文里补全样板代码、单测、正则,速度快,基本不打断心流只能基于当前文件和打开的文件做推测,缺乏全局视野,生成的长代码往往上下文对不上会话式AI编程Cursor、Trae、Codex能跟你多轮对话,一边改代码一边解释,适合局部重构、跨文件小改动对大型代码库的结构理解有限,容易“改了这个忘了那个”,需要人工反复校验Agent型自主编程Claude Code、Devin、OpenHands能自己规划任务、读写多个文件、执行命令、跑测试,真正做到“给个需求,还你个PR”消耗大、速度偏慢,在复杂的、隐性知识密集的企业级代码库里,容易陷入“表面看起来都做完了,实际业务逻辑跑不通”的窘境我自己的体感是,这三类工具的定位完全不同。Copilot类的价值在于“把光标处的那个函数立刻填完”,像是给你配了个手速极快的打字员,适合把脑中的想法快速落到键盘上;Cursor类的价值在于“帮你在已有代码里安全地做手术”,适合重构、修Bug、调整逻辑;而Claude Code这类Agent的价值,在于它能替你把“查代码→写代码→跑测试→改代码”这个循环跑起来,让你把精力从“逐行写”抽离到“设计任务和验收结果”上。1.2 我用AI写代码的真实效率数据说个我们团队内部的真实数据。上个月我们做一个内部数据中台项目,里面有一块涉及三十多张表的报表聚合逻辑。放在以前,我手下的一个三年经验的后端,光是把这些表的关联关系梳理清楚、写出能跑的SQL和对应的Java代码,保守估计要两天。这次我们用Claude Code,先让它读数据库Schema文档,再把聚合逻辑的伪代码描述进去,它用了大概一个下午就把初版代码全部生成完了,包括MyBatis的Mapper、Service层逻辑和几个关键的性能优化点。听起来很爽对不对?但真正的“坑”在人机协作的校验环节。AI生成的代码表面上看结构完整、命名规范、注释齐全,可一旦嵌入真实业务上下文——比如“汇率精度统一保留多少位”“状态流转到什么节点才允许作废”“历史数据的幂等键到底用哪几个字段拼接”——这些隐含的业务知识,它一概不知。我们在Code Review阶段,至少花了比AI生成代码多一倍的时间去核对它的逻辑,甚至在一处涉及资金计算的地方,发现它把“分段计费”的边界条件写错了,导致费率阶梯越高,总费用反而越低。这种业务语义层面的错误,靠单元测试测不出来,只有真正懂业务的人做深度的逻辑走查才能拦得住。所以,认清边界这件事极其重要。AI解决的是“从伪代码到实现代码”的翻译效率,而不是“从业务诉求到系统设计”的思考效率。后者,恰恰是我认为瓶颈正在迁移的方向。2. 瓶颈迁移第一站:从“写不出来”到“说不清楚”过去我们常说,软件开发的瓶颈是“程序员不够用”“写代码太慢”。这个瓶颈真实存在了几十年,也是各种敏捷开发、低代码平台试图解决的问题。但AI出现之后,“实现”这件事的门槛被暴力拉低了——现在一个刚培训三个月的人,配合AI也能把增删改查的接口堆出来。于是,新的瓶颈几乎毫不意外地转移到了“说清楚”这件事上:需求描述不清楚,AI就给你生成一个货不对板的东西;设计边界不明确,AI就给你写出一堆看似正常实则反直觉的逻辑。2.1 “需求澄清”正在取代“编码”成为最大的人力黑洞我举个特别真实的例子。上周一个产品经理来找我,开口就是“老张,帮我加一个会员积分转赠功能,很简单,就是A用户可以把积分转给B用户”。这个需求听起来多简单?但如果真把这个需求直接丢给AI,它大概率会给你生成一个:查A的积分余额,校验转赠数量,扣A的积分,加B的积分,完事。这串代码跑起来,单元测试也过了,可一旦上线,全是坑。真正的业务设计里,你必须搞清楚:积分转赠的最小单位是多少?转赠是否要扣手续费?转赠后积分有效期是按原来的算,还是重新计算?A转赠给B的积分,如果A后悔了能不能撤回?转赠行为是否需要风控校验,比如短时间内频繁转赠到同一个账号,要不要触发限制?B如果账号被封,积分还能不能转进来?这些还只是一小部分。过去,这些“说不清”的地方,会在开发过程中被一遍遍拿出来反复确认、打回重做,虽然也痛,但至少是发生在人和人之间,你写一行代码,对方能即时纠正你的方向。而跟AI协作的时候,它的理解能力其实很强,你稍微说一句“加上风控”,它就能帮你写一段非常像样的风控代码。问题是,如果你根本没想到要说“风控”这件事,AI是绝对不会主动替你想的。于是,“需求不明确”这个老问题,以前只是导致返工,现在直接导致“生成一堆完美的错误代码”——你甚至会在Code Review的时候被它的代码量唬住,觉得“它都写了这么多了,应该没问题吧”。所以我现在带团队,反复强调的第一件事,就是“把需求说清楚,比把代码写出来更重要”。我们为此把需求文档的验收标准提到了前所未有的高度。以前需求文档里写“用户可查看订单列表”,现在必须写“用户可按订单状态、时间范围筛选订单,列表支持分页,默认按下单时间倒序,已取消的订单不能申请售后,列表接口响应时间超过2秒时必须做缓存”。这些边界条件,才是AI生成代码时真正需要“吃进去”的输入。2.2 编写“AI可理解的需求”成了新基本功这也带出了一个新技能:给AI写“提示词”已经不是梗,而是实打实的工程能力。我在团队里做过一次分享,把“面向AI的需求描述”拆成了三个层次,大家可以直接套用。第一层,明确输入输出。告诉AI你要处理什么数据、最终要产出什么结果。比如“从orders表读取昨天所有已完成状态的订单,统计每个门店的GMV,按门店编号分组,输出成CSV格式”。这个层次最简单,AI几乎不会犯错。第二层,明确约束条件。这是最容易漏掉的部分,也是AI生成代码质量的分水岭。你要把所有“正确性”相关的边界全部说死:金额精度、时区换算、空值处理、并发控制、幂等方案、权限校验、状态机流转。我跟团队说,写需求时你就想象自己是在给一个执行力极强、但毫无常识的外星人下指令,它真的会一字不差地执行,但也真的不会补充任何你没说到的常识。第三层,明确验收方式。AI生成完代码,你怎么知道它做对了?这里我给的建议是,在需求描述里就带上场景用例。“比如当订单金额为0.01元时,不参与满减;当同一用户一小时内下单超过5次,需要触发人工审核”。把这些场景直接喂给AI,它的输出会比虚无缥缈的“实现订单逻辑”精准一个数量级。说实话,这三层能力,以前很少被当作“开发核心能力”来培养。程序员们习惯了“需求给我,我边写边问”的模糊迭代模式。但在AI主导生成代码的语境下,模糊意味着失控——你连改都不知道从哪改起。这不是什么高深的技术,这是新工作方式下必备的沟通基本功,但绝大多数团队还没意识到它的重要性。3. 瓶颈迁移第二站:验证和审查,正在成为最贵的环节AI把“写代码”从几天压缩到几小时之后,时间并没有凭空消失,它几乎原封不动地转移到了“验证代码”和“审查代码”上。以前你写代码,写的过程本身就带着对逻辑的熟悉感,你清楚每一个分支为什么这么写;现在看AI写的代码,就像看一个陌生人的代码,你不仅要对它的正确性负责,还得摸清它几十代变异之后的脾气。3.1 代码审查的重心,从“查风格”转向“查语义”以前代码审查查什么?命名规不规范、函数拆得细不细、有没有明显的线程安全问题、SQL有没有漏索引。这些东西在AI生成的代码里,反而变得非常规范——它比你更懂代码风格规范,甚至能主动给你加上Javadoc注释。但代价是,代码的“语义正确性”风险显著上升。我举个例子,我们团队有一次用AI生成一个订单超时自动取消的定时任务。AI的逻辑写得非常完整:扫描超时订单,更新状态为已取消,记录操作日志,还加了事务控制和异常重试。单看代码,几乎找不出毛病。但Review的时候我追问了一个问题:“这个定时任务和用户前端手动取消订单,是有可能并发操作的,你加锁了吗?”AI当然没加。两个事务同时执行,用户前端取消的同时定时任务也在取消,虽然最终状态都是“已取消”,看起来结果一致,但操作的日志顺序、状态变更的版本号可能全是乱的。这种并发的语义问题,静态代码根本看不出来,只有对业务场景有全局认知的人,才能提出“这个操作可能和哪个地方并发”的质疑。所以,我现在对团队Review的要求已经变了。我不让大家一句一句去读AI生成的代码,而是要求Reviewer先理解“这段代码的真实业务意图”,然后再反向推导“AI的理解是否和需求一致、是否漏掉了并发、幂等、异常补偿等横向关注点”。这实际上是把Review的起点,从代码层面抬高到了业务抽象层面,对Reviewer的全局视野要求更高了。以前,一个刚毕业一年的同学,靠查代码规范和跑单测也能参与Review;现在,如果他不懂业务上下文,面对AI生成的一坨“看起来都对”的代码,几乎是无从下口的。3.2 测试策略的重新洗牌:单元测试易写,端到端难过另一个被AI深刻影响的环节是测试。AI最擅长的事情,就是根据已有代码写配套的单元测试,覆盖率还拉得挺高。但如果你以为“AI写代码AI写测试”就等于质量有保障,那就大错特错了。因为AI生成的单元测试,往往是基于它对代码行为的理解,而不是基于对需求契约的理解。说白了,它测试的是“代码当前做了什么”,而不是“代码应该做什么”。我特别提醒团队一个隐蔽的陷阱:AI在重构代码时,如果没改对,它补的测试也大概率会跟着一起错。比如,原逻辑是“订单金额超过100元打九折”,AI重构时给你改成了“订单金额超过100元打八折”,顺手把原有断言里的期望值从90改成了80。这时候,测试全绿,但业务方傻眼了。这种“测试和实现一起跑偏”的情况,在纯人工协作里也有,但在AI高速生成代码的节奏下,出现得极其隐蔽,而且频率更高。所以我们的实践是,把宝贵的测试精力从“AI已经能覆盖的单元测试”中抽出来,集中投放到端到端测试和基于业务场景的契约测试上。我们需要的是从真实用户视角去验证“一条完整的链路能不能跑通”,比如从下单、支付、积分入账、到售后产生退款,整个流程下来余额是否正确。这种测试,AI目前还很难独立生成——因为它需要理解多系统之间的交互、时序和补偿机制。也正因为如此,写和执行这种业务级验证方案的人,价值反而变高了。4. 真正的深层瓶颈:人如何和AI协作而不丧失判断力说了这么多,归根结底,技术上的瓶颈其实都可以靠工具和流程去消解。需求说不清,就多花时间打磨需求文档;审查变难,就调整Review机制,引入更强的静态分析甚至AI辅助审查。但我观察下来,最难跨越的瓶颈,还是在“人”身上——工程师在面对AI生成的一堆代码时,如何保持判断力,甚至如何让自己不被AI带偏,这件事,比任何工具选型都更难。4.1 “AI盲从症”:生成的速度越快,人的惰性越强心理学上有个现象叫“自动化偏见”,指的是人在自动化系统面前,倾向于认为机器是对的,从而放松自己的警惕。AI编程这件事,把“自动化偏见”放到了最大化。我见过不止一个原本很有想法的中级工程师,用了AI之后,变成了一个“复读机”——需求来了,把关键信息往对话窗口一贴,AI给什么代码,他就用什么代码,遇到报错,也不去分析根因了,直接把报错信息丢回给AI,让AI自己猜、自己改。这种工作方式在简单的场景下一天能完成过去三天的活,短期内成就感拉满。但几个月后,问题就暴露了:一是对代码的理解深度急剧下降,一旦AI生成的东西在特定输入下出了bug,他连“从哪开始排查”都不知道;二是长期让AI替自己做判断,自己的架构设计能力和边界敏感度会严重退化。老话说“用进废退”,放在AI协作时代,体现在一个工程师身上就是——代码能力退没退不好说,但定义问题、权衡取舍、识别风险的能力,实打实地在退化。我自己踩过几次坑之后,现在定了三条铁律,也想分享给大家:AI生成的代码,必须经过你的“大脑编译”才能提交。你要能做到“不看AI,自己也能把这套逻辑的骨架讲出来”,如果你讲不出来,说明你还没有真正拥有这段代码。遇到任何AI生成的报错,先自己读一遍堆栈,定位到问题代码行,尝试给出自己的判断,然后再去问AI。哪怕你的判断是错的,也要先有判断。这个“先思考”的动作,是防止脑子生锈的关键。定期做“无AI日”:每个月挑一到两天,写代码、改bug、看架构,完全不打开任何AI工具。这听起来很反潮流,但确实能帮你找回那种对代码的直接手感。4.2 从“编码能力”到“判断与决策能力”的范式转移在AI时代,工程师的核心竞争力在肉眼可见地发生偏移。过去招聘,我们主要看数据结构和算法,看语言深度,看框架熟练度;现在,这些东西固然还是基础,但真正能拉开差距的,变成了“需求拆解能力”“技术方案取舍能力”和“风险识别能力”。AI可以把某个具体的技术方案快速落地成代码,但它没法替你想清楚“这次到底是该上消息队列,还是先简单加个锁顶一下”“这个模块是重构成微服务,还是继续躺在单体里苟着”。这其实对资深工程师反而是个利好。因为AI拉平了初级工程师和资深工程师在“编码速度”上的差距,但没有拉平在“决策质量”上的差距。初级工程师可能靠AI一天产出2000行代码,资深工程师一天只产出200行,但这200行的背后,是对系统边界、未来演进、团队维护成本的综合判断。时间拉长,这两者的代码资产价值,完全不是一个量级。我最近在团队里刻意培养的,也是这种“判断力”。怎么培养?一是让每个工程师深入参与业务讨论,不能只做“接需求的人”,要理解业务为什么这么设计,甚至敢于挑战业务方;二是做完技术方案评审,让写方案的人自己推演“这个方案在什么极端情况下会崩”,把风险提前暴露出来;三是不管AI生成的代码多完美,都要求工程师对它保留审视和质疑的心态——代码是AI写的,但责任永远是人的。4.3 协作关系重构:AI不该是“替身”,而该是“学徒”最后分享一个我个人的视角转变。最开始用AI编程时,我下意识地把它当成一个“效率放大器”,希望它越快越好地把我脑子里的东西变成代码。但用久了之后,我越来越觉得,更健康的协作关系,是把它当成一个“带过很多项目的学徒工”——它不是你的替身,而是跟着你学习的助手。什么意思?就是你依然要花时间设计整体结构和关键算法,然后把这个结构和关键路径讲给“学徒”听,让它去实现那些你已经想清楚的、重复性的、体力活的代码。碰到不确定的地方,你告诉它“这块先别做,等我想清楚”,而不是让它自由发挥。这样操作下来,它的产出质量不仅稳定,而且你对自己的代码库仍然保持着完全的控制感和理解度。我曾经在项目里同时用两种方式做过对比测试:一种是当甩手掌柜,只给AI一个宏观目标;另一种是先把模块的接口定义、核心类的职责、状态流转图全部画好,再让AI去填空。结果是,后者生成的代码通过Review的概率几乎是前者的两倍,后期返工的成本更是低到可以忽略。所以我现在带团队,最常挂在嘴边的一句话是:“AI越强,你越要清楚自己在做什么。”这句话,大概就是我在这个时代最想分享的心得了。5. 实操层面的应对策略与建议道理聊得差不多了,最后落回实操,说说我自己团队现在沉淀下来的、可复制的一整套“AI协作开发流程”。这套流程不一定适合所有人,但对那些已经被“AI生成代码太多、质量不可控、Review压力山大”困扰的团队,应该会有不错的参考价值。5.1 需求侧:建立“三层验收标准”机制我们在需求输入端做了一个强制动作:任何需求进入开发之前,必须写清楚三层验收标准。第一层,功能验收,也就是“这个功能要实现什么”,这是最基础的;第二层,边界验收,也就是“哪些情况属于异常,要怎么处理”,比如参数非法、数据不存在、并发冲突;第三层,体验验收,也就是“性能上要达到什么标准,异常时给用户呈现什么提示”。以前这三个层次通常要开发过程中逐步逼问出来,现在我们把它前置到需求评审阶段,目的就是给AI生成代码时提供足够多的“约束锚点”。实践下来,一旦这三层标准清晰了,AI生成代码的一次性通过率,确实会提高一大截。5.2 开发侧:小人步进策略,拒绝“一把梭”我还特别建议大家,不要尝试让AI一次性生成一个超大模块的全部代码。那种“从Controller到Mapper一条龙全生成”的操作,看起来高效率,实际上给Review环节埋了一颗巨大的雷——代码量太大,你的大脑根本来不及校验每一行,只能“抽查”,而抽查漏掉的bug,进了生产环境就是事故。我现在的习惯是,把任务切成尽量小的颗粒度,一个用例一个用例地让AI实现,每实现一小块就立刻编译、跑测试、做Review。这个方法看起来多了一些交互下去的次数,但综合下来,总耗时不升反降,最大的价值是每一段代码都是人脑可解码的,安全性大大提高。5.3 审查侧:引入“双轨审查制”代码审查这块,我现在把流程拆成了两条并行的轨。第一条是“人工语义审查”,重点不再是代码规范,而是“实现是否符合业务预期,是否存在逻辑漏洞、并发隐患和边界遗漏”;第二条是“工具自动审查”,除了传统的SonarQube和Checkstyle,我们还会把AI审查插件也跑一遍,重点让它查一些低级错误和规范问题,比如资源没关、空指针、SQL注入风险等。两条轨的结果综合起来,作为合并代码的依据。这相当于让AI和人类互相Check,而不是让AI既当运动员又当裁判员,能大幅降低“测试和实现一起跑偏”的盲区。5.4 团队侧:重新定义“绩效”与“成长路径”最后说一个偏管理但极其重要的维度。如果一个团队的考核仍然是“每天产出多少行代码”,那么在AI时代,这个考核方向会把团队带向深渊——因为AI能把代码量轻易堆上去,但堆得越多,潜在的地雷就越多。我调整了团队的评价维度,把“需求理解深度”“代码审查质量”“线上问题率”这些指标放到了比“开发速度”更重要的位置。毕竟,在AI大幅提速的情况下,真正的交付能力,已经不是“写得多快”,而是“上线之后够不够稳、出问题之后能不能快速定位”。对于工程师个人成长,我建议每一个人都主动往“业务懂行技术全局判断力强”这个方向走,因为纯粹的“写代码手速快”,在AI面前几乎不再具有护城河。这可能有点残酷,但确实是大实话。
返回列表