直接回答:不要只写“遇到特殊情况就跳过”,而要把例外拆成可判断的条件、可执行的动作和可观察的结果。以你手头一份人工整理过的博客选题清单为对象,先标出每条经验里“什么情况下不适用”,再把它翻译成脚本能识别的字段和分支,最后用一个假设样例验证分支是否会互相冲突。
人工操作时,很多判断靠的是“看一眼就知道不对”。写脚本需求时,这类判断最容易丢。你要做的不是把整段经验原样搬进需求,而是逐条追问:这条经验在什么输入下会失效?
假设你有一份人工维护的博客选题资料,每条包含标题、目标读者、内容类型和备注。人工筛选时,操作者可能会跳过“标题里带年份但正文没有年度事件”的选题,也可能把“目标读者写得太宽”的条目退回。这些动作在人工阶段没有写下来,但脚本必须知道它们存在。
具体动作:拿一份现有资料,在每条经验后面加一列“例外条件”,用“当……时,不执行……”的句式写。结果会影响下一步——如果例外条件写不出来,说明这条经验还停留在感觉层面,不能直接转成脚本分支。
例外不能写成“内容质量差就跳过”,因为脚本无法判断“差”。要把它换成可读取的字段组合。常见做法是把例外归到三类:字段缺失、字段冲突、字段超出范围。
这里的关键取舍是:例外到底应该“终止流程”还是“转入人工队列”。如果例外很少且影响小,终止并记录就够了;如果例外反复出现,说明字段设计本身需要调整,而不是继续加分支。
假设你写了两条规则:第一条是“目标读者为空时标记待补充”,第二条是“备注含‘紧急’时优先处理”。现在有一条资料同时满足这两个条件。脚本先执行哪条?如果先标记待补充,它可能永远不会进入优先队列;如果先进入优先队列,又可能把不完整资料推给人工。
这类冲突不能靠感觉解决。你需要给例外排一个明确的判断顺序,并写清每一步的输出。例如:
这个顺序本身就是需求的一部分。动作是给例外编号并规定先后,结果是后续新增例外时你知道该插在哪一层,而不是把所有条件堆在一起。
人工经验转脚本时,另一个常见遗漏是只记录“处理结果”,不记录“为什么被例外”。例如脚本把某条资料标记为跳过,但没有保留触发跳过的字段值。过一段时间你回头看,无法判断是字段缺失还是冲突导致的。
做法很简单:每个例外分支都要求输出原始字段和触发条件。比如用 skip_reason 记录“目标读者为空”,用 source_value 保留原值。这样当例外数量变化时,你能区分是资料本身变了,还是判断条件写错了。
需要说明的是,例外数量归零不能单独证明脚本正确。它也可能是字段被上游统一填了默认值,或者例外分支根本没有被触发。要结合原始值的分布一起看,才能判断下一步是调整字段还是调整分支。
在交付脚本需求前,用下面这组问题过一遍,能减少后续返工:
如果其中一项答不上来,先不要继续写更多分支。回到你手头那份资料,补一个假设样例,把缺失的条件写清楚,再决定这个例外应该终止流程还是转入人工队列。这样脚本需求才真正承接了人工经验,而不是把例外藏进一句“特殊情况特殊处理”。