土拨鼠日志:同一件事算两遍,迟早对不上
今天修了两个「看着已经好了、其实没好」的问题。它们有个共同点:不是功能没做,而是同一件事被算了两次,然后两次的答案打起来了。
一、一条正则,把「已结案」判成了「等你回话」
现象很怪:同一条会话,列表右上角的灯是绿的(已结案),气泡底部的章却是黄的(在等你回话)。一个人看两个地方,得到两个相反的结论,这不叫显示问题,这叫判断错了。
顺着判据查下去,根因是一条正则写歪了:它中间那段分隔符用了「可有可无」的量词,于是可以退到零个字符,后面的否定断言就永远成立。结果凡是结尾写了「要您做的:无」的正常收尾,全被当成「还在请示你」。
这里值得记一句:「语法上写得出来」不等于「判得对」。可选量词后面跟否定断言,先想清楚它会不会退到零个字符让断言恒成立。这种 bug 最难抓的地方在于——它不报错,它只是安静地给错答案。
二、灯和气泡各算各的,就一定会有第三种答案
第二个坑更结构性:状态灯被后台的重试票无条件覆盖。票要十几分钟才撤,这期间已经干完的会话一直亮着「跑命令中」,看着像永远干不完。
为什么会有这种事?因为同一个事实在两个地方各算了一次:列表算一遍,气泡算一遍,后台追跑又算一遍。三处代码各写各的规则,只要有一处漏改,就会出现自相矛盾的场面。
改法是老办法但很有效:只认最后一条真账,把结论算一次发出去,让列表灯、气泡章、后台追跑共用同一把尺子。真在跑就是跑命令中,在等你回话就是黄闪,明确结案就是绿——不再有第三种答案。同一个事实要么只算一次,要么让一处去调另一处,别指望三份代码长期保持一致。
三、每条回话只记了「跑了多久」,没记「几点跑完」
第三个问题出在记录本身:每条回话只存了耗时多少毫秒,没存完成时刻。于是翻历史的时候,你只知道「这一轮花了三分钟」,却不知道它是哪天几点的事——查问题时这个信息基本等于没有。
现在每条回话的信息条末尾都补上了具体的完成时间(年月日时分),电脑和手机都显示;手机端原来那个「本轮耗时」,也换成了「这条回话真正说完的时刻」,不再错位。
顺手把一个相邻情况也归了类:结尾是「明问你还要不要做某件事?」的,算等回话,不算还在跑。判据要覆盖真实说话方式,而不是只覆盖你想得到的写法。
四、这次学到的一条验收标准
「显示对了」不算验收。这次真正的验收动作是:拿真实的历史记录全量跑一遍前后对比,看变了哪几条、每一条变化能不能解释得通。如果某条状态从红变绿你说不出理由,那多半是改出了新错,只是还没被发现。
- 先复现:改之前能不能稳定看到矛盾(一边绿一边黄);
- 再解释:改之后每条变化都要有理由,说不出理由的当 bug 处理;
- 最后收口:加上一个相邻输入(比如「明问要不要」这种),确认没被误判。
如果你也在用助手干长活,这类细节其实直接影响你对它的信任度——状态说得准不准,比它答得多漂亮更重要。功能页 里有长任务与后台追跑的说明,定价页 是按真实消耗算的账,想直接上手可以 下载 装一个自己跑一遍。
五、三条能直接抄走的经验
- 判据写完先问一句:它能退到零个字符吗? 能退,后面的否定断言就是恒真,等于没判。
- 同一个事实只算一次。 两处各算一次,短期看不出问题,长期一定对不上,而且对不上的时候没人知道自己错了。
- 记时间,别只记耗时。 「花了多久」回答不了「什么时候」,而排查现场九成问的是后者。
今天没有加什么闪亮的新功能,就是把三个「看起来没问题」的地方拧到了一致。这类活不出图、没有截屏可炫,但它决定了你下次打开会话时看到的那盏灯,到底能不能信。
土拨鼠 Marmot