第78章 特邀选手(1/5)
这个周,林泠在办公室加班到晚上八点。
不是单位要求的,没人要他加班。
是季度末的数据迁移出了个让他放不下的问题——上游系统改了时间戳格式,从Utc+8改成了ISo 8601带时区偏移的格式,下游的分析模型在合并时间序列时把相邻两个时间窗的数据叠在了一起。
偏差不大,不到两个百分点,但足够让他在验证集上盯了整整一个下午。
两个百分点的偏差在业务报表上几乎看不出来,但他是做模型的,他知道这种系统性误差如果不从根上掐掉,会在后续所有叠加分析中被逐级放大,到最后偏差会大到让整个预测模型失去意义。
同事小赵走的时候背着包站在他工位旁边,说林哥你不走啊。
他说再查一会儿,有个字段格式不对。
小赵说了句那你别太晚,转身走了,脚步轻快,年轻人周五晚上总有安排。
林泠没抬头,盯着屏幕上那两列时间戳数据,左边是迁移前的,右边是迁移后的,同一个事件的记录在迁移后偏移了整整一个时区。
不是数据丢了,不是字段错了,而是时区参数被隐式吞掉了——这种bug最恶心,表面看一切正常,每一行数据单独拎出来都没毛病,只有放在时间序列里叠起来才会露出马脚。
他沿着数据链路一层一层往回追溯。
第一层是应用层的日志清洗脚本,没毛病。
第二层是数据仓库的EtL存储过程,参数传递也没问题。
追到第三层,在嵌套查询的JoIN条件里找到了那个被隐式转换吞掉的时区参数——FRom_UNIxtImE函数在缺少显式时区参数时默认使用了系统时区,而迁移前和迁移后两台服务器的系统时区设置差了八个小时。
他在whERE子句里补了一个时区参数,重新跑了验证集,偏差归零。
他靠在椅背上揉了揉眼睛。
办公室里只剩他一个人,空调外机在窗外嗡嗡转着,日光灯管发出细微的电流声,窗玻璃上倒映着天花板上一排惨白的灯影。
他把排查过程从头到尾整理成一份文档,每一步的排查逻辑、每一个排除掉的假设、最终定位的代码行号和修复方案,清清楚楚写在里面,然后发给相关同事。
关上电脑的瞬间屏幕黑下去,倒影里他的脸看起来有点累,但眼神是踏实的——数据对了,周末可以安心钓鱼了。
关了灯锁了门走出办公楼,夜风裹着一股湿润的泥土味扑面而来。
周六凌晨四点半闹钟响了。
他按掉闹钟坐起来,比平时多花了几秒钟才彻底清醒——昨晚加班到家洗完澡躺下已经快十二点了,睡眠时间不到五个小时。
但他不觉得困。
钓鱼日的精神状态跟工作日不一样,不管前一天多累,只要想到要去水边,脑子就会自动切换到另一个模式。
他摸黑套上衣服,轻手轻脚地下楼。
车载温度计显示十一度。
路上经过那家二十四小时营业的早点铺,灯已经亮了,包子屉冒着白汽,一团一团地往上升,在路灯下白得发亮。
老板娘正往油锅里下油条,面团落进滚油里滋啦一声响,油面上炸开一层金黄色的泡。
他停了车摇下车窗,老板:两个肉包子和一杯豆浆,你从车里取了八块钱。
到西郊湿地的时候天刚刚亮透。
本章未完,请翻下一页继续阅读.........