跳转至

第五十三章 · 自动

三月三号早上八点四十七分,赵岩的工单答复先进来了。

「技术支持中心三层东侧库房,交换机二十一号口,流量记录:二月一日零点至今,持续为零。告警配置自二月一日启用以来,零触发。上月月报抄送在附件,『流量监控运行正常』一栏,有我的签字。」

后面还有一行:「机器开着机,键盘上落了一层灰。谁也没再碰过它。」

陈稳把这两行抄进记事本,在「零触发」后面画了一条横线,前面补了半行:10.14.1.88:告警上线三十九天,零触发。

它一月二十二号那天上了网,进了配置中心,只看了一遍,什么都没改。从他填进清单、发给万钧的那一晚开始,再没动过。机器没动,人也停了。一台开着机、落着灰的机器,在没人锁的库房里替一个人守了三十九天的空。

他给赵岩回了三个字:「收到。告警别撤,继续挂。」

赵岩回得很快:「懂。告警只报给我,不进群。」

九点零三分,王磊把演示页面投上大屏。第四栏是空的。

栏标题在,数据没有。屏幕正中一行红字:

ERROR 1142 (42000): SELECT command denied to user 'ro_demo'@'10.%' for table 'settle_diff_order'

「周五联调都好的。」王磊说。「今天早上权限组把账号收了。」

陈稳打开工单。只读账号上周四提交,周一早上九点零六分驳回,理由一行:演示用途,不予开通生产库只读权限。重新申请需部门负责人审批,五个工作日。

中期评审定在三月十一号,周四。日期两周前就锁死了,相关方名单纪衡亲自圈的:他,技术 VP,易文,周其正,万征,架构组两个人。

「五个工作日,赶不上。」王磊说。

「不改申请,改页面。」陈稳说。「第四栏不读生产库,读归档库的快照表。四千四百笔全在里面,只读权限本来就有。前三栏走调度平台接口,也是现成的。」

「那页面上就不是实时数了。」

「影子比对的结果落地在归档库,跟生产是同一批数,晚十分钟。页面加一行缓存说明,写清楚就行。」

陈稳把驳回邮件截了图,原样贴进周报,一个字的说明都没加。周报模板最后一栏,他早就写好了那行字:答不上来的时候,把问题原样放进周报。放进去了,下周就有人答。

「就这样放着?」王磊问。

「放着。」陈稳说。「工单里驳回了,周报里看得见。两条路都留了痕,谁也不欠谁。」

「为什么不做 PPT?评审带个 U 盘就完了。」

「PPT 是死的,散会那天就过期。」陈稳说。「这页每天不一样。谁哪天打开,看到的就是那天的数。」

「要是有人问,你这页是不是挑了好看的数放进去。」

「页面上有水印。打开人的工号和时间,右上角常驻。截图自带出处,谁截的图,出处跟着谁走。」

王磊把这个工具的代码拉下来看了一遍,在注释头加了一行:auto_brief。

「你不起名字,我来起。」王磊说。

陈稳没有改。

周二上午十点,DBA 组在工单里回复:演示库可以建在归档库,只读,白名单限三张表,越界即断连接。落款是一个陈稳没打过交道的名字。

王磊把回复念了一遍。「他们怎么知道我们缺什么。」

「周报抄送全组。」陈稳说。「问题放进去了,就轮到别人答。这句是你自己贴在显示器上的。」

王磊那张便利贴还在显示器边框上。最上面一条是旧的:问题比事实有用。最下面一条是新的,贴得比旧的正。


周三上午,陈稳先自己查了一遍交接系统。第三批文档的发送记录,空。他把书面答复那两行又读了一遍,然后给张毅发消息:「孙宇第三批交接文档,交接系统里没有发送记录。你最后工作日之前,能不能把它当面移交给王磊。」

张毅回了两个字:「可以。周五上午。」

下午四点,陈稳把演示页的链接发给顾源,正文一行:中期评审用这页,请您给意见。

顾源回了三行。

「第三栏加总数。抽不抽其次,总数不能没有。」

「第四栏的通知模板,让业务线的人先过一眼再上会。」

「其余不动。」

陈稳加了总数行:四千四百一十二笔,九十六万三千四百元,一笔不差。又把第四栏的截图发给周其正,附一句:评审之后,这个通知商户会第一次收到。周其正回了三个字:「早该有。」

傍晚易文顺路过来,在工位边上停了停。

「明天我坐在哪儿。」她问。

「随便坐。」

「我坐边上。」易文说。「你也想好一句话——要是有人问,这些数字是不是你和她一起弄的,你怎么答。」

「页面脚注有 commit hash。每个数是谁写的,Git 里都有。」

「你知道就好。」易文说。「我在场,有人就会往那上头想。你想好了再说,别现场找词。」

晚上八点,陈稳把迁移顺序的两个选项发给顾源,电话跟过去。

「一,先迁历史,后切实时。二,直接双写两周再切。我倾向一。」

「一。」顾源说。「历史不迁,实时切了也是两个人记账。」

「双写还要吗。」

「要。双写跑满两周,逐日比对为平,再切。报备写日期,别写『尽快』。」

电话挂了。当晚书面报备:三月十六迁历史,三月十七起双写,三月三十一比对为平后切实时。纪衡回:「按这个执行。」

隔了一分钟,又来一条:「重写那个空括号,我填了。下周一到。是谁,周一你自己看。」

陈稳把这条读了两遍,没有问。

三月九号晚上,工具成型。一百六十行 Go,王磊起的 auto_brief,名字定下来不再改。每栏一个取数函数,一个渲染函数,中间一层缓存:三十秒刷一次,取数超时两秒,自动重试一次,重试再失败就显示上一轮的数据,页脚加一行灰字说明数据滞后。

「页面上可以坏,不能停。」陈稳在注释里写。

水印是他最后加的:右上角,访问人工号加时间戳,常驻,不随截图丢失。写完他用水杯挡住摄像头给自己截了一张图,工号和时间清清楚楚浮在第三栏上头。

commit message 写了三行:

feat: auto_brief——评审演示页,数据自动汇总

水印:访问人工号+时间戳,常驻

取数超时自动重试一次,失败回落上一轮数据并标注。页面可以坏,不能停。

推送之前他把整个仓库翻了一遍,确认里面没有一句给人看的话——没有解释,没有铺垫,没有「为了让大家更直观地」这种句子。页面第一行是栏标题,最后一行是「本页无人工输入」。

三月十号下午,万征在 Git 上给仓库点了关注,发来一条消息:「这工具,数据平台能不能抄一套。我们十二张指标页,全是手工导 Excel 拼 PPT。」

「工具在 Git,谁都可以拉。」陈稳回。「取数按权限走,你们的数你们自己接。」

「 watermark 这个设计好。」万征回。「谁看的,什么时候看的,跟着图走。我们那边的报表,截图满天飞,从来不知道出处。」

当晚十一点,陈稳在工单里把后台账号、SQL 清单、页面部署路径各贴了一份,标题写「中期评审材料附件」。做完关显示器。对面那栋楼,冷白灯那扇这两天多了一件家具的影子,像一张桌子。他站了不到一分钟就回了卧室。

三月十一号早上七点四十,他提前到。页面从昨晚十一点开始自己刷,日志里躺着七百二十一轮,全部成功,其中两次取数超时自动重试,都在凌晨三点前后。他把这两行日志截了图,存进「回去」文件夹旁边的「自动」文件夹——这个文件夹是昨晚新建的,里面只有这一张截图。


三月十一号下午两点,五楼大会议室。纪衡,技术 VP,易文,周其正,万征,王磊记录,架构组两个人,加陈稳自己,九个。蒋辉不在名单上——他的交接在另一条线上,三月十九日之前走完。

开讲前两分钟,蒋辉抱着一个纸箱从会议室外的走廊经过。箱子封着,没有写字。他在玻璃墙外面停了两秒,朝里面点了下头,继续往电梯走。屋里没人回头。王磊的笔在记录本上顿了一下,又继续写。

讲台上没有翻页笔,没有打印稿。

「材料在工单里,我念没有意义。」陈稳说。「这页是我写的工具,现在打开是活的。数字自己跑,出处自己带。各位随时打断。」

投屏亮了。五栏。

第一栏,影子比对:二十一万一千三百笔,新旧差异单逐行比对,零行差异。栏底是任务编号和调度参数截图,附查询链接。

第二栏,错误率曲线,十一点七到一点八七。每个数据点上悬着当天的取数 SQL,点开就能看。

第三栏,自动核销差异单。栏首是总数:四千四百一十二笔,九十六万三千四百元。默认展示最新五十笔,翻页到底。每一笔点开,左边原始差异,右边核销依据,金额精确到分。

第四栏,通知改造预览。auto_accepted 后面跟着 auto_accepted_notified,模拟通知一封一封往下滚,套的是商户话术模板。

第五栏,迁移顺序,三个日期,来源是周三那封书面报备。

页面最底下,一行小字:本页无人工输入。

纪衡第一个开口。

「数据谁审的。」

「没人审。」陈稳说。「只读账号,白名单三张表,取数 SQL 全部在 Git,每栏脚注带 commit hash。页面上任何一个数,从页面到库,中间不经过人。」

「数错了呢。」

「错也错在明处。每一步有记录,比经过人好查。」

技术 VP 往前倾了倾。

「这页本身,谁维护。」

「页面自己。三十秒刷一次。刷挂了,告警进值班手机。」

「值班手机谁看。」

「排班表。主号十五分钟不确认,升级备号。规则引擎排的,不经过人。」

易文开口。

「第三栏的排列顺序,谁定的。」

「没人定。按时间倒序,代码写死的,排序规则在脚注里。」

「抽样那点 Bias 你避掉了。」易文说。「这页要是早两年有,数据治理那个项目,我跟你们开的会能少一半。」

万征接着问:「这个工具,会开放给别的组吗。数据平台那边用得上。」

「工具在 Git,谁都可以拉。」陈稳说。「数据按权限走。」

「先不要。」纪衡说。「先把结算这条线跑稳。」

14:07,陈稳裤兜里的手机震了一下。

他把手机掏出来,扣在讲台上,屏幕朝下。

赵岩:「二十一号口有流量。上行。开始 14:07:32。四十八天来第一次。」

投屏上,模拟通知还在滚。屋里只有页面滚动的声音。

14:11,第四栏滚到一半,卡住了。两秒,三秒。王磊的手往键盘那边伸。

「等。」陈稳说。

第五秒,页面自己重试成功,通知接着往下滚。栏脚多出一行灰字:14:11:03 取数超时,自动重试一次,成功。

「这一下也要给各位看?」周其正问。

「要。」陈稳说。「这页不是不会坏。是坏了自己报。」

「汇金那四百三十一笔,在第三栏里吗。」周其正又问。

「在。按业务线筛,第三行。」陈稳把汇金筛出来。十一月,四百三十一笔,占九十六万三千四百元里的四万一千二百零七元。「上个月对数的时候,这些笔在马菁的台账里是另一个数。通知改造上线以后,这个数她会第一个收到。」

14:16,手机又震。陈稳没有掏。

「评价一下。」纪衡说。「这个演示,跟你自己讲一遍,差在哪。」

「差在出处。」陈稳说。「我讲的,各位要信我。这页讲的,各位只要信库。」

技术 VP 笑了一声,很短。

「我头一次见汇报不带翻页笔的。」他说。「别的线我不替别人说。」

14:23,页面停在第五栏。三个日期:三月十六,三月十七,三月三十一。

「我的问题问完了。」技术 VP 靠回椅背。

纪衡合上本子。

「明天上午十点,我办公室。带上这页的后台账号和 SQL 清单。」

众人散了。王磊把记录本递过来,结论栏两行:中期评审通过,迁移顺序按报备执行;演示页面自下个双月会起作为例行汇报载体。

陈稳掏出手机。

14:24,赵岩:「停了。上行 3.8 GB,持续十五分四十七秒。交换机登录记录:本地 console,没走网络。库房无摄像头,门禁无记录。人已经走了。」

陈稳回:「流量整段、console 时间戳、交换机日志,全部导出留底。目前只有你我两个人知道。」

赵岩回:「懂。」

他把手机收起来,给纪衡发:「纪总,评审材料之外有个事,跟八月一日那条线有关。今晚送过去,还是明天一起。」

纪衡没有回。


回家路上他绕去了鞋柜那件事的反方向——先在楼下便利店买了一盒胃药。抽屉里他妈塞的那两盒还没拆,但旧盒只剩四粒。药不能断,这句是他自己记住的,没人提醒。

到家九点。鞋柜最上层,那双四百八的皮鞋摆得正,鞋油的光还没暗下去。最里面的纸箱没动,箱口封着。厨房沥水架上,辣酱空罐倒扣着,跟今晚洗的碗隔一个位。他把碗摆进去的时候,让了一个位——不知道从哪一次开始的,那个位一直留着。

窗前站了一分钟。对面那栋楼,冷白灯那扇的家具影子又多了一件,像一张桌子。


会议室空了。定时关灯把顶灯灭了一排,大屏没断电。

演示页还在三十秒一刷。第一栏的零行差异,第二栏曲线末端的一点八七,第三栏栏首的总数。页脚那行小字在半黑的屋子里亮着:

本页无人工输入。

他把记事本摊在讲台上。

3 月 11 日 14:07:32–14:23:19。上行 3.8 GB。console 本地登录。无门禁记录,无摄像头。

他把笔帽按上。大屏刷新到下一轮,零行差异没有变。


到家九点。楼下便利店他进去了一趟,买了一盒胃药。抽屉里他妈塞的那两盒还没拆,旧盒只剩四粒。药不能断,这句是他自己记住的,没有人提醒。

鞋柜最上层,那双四百八的皮鞋摆得正,鞋油的光还没暗下去。最里面的纸箱没动,箱口封着。厨房沥水架上,辣酱空罐倒扣着,他把今晚洗的碗摆进去的时候让了一个位——不知道从哪一次开始的,那个位一直留着。

台灯下,记事本翻到新的一页。他写:3 月 12 日。张毅最后工作日。上午,孙宇第三批文档移交,王磊经手,回复走系统。

底下隔了一格,又写半行:3.8 GB 上去的,是什么。

写完他合上本子。窗前站了一分钟。对面那栋楼,冷白灯那扇的家具影子又多了一件,像一张桌子。桌子的方向,朝着他这边。


← 第五十二章 走了 · 目录 · 第五十四章 沉默 →