先做一个最小对照:把同一份教程里的操作在两种环境下各跑一遍,只改变其中一个变量。如果结果只在一种环境下出现,问题多半在环境;如果两种环境都失败,问题多半在步骤理解或资料本身。下面以你手里的一份教程和它对应的练习页面为对象,给出可执行的分辨方法。
不要拿整站或真实项目做复现,选教程里最小的一个交付物:一个页面、一次标题改写、一次内链调整,或一份抓取结果。把它复制成两份,放在两个独立目录或两个测试站点里,保证初始内容完全一致。这样做的目的是把“教程结果”变成一个可以重复执行的动作,而不是一段记忆。
动作:把教程中每一步的输入和输出写成两列表格,左列是操作前的状态,右列是操作后的预期状态。结果:你会立刻发现哪些步骤其实没有明确输入,这些步骤就是后面最可能出问题的地方。下一步是给这些模糊步骤补上可观察的判定条件,比如“页面标题包含某词”而不是“标题优化好了”。
假设教程说某类页面在调整后会出现某种变化,你在自己电脑上复现成功,换一台机器或换一个测试域名就失败。此时不要急着改步骤,先按下面的顺序排查。
如果换环境后结果恢复,说明原环境里有某个前置条件没被教程写出来,比如已存在的缓存、已登录状态、已配置的跳转规则。如果换步骤后结果恢复,说明教程的步骤描述省略了顺序或依赖关系。两种情况的处理方向不同:前者要补环境说明,后者要补步骤依赖。
假设你手里有一份教程,其中一步写“提交页面后等待处理”。这句话无法直接执行,因为不知道提交什么、等待多久、看哪里。把它转成可执行方案时,先写清楚三个字段:提交对象、观察位置、判定信号。
动作:按这三个字段重写这一步,然后在两个环境里各执行一次。结果:如果两个环境都能得到同一个判定信号,这一步就算可复现;如果只有一个环境能得到,说明判定信号依赖了环境里的某个隐藏条件。下一步是把那个隐藏条件写进前置检查,而不是继续改后面的步骤。
个别样本成立、批量执行后出现例外,通常不是教程全错,而是教程的适用边界没写清楚。此时要区分三种情况:
区分方法:从例外样本里挑一个,单独按原步骤再跑一次。如果单独跑能成功,问题在批量交互;如果单独跑也失败,问题在样本条件或步骤理解。这个判断会直接影响你下一步是改流程还是改样本筛选条件。
无论结论是环境差异还是步骤差异,最后都要落到一份可交接的清单上。清单至少包含:前置条件、每步的输入、每步的观察点、失败时的回退动作。这样下次再遇到无法复现,你可以先对照清单找缺失项,而不是重新看一遍教程。
动作:把这次排查中新增的条件和判定信号补进清单,然后换一个人按清单执行一次。结果:如果对方能在不问你问题的情况下得到相同观察结果,说明清单已经覆盖了关键差异;如果对方仍在某一步卡住,那一步就是下一个需要拆解的对象。