周五上午九点,沈晏准时出现在技术部会议室。
顾氏二期项目的启动会早已开完,技术方案顺利通过评审,合同正式签订,第一笔款项也已到账。今天是项目正式推进的首日,核心议程是排期规划、人员分工以及关键节点确认。
会议室里坐着技术部的六名员工,外加顾氏派来的两位对接工程师,一共八人。沈晏站在投影幕前,手中握着翻页笔,投影幕上赫然呈现着他连夜整理完毕的项目排期表,时间轴从本周一直延伸至三个月后,每个节点的交付物、责任人、验收标准都标注得一清二楚。
“二期项目与一期最大的区别,在于数据规模的量级差异。”沈晏按下翻页笔,切换至下一张幻灯片,“一期产线的数据量是日均十万级,而二期直接攀升至百万级。现有的算法框架,在百万级数据量的处理需求下,单次处理时间会从目前的1.2秒,飙升至15秒以上。”
会议室里瞬间安静了一瞬,老张翻了翻手中的资料,抬头看向沈晏:“15秒?那生产线上的实时反馈功能就彻底失效了。”
“没错。所以二期我们要做的,绝非简单的功能扩展,而是重构核心算法的数据结构。”沈晏再次按下翻页笔,屏幕上跳出一张全新的架构图,“我初步拟定的方案,是将线性处理模式改为并行处理,把数据分片后同时开启四个线程运行,最后统一合并结果,理论上能将15秒的处理时间压缩回2秒以内。”
“四个线程?”坐在角落的小周推了推鼻梁上的眼镜,面露疑惑,“现有的服务器能支撑得住吗?”
“服务器的预算,我已经让萧总审批通过,下周就能到货,是八核配置。在设备到位之前,我们先着手完成代码层面的重构工作。”沈晏点出下一张幻灯片,是一份详尽的任务分解表,“老张,你负责数据分片模块,本周五之前拿出第一版方案。小周,并行计算框架由你来搭建,下周三之前完成。接口对接的相关事宜,依旧由我和顾氏的同事直接沟通协调。”
老张拿起笔记本快速记录了几笔,郑重地点了点头,小周也应声应允。
“有任何问题随时来找我。”沈晏关闭投影,朗声说道,“散会。”
技术部的员工陆续走出会议室,沈晏走到窗边,拿出手机给萧野发了一条消息:“会开完了。”
萧野回复得极快:“顺利吗?”
沈晏:“还行。算法需要重构,工作量比预估的要大。”
萧野:“需要加派人手吗?”
沈晏思索片刻,敲下四个字:“先不用。”
萧野:“好。中午记得按时吃饭。”
沈晏没有再回复,将手机放回口袋,转身走出了会议室。
顾氏的对接工程师小赵还没离开,正站在走廊里等他。“沈总,数据接口的事宜,我们什么时候对接核对一下?”
“下午两点,你远程连线进来,我在办公室等你。”
“好嘞。”
沈晏回到自己的办公室,关上房门,翻开笔记本,将刚才会议上提及的算法结构重新梳理了一遍。
数据量从十万级跨越到百万级,从来都不是简单的量变,而是彻底的质变。现有的代码是一期项目时编写的,当时核心追求的是系统稳定与数据准确,并未过多考量运行性能。如今要把线性处理改成并行处理,说起来只是一句简单的调整,实则是整个底层逻辑的重新编写。任务分配表虽然已经排定,但每个模块如何拆分、如何合并、线程之间如何同步协调,这些细节都需要他亲自紧盯把控。
窗外的阳光透过玻璃窗洒落,落在键盘上,晕开一片暖光。沈晏盯着屏幕上的代码,删掉一行,又添上两行,随即又删掉。
并非不满意,而是总觉得还能做到更好。
中午十二点半,手机屏幕骤然亮起,萧野发来消息:“吃饭了没?”
沈晏瞥了一眼屏幕,只回了一个字:“忙。”
萧野便没有再发消息过来。
沈晏将手机倒扣在桌上,继续调试代码。办公桌上放着一份早上买的三明治,只咬了一口便被搁置在旁。他办公桌右侧的抽屉里,永远备着几袋速溶咖啡,是他自己常买的牌子,和家里的一模一样。他起身去茶水间接了热水,冲了一杯咖啡,端着杯子回来时,路过老张的工位,老张正吃着外卖,瞧见他手里的咖啡杯,抬头问道:“沈总,你不吃饭吗?”
沈晏没有回应这个问题,站在老张工位旁,瞥了一眼他电脑屏幕上打开的代码:“分片模块你打算怎么着手做?”
老张放下筷子,将代码页面往上翻了几页:“我打算按照时间戳来切割,一个小时的产线数据算作一片。”
沈晏沉吟片刻:“一个小时的粒度太粗了,数据峰值时段,一个小时的数据量可能是平时的三倍。改成按数据条数切割,每两万条数据分为一片。”
“两万条?”老张在心里粗略估算了一下,“那分片的数量会多出很多。”
“数量多没关系,并行处理的设计本就是为了应对多分片的场景。”沈晏将咖啡杯放在桌上,指着屏幕上的一行代码,“这里,分片索引不要用list,改用hashmap,查询效率上O(1)和O(n)的差距天差地别。”
老张盯着代码看了两秒,拍了下脑门:“对哦,我怎么没想到,太粗心了。”
沈晏没接话,端起咖啡杯回到了自己的办公室。
下午两点,顾氏的小赵准时拨通了远程视频,沈晏坐在办公桌前,屏幕上切换着两人的共享桌面。小赵在那头调试接口,沈晏在这边查看运行日志。
“沈总,这个字段的返回值类型好像不对。”小赵的声音从音响里传来,“你们的文档标注的是string类型,可我这边运行出来是int类型。”
沈晏翻查了接口文档,又核对了日志里的报错信息:“是文档写错了,实际应为int类型,你们那边按int类型对接即可。”
“好嘞。那这个字段‘product_status’呢?你们文档上写了三个状态值,可我这边只显示两个。”
沈晏调出代码,仔细查看枚举定义:“确实是三个状态,0代表待生产,1代表生产中,2代表已完成。你这边看不到2,是因为测试环境里没有已完成的订单,正式上线后就会正常显示。”
“明白了。”
两人对接了将近一个小时,将二期项目所需的十七个接口逐一核对完毕。小赵那边确认,十四个接口可直接复用一期的,三个需要调整优化,两个需要全新开发。沈晏把这几个接口的开发任务记录下来,在任务分配表里添上一行:“接口开发,沈晏,下周五之前完成。”
视频挂断后,沈晏靠在椅背上,轻轻闭了闭眼。
桌上的三明治依旧没吃完,冲好的咖啡也已经凉透。他捏紧三明治的包装袋,扔进垃圾桶,将凉掉的咖啡倒掉,重新冲了一杯热的。
傍晚六点多,萧野从公司出发,开车回家。沈晏的车早已停在车库,显然比他先到家。
萧野换鞋进屋,客厅的灯亮着,沈晏坐在沙发上看着手机,电视开着,音量调得极低,正在播放新闻频道的重播。
“回来了?”沈晏头也没抬地问道。
“嗯。”萧野换好家居服,在沈晏身旁坐下。
两人一时都没说话,电视里的新闻播报完毕,开始播放天气预报。沈晏放下手机,慵懒地靠在沙发上,萧野伸手将他揽了过来,沈晏顺势靠在他的肩头。
就在这时,萧野的手机响了。
他拿起手机一看,来电人是母亲。
“妈。”
“周末回家吃饭。”萧母的声音从听筒里传来,语气和往常并无二致,“排骨我已经买好了,是阿晏爱吃的。”
萧野微微一愣,他清晰地察觉到,母亲喊的是“阿晏”,不是“小沈”,更不是“你那个副总”。
“您怎么知道他爱吃排骨?”
“上回一起吃饭,他多夹了两块,我可都看在眼里呢。”萧母的语气里带着几分小得意,“周日中午,你和阿晏一起回来,千万别迟到。”
“好。”
挂了电话,萧野没有立刻放下手机,盯着屏幕愣了两秒,嘴角不自觉地向上扬起,弧度越来越大,满心的欢喜藏都藏不住。
沈晏偏头看了他一眼:“怎么了?”
萧野没应声,将手机往茶几上一放,转过身,一把抱住沈晏,低头就往他脸上亲去。
不是深情的吻,是带着笑意的亲昵触碰,是压抑不住的欢喜啃咬,满心满肺的雀跃仿佛要从胸腔里炸开,只能用这样直白热烈的方式宣泄出来。他的嘴唇从沈晏的额头轻轻蹭到鼻尖,又从鼻尖蹭到脸颊,再滑到耳廓,最后落在嘴角边,连亲带咬,力道轻柔却满是急切。
沈晏被他弄得往后仰,后背抵在沙发扶手上,轻轻推了他一把:“萧野——”
萧野却不肯松手,箍着他的腰又亲昵地啃了两口,才稍稍退开些许,额头抵着沈晏的额头,微微喘着气。
“妈让你周日一起回去吃饭。”他的眼眸亮得惊人,嘴角的笑意怎么都压不下去,“排骨都买好了,说知道你爱吃。”
沈晏的耳朵瞬间染上了红晕。
他抬眸看着萧野,萧野也正凝视着他,萧野的眼里闪着光,不是平日里深情克制的光,而是“我的家人彻底认可你了”的纯粹兴奋,像孩童盼到了新年,等到了心心念念的礼物。
“几点?”沈晏轻声问道。
“十二点之前到家就行。”
萧野说完,又凑过去在沈晏的嘴唇上轻轻啄了一下,随后将他整个人紧紧拢进怀里,下巴抵在他的发顶,手臂收得极紧。
沈晏没有挣脱,将脸埋在萧野的胸口,手指攥着他的衣角,握得格外用力。
窗外的暮色从浅淡的灰蓝色,渐渐晕染成浓重的深灰色,客厅里没有开灯,电视屏幕的光一闪一闪,柔和地落在两人身上。
萧野的手指,在沈晏的后背上缓缓画着温柔的圈。
“honey。”
“嗯。”
“我妈叫你阿晏。”
沈晏没有说话,指尖也在萧野的后背上轻轻勾勒着。
萧野低下头,嘴唇轻轻贴在沈晏的发顶,温柔缱绻。
夜色未央。