TouchX Schedule 的 README 在 gate 的说明里列了六个 smoke 命令。我打开其中一个,smoke:api-boundaries,里面规定了两个文件的行数上限:v1-api.ts 不许超过 700 行,social-v1-api.ts 不许超过 450 行。

这两个文件在 6 月 1 号上午 9 点 44 分以前不是这样的。那个提交叫 split v1 api handlers,79 个文件,+24,001 -11,387,v1-api.ts 从 5,593 行变成了 508 行,social-v1-api.ts 也删掉了五千九百多行。一分钟后,9 点 45 分,下一个提交加了验证门和那几个 smoke 脚本,+2,472 行。

先拆,再上锁,中间隔了一分钟。我觉得这两件事是一起想的:5,593 行的文件好不容易拆开,不上锁多半会自己长回去。提交里没写,我是对着时间猜的。

检查

我一共打开了两个脚本。这两个都叫 smoke,其实都不跑服务,只是读源码文件,数行数,找字符串。v1-api.ts 必须引用 17 个处理模块,文件里最多只能留一个直接写的 method 判断,social-v1-api.ts 一个都不能留;客户端代码里不许出现裸的 fetch(,必须走共用的 api-client;几种事件类型的颜色不许直接写十六进制,必须取共用的 token。

README 把这些检查要防的事写成了一长句,我数了数有五件:接口入口别退回一个大处理函数,后台页面别绕开共用的外壳,小程序和移动端别各抄一份接口封装和主题色,小程序那几个页面别退回不走真实接口的样子,还有一件,V1 收尾阶段不许提前引入 PostgreSQL、Redis 和 Docker Compose。最后这件我猜是防自己手痒。

十二天

5 月 17 号晚上 7 点 22 分到 7 点 33 分,11 分钟里连着进了五个提交:日历的包,导入和通知的接口,几张日历页,小程序和移动端的壳,还有一个 React 写的后台 CMS(+1,021 行)。半夜又来了一个 React Native 的原生工程。5 月 29 号下午 4 点 25 分,一个提交把后台并进了后端自带的 Nuxt 页面,60 个文件,+5,265 -8,130,净删了两千八百多行。README 现在写着,独立的 apps/cms 已经移除。那个 React CMS,从搭起来到并回去,一共 12 天。

再看 6 月 1 号早上那五个提交:9 点 44 分拆接口,45 分上验证门,46 分让各个端共用一个接口客户端,47 分合并后台外壳的样式,48 分写 V1 收尾状态。从 5 月 29 号到这里,我觉得做的差不多是同一件事,把前面搭得太快、分出去的东西收回一处。上面那五件要防的事,头三件和这几个提交对得上名字,我猜是对着它们写的。

一夜

6 月 8 号凌晨 0 点 53 分到 4 点 53 分,整整四个小时,40 个提交。我按标题数了一遍:16 个 test,9 个 Harden 或 Tighten 一类的,8 个文档,6 个重构一类的,fix 只有 1 个,feat 是 0。

其中 2 点 32 分到 2 点 45 分,13 分钟里五个提交围着一个东西转,生产环境 smoke 的 URL 守卫:先给它写测试,再测直接填生产地址的情况,再测地址怎么解析,再把守卫重构一遍,最后给分类逻辑补测试。给守卫写测试,再重构守卫,再给重构后的写测试,听起来有点绕。

整个仓库 125 个提交,3 月 14 个,4 月 33,5 月 27,6 月 51。6 月最多,标成 feat 的只有一个,就是 6 月 1 号加验证门的那个。回头看,前三个月大概在想能不能跑起来,到了 6 月才开始怕它走样。检查在这个阶段的分量,感觉不比功能轻。

serverOffsetMs

我最想讲的是服务器时间那一条。README 里写,小程序算今天和本周、移动端算今天和课表的时候,不许直接信手机的时间,要通过 today-brief 这个接口拿服务器时间,自己记一个 serverOffsetMs。移动端那份检查写得更死:必须有 let serverOffsetMs = 0,必须有 serverOffsetMs = serverNowMs - Date.now(),必须有 getServerNow 和 syncServerOffsetFromIso 两个函数,排课的代码里还不许出现 new Date().getHours()。

这条规矩不是 6 月才有的。4 月 3 号晚上 9 点 40 分,一个标题写着 sync today view with backend time 的提交,就已经把今天页自己的 Date.now() 计时器拿掉,改成从外面传 nowTs 进来。6 月 8 号凌晨 3 点 11 分,规矩和守规矩的检查才在同一个提交里进来,整个提交加了 482 行删了 97 行,其中两个检查脚本各多了 48 行。

README 只写了这是为了算当前周和今天的课,没写为什么不信手机的钟。我猜是怕手机时间不对,课表跟着错。这种检查只看得见写法,看不见行为,变量名都对、逻辑错了,它照样过。

最后一个

这一段的最后一个提交是 6 月 24 号晚上 8 点 58 分,一个 fix,标题写的是课表导入的纠错那一圈。6 个文件,+267 -104,有后端的处理函数,导入服务,测试,还有小程序里的一个页面。课表导入的预览、确认、历史、续传,是 4 月 27 号那一天进来的。那天一共 16 个提交,导入占了五个,离这个 fix 隔了快两个月。