许知然盯着屏幕上刚弹出的系统通知,轻轻挑了下眉。
“【bug编号1001】状态更新:已驳回。驳回理由:无法复现。处理人:陈序。”
她入职星辰科技第七天,提交的第一个bug,从提交到被驳回,耗时四小时二十七分钟。驳回理由只有四个字:无法复现。
简洁,干脆,没有任何商量的余地。
许知然端起杯子喝了口水,目光落在那个处理人的名字上。陈序。开发组后端工程师,入职时间三年两个月,bug处理量全组第一,驳回率全组最低——但那是针对别人的。她这个新人的第一个bug,就撞上了他的驳回记录。
她点开bug详情,又看了一遍自己提交的内容。
【bug描述】:首页底部“立即体验”按钮,点击后反馈延迟约0.3秒。用户在低网速环境下感受尤为明显,存在交互阻塞感。
【复现步骤】:1.连接公司Wi-Fi;2.打开App进入首页;3.连续点击“立即体验”按钮5次。
【预期结果】:按钮点击后应在0.1秒内给出视觉反馈。
【实际结果】:点击后约0.3秒按钮状态才发生变化。
0.3秒。对于普通用户来说,这可能是根本不会注意到的延迟。但许知然不是普通用户,她是产品体验官。
她的工作,就是找茬。
许知然放下杯子,手指在桌面上轻轻敲了两下。她想起入职培训时前辈说过的话:在星辰,开发组有两个公认的规矩。第一,不要惹架构师;第二,不要和陈序争bug。前者是因为架构师掌握核心代码,后者是因为陈序掌握真理。
据说陈序驳回bug的理由永远只有三种:无法复现、设计如此、建议优化测试环境。而被他驳回的bug,百分之九十不会再被提起。
许知然看了眼时间,十一点五十。她站起身,没有去食堂,而是走向了茶水间旁边的测试设备柜。
下午两点,陈序的电脑屏幕上弹出了一条新通知。
【bug编号1001】状态更新:已重新激活。激活人:许知然。附言:证据链已补充,请重新审核。
陈序敲代码的手指顿了一下。他点开bug详情,发现下面多了一个附件包。
第一个文件:对比视频。视频被分成左右两半,左边是星辰App的操作录屏,右边是某头部竞品的操作录屏。同样的点击动作,同样的网络环境,竞品的按钮在手指触屏的瞬间就变了颜色,星辰的按钮却肉眼可见地慢了半拍。视频右下角标注了毫秒级的时间轴,延迟数据清晰可见。
第二个文件:用户行为数据分析截图。截图上显示,在首页停留超过10秒的用户中,有63%会点击“立即体验”按钮。而在这部分用户中,又有一部分人在点击后快速返回了首页。数据标注:可能存在点击后反馈延迟导致的误操作。
第三个文件:测试环境说明。许知然详细列出了她使用的设备型号、系统版本、网络类型、信号强度,甚至包括了当时的手机温度。最后附了一句话:如需更多信息,我可以携带设备前往开发组,当面复现。
陈序盯着屏幕,眉头微微收紧。
旁边工位的何照探过头来:“哟,陈哥,看什么呢这么认真?”
陈序没理他。
何照自己凑近了看,一看就乐了:“这不是上午你驳回的那个bug吗?许知然……这名字有点耳熟啊。”他想了想,“哦对,新来的产品体验官,听说人长得挺漂亮,就是特别较真。你这是碰上对手了?”
陈序还是没说话,但他点开了那个对比视频,又看了一遍。
何照在旁边啧啧两声:“人家这证据链做的,比测试组还专业。你打算怎么办?继续驳回?”
陈序终于开口,声音平淡:“她用的是公司Wi-Fi?”
何照愣了一下:“啊?我看看……哦,是公司Wi-Fi。怎么,问题出在Wi-Fi上?”
陈序没有回答。他盯着屏幕又看了几秒,然后移动鼠标,在bug处理页面敲下了一行字。
下一秒,全开发组的电脑屏幕上同时弹出了一条实时通知。
“【bug编号1001】状态更新:已重新领取。处理人:陈序。附言:工位403,现在过来。”
何照一口水差点喷出来。
他扭头看向陈序,表情像是看到了什么稀罕物:“陈哥,你这是……投降了?我认识你三年,你第一次主动约产品当面聊bug。”
陈序靠在椅背上,目光还停在屏幕上:“她的数据有问题。”
“什么问题?”
“证明bug存在,但原因找错了。”陈序说,“不是代码的事。”
何照还想再问,就看见一个身影穿过开放办公区的过道,正朝403工位走过来。
是个年轻女人。白衬衫,深灰色长裤,头发松松地扎在脑后。五官生得温和,但眼神清亮,步子不快不慢,完全没有第一次来开发组的拘谨。
许知然。
她在陈序的工位旁边站定,目光扫过他的电脑屏幕,最后落在他脸上:“陈工?”
陈序点点头,没有起身,只是把旁边的椅子往外推了推:“坐。”
许知然坐下来,从包里拿出自己的测试机,放在桌上:“需要我复现一遍吗?”
“不用。”陈序说,“视频我看过了。你连的是公司Wi-Fi?”
“对。”
“换4G试试。”
许知然愣了一下,随即明白了他的意思。她关掉Wi-Fi,打开4G网络,重新点击那个按钮。
这一次,反馈几乎是瞬间的。
许知然又点了两下,然后抬起头,对上陈序的目光。
陈序的表情没有任何变化,但许知然分明从他眼里看到了一丝极淡的——她不确定那是不是得意。
“问题不在代码,”陈序说,“在公司Wi-Fi的某个模块上。兼容性问题。”
许知然沉默了两秒,然后点点头:“你说得对。”
陈序正准备开口说什么,就听见她继续说下去。
“但用户不会知道问题出在Wi-Fi上。”许知然的声音依然平静,像是在陈述一个事实,“他们只会觉得是App卡。他们会想,为什么我点这个按钮的时候,它总是慢半拍?为什么别的App不这样?然后他们可能会截图发微博,可能会给应用商店打一星,可能会在卸载之前留下最后一句话:星辰的App真难用。”
陈序没有说话。
许知然看着他,语气里没有指责,只有认真:“陈工,这个bug的根因确实不在你的代码。但用户感知到的延迟是真实存在的。作为产品体验官,我的工作是发现问题,不是追责。至于这个问题该由网络组解决,还是由你们前端通过优化交互来兜底,那是后续的讨论。”
她说完,站起身,把手机收回包里:“谢谢你的时间。如果还需要我配合测试,随时找我。”
她转身要走,却被陈序叫住。
“等等。”
许知然回过头。
陈序已经转回去盯着屏幕,手指在键盘上敲着什么。过了几秒,他才开口,声音比刚才低了一点:“把你的手机给我。”
许知然把手机递过去。
陈序接过来,连上数据线,打开了一个许知然看不懂的界面。他操作了大概两分钟,然后把手机拔下来还给她:“再试试。”
许知然点开App,点了一下那个按钮。
这一次,即使在Wi-Fi环境下,反馈也几乎是瞬时的。
她抬起头,看向陈序。
陈序已经转回去继续敲代码了,像是刚才什么都没发生。但他的耳尖,在办公区的灯光下,有一点微微的泛红。
“我加了一层兜底逻辑,”他说,声音淡淡的,“如果检测到网络请求延迟超过阈值,前端强制提前渲染反馈状态。治标不治本,但能让用户感觉不卡。”
许知然看着他的侧脸,忽然觉得这个人有点意思。
她回到工位的时候,bug系统又弹出了一条通知。
【bug编号1001】状态更新:已修复。修复人:陈序。处理附言:问题已处理。下次这种情况——
许知然等着看后面的话。
附言显示完整了:“下次这种情况,直接来工位找我。”
她盯着那行字看了好几秒,然后端起杯子喝了口水。水是凉的,但她的心跳好像快了半拍。
旁边工位的苏桐探过头来:“看什么呢,脸都红了?”
“谁脸红了。”许知然放下杯子,“看bug呢。”
“哟,你那个被驳回的bug?”苏桐凑过来看屏幕,看完之后意味深长地哦了一声,“陈序让你直接去找他?”
“他说的是下次这种情况。”许知然纠正她。
“下次这种情况。”苏桐重复了一遍,语气更暧昧了,“他处理的bug没有一千也有八百,怎么就你的需要‘下次直接来’?”
许知然没接话,但她的目光又落在那行附言上。
直接来工位找我。
她想起刚才在他工位旁边,他接过她手机时指尖无意中碰到她的手背。想起他低着头操作时,她不小心瞥见的睫毛弧度。想起他把手机还给她,说“再试试”的时候,耳尖那一点可疑的红。
许知然轻轻弯了弯嘴角。
对面开发组的方向,隔着半个办公区,她好像感觉到有人在看这边。
但她没有抬头。
许知然拿着测试机站起身的时候,明显感觉到四周的目光。
不是那种明目张胆的注视,而是键盘声突然变得稀疏、余光纷纷偏移的微妙变化。她穿过开放办公区,沿着过道往开发组的方向走,一路上遇到的人都会多看她一眼——新面孔,长得不错,方向是403工位,那是陈序的位置。
开发组的办公区比产品那边更安静,只有密集的键盘敲击声。但当她拐进通往403的通道时,那些键盘声齐刷刷地顿了一下。
何照第一个抬起头,脸上挂着那种看热闹不嫌事大的笑容:“来了来了,许老师来了。”
旁边几个人跟着抬头,目光齐刷刷落在许知然身上。
许知然脚步没停,脸上也没什么表情变化,径直走到陈序工位旁边。陈序背对着她,正盯着屏幕,像是完全没注意到身后的动静。
但许知然看见了。他的手指停在键盘上方,没有敲下去。
“陈工。”
陈序这才转过身,目光在她脸上停了一秒,然后移向她手里的测试机。他点了点头,把旁边的椅子往外推了推:“坐。”
许知然坐下来。这个工位比她从远处看时感觉更挤,桌上两台显示器,中间夹着一个机械键盘,旁边散落着几本技术书和一个保温杯。她坐下的时候,手肘差点碰到他的胳膊,于是不动声色地往旁边挪了挪。
陈序没看她,目光落在她的测试机上:“开始吧。”
许知然打开手机,点进App,找到那个按钮。她的动作很慢,确保每一步都在他的注视下完成。点击,等待,点击,等待。
按钮反馈正常。延迟消失了。
许知然抬起头,正好看见陈序嘴角有一个极淡的弧度,那弧度只出现了一秒,如果不是她盯着看,根本注意不到。
她没说话,继续点击。第二次,第三次,第四次。每一次反馈都是正常的。
旁边的何照凑过来,压低声音对旁边的人说:“看来真是环境问题,陈哥赢了。”
陈序靠在椅背上,目光终于从手机屏幕移开,落到许知然脸上。他没说话,但那眼神分明在说:你还有什么要说的?
许知然放下手机,抬起头迎上他的目光。
“陈工,”她的声音很平静,“能借一下你的热点吗?”
陈序愣了一下。
许知然解释道:“你工位旁边这个Wi-Fi信号,和我那边不太一样。我想试试用你的手机热点,模拟一下弱网环境。”
陈序看了她两秒,从桌上拿起手机,解锁,递给她。
许知然接过手机,连上热点,重新点开App。这一次,在点击按钮的瞬间,那个熟悉的延迟出现了。
0.3秒。肉眼可见的卡顿。
许知然又点了两次,每次都是同样的结果。然后把手机递还给陈序,语气平淡:“看来不是我的环境问题,是你这个位置Wi-Fi信号比较好。”
周围突然安静了。
何照张了张嘴,想说什么又咽了回去。旁边几个人交换了一个眼神。
陈序盯着自己的手机屏幕,上面还显示着热点连接成功的提示。他沉默了几秒,然后抬起头,对上许知然的目光。
许知然没有躲开。她的眼神很干净,没有得意,也没有挑衅,只是在陈述一个事实。
“看来是公司Wi-Fi某个模块的兼容性问题,”她说,“与你的代码无关。”
陈序没有说话。
许知然继续道:“但作为用户,他不会知道问题出在Wi-Fi上。他只会觉得是App卡。他会在加载的时候多等那0.3秒,然后想,这App真慢。他可能会因此少点一次那个按钮,可能会在应用商店给个三星,可能会在卸载的时候写一句:星辰的App体验越来越差了。”
她说这些话的时候语气始终平静,像是在做一个例行的工作汇报。但每一个字都落得很实。
陈序看着她,忽然发现她的睫毛很长,说话的时候会轻轻颤动。
“问题我记下了,”他开口,声音比平时低了一点,“我会看看底层网络请求库的逻辑,加一层兜底处理。”
许知然点点头:“需要配合测试的话随时找我。”
她站起身准备离开,陈序却伸手拦了一下:“手机给我。”
许知然把手机递过去。
陈序接过来,连上数据线,打开一个满是代码的界面。他操作的时候,许知然就站在旁边等着。距离很近,她能闻到他身上淡淡的洗衣液味道,能看见他敲键盘时手指的骨节分明。
大概两分钟后,陈序把手机还给她:“试试。”
许知然点开App,点击按钮。延迟消失了。她又换回自己的位置试了一次,依然流畅。