林夏的指尖在机械键盘上敲出最后一个分号时,办公室的日光灯管突然闪烁了一下。凌晨四点十七分,淡白的光线将他的影子拓在布满便签的玻璃隔断上,像幅被揉皱又勉强展平的流程图。屏幕中央的编译进度条卡在99%,红色报错信息像道未愈的伤口:“内存溢出:堆栈层级超过系统阈值”。
“夏哥,移动端的适配又崩了。”实习生阿哲抱着笔记本电脑凑过来,卫衣袖口沾着速溶咖啡的褐色渍痕。男孩的黑眼圈比键盘键帽还黑,显然也是熬了通宵——这是项目上线前的第七次通宵,测试环境的服务器已经连续崩溃了三次,运维组的老王在工作群里发了个“裂开”的表情包,后面跟着句“再崩下去我要申请工伤”。
林夏接过电脑的动作顿了顿,触控板上还留着阿哲的指纹印。他点开调试日志,发现问题出在首页轮播图的动画效果上——新来的UI设计师为了追求视觉效果,给每张图片加了三层嵌套动画,在低配安卓机上直接触发了内存泄漏。他想起昨天评审时自己提过性能风险,设计师小苏当时翻了个白眼:“用户现在就吃这套,你们程序员就是不懂审美。”
“把动画层级减到一层,”林夏拖动鼠标选中冗余代码,Delete键发出清脆的声响,“保留淡入淡出就行,滑动切换时禁用悬浮效果。”他忽然注意到阿哲的笔记本贴纸,是只举着代码的卡通猫,爪子上写着“BUG退散”,大概是昨晚加班时贴的。
走廊里传来微波炉的嗡鸣,产品经理张姐端着加热好的便当盒走过来,高跟鞋在地板上敲出急促的节奏。“小林,支付模块的倒计时功能必须今天实现,”她把便当盒重重放在桌上,米饭的香气混着焦虑飘过来,“甲方老板明天要亲自测试,这个功能是他特别强调的。”
林夏翻开需求文档,第37页的“紧急程度”栏被张姐用红笔标了三个星号。这个功能昨天才临时加进来,按原计划属于下一版本的迭代内容。他想起上周和甲方开会时,那个啤酒肚老板拍着桌子说:“我不管你们怎么弄,下周我就要看到这个效果。”当时窗外的梧桐叶正被秋风卷着打转,像无数个被打乱的进度节点。
“需要后端配合改接口,”林夏调出数据库表结构,指尖在“订单状态”字段上敲了敲,“让老周加个倒计时触发字段,默认值设为订单创建后30分钟。”他忽然想起老周的女儿今天满月,昨天还在群里发了满月照,小家伙攥着拳头的样子,像在敲代码。
阿哲突然“呀”了一声,指着屏幕上弹出的消息:“夏哥,测试服又挂了!”监控面板上的服务器状态全变成了红色,像串熄灭的灯笼。实习生的手指在键盘上乱按,差点碰翻林夏手边的保温杯——那是妻子早上塞给他的,里面的枸杞菊花茶还冒着热气,杯壁上贴着便签:“记得多喝水,别又盯着屏幕忘了时间”。
林夏登录远程控制台时,发现是磁盘空间满了。日志文件里堆满了无效的调试信息,是阿哲昨天调试时忘了关输出开关。“把7天前的日志删了,”他输入删除命令的手指很稳,“再加个定时清理脚本,每天凌晨三点自动删过期日志。”他忽然想起自己刚入行时,也曾因为忘了关日志输出,把服务器硬盘写满,被项目经理骂得狗血淋头,那天的晚霞红得像团火,映着自己泛红的眼眶。
张姐的便当盒打开时,林夏闻到了红烧肉的味道。产品经理往他碗里夹了块排骨:“吃点东西垫垫,我妈昨晚特意做的。”她的指甲上还贴着代码主题的美甲,每个指甲盖都是不同的编程语言符号,“刚才跟甲方沟通了,倒计时功能可以简化,只要显示剩余时间就行,不用动画效果。”
林夏咬着排骨的动作顿了顿。窗外的天已经泛白,晨光透过百叶窗在地板上投下细长的光斑,像行没写完的代码。他想起昨晚妻子发的视频,女儿举着蜡笔在纸上画爸爸,画里的人长着好多个眼睛,每个眼睛里都有个小屏幕。“妈妈说爸爸的眼睛里有星星,”女儿奶声奶气地说,“可是我觉得爸爸的眼睛里只有代码。”
“夏哥,老周回消息了,”阿哲举着手机凑过来,屏幕上是后端组组长的消息,“他说现在就改接口,半小时后发版。”实习生的嘴角沾着饭粒,像颗没擦干净的代码注释符,“周哥还说,等项目上线了,请我们去他家喝满月酒。”
编译进度条终于爬到100%,绿色的“编译成功”提示像道黎明的光。林夏长舒一口气,后背的衬衫已经被冷汗浸透。他点开手机相册,最新的照片是凌晨两点拍的办公室——三十多台电脑屏幕亮着,像片小型银河,每个屏幕前都坐着个和他一样的程序员,在代码的海洋里打捞着属于自己的星辰。
早上七点,测试组的女孩们开始陆续到岗。小组长拿着测试用例表过来时,脚步轻得像片羽毛:“林哥,核心功能都测过了,就差支付流程的最后验证。”她的黑眼圈比阿哲还重,却努力挤出个笑脸,“我让她们先测次要功能,你再眯会儿?”
这章没有结束,请点击下一页继续阅读!