程序员最怕听到的一句话,可能不是这个需求很难。而是:这个需求很简单,就改一下。产品说,就加个状态。 老板说,现在 AI 都能写代码了,这个今天能不能顺手带上。 你打开项目一看,第一反应是:不太对。但最痛的地方就在这。你知道它不太对。 可你一时说不清楚哪里不对。你只能说:这个可能有风险,我要先看一下。
核心判断:面对“就改一下”,先把影响关系显性化,再讨论工期和实现。
你为什么知道不对,却说不清风险
对方听到的是什么?又要评估。 又要排期。 又觉得麻烦。但你脑子里真正闪过的,可能是另一套画面:这个状态是不是订单、退款、发票、售后都在用? 移动端和后台是不是共用一个接口? 老数据有没有这个字段? 缓存会不会不刷新? BI 报表会不会依赖这个枚举? 上次改类似逻辑,是不是线上挂过一次?这些焦虑不是情绪。
它其实是压缩过的工程经验。问题是,这些经验只在你脑子里。产品看不到。 老板看不到。 AI 也看不到。所以这期我们聊一个特别现实的问题:AI 会写代码之后,为什么程序员反而更容易背锅?不是因为 AI 不好。而是因为 AI 让所有人更容易低估一件事:写代码变快了,不代表需求、验证和责任也变快了。
真实工程里,很多需求不是和代码搏斗。而是在和上下文搏斗。同一句“就改一下”,每个人看到的上下文完全不一样。产品的上下文是用户反馈。用户说这里不好用,希望多一个入口。 所以在产品眼里,这是一个体验优化。老板的上下文是工期和交付。这个版本已经答应客户了。 这个需求最好今天一起带上。 所以在老板眼里,这是一个排期问题。
测试的上下文是用例和事故。哪些路径要回归? 哪些状态以前出过问题? 测试环境有没有对应数据? 所以在测试眼里,这是一个覆盖问题。程序员的上下文是什么?是历史代码。 是技术债。 是隐藏调用方。 是老数据。 是权限。 是缓存。 是回滚。 是出了问题之后,谁来解释为什么没有提前发现。而 AI 的上下文更窄。
你告诉它:给这个页面加一个按钮。它真的能给你写一个按钮。但它不知道这个按钮背后,可能挂着三个页面、两个接口、一堆历史兼容逻辑。所以第一个矛盾就出现了:需求更容易被低估。以前你说这个要评估一下,对方可能还能接受。现在对方会觉得:AI 不是能写吗?但 AI 压缩的是局部实现时间。不是需求边界。 不是历史逻辑。 不是线上风险。
产品看到的是:加一个入口。程序员看到的是:哪些角色可见? 哪些状态可点? 点完以后去哪? 老数据怎么办? 权限穿透怎么办? 埋点变不变? 客服后台要不要同步? 移动端要不要同步?这不是同一个需求。只是被同一句话压缩了。第二个矛盾是:工期更容易被压缩。AI 提效之后,很多公司第一反应不是:太好了,我们可以把质量做高一点。

代码改动的成本藏在关系网里
而是:太好了,那是不是今天能上?这很现实。工具提效,最后经常不会变成程序员的喘息空间。而是变成新的排期基线。以前三天做完。 现在默认一天半。以前要先看代码。 现在默认你让 AI 看一下就行。但问题是:AI 可以把写代码从两小时压到二十分钟。它不能把等接口、跑环境、查历史坑、确认产品边界,也压到二十分钟。
你省下的是编码时间。但很多项目里真正耗时间的,从来不是敲代码。是本地环境怎么又起不来。 是测试库里没有那种老数据。 是接口文档和真实返回不一样。 是这个字段三年前被另一个团队临时改过。 是你改完以后发现,还有一个定时任务半夜会扫这张表。这些东西,AI 不会自动替你消失。第三个矛盾是:代码更快了,但验证没有更快。
这才是最危险的。AI 写出来的代码,经常看起来很像对的。命名合理。 结构完整。 注释也有。但它可能刚好错在项目最脏、最旧、最没人敢碰的地方。比如你让 AI 改了一个订单状态判断。本地页面正常。 单测也过了。结果上线后发现,另一个渠道的老订单状态全乱了。因为那个渠道的状态枚举,是三年前另一个团队临时加的。
文档没有。 测试环境没有。 正常路径也不会走到。AI 当然也不知道。所以现在最危险的不是 AI 写错。而是它写得太像对的。以前你慢慢写代码,至少你知道自己每一步是怎么想的。现在 AI 很快给你一个完整 diff。你要在更短时间里判断:它有没有改错文件? 有没有漏掉老逻辑? 有没有破坏旧调用方? 有没有让异常状态直接穿过去? 有没有只满足了新需求,却破坏了历史兼容?
代码生成速度提升了。但验证系统没有同步提升。程序员的压力就会从写不出来,变成来不及判断它对不对。第四个矛盾是:责任不会转移给 AI。AI 可以参与生产。但它不会进入责任链。线上出问题的时候,不会有人问:是哪一个模型 merge 的?问的是:谁提的 MR? 谁点的发布? 谁确认测试通过? 谁没有写风险说明? 谁没有准备回滚方案?

把模糊担心画成风险地图
代码可以让 AI 写。事故不会让 AI 背。所以 AI 时代程序员真正的风险,不是不会写代码。而是写得更快之后,责任还是你的。那怎么办?现实一点说,我们不可能每个需求都搞一套完整评测系统。很多时候你就是工期紧、文档乱、测试不全、历史代码没人敢动。所以这里需要的不是宏大的方法论。而是一个当天就能用的动作:
当别人说“就改一下”的时候,不要先争论这个需求简不简单。先把风险展开。我把它叫做:三分钟风险展开法。第一步,把一句需求拆成影响面。不要直接让 AI 实现。先让 AI 帮你问:这个需求可能影响哪些页面? 哪些接口? 哪些数据库字段? 哪些状态机? 哪些权限? 哪些缓存? 哪些埋点? 哪些报表? 哪些异步任务? 哪些第三方回调?
然后标成三类:确定影响。 可能影响。 需要确认。这一步的目的,不是证明你很专业。而是把“我感觉不对劲”,变成一张别人能看见的影响面清单。第二步,把技术焦虑翻译成业务后果。很多时候程序员说的话,产品听不出风险。你说:这个状态机有历史兼容逻辑。对方可能没感觉。但你换成:如果老订单没有这个新状态,用户可能会看到错误按钮,客服后台也可能查不到正确原因。
这就有感觉了。你说:这个字段被 BI 依赖。对方可能觉得只是技术细节。但你换成:如果字段含义变了,这周的转化率报表可能会不准。这就不是技术细节了。你说:这个接口有多端调用。对方可能以为你在扩大问题。但你换成:你看到的是后台页面改一下,但移动端、客服端、小程序可能共用这个接口。对方就能理解,为什么你不能只看一个页面。
第三步,把风险变成排期选项。不要只说:做不了。可以说:如果只做最小改动,今天能上。 但风险是老数据、报表和多端调用没有完全覆盖。如果要稳妥一点,需要补两个回归路径,明天提测。如果要完整兼容,需要确认移动端和客服端调用,排期至少多一天。这一下,沟通关系就变了。你不是在反对需求。你是在提供不同风险等级的选择。

面对“顺手改一下”,先做这套检查
对方可以继续压工期。但至少他知道,压掉的是哪一部分验证,留下的是哪一类风险。这就是上下文对齐。程序员最吃亏的地方,往往不是没有风险意识。而是风险意识没有外显。你脑子里已经跑完了一遍事故预演。但对方只听到一句:我觉得要评估。这句话太弱了。它没法让对方感受到你的焦虑。所以 AI 在这里真正有用的地方,不是替你怼产品,也不是立刻帮你写代码。
而是把你的工程直觉展开成风险地图。你可以直接这样问 AI:不要实现。先基于这个需求和当前代码,帮我整理四类上下文:第一,业务上下文。 这个需求要解决什么问题,影响哪些用户,成功标准是什么。第二,代码上下文。 涉及哪些模块、状态、权限、字段、历史兼容逻辑。第三,验证上下文。 必须测试哪些路径,可能破坏哪些旧逻辑,上线后看什么日志和指标。
第四,责任上下文。 哪些假设需要产品确认,哪些风险要提前说明,出问题怎么回滚。最后,把“就改一下”改写成一份可评估的任务说明。这才是 AI 对程序员最现实的帮助。不是让你更快背锅。而是帮你更快把锅摊开。当然,很多时候你把风险说清楚了,排期还是会被压。这也很现实。但至少你留下了三个东西:影响面。 确认点。 风险选项。
它们不一定能让你完全不背锅。但它们能让责任不再只停留在你的直觉里。最后总结一下。AI 会写代码之后,程序员的经验没有消失。它只是从“我会不会写”,迁移到了:我能不能快速判断这个需求影响哪里。 我能不能把历史坑翻译成业务风险。 我能不能把工期压力拆成不同风险选项。 我能不能在动手之前,让所有人的上下文先对齐。
所以程序员最怕“就改一下”,不是因为这句话一定恶意。而是因为它把需求压缩成一句话。却把验证、风险和责任,留给了最后改代码的人。你遇到过最离谱的“就改一下”是什么?最后牵出了几个页面、几个接口、几个历史坑?
本文根据同主题视频脚本重新编辑为公众号图文版。
夜雨聆风