许知然盯着这行字看了五秒,然后回:现在?
陈序:嗯。
她拿起手机往开发组走,走到一半又停下,返回来从抽屉里翻出充电线和备用机,这才继续走。
403工位,陈序正在吃饭。不是食堂的饭,是一个保温盒,里面装着家常菜。许知然走过去时,他筷子停了一下,然后放下,把保温盒推到一边。
“打扰你吃饭了。”许知然说。
“吃完了。”陈序扯了张纸巾擦嘴,动作很快。
许知然看了眼那还剩大半的饭菜,没戳穿他,把手机递过去:“给。”
陈序接过手机,目光在她脸上停了一下:“可能要装几个监控程序,下午才能还你。”
“没关系,我有备用机。”许知然晃了晃手里的另一部手机,然后故意问,“陈工,这种复现不了的bug,你也接?”
陈序已经把她的手机连上数据线,正在电脑上操作什么。听到她的话,他手指顿了一下,然后继续敲代码。
过了几秒,他开口,声音比平时低一点:“你的bug,我接。”
许知然愣了一下。
陈序没抬头,继续盯着屏幕,但许知然看见他的耳朵尖开始泛红。从耳垂开始,一点一点蔓延,和昨天在她面前写代码时一模一样。
她没说话,转身走了。
走出几步,她回头看了一眼。陈序还是那个姿势,低着头盯着屏幕,但手指没动。何照正从旁边探过头,嘴巴一张一合在说什么,表情贱兮兮的。
许知然收回目光,嘴角弯了一下。
下午三点半,许知然的手机被还回来了。
陈序把手机递给她时,手指上有一道红痕,是被数据线勒出来的。他指给她看手机里新装的一个应用:“监控程序,后天可以删。以后如果还闪退,它会自动抓取详细的日志。”
许知然接过手机,看着他手指上的红痕,心里动了一下。
“找到原因了?”她问。
陈序点头:“你的手机系统版本有个底层bug,和我们的SDK有冲突。只有在特定内存占用情况下才会触发,所以很难复现。”
“那怎么办?”
“我已经绕过处理了。”陈序说,“改了几行代码,以后不会再闪退。”
许知然看着他的眼睛:“你为了一个偶发闪退,研究了半天?”
陈序没说话,但目光没有躲开。
许知然又问:“如果今天提这个bug的是别人,你也会这样吗?”
陈序沉默了两秒,然后说:“不会。”
只有两个字,但他说得很清楚。
许知然垂下眼,把那两个字在心底过了一遍。然后她抬起头,笑着说:“谢谢陈工,那我先回去了。”
她转身离开,步子比来时轻了一点。
回到工位,苏桐立刻凑过来。
“手机都交出去了?”苏桐压低声音,“陈序帮你查bug查了一下午?”
许知然嗯了一声,把陈序的话复述了一遍。
苏桐听完,沉默了三秒,然后意味深长地说:“为了你一个偶发闪退,专门研究半天?知然,他对你不一样。”
“哪里不一样?”
“哪里都不一样。”苏桐掰着手指数,“第一,这种无法复现的bug,正常开发直接驳回;第二,就算不驳回,也是让你自己多观察,谁会上手帮你看;第三,你注意到没有,他说的不是‘这个bug我接’,是‘你的bug,我接’。”
许知然没说话。
苏桐盯着她的表情,笑了:“你也注意到了,对不对?”
许知然端起杯子喝水,不接话。
但晚上回家后,她打开了电脑,登录bug系统,点进陈序的处理记录。
三年两个月,处理bug总数两千四百多个。她一条一条翻下去,翻了一个多小时,翻到眼睛发酸。
然后她确认了一件事。
两千四百多个bug里,陈序对所有无法复现的问题回复都是同一个模板:请补充复现步骤或提供更详细的日志。没有例外。
直到今天,直到她的bug编号1015。
她翻回那条记录,看着他的回复:“已处理。绕过底层冲突,优化SDK兼容逻辑。”
标准的技术用语,看不出任何私人情绪。
但她知道,他今天下午说的那四个字,从来没对任何人说过。
你的bug,我接。
许知然盯着屏幕,手指轻轻敲着桌面。然后她拿出手机,给苏桐发了条消息。
许知然:你说得对。
苏桐秒回:他对你不一样?
许知然:嗯。
苏桐:那你打算怎么办?
许知然盯着这个问题,想了很久,最后回:先看看。
第二天上午,全公司收到一封邮件。
关于下周内部培训的通知。为了促进跨部门协作,本次培训采用随机分组,每组两人,名单见附件。
许知然点开附件,找到自己的名字。
分组:第七组。
同组成员:陈序(后端开发组)。
她盯着那行字看了五秒,然后抬起头,隔着半个办公区看向开发组的方向。陈序正对着屏幕,看不清表情,但何照在旁边笑得前仰后合,手还在陈序肩膀上拍。
许知然收回目光,心里冒出一个念头。
公司有三百多人,随机分组,分到一起的概率是多少?
她没算,但知道这个数字很小。
很小。
周五下午,公司租的培训场地在郊外一个创意园区。
许知然在签到处排队,前面还有七八个人。她低头看手机,余光扫到门口有人进来,抬头,正好对上陈序的目光。
他站在门边,手插在兜里,穿着件深灰色的连帽衫,比在公司时显得年轻几岁。两人对视了不到一秒,同时移开视线。
许知然转回头,继续看手机,但屏幕上的字一个也没看进去。
轮到她了。她在签到表上找到自己的名字,签完正要走,却被负责签到的人力同事叫住。
“许知然是吧?你是第七组。”同事递给她一张名牌,“你的搭档是开发组的陈序,他在那边,你可以先去认识一下。”
许知然接过名牌,往同事指的方向看了一眼。陈序正站在角落里,也在低头看自己的名牌,第七组,陈序。
她走过去,在他面前站定。
“第七组。”她说。
陈序抬起头,看了她一眼,点点头:“嗯。”
然后就没了。
许知然等了两秒,确定他没有下文,只好自己开口:“破冰游戏好像是互相介绍,你打算怎么介绍我?”
陈序想了想,认真地说:“产品体验官,入职一个月,提了十五个bug。”
许知然愣了一下,然后笑出声:“你记得这么清楚?”
陈序没说话,但耳朵尖又开始泛红。
破冰游戏开始。每组轮流上台,一人介绍另一人,限时一分钟。前面几组介绍得花里胡哨,有人唱歌有人讲段子,现场笑声不断。
轮到第七组。
许知然先介绍陈序。她站在台上,看了眼旁边的他,然后对着话筒说:“这是开发组的陈序,代码写得很好。”
没了。
台下安静了一秒,然后有人笑出声。主持人也笑了:“这位同学,介绍得也太简洁了吧?”
许知然脸微微发热:“他……确实就是代码写得很好。”
轮到陈序介绍她。他接过话筒,沉默了三秒。台下开始有人憋笑,以为他也要来一个同样简洁的版本。
然后他开口了。
“她提的bug,是我处理过最认真的。”他的声音不高,但很清晰,“每个bug都有详细的复现步骤,有录屏,有数据分析。有时候证据链比测试组还全。被她盯上的问题,基本上逃不掉。”
台下安静下来。
陈序继续说:“有一次她提了一个闪退bug,无法复现,本来可以驳回。但她附了崩溃日志,附了设备信息,附了事发时的操作路径推测。我查了四个小时,最后发现是系统底层冲突。”他顿了顿,“如果不是她的证据够细,这个问题可能永远发现不了。”
全场安静了几秒,然后突然爆发出掌声和口哨声。
许知然站在台上,耳根发烫。她余光看见陈序的耳朵也是红的,但他表情很平静,像是刚做完一个技术汇报。
主持人笑着调侃:“陈序同学,你这介绍够专业的啊。不知道的还以为你在做代码评审。”
台下又是一阵笑。
许知然侧头看了陈序一眼。他没看她,但嘴角有一个极淡的弧度。
团队挑战环节。每组需要完成三个任务,第一个是“盲人搭积木”——一人蒙眼,另一人用语言指挥,搭出一个指定的结构。
许知然看着那个眼罩,又看了看陈序:“你指挥还是我指挥?”
陈序伸手拿起眼罩,递给她:“你蒙眼。”
许知然愣了一下:“你确定?我方向感不太好。”
“我指挥。”陈序说。
许知然戴上眼罩,世界一片黑暗。她听见旁边其他组的嘈杂声,听见主持人的麦克风声,然后听见陈序的声音。
“往前两步。”
他的声音很近,就在她侧前方。许知然往前走了两步。
“停。右手边,有积木,摸一下。”
许知然伸手,摸到了积木的棱角。木头的,凉的,一块一块摞在一起。
“拿最上面那块,红色的。”
她摸到红色的那块,拿起来。
“现在,往左转九十度。”
她转。
“往前一步。”
她往前。
“停。弯腰,把积木放在你正前方。”
她弯腰,放下。手指触到桌面时,碰到了什么——是已经放好的底座。
“对。现在,往后退一步。”
许知然退后,心跳开始加速。不是因为紧张,是因为他的声音。他平时话少,在公司一天说不了几句,但现在每一个指令都清晰、耐心、笃定。不高不低,就在她耳边。
“下一块,蓝色的。在你左手边,往下摸。”
她摸到蓝色的。
“往右转四十五度。对,就那个方向。往前走一小步。停。现在放下去,轻轻放,下面那块是歪的,你感觉一下角度。”
许知然弯腰,手指触到底座时,确实感觉到了那块红色的有点歪。她调整了一下角度,把蓝色放上去。
“好。”他的声音里有一丝满意,“就是这样。”
十五分钟后,他们的积木搭完了。许知然摘下眼罩,看见眼前那个结构,和指定的图片一模一样。
“成了?”她有点不敢相信。
陈序点点头。
旁边几个组还在吵吵嚷嚷,有人把积木碰倒了,有人在互相埋怨。许知然看着眼前完美的积木塔,突然想笑。
“陈序,”她叫他。
他看她。
“你指挥得挺好。”
陈序没说话,但嘴角那个极淡的弧度又出现了。
主持人走过来检查,确认他们的结构完全正确,宣布第七组获得本轮最高分。许知然下意识伸出手,想击掌庆祝。
陈序看着她的手,愣了一秒,然后也伸出手。
手掌相触的瞬间,两人都顿了一下。
他的手掌很热,指尖有薄薄的茧。只是一触,大概不到一秒,两人同时收回手。
“合作愉快。”许知然说,声音比平时轻一点。
陈序点点头,把手插回兜里。
但那天下午,他的手心一直残留着某种温度。每次他想专注听讲,那温度就会冒出来,让他走神。
培训结束,大巴车把大家送回公司楼下。许知然下车时没看见陈序,不知道他什么时候走的。
何照拉着陈序去附近喝酒。
“你今天怎么老看许知然?”何照问,筷子夹着花生米。
“没有。”陈序说。
何照翻了个白眼:“我数了,一共十七次。”
陈序没说话。
何照等了几秒,又问:“那你说,她今天穿的什么颜色衣服?”
陈序沉默。
何照正要开口嘲笑,就听见他说:“浅蓝色。”
何照愣了一下,然后无语了。
“你连人家衣服颜色都记住了,还说没有?”
陈序端起杯子喝酒,不接话。
何照盯着他看了半天,最后叹了口气:“行吧,你继续装。”
周一早上,陈序到公司比平时早了二十分钟。
他打开电脑,第一件事是刷新bug系统。周末两天,新提交的bug有七个,他快速扫了一遍处理人。
没有许知然。
他刷新一次。还是没有。
他点进已处理列表,找到她的名字,最近的一条是上周五的bug编号1023,状态已修复。
今天没有新的。
何照来的时候,看见陈序盯着屏幕发呆,凑过去看了一眼:“看什么呢?”
陈序没回答,反而问:“许知然今天没来?”
何照愣了一下,然后拿出手机翻了翻:“苏桐朋友圈说她病了,请了病假。”
病了。
陈序盯着那两个字,觉得今天早上的bug系统安静得有点不正常。
他打开编辑器,想写代码,但手指放在键盘上,半天没敲出一个字符。
何照在旁边坐下,看了眼他的屏幕,又看了眼他的表情,然后默默转回头,嘴角憋着笑。
那天上午,陈序写代码的效率比平时低了百分之三十。他刷了八次bug系统,看了四遍已处理列表,点进许知然的头像两次。
没有新bug。
系统安静得让人难受。
周一早上,陈序到公司比平时早了二十分钟。
他打开电脑,输入密码,点进bug系统。这是每天早上的固定动作,先看新提交的bug,按严重级别排序,然后规划今天的工作。
新提交列表:空的。
他刷新一遍。还是空的。
他看了眼时间,八点四十二。可能太早了,大家还没到。
陈序打开编辑器,开始处理昨天遗留的一个性能问题。写着写着,他发现自己不知道什么时候又点开了bug系统。刷新。新提交:0。
他皱了皱眉,关掉页面,继续写代码。
九点半,何照来了。他把包往桌上一扔,掏出手机开始打电话。
“喂?苏桐?许老师病了啊?”何照的声音不大,但在安静的开发组里足够清晰,“严重吗?发烧?行行,那你让她好好休息,别急着来上班。”
陈序的键盘声停了。
他盯着屏幕,代码写了一半,光标在最后一行的末尾一闪一闪。他试图继续,但手指放在键盘上,半天没敲出一个字符。
何照挂完电话,刚坐下,就听见旁边传来一个声音。
“谁病了?”
何照转头,看见陈序盯着屏幕,表情很平静,像是随口一问。
他忍住笑,也装作随口回答:“许知然,发烧,请了病假。”
陈序嗯了一声,继续敲代码。
何照瞥了眼他的屏幕,上面还是那行写到一半的代码,光标停在原地,一动没动。
上午十一点,陈序刷新bug系统第四次。
新提交:3条。他点进去,快速扫了一遍标题和提交人。测试组的小李提了一个P3,前端组的小王提了一个P2,运营组提了一个需求建议。
没有许知然。
他关掉页面。
中午吃饭,何照拉他去食堂。陈序端着盘子坐下,吃了几口,突然问:“发烧一般多久能好?”
何照筷子一顿,抬头看他。
陈序面不改色,继续吃饭,像是刚才那个问题不是他问的。
何照憋着笑:“看情况吧,轻的一天,重的三五天。怎么,有朋友发烧了?”
陈序没说话。
下午三点,陈序刷新bug系统第七次。
新提交:1条。他点进去,是测试组提的兼容性问题。提交人:不是许知然。
他盯着那个名字看了两秒,然后关掉页面,打开工作群,敲下一行字。
陈序:bug编号1024,需要许知然复现一下。
群里安静了几秒。
然后苏桐秒回:陈工,知然今天病假,有什么bug我可以帮忙复现吗?
陈序盯着屏幕,手指悬在键盘上。
过了几秒,他回:不用,等她回来。
群里又安静了几秒。
然后有人发了一串省略号。接着又是一串。再接着,何照发了一个狗头表情。
陈序关掉群聊。
下班时间到,何照收拾东西准备走人,看见陈序还坐在工位前,盯着屏幕。
“陈哥,不走?”
“再看会儿代码。”
何照哦了一声,走了。
走出几步,他回头看了一眼。陈序的屏幕上根本不是代码,是bug系统的历史记录页面。
何照笑了一下,走了。
办公室里的人越来越少,窗外的光线从明亮变成昏黄。陈序坐在工位前,点进了一个他从没点进去过的页面——许知然提交的所有bug列表。
他一条一条往下翻。
bug编号1001:首页按钮反馈延迟。这是他处理的第一条。他记得那天她来工位,借他的热点,然后说“看来是你这个位置Wi-Fi信号比较好”。他记得她说话时的表情,平静,认真,没有得意。
bug编号1007:购物车并发问题。他记得她坐在旁边看他写代码,突然说“你代码写得真干净”。他记得自己当时手指顿了一下,耳尖发烫,不敢抬头看她。
bug编号1015:偶发性闪退。他记得自己说“你的bug,我接”。他记得她听到这句话时的表情,愣了一下,然后转身走了。
他继续往下翻。
bug编号1023,1028,1032……每一条都有详细的复现步骤,有录屏,有数据分析。连那些被其他开发驳回的bug,她也会重新整理证据,再提一次。
他翻到很晚,久到办公室的灯自动熄灭了一半,只剩他头顶这一盏还亮着。
窗外天已经黑透了。
陈序靠在椅背上,看着屏幕上那个名字,心里涌起一种奇怪的感觉。
不是欣赏,不是佩服,不是之前他对所有“好bug”的那种认可。
是别的什么。
他说不清是什么,但他知道,从今天早上到现在,他刷新了无数次bug系统,每一次都在期待一件事——
看到她的名字。
第二天早上,许知然退烧了。
她吃了早饭,觉得精神还行,就换了衣服出门。到公司时九点刚过,她往工位走,远远看见自己的桌面上好像多了什么东西。
走近了,她看清了。
一个药袋,里面装着退烧药和感冒药,药店那种包装。旁边还有一个小U盘,白色的,很普通。
她拿起U盘,发现标签上贴着一张小小的便签纸,上面只写了一个字:陈。
许知然愣了一下。
她把U盘插进电脑,打开,里面只有一个文件夹。点进去,是一个可执行文件,文件名是:页面加载时间抓取工具_v1.0。
她打开工具说明,里面写着:
本工具可自动抓取指定页面的完整加载时间,包括:
- DNS解析时间
- TCP连接时间
- 首字节时间
- 内容传输时间
- 白屏时间
- 可交互时间
支持批量测试,自动生成对比报告。
使用方法:……
许知然盯着那行字,突然想起一周前。那天她在茶水间和苏桐聊天,说要是有一个工具能自动抓取页面加载时间就好了,现在每次都要手动录屏,太麻烦。
当时陈序也在茶水间。他在接水,背对着她们,不知道有没有听见。
现在她知道了。
她握着那个小U盘,抬起头,看向开发组的方向。
隔着半个办公区,陈序正好看过来。
两人的目光在空中相撞。
不到一秒,陈序就转回头,盯着自己的屏幕,像是刚才什么都没发生。
但许知然看见了。
她看见他转头的速度比平时快,看见他的耳朵尖在日光灯下泛着淡淡的红。
她低下头,看着手里的U盘,笑了。
许知然握着那个U盘,在工位前站了五秒钟。
然后她坐下,把U盘插进电脑,打开bug系统,点新建。
【bug编号】1045
【严重级别】P3
【bug标题】测试工具建议:自动抓取页面加载时间
【bug描述】目前在测试页面性能时,主要依赖手动录屏和人工计时,效率较低且误差较大。建议引入自动化工具,可批量测试并生成对比报告。
【附件】页面加载时间抓取工具_v1.0
她敲完最后一个字,手指在回车键上停了一下。
附件里她没署名,但工具里有没有留痕迹,她不知道。
提交。
五分钟后,陈序的屏幕上弹出一条新bug通知。他点开,看到附件名称,心里一紧。
他点下载,打开,看到了那个熟悉的文件名。页面加载时间抓取工具_v1.0。他昨晚熬到十一点半写的,今早悄悄放在她桌上。
现在她把它提成了一个bug。
陈序盯着屏幕,手指悬在键盘上方。他想了三秒,点开私聊窗口。
陈序:不用提bug,这个工具只是给你用的。
许知然的回复很快。
许知然:这么好用的工具,应该让更多人受益。代码是你写的,你决定要不要推广。
陈序看着那行字,半天没动。
旁边何照凑过来:“看什么呢?脸这么红?”
陈序下意识关掉窗口:“没什么。”
何照不信,但也没追问,只是嘿嘿笑了两声,转回去了。
陈序重新打开那个工具,又看了一遍自己写的代码。昨晚写的时候,他只想让她测试时能轻松一点。现在她把它提成bug,说要让更多人受益。
他犹豫了几分钟,然后把工具发到了测试组群里。
陈序:写了个小工具,可以自动抓取页面加载时间,大家有需要可以用。
群里安静了三秒,然后炸了。
“卧槽,陈哥出品必属精品!”
“这工具太实用了吧,我手动录屏录了一个月了!”
“下载了,好用!比我自己算的准多了!”
“陈哥牛逼!”
测试组组长李姐冒泡:小陈,这工具是你写的?什么时候这么贴心了?
陈序没回复。
但群里又跳出一条消息。
许知然:陈序写的,他很厉害。
群里又是一波“陈哥牛逼”刷屏。
陈序盯着那条消息,看着“他很厉害”四个字,耳尖慢慢红透。他伸手摸了摸耳朵,烫的。
何照在旁边目睹全程,默默拿起手机,给苏桐发了条私信:你家许老师在群里夸陈哥了。
苏桐秒回:看见了。陈序什么反应?
何照:耳朵红得像猴子屁股。
苏桐发了一串哈哈哈,然后说:好事将近。
下班时间到,人陆续走了。
许知然收拾东西,慢吞吞的。她看了一眼电梯方向,又看了一眼开发组那边。陈序的工位灯还亮着。
她拿起包,走向电梯,没按下楼,就站在电梯口等。
五分钟后,陈序出来了。他低头看手机,走到电梯口才发现她在。
脚步顿了一下。
“还没走?”他问。
许知然转过身,手里多了一杯咖啡,递过去:“给你。”
陈序愣了一下,接过咖啡。杯壁是温的,刚好入口的温度。
“谢谢你的药和工具。”许知然说。
陈序握着咖啡,垂眼看杯盖上那个小孔,声音低低的:“没什么。”
电梯来了,两人走进去。门关上,狭小的空间里只有他们两个人。
许知然按了一楼,陈序没动。
电梯往下走,数字一格一格跳。许知然看着那些数字,忽然感觉到他的目光落在自己身上。她侧头,他又移开了。
一楼到了。
门打开,两人走出大楼。傍晚的风迎面吹过来,带着初秋的凉意。
许知然忽然停下脚步。
陈序也停下,看她。
她转过身,面对着他,晚风把她的头发吹起来,拂过脸颊。她抬手把头发别到耳后,然后问了一句话。
“陈序,你对所有人都这么细心吗?”
陈序握着咖啡的手指紧了一下。
他没说话,沉默了很久。
久到许知然以为他不会回答了,久到她准备说“开玩笑的”然后转身走人。
然后她听见他说:“不是。”
只有两个字,声音很低,但很清楚。
许知然看着他。他的目光落在别处,脸上没什么表情,但耳朵在夕阳的余晖里红得发亮。
她没再说什么,只是弯了弯嘴角。
两人继续往前走,并肩,脚步很慢。走到地铁口,该分开的时候,许知然忽然说:“周末团建,你看到分组了吗?”
陈序点头。
“我们又是一组。”许知然说。
陈序又点头。
许知然看着他,笑了一下:“这次我不会再让你一个人指挥了。”
说完她转身进了地铁站,没回头。
陈序站在原地,看着她背影消失在扶梯尽头。他低头看了眼手里的咖啡,还是温的。
他想起她刚才那个笑,想起她说“我们又是一组”时眼睛亮亮的。
他想起自己刚才说的那两个字。
不是。
他从来没对任何人这么细心过。
周末,郊外露营地。
大巴车停在集合点,许知然下车,看见陈序已经站在签到台旁边了。他穿着件黑色的冲锋衣,背着个大包,正低头看手机。
她走过去,在他旁边站定。
陈序抬起头,看她一眼,又移开目光。
许知然发现他的耳朵又开始红了。明明什么都没发生,只是站在一起等签到。
她忽然想起苏桐说过的话:他现在就差把“我喜欢你”写在脸上了。
许知然看着他的侧脸,在心里默默回了一句:这次,我不等了。
周六早上七点半,大巴车停在公司楼下。
许知然到的时候,车上已经坐了大半的人。她刷卡上车,目光从前到后扫了一遍——只剩最后一排还有几个空位,其中一个靠过道的位置上,坐着陈序。
他靠窗,旁边空着。
许知然走过去,在他旁边站定:“有人吗?”
陈序抬头看她一眼,摇摇头,然后站起身,让出靠窗的位置。
许知然愣了一下:“不用,我坐外面就行。”
陈序没说话,就那么站着,等她进去。
后面排队的人开始催了,许知然只好侧身挤进去,在他让出的位置坐下。等她坐好,他才重新落座,还是那个姿势,靠过道,背挺得很直。
车子发动,窗外的街景开始后退。
许知然侧头看了他一眼。他正盯着前方椅背,不知道在想什么。阳光从窗帘缝隙漏进来,在他侧脸上落下一道浅浅的光。
她收回目光,靠在椅背上,闭上眼睛假寐。
但其实没睡着。她能感觉到旁边的存在感,能闻到他身上淡淡的洗衣液味道,能听见他呼吸的声音,很轻,很平稳。
一个小时后,车子停在露营地。
徒步是第一项活动。领队让大家把行李放下,轻装上阵,沿着山路走一圈,大概两小时。
许知然换了一双运动鞋,跟着队伍出发。陈序走在她后面,不远不近,隔着三四个人。