第一百五十章 58%的回声
数据是从周三下午开始烂的。
王总公司的三十辆货车,每辆车一个数据文件夹。林知行打开第一个文件夹的时候,还以为自己点错了——里面是一张手机拍的照片,拍的是一本软抄本,纸页发黄,字迹歪歪扭扭,记录着某辆车过去三个月的出车时间、油耗、里程。
他打开第二个文件夹。Excel表格,格式倒是规整,但列名是"出车时间""跑了多少""油钱""备注"——不是标准字段,没法直接入库。
第三个文件夹里是三十七张微信群截图。
"王总公司的数据比预想的差十倍。"林知行坐在折叠桌前,盯着屏幕,把这句话跟方小满说了一遍。方小满正在沙发上回客户消息,头都没抬:"意料之中。小物流公司嘛,能有数据就不错了。"
问题是不能只"有数据"。调度算法需要标准化的输入——车牌号、司机ID、出车时间、线路编号、油耗、里程,这些字段缺一个,模型就跑不起来。
三十辆车,十五种数据格式。有的用纸质记录拍照上传,有的用Excel但列名不统一,有的根本没有历史数据只有微信群里的口头汇报。
林知行在白板上画了一个表:左边是"需要的字段",右边是"现有数据"。对应关系一目了然——大部分是错位的,有些干脆对不上。
他花了一下午写了一个数据清洗脚本,试图用正则表达式从微信群截图里提取关键信息。试了三辆车的数据,准确率大概60%——还有四成需要人工校对。
脚本跑完之后他盯着输出结果看了一会儿,把椅子往后推了推。
"周然,"他喊了一声。
周然的工位在客厅角落,一张折叠桌上摆着笔记本电脑和三个显示器支架——支架是方小满从旧货市场淘的,三十块一个,有一个摇摇晃晃,底下垫了半本《三体》。
"在。"周然抬起头,眼镜片上反射着屏幕的光。
"数据格式的事,你能处理吗?"林知行把脚本的输出结果发给他,"脚本只能解决一部分,剩下的得人工对。三十辆车的数据,我估计得花点时间。"
周然把输出结果看了一遍。
"行,"他说,"我来。"
没有问"为什么是我",没有问"什么时候要",没有问"有没有文档"。
林知行想起了自己刚入职灵犀的时候——周睿给他的第一份工作也是数据清洗,五十万条用户交互数据,格式乱得像垃圾堆。他也没问,只是坐下来开始干。
区别在于,那时候他有两周时间。周然没有。
周四晚上十一点,林知行去厨房倒水,路过客厅,看到周然还坐在工位上。屏幕亮着,他面前摊着一叠打印出来的数据表——纸质记录的那一部分,他从照片里手动抄录的。
"周然,"林知行说,"今天先到这里。"
周然没抬头:"还有几辆车的数据没对完。"
"明天再说。"
"明天还有别的事。"周然把一条数据手动输入Excel,"方哥说下周要去长沙跟王总开会,数据不整理完没法做演示。"
林知行想说"我来帮你",但他看了一眼自己的屏幕——明天上午要跟陆可盈汇报财务数据,下午要调调度算法的参数,晚上还要给贺记粉面的贺总写一份菜品优化方案。
他没有多余的时间。
"那你别太晚。"他说。
周然点了点头。
林知行端着水杯回了自己的工位。
周五晚上,他在行军床上躺下来的时候,听到客厅那边还有键盘声。手机显示凌晨一点十二分。
周六早上他起来的时候,周然已经在工位上了。桌上多了一个塑料袋,里面是两个冷掉的包子和一盒豆浆。
"吃了没?"林知行问。
"吃了。"周然说。
林知行看了一眼他的屏幕——数据表已经从十五种格式统一成了三种。进度比他预想的快。
"还有多少?"他问。
"还有八辆车的数据。"周然揉了揉眼睛,"有几辆车的纸质记录字太潦草,我得打电话跟司机确认。"
林知行点了点头。
他想说"辛苦了",但这两个字卡在嗓子眼里,没有出来。
周日下午,数据终于跑通了。
三十辆车,七百三十二条出车记录,全部清洗完毕,字段统一,格式规范,可以直接导入调度系统。周然把最终的数据集发到群里,附了一行消息:"数据整理完了,30辆车,732条记录,已验证。"
林知行打开数据集,抽查了十辆车的数据——准确率接近百分之百。有些字段周然还做了补充标注,比如"该司机周三固定休息""该线路高峰期绕行"之类的备注,是从微信群聊天记录里挖出来的信息。
他盯着屏幕,想打三个字——做得好。
手指放在键盘上,停了两秒。
然后他打了一行字:
"还有五辆车的数据没有做交叉验证。"
消息发出去之后,他盯着聊天窗口看了三秒。
周然秒回:"好,我现在做。"
林知行把手机放在桌上,走到窗边。
窗外四环路上车流不断,傍晚的阳光从西边打过来,把客厅的墙壁照成橘红色。方小满坐在沙发上,手里的烟烧了半截,灰掉在了裤子上。
他看了林知行一眼。
"你刚才在群里说什么了?"方小满问。
"说还有五辆车没做交叉验证。"
方小满把烟灰弹掉,站起身,走到林知行旁边。
他没有立刻说话。
"怎么了?"林知行问。
方小满看着窗外,沉默了几秒。
"知行,"他说,"你对周然说话的方式,跟周睿对你说话的方式一模一样。"
林知行的手指停在了手机壳上。
"周然三天没怎么睡觉,"方小满继续说,"把三十辆车的数据从垃圾堆里捡出来,整理成能用的样子。你看到了,你心里也知道他做得好。但你说出口的,是'还有五辆车没做交叉验证'。"
他转过头,看着林知行。
"周睿当年怎么对你的?你做完五十万条数据清洗,他说什么了?他说'格式还有一处不规范'。你做完可信度评分模块,他说什么了?他说'理论基础不足'。你每次做出成果,他只看到你没做到的部分。"
林知行的喉咙发紧。
"你现在对周然做的,是一样的事。"
方小满没有提高音量。他的语气平得像在念一份清单。
林知行没有反驳。
因为方小满说的是对的。
他站在窗边,阳光照在他脸上,但感觉不到温度。他的手攥着手机,指节发白。
"我去抽根烟。"方小满拍了拍他的肩膀,往门口走。
门关上之后,客厅安静下来。
林知行走到折叠桌前坐下。桌上摊着那个三块钱的笔记本——他习惯随手记东西,记完就翻过去,很少回头看。
他把笔记本翻到前面,一页一页地找。
翻到第四十七页的时候,他停住了。
那一页的纸已经发黄了,边角卷起来,有些字迹因为手汗变得模糊。但最上面那行字还看得清——
我在做O(1)的工作,但我的能力是O(n log n)的。
这行字是三年前写的。那时候他刚发现自己的算法思维在简单任务上被浪费了——接的小项目太浅,用不着他真正的本事。他在灵犀的角落工位上,在灰色工牌的阴影里,在周睿给他的边缘工作中,写下这行字。
O(1)的工作——数据清洗、跑脚本、整理文档。
O(n log n)的能力——问题拆解、系统架构、技术决策。
他那时候觉得自己被浪费了。
现在他看着这行字,忽然意识到——
周然在做O(1)的工作。三十辆车的数据清洗,手动抄录纸质记录,打电话跟司机确认潦草的字迹。这是最基础、最枯燥、最不被看见的工作。
周然的能力是O(n log n)的——他能从微信群聊天记录里挖出有用信息,能给数据做补充标注,能把十五种混乱的格式统一成标准字段。这不是简单的执行,这是判断力。
但林知行看到的,只是"还有五辆车没做交叉验证"。
他把笔记本翻回刚才的页面。
上面写着——
算法能算出最优路线,但算不出人心。
三年了。我还是在等别人告诉我变量是什么。
他在下面加了一行——
现在的周然,就是当年的我。
笔尖在纸上停了两秒。
他又写了一行——
但我没有变成周睿。我只是以为自己没有。
写完之后他盯着这两行字看了很久。
方小满推门进来的时候,他把笔记本合上了。
"想通了?"方小满问。
"没有,"林知行说,"但我知道该做什么了。"
他拿起手机,打开跟周然的聊天窗口。
输入框里周然的最后一条消息是:"好,我现在做。"时间是十七分钟前。
林知行打了一行字——
"今天辛苦了。明天放半天假。"
发送。
他盯着屏幕,等回复。
三十秒后,周然回了:
"不用,我还有一辆车的数据没整理完。"
林知行看着这条消息,心里忽然涌上来一种说不清的东西。
不是感动。不是心疼。是一种苦涩的认同——
三年前,沈渡说"你可以休息一下",他也是这么回答的:"不用,还有代码没写完。"那时候他觉得这是勤奋,后来他才明白,那是一个没有退路的人不敢停下来的本能。
周然也是。
二十五岁,大专学历,第一份正经的技术工作,老板是一个创业公司的创始人——他不敢休息。不是因为他不想,是因为他不确定"休息"会不会变成"不被需要"。
林知行盯着屏幕,打了一行字,删掉了。又打了一行,又删掉了。
最后他发了一条消息:
"放半天假。这不是商量,是命令。"
发完之后他盯着屏幕,心跳比平时快了一点。
周然的回复来得比上次慢。过了五分钟,屏幕上弹出一个字:
"好。"
林知行把手机放在桌上,靠在椅背上。
方小满站在旁边,把刚才的对话都看在了眼里。
"你刚才那条消息,"方小满说,"比你过去三个月对周然说的所有话加起来都有用。"
林知行没有接话。
他看着天花板,想起今天下午的数据——三十辆车,七百三十二条记录,准确率接近百分之百。
也想起另一组数据——长沙十家门店的第一批库存预测,准确率58%。
58%。
那是一个让人心凉的数字。比扔硬币好不了多少。
但58%不是终点。三个月后,那个数字从58%到了72%,再到82%。每一次提升,都是一条一条数据喂出来的,一个一个夜晚熬出来的。
周然做的这些数据清洗,看起来是O(1)的重复劳动。但没有这些劳动,调度算法连58%都跑不出来。
有些人负责造火箭,有些人负责拧螺丝。
但火箭上天的时候,功劳不能只记在造火箭的人头上。
林知行没有把这句话说出来。他知道说出来太刻意了——周然不需要他表扬,周然需要的是不被当成螺丝钉。
他能做到吗?
他不知道。
但他至少可以做一件事——让周然明天睡到自然醒。
方小满把烟盒扔在沙发上,去厨房热剩饭。
林知行一个人坐在折叠桌前,笔记本翻开着。
今天的页面上多了四行字——
算法能算出最优路线,但算不出人心。
三年了。我还是在等别人告诉我变量是什么。
现在的周然,就是当年的我。
但我没有变成周睿。我只是以为自己没有。
他把笔记本合上,塞进枕头底下。
窗外的天已经全黑了。四环路上的车灯还亮着,从这边流向那边,像一条永远不会停的数据流。
他躺在行军床上,盯着天花板。
58%。
那是一个起点。不是终点。
他闭上眼睛。
明天还有很多事要做。但今晚,他允许自己什么都不想。
方小满在厨房喊了一句:"吃饭了。"
林知行翻身起来。
折叠桌上摆着两碗泡面,方小满往里面加了两个鸡蛋。
"周然呢?"林知行问。
"他回房间了,"方小满说,"我让他先歇着。"
林知行点了点头。
两个人坐下来吃面。没有说话。
吃到一半,方小满忽然说了一句:
"知行,你今天那个'命令',不错。"
林知行抬头看了他一眼。
"但下次,"方小满用筷子指了指他,"可以在发命令之前,先说一句'做得好'。"
林知行愣了一下。
然后他笑了。
不是苦笑,是那种被人戳中了的、有点不好意思的笑。
"行,"他说,"下次。"
方小满把最后一个鸡蛋夹给他,自己把面汤喝干净了。
(本章完)