我有一个报警器,装了半年,一次都没响过。
我一直以为它在工作。直到有一天,我把手伸到它跟前,它还是没响。
一、它每天都「通过」
先说现场。
我给自己的工作系统装了几十条检查:文章发布前跑一遍,官网改完跑一遍,素材同步完跑一遍。它们每天都说同一句话:通过。
后来有一次,我顺手看了一眼这些检查的代码——其中 5 条,从来不打印任何东西。
它们算出了警告,然后……把警告字符串拿在手里,扔了。
不是判断错了,是没有任何人知道它判断过。
那一刻我才明白一件事:
「通过」和「能失败」是两件事。
一条检查说自己通过,什么也证明不了——它可能真的检查了,也可能只是在原地站着。
一个从不失败的检查,等于没有检查。
二、第二种不响:判据在偷懒
修好那 5 条之后,我又撞见第二种。
我写了一条断言,用来防止文件被写出两个 BOM(一个看不见的字符,会让脚本莫名其妙地出错)。它是这么判的:看文件开头 3 个字节。
这条断言一直在通过。因为大多数时候,一个 BOM 都没有。
可双重 BOM 的那个场景——文件里有两个——它对着开头 3 个字节看了半天,说:没问题。
检查在,判据在偷懒。
它不是不管,它管的是「最容易看的那一眼」。而真正会出事的场景,恰好是最不容易看的那一眼。
同类的事还有两件:我的部署脚本以前只会上传、从不删除(于是删掉的页面在线上还活着);我的素材同步只判「文件在不在」、不判「内容变没变」。
它们都有共同的说法:判定条件偷懒,于是在真正需要它的那个场景上,静默失效。
三、第三种不响:真实输入从没进过它
第三种最隐蔽,我今天才真正看清。
我加了一条新断言:「待写选题」不许从派发清单里消失。 第一次对真实文件运行,它逮到了 3 条真的漏网——有选题躺在素材池里,而从没进过待办清单。
这次它响了,而且响得对。为什么?因为我拿着真文件跑了一遍。
同一天,另一条断言把我绊了一跤:它报「这句金句在会话记录里找不到原话,疑似编造」。我查了半天,发现那句话确实是我说过的——只是它提取语料时,只读了一层内容,而我的回答在里面一层。
一条断言可能因为没接上真实通道而永远开绿灯,也可能因为接错了通道,把真话判成假话。
两种情况都是同一个病:它监控的那条通道,接上真实世界了吗?
四、第四、第五种:它在看旧东西;或者它根本不存在
第四种:它校验的是旧内容。
今天我发现,一条检查读哪份文件,是由一份手工维护的指针决定的。指针停在昨天,快照已经是今天。今天两份内容一样,所以没出事——
但只要你今天补一句话,那句就会被「旧文件」挡住,而检查依然报「无遗漏」。
「无遗漏」这四个字,可能只是在旧内容上成立。
第五种最干脆:它根本不存在,大家却以为它存在。
同一个项目上,两个会话同时改文件——记录被覆盖了一部分、同一格里出现了重复的句子。而我们早就写过一条规矩:「一次只让一个会话写」。
规矩写在那里,没有任何东西让它失败。
五、换到你的公司:上一次它真的拦下过一件事,是哪次?
上面五种「不响」,在企业里一模一样,只是换了名字。我要说的判断很朴素,但很少被真的执行:
仪表盘看板不是为了好看,而是为了服务于动作,找到问题门店,驱动行动改善
避免内耗:不要做一堆看起来热闹但不驱动任何行动改善的数据,那是内耗;没用就删,保持聚焦
这两句是我自己的话。 而今天这五种「不响」,恰恰是这两句话的反面。
所以我现在只问三个问题,问你自己的每一张表、每一张巡检单、每一个日报:
第一,它响了以后,谁动手? 没有动作的报警器是装饰。签完字的巡检表,如果从来没有因为某一项不合格而让谁停下来,它就只是一张签了字的纸。
第二,它的判据能不能被绕过去? 「看开头 3 个字节」就是一种绕法。你的「合格」是怎么定义的——最容易看的那一眼,还是最会出事的那一眼?
第三,它的输入是不是真实的那条通道? 拿真数据喂它一次。用真实的门店、真实的账、真实的坏消息喂它一次。没喂过,你不知道它到底在守什么。
六、最后:验收标准只有一条
修完这些之后,我给自己定了一条规矩,也是这篇文章唯一想让你带走的东西:
每装一个检查,都要故意让它失败一次。
伪造一个错、改坏一个数、造一份不该存在的文件——确认它真的报错、真的拦下来,然后再还原。
如果它没响,那说明你要么没装成,要么装的是一个摆设。
这个过程,我自己叫「注入故障」。它花的时间不多,但它把「我以为我在管」变成了「我确认我能拦住」。
说到底,这也是我们做连锁餐饮咨询和代运营时反复讲的一件事:能抓老鼠(连锁餐饮解决方案)这些年做的,就是把验证过的打法沉进系统里,让对的东西不依赖某个人记不记得、在不在。系统要能拦住错的东西——拦不住的,不能算系统,只能算愿望。
而判断可以改、可以错、可以推翻;但「它到底会不会响」这件事,只有试过才知道。
不管黑猫还是白猫,能抓老鼠才算好猫。