代码已经改错之后,怎样用最小步骤先止损再定位
先给一条能当场核对的代码定位判断标准:如果你现在无法在十分钟内说清“哪一行改动、在哪个输入下、已经样用出现什么现象”,改错就说明问题还没有被缩小,后最此时继续改代码只会把现场搅乱。步骤已经做错时,先止第一目标不是损再立刻修好,而是代码定位先把损失挡住、把现场留住,已经样用再谈定位。改错下面这套动作,后最今天下班前就能做完。步骤
先把手上的先止改动冻住,存一份现场
发现改错后,损再第一反应往往是代码定位继续改回去。先停手。打开终端执行 git status 和 git diff,把当前差异复制到一个临时文件;没有版本控制的,直接把出错文件另存为 xxx.bak。这一步的意义是:你后面无论怎么试,都能回到“出错那一刻”。
接着确认影响面。问自己三个问题:这个错误有没有写进数据库?有没有发出请求、扣款、发消息?有没有部署到线上?只要有一项是“是”,止损优先级就高于定位,先按下面的回滚动作处理,再回头查原因。三项都是“否”,可以安心做最小复现。
这里的关键词是止损:止损不是修好,是让错误不再扩散。改错的文件先别提交,正在跑的任务先停掉,已推送的分支先别合并。
用一条命令把输入缩到最小
最小复现的核心是“去掉一切与错误无关的东西”。不要拿完整业务数据试,造一条能触发问题的最短输入。比如报错出现在解析某段文本,就先只留触发报错的那一行;出现在某个接口,就先用 curl 直接打这个接口,绕开前端和登录态。
具体动作:新建一个临时脚本或测试文件,只放三样东西——触发输入、被调用的那个函数、一句打印结果的语句。跑一次,看它是否还错。还错,说明范围已经缩到这三样里;不错,说明问题在你去掉的部分,把去掉的东西分批加回来,每次只加一批。
这一步要克制:一次只改一个变量。同时改两处,你就无法判断是哪一处起了作用。记录方式很简单,在临时文件顶部写三行:改了什么、预期什么、实际什么。三行写不出来,说明你还没想清楚。
回滚与复现要分开做,别混在一台机器上
很多人一边回滚一边调试,结果两头都乱。正确顺序是:先在能影响用户的环境回滚,再在本地复现。回滚动作要具体到命令或按钮,比如把发布版本切回上一个 tag、把配置项改回旧值、把灰度比例调回零。回滚后立刻验证一个用户可见的行为,确认损失已经止住。
本地复现则用干净环境。关掉你改了一半的分支,切到出错前的提交,用同样的最小输入再跑一次。如果旧提交也错,说明问题不是这次改动引入的,你的排查方向要换;如果旧提交正常,那问题就锁定在这次差异里,逐段注释掉改动来二分。二分时每轮只保留一半改动,几轮就能定位到具体几行。
需要提醒边界:涉及资金、账号、生产数据的错误,回滚和恢复数据应走公司既定的变更流程,找值班同事或负责人一起确认,不要单人操作生产库。最小复现可以自己做,止损动作要有人复核。
把结论写成三句话再收工
定位到之后,别急着大改。先在临时文件里写三句话:触发条件是什么、根因在哪一行、修复后要用哪个输入验证。第三句最容易被跳过,但它是你明天回来时唯一能确认“真的修好了”的依据。
然后再动手修,修完用同一个最小输入重跑一遍,再补一个相邻的边界输入,防止修好一个弄坏另一个。最后把临时脚本删掉或收进测试用例,别让它散落在桌面。已经做错不可怕,可怕的是错完之后现场没了、输入忘了、下次还得从头再来一遍。