自动化失败后,先判断失败类型
最近一个自动化流程输出结果完全不对。第一反应是改代码,直接修参数。但这个念头刚冒出来就被我压住了——改代码之前,得先搞清楚这次失败到底是什么类型。
不是所有失败都用同样的方法修。如果失败类型判断错了,你修的方向就错了。方向错了,你花的所有时间都是在做无用功——你可能修了逻辑层但问题在数据层,可能调了参数但问题在环境层,可能改了代码但问题在交互层。修了不该修的地方,不仅浪费了时间,还可能引入新的问题。
失败类型决定诊断路径
那次我让 Agent 先回溯整个流程,从输入到输出,每一步检查一遍。Agent 给了修改建议,我打断它:"不要急着给解决方案,先把失败点找出来。"
Agent 重新执行,逐层排查。最后发现问题出在数据预处理阶段——输入数据格式变了,预处理脚本没有适配新格式。
如果我当时直接改逻辑或调参数,改的方向就是错的。因为问题不在逻辑层也不在参数层,而在数据层。逻辑层和参数层都没问题——脚本按照设计逻辑正常运行了,参数也是按配置值设的。但输入数据的格式变了,预处理脚本按旧格式解析新数据,解析失败导致后续所有步骤基于错误数据运行。逻辑没错,参数没错,但输入错了。输入错了但逻辑和参数正确,输出一定错——这不是逻辑问题,是数据问题。
这让我想起 jianfei-plan 的 failure taxonomy 方法论。它把自动化失败分成四类:
- 数据类失败:输入数据格式变了、数据源不可用、数据质量异常(缺失值、重复值、格式不一致)。诊断路径:检查数据源状态、验证输入格式、对比新旧数据差异。数据类失败的特征是:逻辑正确、参数正确、环境正确,但输入不对。
- 逻辑类失败:处理流程有 bug、条件判断错误、流程设计有缺陷(缺失步骤、多余步骤、步骤顺序错误)。诊断路径:逐步执行流程、检查每步的输入输出、对照设计文档验证逻辑。逻辑类失败的特征是:数据正确、环境正确,但处理方式不对。
- 环境类失败:配置参数变了、权限不足、依赖服务不可用(数据库连接断、API 挂了、磁盘满了)。诊断路径:检查配置文件、验证权限状态、测试依赖服务连通性。环境类失败的特征是:数据正确、逻辑正确,但运行环境不对。
- 交互类失败:人机接口不对、反馈机制失效、用户操作路径错误(按了不该按的按钮、输入了错误参数、跳过了必填字段)。诊断路径:检查用户操作日志、验证交互流程、对比预期操作路径和实际操作路径。交互类失败的特征是:系统正确,但人的操作不对。
每种类型的诊断方法完全不同。数据类要看数据源和预处理,逻辑类要看代码和流程设计,环境类要看配置和权限,交互类要看用户路径和反馈。用错诊断路径,就像用眼科的方法治胃病——检查方向对,但检查对象错了。
为什么不能直接改
很多人失败后的直觉是:马上改,改完再看。这就像发烧了就吃退烧药——可能暂时压住了症状,但病因还在。退烧药只能治症状(发烧),不能治病因(感染)。下次感染再发,你又吃退烧药,永远治不了根。
那次数据类失败,如果我直接调参数——比如放宽格式校验的阈值,让新格式也能通过。参数调对了可能让输出看起来正常,但预处理脚本的问题还在——它还是按旧格式解析,只是阈值放宽了让它不至于报错。下一次输入格式再变,同样的失败会再出现。因为根因没有被修,只是症状被压住了。
正确的做法是:先判断类型 → 按类型选诊断路径 → 找到根因 → 针对根因修复。数据类失败就修数据层——要么更新预处理脚本适配新格式,要么在输入端做格式校验和自动转换。逻辑类失败就修逻辑层——要么修 bug,要么补缺失步骤。环境类失败就修配置层——要么更新配置,要么补权限。交互类失败就修交互层——要么修正操作路径,要么加强反馈提示。
对症下药的前提是对症诊断。诊断的前提是判断类型。类型判断错了,后面所有步骤都白费。
提炼方法
这次卡点提炼出的方法很直接:
自动化失败后,第一步是判断失败类型,第二步是按类型选诊断路径。 不判断类型就动手修改,等于蒙着眼睛修路——你可能修对了方向,也可能修错了方向,但你不知道自己修对了还是修错了。
判断方法分四步快速排查:
- 看输入:数据格式、数据源状态是否正常 → 不正常就是数据类
- 看流程:处理逻辑有没有按预期执行 → 没有就是逻辑类
- 看环境:配置、权限、依赖是否到位 → 没到位就是环境类
- 看交互:用户操作路径和反馈是否合理 → 不合理就是交互类
每步只需要几分钟就能排除一类。排除了数据类再检查逻辑类,排除了逻辑类再检查环境类,排除了环境类再检查交互类。整个过程不超过半小时,但能确保你的修改方向是正确的。半小时的方向确认,比几小时的盲目修改更有效率。
这个方法后来写进了 jianfei-plan 的 failure taxonomy 规则:每次自动化失败,先做类型判断再开始诊断。不判断类型就动手的修改请求,直接驳回——因为方向未知的修改,风险远高于方向明确的修改。方向明确意味着你知道修哪里、为什么修、修完的效果预期。方向未知意味着你不知道修哪里、为什么修、修完是否有效。
自动化失败不是终点,是优化的起点。但只有当你知道失败类型时,优化才有方向。蒙着眼睛修路,修完还是迷路。