平台工程

零路由补路由 · 普查要能推翻已写的代码

入档:2026-08-20 来源:PB Arena(pb.tiaozhuxiansheng.com)自检收口与全站接入 hash 路由的整轮会话,两批共 9 文件 +476 −40,后端用例 28 → 29,两次部署上线 状态:已上线并在生产站逐条实测;insight 1/2/3/4 为本次首次发现 ⚠️;insight 5 是 成稿链接存进库没人读_写入方不等于展示方_v1 家族的第四形态;insight 6 是 全站文字截断体检_检测工具本身要先被证伪_v1 的人肉版第三次现形 前情:自检46条零驳回_同类中的异类才是缺陷藏身处_v1(同项目上一轮,2026-08-19)——本篇是那一轮清单里最后一项、也是唯一的架构级缺口的落地

事实记录(不可修改区)

客观查证(不加解释)

一句话总结

改动面大的功能,普查不只是用来「开工前列清单」的——它得能推翻你已经写出来的代码;判断该不该被它推翻,看对方给的是「哪一行会和哪一行互相触发」这种机制,还是「建议重构一下」这种口号。

六条可复用 insight

1 · 普查要能推翻已写的代码 ⚠️首次

动手前摸集成点,这件事本身不新鲜。这次真正值钱的是:普查推翻了一版已经写好、语法也过了的实现

推翻一个想法很容易,推翻已经写出来的东西难得多——沉没成本是真实的,而且「它看起来能跑」会持续为自己辩护。这次做到了,唯一的原因是普查给的是具体机制switchView 里的 state.currentView 赋值会和 hash 互相触发形成回环),不是一句「建议改成单向数据流」。

判据:收到与自己已有实现冲突的建议时,先问「它给的是机制还是口号」。给得出「哪一行和哪一行打架」的,认真对待;给不出的,可以先放着。

2 · 技术选型的探路实验是免费的 bug 探针 ⚠️首次

为了判断 hash 还是 History,我 curl 了一下线上的深层路径资源。这个实验的目的是回答「能不能做」,副产品却是「现在的行为对不对」——那条兜底规则对 .js 也生效,意味着任何资源路径写错都不是 404,而是 200 + 一坨 HTML 当脚本,浏览器只会抱怨 MIME 不符,报错位置和真正的原因完全对不上

这个 bug 存在很久、不在任何清单上、正常使用也不会暴露(只有写错路径时才现形,而那时人会去查别的地方)。

规律:选型探路和行为体检共用同一批观察。多看一眼观察结果本身,别只从里面提取「能/不能」这一个比特。

3 · 完备方案 ≠ 该做的方案 ⚠️首次

普查建议的「三十处收编、每个弹窗各占一格历史」是完备的做法。实际采用的「一处 popstate 拦截」不完备——按返回只能关最上面那个弹窗,关不掉叠起来的一摞。

但本站几乎不叠弹窗,这个差别在实际使用里遇不到;而代价差了一个量级:三十个改动点意味着三十次「漏一处就出现历史与显隐脱节」的机会。

规律:来自普查 / 审计 / AI 的建议默认朝完备去,因为提建议的一方不承担回归成本。落地方必须自己做这一步权衡。

配套动作:把取舍写下来(这次写进了更新报告单列一节)。不写的话,半年后回看只会看到一个「没做完」的实现,不知道当时权衡过什么。

4 · 异步修复要问「在途期间会发生什么」 ⚠️首次

时钟跳变那条,第一版修法是加防重入守卫——它挡住了「一个 tick 内递归穿三阶段」,但挡不住「连续几个 tick 各推进一格」,因为重新对时是异步的,在途期间旧偏移仍然有效。自测时才发现还是走到了结算。

规律:给异步流程加同步守卫是不够的。守卫覆盖的是「同一次调用栈」,而异步意味着在结果回来之前还会有别的调用栈进来。修完问一句:这个操作在途的那几百毫秒里,谁还会跑?

这条差点就当成修好发出去——写自测的那几分钟是唯一拦住它的东西。

5 · 初值与初始渲染分处维护,中间没有同步动作,两边必漂 ⭐ 同族第四形态

state.currentView 初值写死 "lobby",而 HTML 里 active 的是首页,init 全程一次 switchView 都不调。于是首屏所有读这个状态的分支判的都是错的——对战悬浮条、房间聊天、赛事轮播、反馈的来源页字段。

为什么一直没暴露:用户几乎总会先点一下导航,一点就对了。只有「打开就直接用首屏功能」这条路径会撞上,而这条路径少见到没人报过。

这是 成稿链接存进库没人读_写入方不等于展示方_v1 家族的第四形态:前三种是「写入方 ≠ 推进方 / 展示方」「界面演完 ≠ 链路存在」,这一种是**「初值方 ≠ 渲染方」**。

判据:看到一个初始状态时问三句——这个初值是谁写的?谁在渲染时用它?它俩碰过面吗? 中间没有一次同步动作的,一定已经漂了。

6 · 「觉得自己知道于是没查」要变成动作,不是提醒 ⭐ 第三次现形

三次同一种错,全在写回归测试时:action 名 finished 写成 finish、好友接受漏了 /respond、赛事列表接口误加 admin 前缀。每次都是凭印象手打字符串。

这是 全站文字截断体检_检测工具本身要先被证伪_v1 那条律的人肉版本——那条讲「工具的输出是待验证的假设」,这条讲「我的记忆同样是待验证的假设」。

前两次我在复盘里写了「要先查」。没用,第三次照犯。 光记住不管用,得改成动作:

写任何调用接口的测试前,先 grep 出路由定义和 action 白名单,把实际字符串贴过来,不手打。

关联文档

类型/平台工程主题/踩坑