直接回答:不要只写“正常情况怎么处理”,而要把每个判断拆成“触发条件、默认动作、例外条件、例外动作、记录方式”五段。人工操作时,人可以凭直觉跳过反常样本;脚本没有这种直觉,所以凡是你曾经犹豫过、回头查过、或手动改过的地方,都要单独写成一条例外分支,并注明它成立的前提。下面用两种条件分别说明该怎么落笔。
如果你处理的是几十到几百条数据,且每条都能人工看一眼,那么脚本的职责不是替你下结论,而是把“不符合常规模式”的条目挑出来,放进一个待确认队列。需求里应这样描述:
这种写法的好处是,你不需要在需求阶段就把所有边界想全。脚本拦住的东西会反过来告诉你:哪些例外是真正需要单独规则的,哪些只是数据脏。实际操作中,先跑一批待确认队列,统计每类例外各占多少,再决定哪几类值得写成自动分支。这个动作会直接改变下一步——如果某类例外反复出现且判断标准稳定,就把它升级为默认规则;如果只是零星噪声,就保持人工处理。
当数据量已经大到无法逐条复核,例外就不能只靠“拦下来”,而要在脚本内给出可执行的分支,同时保留回退路径。需求描述的重点从“挑出来”变成“按什么顺序尝试、失败后落到哪里”。
这里的关键是:例外分支必须有明确的上限,不能无限兜底。假设一批条目里,绝大多数能走第一层,少量走第二层,极少数落到第三层——如果第三层的数量突然变大,说明上游数据或判断条件变了,此时应该停下来检查,而不是继续让脚本硬跑。这个信号比“跑完了”本身更重要。
人工经验里有很多默认前提,写需求时如果不点明,脚本就会在规模化后暴露问题。
一个常见的漏项是“例外之后再例外”。比如某类条目因为缺少字段被拦下,但它其实可以从另一个字段补全——这层关系如果不在需求里写明,脚本只会把它当失败处理,人工复核时又要重新判断一遍。
假设你有一批页面标题需要按统一模板调整,人工操作时会凭经验跳过一些“读起来别扭”的。写需求时可以这样落笔:
默认动作:标题符合模板长度范围且不含冲突词时,按模板替换。例外条件:标题长度超出范围、或同时包含两个互相矛盾的限定词。例外动作:不改动,输出到待确认列表并标注触发条件。假设:这批数据里超长标题占比很低,且人工复核一条大约需要固定时间——那么先跑待确认队列比直接全量替换更稳妥。这个判断依赖的是你对数据的了解,不是某个固定阈值。
比较改动效果时要注意,前后对比不能只看一次结果。搜索需求本身会随季节和热点变化,数据采集的口径也可能不同,所以“改完变好或变差”不能单独归因于这次脚本调整。更稳妥的做法是保留改动前的快照,在同一口径下对比,并记录同期外部变化。
写完需求后,做一次反向检查:拿几条你曾经手动处理过的真实条目,逐条对照需求,看脚本会走哪条分支。如果某条在需求里找不到对应描述,说明例外还没写全。这个动作的结果会告诉你下一步是补规则,还是把这类条目明确划为人工负责范围。规则和人工的边界越清楚,规模化之后越不容易出现“脚本跑了但结果不能用”的情况。