先给结论:不要因为工具开始接受新格式,就把输入规范整体改写。更稳妥的做法是分层处理——把已经确认稳定的对象格式保留为默认规范,把新格式放进一条可回退的旁路,只有在批量样本中连续验证通过后,才考虑替换主规范。下面按保留、改写、退出三种取舍展开,重点说明各自成立的前提。
“对象格式变化”至少可能指三种不同情况,处理方式并不一样。第一种是输入载体的变化,例如从单个URL列表改为结构化条目;第二种是字段结构的变化,例如原来只填目标对象,现在要求附带语言、地域或类型标记;第三种是对象本身的粒度变化,例如从页面级对象变成模板级或目录级对象。三种情况里,只有第一种通常可以直接沿用旧规范,后两种往往要求改写输入规则。
判断方法很直接:取一小批旧规范下本来能正常处理的对象,原样丢进新格式要求里。如果只是载体换了、字段含义没变,旧规范可以保留;如果出现字段无法对应、同一对象被拆成多条或合并成一条,就说明输入规范必须改,而不只是换一种提交方式。
当新格式属于可选入口、旧格式仍然被接受时,保留旧规范是成本最低的选择。适用前提有三个:旧规范下的对象仍能被完整表达;新格式没有引入旧规范无法承载的必填信息;团队没有必须迁移的时间压力。满足这三点时,把旧规范作为主路径,新格式只用于个别确实需要额外字段的样本。
具体动作可以这样设计:维护一份“旧规范默认值”清单,记录每个字段在旧规范下隐含的取值。当某个对象改用新格式提交时,逐项对照这份清单,确认没有因为格式切换而丢掉隐含信息。这个动作的结果会直接影响下一步——如果对照后发现大量对象依赖旧规范的隐含默认值,就说明迁移条件不成熟,应继续保留旧规范,而不是急着改写。
需要改写输入规范的情形,通常是字段语义发生了变化,而不是字段数量增减。例如原来一个字段同时承担“对象类型”和“范围”两种含义,新格式把它们拆成两个字段。这时继续沿用旧规范会导致歧义:同一串输入在不同对象上被解释成不同含义。
改写时不要一次性替换全部规则,而是先写一份字段映射表,把旧字段与新字段的对应关系、无法对应的部分、以及默认填充规则列清楚。假设一批对象里,约七成可以一一对应,剩下三成需要人工判断,那么合理的做法是让这七成走自动映射,三成进入人工队列,而不是为了统一而给三成对象强行填默认值。强行填默认值会让错误被格式掩盖,后续排查时更难定位。
改写完成后,用一个可区分原因的检查来验收:把映射失败的对象单独归一类,看失败原因是字段缺失、语义冲突还是取值越界。三类原因对应三种修法,混在一起统计没有意义。
个别样本成立、规模化后出现例外,是输入规范需要退出的典型信号。判断依据不是例外数量的绝对值,而是例外比例是否随对象规模上升而上升。如果小批量时例外很少,批量扩大后例外持续增加,说明旧规范隐含了只在特定样本上成立的前提,继续保留只会把问题推到下游。
退出不等于放弃工具,而是把这类对象从当前输入规范中移出,改用更保守的处理方式,例如先做对象归类、再分批提交。退出前要确认例外不是由数据本身质量问题造成的——采集不完整、字段为空、对象重复,都会表现为格式不兼容,但根因不在输入规范。把数据质量问题误判为格式问题,会导致规范被反复改写却始终不稳定。
假设某批输入原本都是页面级对象,规范按“一行一个页面”设计。后来混入少量目录级对象,工具仍能接受,但输出结果开始出现同一内容被重复计入的情况。此时有三种取舍:保留页面级规范,把目录级对象单独拆成页面列表;改写规范,增加对象类型字段并分别处理;退出该批对象,先完成归类再提交。
如果目录级对象占比很低且能可靠拆分,保留加拆分更划算;如果目录级对象会持续增加,改写规范并引入类型字段更合适;如果连对象类型都无法稳定判断,退出并先做归类是唯一不会放大错误的选择。三种取舍没有绝对优劣,取决于例外比例、可拆分性和后续增长趋势。
无论选择保留、改写还是退出,都要保留一份旧规范的快照和对应的样本结果。格式变化后如果结果异常,需要能回答“是格式导致的,还是数据本身变了”。没有快照,就只能凭印象判断,容易把数据波动误当成规范问题。这一步不影响单次提交能否成功,但决定了下一次调整是否有依据。