他以前面对这种故障会直接跳进代码,靠接口的速度优势快速试错——写一个临时补丁,跑一遍测试,报错了再改,改了再跑,在反复迭代中找到最快能用的方案。那是他在瑞联养成的习惯,也是做完初级植入后接口带给他的能力——手指的反应速度比大脑的决策速度快那么一点点,那一点点在应急场景里就是优势。
但现在他没有这么做。他靠在椅背上,把错误堆栈从头到尾逐屏滚动,花了约二十分钟把每一行关键报错日志都读了一遍。然后他从抽屉里翻出一支铅笔和一张便签纸,开始画故障树——从最底层的时钟源漂移开始,往上画到时间同步模块的时间戳错位,再往上画到数据帧校验失败,最后画到接口超时。每一层之间用箭头连接,箭头旁边标注了因果关系。他的字迹比以前更潦草了一些,但每一个箭头都画得很直。
画完之后他把便签纸放在桌上,站起来走到白板前面。项目组几个年轻工程师还在争论版本回滚方案,他听了几分钟,然后开口:“先不回滚。回滚之后依赖冲突只会更复杂,而且上次安全升级之后我们的内核版本已经不兼容旧版库了——你们看看上一轮适配测试报告里那页兼容性矩阵就知道。绕过时间同步模块自己写校验逻辑也不行,因为你绕过去之后所有分布式节点的时间戳就失去了统一的参照系,不同节点的信号采集窗口会对不齐,帧校验通过率反而会降得更快。”
他拿起白板笔,在板上画了一套极简的架构图。“我们从中间层切入。不修时间同步模块,也不绕它,而是在数据帧校验这一层加一个冗余校验缓冲。核心逻辑是:当校验模块检测到时间戳错位导致的帧校验失败时,不要立刻丢弃该帧——先把它暂存在一个环形缓冲里,然后通过一条备用低带宽通道把异常信号的元数据旁路到第二校验节点,在第二节点用独立时钟源重新确认时间戳合法性,确认之后再回写主链路。这样主链路不用等时间同步模块修复,第二校验节点本身就带了独立的时间戳验证,整个系统的实时性可以维持在可容忍的延迟范围内。”
他在白板上边画边讲,用词干净利落,逻辑链条每一环都严丝合缝。几个年轻工程师起初还皱着眉,但当他画到第二校验节点如何与主链路同步状态时,有人开始在笔记本上快速记录。他每画一个箭头都会回头看一眼那个记录的人,确认对方跟上了才继续。孟总在会议室后面站着听完了全程,没有打断,只是在周明远讲到环形缓冲的容量规划时轻轻点了一下头。
方案定下来之后,整个项目组又花了不到两小时完成代码实现和压力验证。孟总在故障复盘会上当众说了一句:“这次应急处理,速度不是最快的,但思路是最清楚的。周总今天画的这张图,建议架构组拿去做故障处理流程的范例。”他在白板上拍了张照片,然后用手指点了一下图上的第二校验节点,补了一句——“这个独立校验的思路,下一版接口的安全架构里可以借鉴。”
散会后周明远回到工位,坐在椅子上,把那张画了故障树的便签纸折好放进抽屉。以前他处理这类故障用的不是这种方法。那时候他依赖的是接口的速度优势——手指比大脑快一点点,试错的循环密到几乎没有间隙。但今天他刻意放慢了。不是不能快,是不想快。不是因为快是错的,是因为他发现,在“快”里面他无法确认哪些决策是接口帮他选的,哪些是他自己选的。而今天这张故障树上的每一个箭头,都是他自己画的。
下午他把今天故障处理的经过整理成一份简短的复盘笔记——不是公司要求的格式,是他自己习惯的那种记录方式。写到结尾时他想起了张薇以前在NGI-7测试后说过的一句话,大意是在特定参数下被试会出现对自主感的观察能力。他当时不理解这话是什么意思。现在他理解了。他落笔写道:“以前觉得那二十分钟是浪费时间,因为接口可以让我更快地试错。现在觉得不是。那二十分钟里我在画故障树——从底层时钟源漂移到上层接口超时,一层一层推,每一个箭头都是我自己画的。这个推的过程没有神经信号,没有数据包,没有延迟,它是我自己的。接口可以让手指更快地敲代码,但它不能让一个人在错误堆栈前面选择先停下来想清楚。那个选择——停下来的选择——不是数据包,是我的。”
晚上他给张薇发了一条消息:“今天处理了一个故障。用的不是接口的速度,是另一个东西。”张薇回了一个问号。他盯着那个问号看了一会儿,打了一行字又删了,再打,最后只发了一句话:“以前做测试的时候,那些用来抑制自发运动的认知资源——现在好像空出来了一些,可以用到别的地方。”
张薇隔了很久才回。她发了一张图——实验室白板上的那个极小的蓝点,还是上次画上去的那个,旁边被她加了一行新字:“认知资源重新部署:从抑制到观察。”字迹是她的,蓝色记号笔,收笔处有她习惯性的轻微上扬。下面又跟了一条消息:“这是你走完那四轮回调之后,神经系统自己重建的