一

凌晨三点,桌上的咖啡凉了。

不是一下子凉的。它是一点一点失去温度的,像很多事情那样,你盯着一个 bug 看了两个钟头,回过神来,杯壁已经温吞吞的,表面凝了一层薄薄的油膜,在显示器的光里泛着一圈暗红。喝一口,凉的,带着一点发涩的苦尾,不像刚煮出来时那样张扬,倒像谁把音量悄悄调低了。

我这个人有个毛病,写代码非要等到所有人都睡了才开始顺。白天太吵。消息一条接一条,会议排得密,临时需求像夏天的蚊子,刚拍死一只又来一只。脑子整日被别人的优先级推着走,到了夜里,世界安静下来,风扇的嗡鸣、硬盘偶尔的咔哒、远处高架桥上零星的车轮声,反而成了背景,让我能沉进去。

咖啡是晚上十一点多煮的。那时候还烫,我吹了又吹,心想这杯怎么也能撑到两点。结果它没撑住,比我先认了输。

二

其实我也不缺那一口热的。厨房里牛奶还在,微波炉转三十秒就能换来一杯新的。但凉了就凉了吧,我不想动。

这种时候最怕的就是「动」。一旦起身去热咖啡,思路就断了——刚才那行卡住的逻辑,明明只差一层窗户纸,你一离座,它就像受惊的麻雀飞走了,再坐回来,对着屏幕发半天呆也想不起为什么卡在那里。于是我就那么坐着,盯着凉掉的杯子,手指在键盘上无意识地敲。啪、啪、啪。像是给深夜打着拍子,也像是确认自己还醒着。

三十五岁之后,我慢慢接受了好几件没道理的事。其中一件就是:很多坚持其实没有意义,只是惯性。比如非要在深夜写代码,比如非要让咖啡保持烫嘴的温度。可惯性也有惯性的好。它让我在被人推来搡去的一整天里,好歹留住了一块完全属于自己的、谁也抢不走的时间。那段时间不产出 KPI,不回消息,只属于我和这几行歪歪扭扭的代码。

年轻时不是这样的。那时拼的是谁更能熬,通宵写完一个模块,第二天照样生龙活虎去开会。现在不行了,熬一夜要缓三天。但换来的,是终于不再用「能不能熬」来衡量自己。凉掉的咖啡也好,早睡的念头也好,都是我和这副身体达成的新协议。

三

bug 是凌晨三点二十修好的。

不是什么了不起的问题。一个边界条件没判空,导致导出报表的时候偶发崩溃,复现率不到百分之一。我盯着堆栈看了很久,最后发现是自己在三个月前图省事,写了个自认为聪明的快捷写法,埋下的一颗雷。程序员这行最大的敌人,往往不是复杂的架构,而是三个月前那个想偷懒的自己。

提交,跑测试,绿了。我把那行注释补上,顺手把另外两处同样的写法也改了——既然今天撞上了,就别等下次再炸。这种顺手,是年纪给我的耐心。

我把凉咖啡端起来,一口喝完。凉的,但奇怪地顺下去了,像一句早就想说、终于说出口的话。屏幕的光映在空杯子里,映出一小汪安静的湖,湖里没有鱼,也没有倒影,就是安静本身。

有那么一瞬,我想给妻子发条消息,说 bug 修好了。手指悬在微信图标上,又放下了。她睡得正沉,这点高兴,原来也可以先自己收着。

窗外的天还没亮。我伸了个懒腰,听见关节轻轻响了一声。第一次觉得,凉掉的咖啡,好像也比热的时候更合深夜的口味。它不是将就,是另外一种刚刚好。