AI Coding 时代,程序员的核心能力正在从实现转向判断

在许多真实项目里,程序员已经很少再从空文件开始工作了。在接到任务后,他们会先让 AI 阅读仓库、分析调用关系、提出修改方案,这已经成为一种自然的工作方式。页面、接口、测试、数据脚本,乃至一套能够运行的原型,都能在很短时间内生成。过去占据开发周期大部分时间的实现工作,正在被极速压缩。

AI 基本终结了程序员手写代码的时代,当然这里的“终结”并不意味着人类从此不再写代码,就像高级语言没有让汇编消失,新的生产方式总会保留旧技能的使用场景。真正的变化发生在更深的地方:手写代码已经退出软件开发的中心,也很难继续充当程序员价值的主要证明。

这会带来一个无法回避的问题。

如果代码的大部分内容都能由 AI 生成,程序员应该把时间花在哪里?当所有人都能迅速获得一份看起来完整、甚至能够运行的实现,程序员还能为软件开发增加什么?

我的答案是判断力。

不过,判断力不能停留在一句听起来正确的口号上。它需要解释程序员究竟在判断什么,为什么这些判断很难交给 AI,以及工程体系怎样承接这种新的分工。只有把这些问题说清楚,“程序员转型”才不会变成另一种空泛的能力清单。

代码曾经是程序员价值的中心

过去,代码是一种稀缺的生产资料。

一个想法能否成为产品,往往首先取决于有没有人能把它写出来。即使需求已经明确、方案也得到认可,团队仍要花费大量时间搭建工程、编写接口、处理类型、查阅文档、补齐测试。实现能力构成了软件生产中最明显的瓶颈。

程序员的价值因此很容易被编码能力代表。写得快、写得多、熟悉更多语言和框架,通常意味着更高的交付效率。产品负责定义需求,研发负责把需求变成代码,这种分工在实现成本高昂的年代具有现实基础。

但是 AI 改变了这个基础。

当一个功能的初版能够在几分钟内生成,代码本身便不再稀缺了。过去因为开发成本太高而无法尝试的想法,现在很容易被做出来;过去需要谨慎安排的技术任务,也能够同时启动多个方向。表面上看,软件生产终于摆脱了实现能力的限制。

问题也恰恰从这里开始。

代码生成得越容易,团队越容易把“做出来”误认为“做对了”。一个缺乏价值的需求,过去可能因为排期紧张而被迫放弃,如今却能很快拥有前端、后端、数据库和一整套测试。一个存在偏差的技术方案,也会在 AI 的帮助下迅速长成结构完整的系统。

过去,缓慢的实现过程多少构成了一道天然的节流阀。团队有时间讨论需求,工程师也会因为开发成本而反复确认范围。AI 拆掉了这道节流阀,却没有自动补上一套更好的决策机制。错误方向同样获得了更高的执行效率。

软件交付的瓶颈也随之移动。

实现速度提高之后,问题定义、方案取舍、结果验证、系统集成和线上运行开始占据更多时间。未经充分验证的代码,更像等待处理的库存。生成量长期超过团队的理解和吸收能力,新增代码很快会变成认知负担,最终以维护成本和线上风险的形式重新出现。

所以,AI 带来的变化远不止编码提速。它让软件开发中那些长期被实现工作遮挡的问题重新显露出来:我们为什么要做这件事,什么样的方案适合当前系统,怎样证明结果可信,出了问题由谁承担后果。

这些问题从来都存在。只是当写代码不再困难,它们终于成为生产效率的主要约束。

实现成本下降之后,决策成本浮出水面

任何一段代码背后都包含选择。数据应该存在哪里,状态由谁维护,失败后是否重试,接口允许哪些输入,系统愿意为性能付出多少复杂度。代码只是选择留下的具体形态。

AI 能够根据当前上下文快速完成实现,却很难天然掌握一个真实系统的全部语境。大量关键知识没有完整地写在仓库里,它们散落在历史事故、业务流程、团队约定和少数人的经验中。模型看到的是眼前任务,软件需要面对的却是长期运行的现实。

例如,某个支付接口偶尔超时,AI 在分析异常后加入自动重试,代码清晰,单元测试也顺利通过。从局部看,这是一处合理修复。可如果上游请求没有完善的幂等机制,新的重试逻辑就可能把偶发超时变成重复扣款。

这里没有低级语法错误,甚至没有明显的局部逻辑错误。问题来自系统边界之外的一项隐含前提。一个不熟悉业务的人类工程师也会犯同样的错,AI 带来的新风险在于速度和规模:它能更快地完成修改,也能把同一种误解扩散到更多地方。

这正是判断力开始发挥作用的位置。

面对一个需求,程序员首先要判断它是否值得解决。用户表达的诉求与实际问题可能并不相同,一项看似必要的功能也许通过流程调整就能解决。越早发现方向错误,团队节省的成本越高。AI 很擅长认真完成交给它的任务,却很少主动替组织追问任务本身是否值得存在。

方向确定之后,还要在多个可行方案之间做出取舍。单体与微服务、实时与异步、强一致与最终一致、自研与采购,都有成立的条件。脱离业务规模、历史系统、团队能力和交付时间谈技术优劣,结论往往没有意义。成熟的工程判断会选择当前阶段负担得起的方案,也清楚今天的便利会留下什么代价。

实现完成后,判断仍在继续。代码能够运行,只说明它通过了某些已知检查;测试全部变绿,也可能只是实现和测试共享了同一个错误假设。什么证据足以支持上线,哪些异常必须覆盖,哪些指标需要在灰度阶段观察,出现什么信号应该立即回滚,这些决定共同定义了“完成”。

判断力因此并不神秘。它建立在对上下文的理解、对技术后果的预见、对证据充分性的衡量,以及对失败风险的敏感之上。经验之所以有价值,也不在于做过更多项目,而在于一个人是否从结果中形成了稳定、能够解释的判断依据。

程序员的角色正在向代码两端延伸

当实现逐渐交给 AI,程序员的工作会沿着代码向两端延伸:一端抵达问题,另一端抵达结果。

在写代码之前,他需要把模糊意图整理成明确任务。

目标是什么,哪些内容不在本次范围内,现有系统有哪些约束,什么结果无法接受,成功又该如何衡量。这些内容过去常常依赖开发过程中的反复沟通,如今必须更早地被说清楚。上下文越含糊,AI 自行补全空白的空间就越大。

进入实现阶段以后,程序员的重点转向边界设计和任务组织。

他需要决定模块怎样划分,接口如何定义,哪些区域允许修改,哪些公共能力需要保护。一个复杂任务也要被拆成能够独立检查的小变更,让每一步都拥有清楚的输入、输出和验收条件。

代码生成之后,工作还远没有结束。

类型检查、静态分析、测试和安全扫描提供第一层证据;人工审查关注高风险决策和关键路径;灰度发布、运行监控和用户反馈继续检验代码在真实环境中的行为。程序员负责把这些环节连成闭环,并在证据不足时阻止系统继续向前。

由此看来,程序员正在从实现任务的执行者,走向软件结果的负责人。他未必亲手完成所有代码,却必须知道为什么这样做、系统依赖哪些假设、哪里最容易失败,以及发生意外时如何恢复。

这也解释了为什么“会使用 AI”很快就不再构成明显优势。几乎所有程序员都会获得相似的生成能力,差距会出现在生成之前和生成之后。有人用 AI 得到更多代码,有人用 AI 更快地得到可信结果。后者创造的价值显然更高。

人不可能读完 AI 生成的所有代码

沿着前面的推论,很容易滑向另一个结论:既然 AI 负责写代码,程序员以后就要投入更多时间阅读和审查代码。

这只说对了一部分。

验证会变得更加重要,逐行阅读的比重却会下降。AI 在很短时间内就能生成数千行代码,人的阅读速度没有同步增长。如果所有生成结果都要经过完整人工审查,AI 节省的实现时间很快会被审查成本吃掉。反过来,大量无人理解的代码直接进入生产,也只是在推迟问题暴露的时间。

继续依赖全面人工阅读,已经无法支撑新的代码产量。工程实践需要从“所有代码同等审查”转向风险驱动的验证。

普通页面、样板逻辑、简单的数据转换,在类型检查、静态分析和测试通过后,通常不值得逐行阅读。权限、资金、数据迁移、并发控制、核心状态流转和公共接口,则需要更高等级的关注。变更越难回滚,影响范围越大,人的介入就应该越深入。

代码阅读也会从全面检查转向定向穿透。程序员平时关注模块边界、数据流、关键假设和影响范围;遇到测试失败、线上异常或高风险修改,再沿着调用链进入具体实现。阅读能力的价值由阅读量转向穿透力:能否迅速抓住关键路径,分辨代码表面上的合理与系统真实行为之间的差距。

调试能力也会出现类似变化。语法错误、常见 API 用法和局部逻辑问题会被 AI 消化掉很大一部分,留下的问题更容易跨越模块,牵涉状态、数据、时序和运行环境。程序员处理的低级错误可能减少,面对的单个故障却更加复杂。

还有一个经常被忽略的问题:代码审查除了发现缺陷,也承担着维持团队认知的作用。

如果一套核心系统能够运行,却没有人能解释它的关键行为、失败模式和数据边界,这套系统已经积累了严重的认知债务。测试能够证明某些行为,却无法替团队承担所有理解责任。

因此,AI 时代依然需要阅读和调试代码的能力,只是它们不再承担大规模验证的全部压力。程序员要保留进入细节的能力,工程系统则要接管大量稳定、重复、能够形式化的检查。

这便把问题带到了 AI 友好架构。

AI 友好架构,是把判断写进系统

人工注意力无法追上代码生成速度,团队只能把更多判断固化为机器能够执行的约束。所谓 AI 友好,也应从这个角度理解。它与选择哪一种热门技术栈关系不大。更值得关注的是:完成一个任务需要多少上下文,系统边界能否约束修改,结果是否易于验证,错误发生后能否迅速恢复。

AI 友好的第一个前提,是让任务所需的上下文足够局部。

模块职责清楚,输入输出稳定,依赖关系有限,业务规则集中,AI 才能在有限上下文中做出相对可靠的修改。如果一个小需求要求模型同时理解几十个仓库、大量口头约定和多年历史包袱,遗漏几乎不可避免。

上下文局部化也不等于把系统无限拆小。一个边界清楚的模块化单体,有时比几十个彼此调用的微服务更容易理解。衡量标准应当落在认知范围和变更影响上:完成一项修改需要知道多少事情,它会波及多少区域,失败后能否被隔离。

边界清楚之后,关键约束还要得到显式表达。

接口契约、数据 Schema、类型定义、状态机、权限规则,都在告诉 AI 哪些行为受到允许。那些只存在于资深工程师记忆里的知识,对人已经不够可靠,对 AI 更是如此。隐含约定越多,模型越容易用常见模式补齐空白,而真实系统最危险的地方往往就藏在这些空白里。

仅仅把规则写进文档还不够。“订单状态不能逆向流转”“扣款请求必须幂等”“业务模块不能绕过领域层直接修改数据库”,这些要求需要进入数据库约束、架构检查、契约测试、属性测试和静态分析。文字告诉 AI 应该怎么做,可执行规则则会在它越界时立即阻止。

验证本身还要避免共享同一个盲点。让同一个模型依据同一份需求理解,同时生成实现和测试,很容易得到一套互相吻合、共同偏离目标的结果。更可信的证据来自不同来源:编译器和类型系统负责确定性检查,历史回归用例保存真实事故,属性测试关注业务不变量,生产流量回放提供复杂输入,独立审查专门寻找反例。多种证据从不同角度指向同一结论,可信度才会逐步提高。

系统还要限制单次变更的行动空间。规定允许修改的目录,控制变更规模,把大任务拆成独立提交,对公共接口、核心数据结构和不可逆操作设置更高门槛,都能降低一次错误修改扩散到全局的概率。AI 的权限不必在所有任务中保持一致,低风险工作可以拥有更大自主权,高风险操作则需要清楚的人工确认。

即使开发阶段建立了层层检查,运行环境仍要具备快速反馈和恢复能力。测试永远无法覆盖真实世界的全部情况,灰度发布、指标监控、调用链追踪、异常告警和快速回滚因此成为验证体系的一部分。成熟工程不会承诺零错误,它追求更低的错误概率、更小的影响范围,以及更短的发现和恢复时间。

当这些能力逐步建立起来,程序员的判断就不再只存在于某个人的头脑里。它会变成系统边界、代码规则、测试用例、发布门禁和运行指标,持续约束后续的每一次修改。

个人判断的最高价值,恰恰是让团队以后不必反复依赖个人判断。

架构能够约束 AI,却无法替现实消除复杂性

说到这里,还需要给 AI 友好架构划出边界。

软件中的一部分复杂性来自糟糕设计、重复建设和历史包袱,这些属于能够逐步削减的工程复杂性。另一部分直接来自现实:交易规则、监管要求、组织流程、用户差异,以及业务中不断出现的例外。它们构成了问题本身,无论代码由谁编写,都不会自动消失。

生产环境还包含大量难以提前穷举的因素。真实数据的分布、并发请求的时序、第三方服务的变化、团队之间的协作方式,都可能让一个在测试环境中表现良好的方案出现意外。所有约束都建立在已经认识到的风险之上,最棘手的问题往往来自团队尚未意识到的错误假设。

过度追求“适合 AI”也会制造新的成本。为了缩小上下文而把系统切成大量服务,可能换来网络、部署、一致性和跨服务排查的复杂度。为了追求形式上的完备而生成海量测试,也可能让团队陷入维护测试本身的负担。代码和规则都不是越多越安全,关键在于它们是否保护了真正重要的边界。

架构能够安排复杂性的位置,让局部问题留在局部,让关键规则得到保护,让失败后果受到控制。但是它无法替现实删掉复杂性,也无法预先覆盖所有未知情况。人仍然需要观察系统、理解变化,并在原有规则失效时重新作出判断。

这正是判断力很难被彻底自动化的原因。规则擅长处理已经认识到的问题,判断力要面对规则尚未覆盖的现实。AI 友好架构不会取消人的责任,它只是让人的注意力从重复检查中释放出来,集中到真正需要理解和权衡的地方。

程序员需要重新安排自己的学习

角色变化之后,程序员的学习重点也要随之调整。

AI 工具、提示词和智能体框架当然值得掌握,但具体工具的优势往往很短。模型会进步,交互会简化,今天需要专门学习的技巧,明天可能成为产品默认能力。更持久的差异来自一个人能否提供高质量上下文、设计合理边界,并建立可靠的反馈过程。

计算机基础仍然是判断的底座。操作系统、网络、数据库、并发、数据结构和编程语言,开始承担一项更重要的任务:帮助程序员理解系统为什么这样运行,识别方案在哪里失效,判断 AI 给出的答案是否可靠。缺乏这些知识的人同样能让 AI 生成代码,却很难在代码表面完整时发现深层问题。

领域知识的价值也会继续上升。通用代码模式很容易被模型掌握,企业内部的业务规则、历史决策、事故教训和组织约束却高度具体。一个熟悉支付业务的工程师,看到“失败自动重试”就会追问幂等和对账;不了解这个领域的人,往往要等事故发生后才意识到问题。

系统设计的学习重点应当回到取舍。记住多少架构名词意义有限,更重要的是理解每项选择会把复杂性带向哪里,团队是否有能力长期承担,未来改变方向时还剩多少空间。

规格、测试、评估和可观测性也会成为新的基本功。程序员需要把模糊意图整理成清晰目标,把业务经验沉淀为可执行约束,并通过持续反馈判断结果。过去被视作编码之外的辅助工作,今后会直接决定 AI 生成的代码能否安全进入真实系统。

对于刚进入行业的程序员,这里还有一个不能跳过的问题:判断力无法凭空产生。

如果学习过程完全交给 AI,初学者很容易得到能够运行的结果,却没有经历过预测、犯错、调试和修正的过程。技术直觉正是在这些摩擦中形成的。手写代码仍然具有训练价值,阅读运行时行为、追踪调用链、亲自定位故障也同样重要。AI 应该缩短反馈周期,不能替人省略认知形成的过程。

资深程序员则需要把个人经验继续向外沉淀。一次正确判断解决一个问题,一条清楚的架构规则、一组回归测试或一套发布机制,能够让整个团队以后少犯同类错误。AI 时代对资深工程师的要求,会从“亲自处理最难的问题”逐渐走向“让系统具备持续处理问题的能力”。

判断力,才是程序员的增量价值

当代码产量不再稀缺,用代码行数和完成任务数衡量程序员贡献,会越来越失真。一个人也许完成了很多需求,却只是帮助团队更快地走在错误方向上;另一个人可能只推动了一次范围收缩,却为团队省下了几个月的建设和维护成本。

更有意义的评价,应当关注他是否识别了值得解决的问题,是否让复杂性停留在合适的边界,是否把隐含经验变成团队能够复用的约束,是否为关键决策建立了足够证据,是否在风险出现时及时改变方向。

程序员的产出也会超出代码本身。一个准确的问题定义、一项克制的架构选择、一条阻止错误依赖的规则、一组保护业务不变量的测试、一套能够快速回滚的发布机制,都在提高系统产出正确结果的概率。这些工作未必增加代码,往往还会减少未来需要维护的代码。

判断力也不等于永远正确。现实信息永远不完整,工程决策必然带有不确定性。可靠的判断会说明自己依赖哪些假设,接受了什么代价,担心哪些风险,也会为后续反馈保留修正空间。它经得起解释,愿意接受结果检验,更不会把经验包装成不可质疑的权威。

技术深度提供判断的底座,业务理解给出方向,长期反馈校准尺度,责任意识让人认真面对后果。这样的能力无法通过一次工具培训获得,它来自持续实践,也会因为 AI 的放大作用而变得更加重要。

AI Coding 终结的,是把手写代码当作程序员主要生产方式和价值证明的时代。它没有消除软件工程的困难,只是让困难重新显露在实现之外。

未来的软件开发不会缺少代码。真正稀缺的,是知道什么值得做、理解系统依赖哪些约束、能够为结果建立证据,并愿意为失败后果负责的人。

程序员的工作会同时远离两个极端:一端是逐行生产所有代码,另一端是逐行审查机器生成的全部代码。他会在更高层定义目标和边界,把经验固化为工程约束;到了关键时刻,又能深入代码和运行现场,找到问题发生的真实原因。

他写下的代码也许会更少,决定的事情却会更多。技术并没有因此远离程序员,而是以系统理解、工程取舍和结果责任的形式重新回到中心。

AI 提供规模惊人的执行能力。方向、边界和上线条件仍然需要人决定。

代码会越来越便宜,正确会越来越贵。程序员的增量价值,最终体现在他能否让团队和 AI 持续产出值得信任的软件。

本文首发于 X:查看原文