公交车在晚高峰的街口停下,车灯把斑马线照得发白。陈峰站在站台边等下一班,手里捏着半凉的关东煮竹签,塑料盒早扔了,只剩签子在指间转来转去。他抬头看了眼天,云层压得低,像是要下雨。
他没打伞,也没急着走。城中村的小路弯弯曲曲,电动车和三轮车挤在窄道上抢位置,喇叭声一阵接一阵。他沿着墙根往回走,路过那家二十四小时便利店时脚步顿了顿,玻璃门里灯光亮堂,几个学生模样的人坐在角落刷手机。他没进去买吃的,只隔着玻璃瞄了眼挂钟——九点四十七。
回到出租屋,门锁有点涩,他用螺丝刀轻轻撬了一下才推开。屋里一股潮味混着泡面底料的气息,他拉开窗帘一条缝,楼下的烧烤摊刚支起棚子,油烟机“轰”地一声响起来。他打开电脑,屏幕亮起的时候风扇转得像拖拉机过田埂。
这是他第三天晚上对着同一个问题死磕。
程序卡在一个异步加载的模块上,数据流总在中间断掉,日志报错写着“deadlock detected”,意思是两个任务互相等着对方先动,结果全都僵住不动了。他之前写修水管的小工具、帮邻居改路由器配置都没这么费劲。可现在这玩意儿不像拧个阀门那么简单,看不见摸不着,错一个标点都能让你熬到天亮。
他先翻技术论坛,搜了一堆关键词:“前端异步死锁”“Promise循环引用”“事件队列阻塞”。帖子倒是不少,但有的讲得太玄乎,满屏英文术语堆着像乱码;有的干脆就是广告贴,说什么“三天速成架构师”。他挑出三个看起来靠谱的方案记下来:一是拆分任务优先级,二是加超时机制,三是换用Web Worker另开线程跑数据。
他一条条试。
第一条改完,页面直接崩了,控制台刷出二十多行红字;第二条加上后倒是没崩溃,可数据还是卡住,刷新五次有四次失败;第三条他琢磨了半天才搞明白怎么起线程,结果浏览器提示不支持跨域脚本,又退回原点。
电脑风扇越转越响,他伸手摸了下机身侧面,烫得缩手。窗外传来谁家孩子哭闹的声音,还有人在楼下大声打电话谈生意,声音一句比一句高。他摘下耳机,把音量调到最低,重新打开编辑器。
已经是凌晨一点二十三分。
他盯着那段函数看了一会儿,突然想起白天公司茶水间听同事提过一嘴:“你那个是不是回调嵌套太深了?试试用async/await平着写。”当时他没细问,现在翻聊天记录也找不到具体人名,只能凭着印象查资料。
他新建一个测试文件,把原来的层层嵌套改成按步骤等待。每一行前面加“await”,让程序老老实实一步一步走,不抢跑。改完之后,心跳快了半拍——结构清爽多了,像把打结的耳机线一根根理顺。
他深吸一口气,把新代码替换进主项目。
刷新页面。
进度条动了。
数据一层层加载出来,没有卡顿,没有报错,最后所有表格都填满了数字。他猛地往后一靠,椅子发出“吱呀”一声长叹。他又点了一次刷新,再刷新,五次,十次,全部成功。
“成了。”他低声说,嗓子有点哑。
他抓起桌上的矿泉水猛喝一口,水洒到下巴上也没管。然后打开控制台看了一眼输出日志,最后一行清清楚楚写着:“Success: All Tests Passed”。
他没截图发群,也没给谁打电话。只是把测试页面多开了几个标签页,每个都运行一遍,确认不是偶然。做完这些,他靠在椅背上闭眼坐了两分钟,耳边只有风扇声和远处狗叫。
睁开眼后,他打开手机备忘录。屏幕光照着他右耳垂那颗小痣。往上翻了几页,全是些零碎记录:“七号楼三单元水管老化,建议物业更换”“电动车充电插座松动,已用绝缘胶布固定”“租房合同注意第九条押金条款”。这些都是他这些年搬来搬去攒下的经验,一条条记着,从不说给别人听。
他在最后一条下面新建一行,敲字:
“今天搞定了异步加载的死锁问题。还能再学点。”
按下保存键,合上电脑。
他拎着塑料凳走到阳台,坐下。楼下烧烤摊还在忙,老板光着膀子翻烤串,油滴下去“滋啦”冒火。对面楼有户人家还没关灯,影子贴在窗帘上晃动,看不清在干什么。
他手里还捏着那根关东煮的竹签,不知什么时候从口袋里掏出来的。风吹过来,带着炭火和孜然的味道。他抬头看了看天,云散了些,露出几颗星。
隔壁传来关门声,接着是钥匙串叮当响。有人骑电动车经过楼下,车灯扫过墙面,一闪而过。
他没动,就坐着。
夜更深了,街角便利店换了班,新来的店员是个年轻女孩,正踮脚往货架上摆关东煮盒子。灯光亮得像个小太阳。
他忽然想起来,自己晚饭没吃。
但这会儿也不饿了。
他把竹签夹在指缝里转了个圈,然后轻轻弹出去。签子划了道弧线,落进楼下的垃圾桶,没碰着边沿,也没弹出来。
他站起身,伸了个懒腰,骨头节发出轻微的响。
屋里电脑还插着电源,他没拔,只把显示器盖上。背包挂在门后,侧袋里的折叠伞和螺丝刀都还在。他摸了摸卫衣口袋,手机静悄悄躺着,没有任何消息提醒。
这一晚没人知道他做了什么,也没人看见他坐在阳台上发呆。就像以前无数次那样,问题来了,他蹲下身子,一点点拆,一点点试,直到它不再挡住去路。
他走进洗手间洗了把脸,冷水拍在脸上,清醒了不少。抬头看镜子,眼底下有点青,但眼神是亮的。
他擦干脸走出来,关灯,躺上床。床垫塌陷的老位置还是那个坑,枕头有点硬,但他很快就找到了舒服的角度。
闭眼前,他脑子里闪过一个念头:明天可以看看有没有关于状态管理的入门教程。
然后他就睡着了。
风从阳台吹进来,掀起窗帘一角。桌上的水杯边缘凝了一圈水珠,慢慢滑下去,在木地板上洇出一小片暗色。
电脑屏幕黑着,映不出任何东西。