清晨,山崎弘树比往常更早地来到了办公室。
他没有开灯,径直走到窗前,拉开了百叶窗。
窗外的天光刚刚开始泛白,大阪湾方向的海平面上浮现出一线淡淡的橘红色,将整座城市从夜色中缓缓唤醒。
他站在那里,望着那片逐渐明亮的天际线,沉默了很久。
昨晚山崎弘树一夜未睡。
他坐在家中的书房里,将翔鹤从最初拿到那份代码到现在所有的技术文档重新翻看了一遍,试图在自己脑海中重建那条完整的决策链条。
他反复问自己同一个问题:如果那份代码从一开始就有问题,为什么七十二小时测试中没有暴露?
为什么一百六十八小时测试中也没有暴露?
为什么在客户现场运行了数百小时后,问题才开始逐渐显现?
答案只有一个。
因为问题被设计成了只有在长期运行后才会暴露的模式。
这个念头在昨晚第一次闪过他的脑海时,他握着水杯的手僵在了半空中。
他放下水杯,闭上眼睛,让那个念头在自己的意识中慢慢沉淀、酵。
他不愿意相信这个可能性。
因为这不仅意味着翔鹤的技术路线存在根本性的缺陷,更意味着山崎制作所可能从一开始就落入了一个精心设计的陷阱。
但如果这个可能性是真的,那么所有的事情就都能说得通了。
那些在后半段测试中出现的微小波动,那些在客户现场逐渐增大的精度漂移,以及代码本身那种“教科书级别的规范”
背后隐藏的某种刻意为之的完美。
如果代码有问题,那么问题最可能藏在什么地方?
在他的脑海中,那份代码的逻辑架构开始像一张地图一样缓缓展开。
主循环、分支判断、参数传递、误差收敛函数。
每一个模块都在他的记忆中清晰可见。
他沿着那条逻辑链路一步一步地向前推进,在一个不起眼的分支节点处停了下来。
那是一个误差收敛函数的参数更新步骤,在代码中看起来完全正常,逻辑上也没有任何破绽。
但如果。。。如果在这个函数中,有一个参数的初始值被设定成了一个极其接近理论最优值、但并非真正最优值的数值呢?
这个偏差在短期运行中会被系统的其他容错机制所掩盖,只有在长期运行后,才会通过累积效应逐渐显现出来。
山崎弘树拿起桌上的电话,拨通了软件审查组负责人的号码,声音比往常快了一些:
“第三层误差收敛函数中,那个用于初始化卡尔曼滤波增益矩阵的常量参数,它的数值来源是什么?是理论计算值,还是实测拟合值?”
电话那头沉默了几秒,然后传来一阵键盘敲击声。
过了一会儿,软件审查组负责人的声音响起,带着一种不确定的语气:
“部长,那个参数的数值……在代码注释中标注为‘理论推导最优值’,但我们没有找到与之对应的推导过程文档或实测验证记录。”
山崎弘树握着话筒的手指微微收紧了一下。