先给一个有条件的结论:如果教程里的每一步你都能逐字对上,结果仍然不同,优先怀疑环境差异;如果步骤本身有跳步、默认值或隐含前提,优先怀疑步骤差异。这个判断只在教程给出了足够完整的操作记录时成立,否则你分不清是环境不同,还是教程根本没写全。
不要一上来就把教程从头再走一遍。挑教程里一个能单独验证的环节,比如一次查询、一次抓取、一次页面输出,把它拆成输入、动作、输出三段。你按教程的输入和动作执行,记录自己的输出。如果输出不同,问题就被压缩到了一个点上。
这个动作的价值在于:它把“整篇教程跑不通”变成“某个环节对不上”。下一步你只需要判断这个环节的差异来自环境还是步骤,而不是在几十个步骤里猜。
环境差异最容易伪装成步骤问题,因为你的动作确实和教程一样,但结果不同。常见的环境变量包括:
判断方法:把教程的输入原样固定下来,只替换环境。如果换成教程的输入后结果一致,说明你的环境是变量;如果仍然不一致,环境嫌疑下降,转向步骤。
假设教程演示的是“抓取一个列表页并提取标题”。你按步骤执行,提取数量比教程少。此时先固定输入:下载教程提到的那个页面快照,用同样的选择规则提取。如果数量对上了,差异来自你抓的实时页面;如果数量还是少,差异来自你的提取规则或执行顺序。这个例子里,数字只用来比较,不代表任何真实项目的表现。
步骤差异往往藏在“看起来一样”里。教程写“配置好之后保存”,但没写保存前要先清空某个字段;教程写“运行脚本”,但没写依赖的版本。你照做后结果不同,不是环境的问题,而是教程省略了隐含前提。
识别步骤差异,重点查三处:
如果这三处都能对齐,结果仍然不同,再回到环境差异,检查版本、权限和外部依赖。
上面的判断有一个反例:教程本身就是在特定环境下录制的,且没有说明这个环境。比如教程作者用的是自己维护的示例站点,页面结构、数据量和访问规则都被简化过。你在真实站点上复现,即使步骤完全一致,结果也不会一致。
这种情况下,你无法区分环境与步骤,因为教程没有提供可分离的边界。正确做法不是继续试,而是先确认教程是否声明了适用范围。没有声明的教程,只能当作思路参考,不能当作可复现的操作记录。
无论你判断是环境还是步骤差异,下一步都应该是写一条记录,格式固定为:输入、动作、预期输出、实际输出、差异点、验证方式。这条记录的作用是让下一次复现时,你能直接定位到差异点,而不是重新走一遍。
如果差异点指向环境,就去固定环境,比如保存页面快照、锁定版本、记录初始状态。如果差异点指向步骤,就去补全隐含前提,比如补上默认值、调整顺序、补充前置条件。做完这一步,再决定是否继续按教程往下走。只有当你能把差异点单独隔离出来,教程才从“跑不通”变成“可复现的部分”和“不可复现的部分”。