2026/9/5 7:45:42

凌晨两点的Bug,和一杯凉透的咖啡

凌晨两点的Bug,和一杯凉透的咖啡 又是凌晨两点。屏幕的蓝光打在脸上眼睛干涩得像进了沙子。手边的咖啡早就凉透了表面结了一层薄薄的膜喝了一口苦得发涩跟现在的心情差不多。其实也不是什么大Bug。就是一个很诡异的并发问题白天测试环境跑得好好的一上预发就偶发超时。查了一下午日志翻了八百遍监控看了个底朝天愣是没找到根因。同事下班前还安慰我“没事明天再看说不定是网络抖动。”呵网络抖动。每次排查不出问题第一反应都是“在我电脑上是正常的”、“换个环境试试”、“是不是缓存没清”。这套连招下来锅总能甩出去但Bug还在那儿像根刺一样扎着。我盯着那段代码越看越觉得没问题。逻辑清晰锁也加了超时时间也给了足够的buffer。可它就是偶尔会卡住像一个人走着走着突然忘了自己要干嘛站在原地发呆。后来我试着把日志级别调到DEBUG加了一堆时间戳重新跑了一遍。这次运气好抓到了。原来是个很蠢的问题。有个地方用了ConcurrentHashMap但里面嵌套了一个ArrayList。多线程同时往这个list里加数据的时候没加锁。ConcurrentHashMap只保证了map本身的线程安全里面的value它可不管。看到这儿的时候我差点笑出声。真的有时候写代码写到深夜脑子已经不太清醒了这种低级错误反而更容易犯。白天清醒的时候反而不会因为那时候你会下意识地多想一步。改完代码跑测试过了。再跑一遍又过了。连跑十遍稳如老狗。长舒一口气靠在椅背上听着机箱风扇嗡嗡响。其实写代码这么多年最折磨人的从来不是技术本身。技术是死的文档是死的源码是死的你总能找到答案。真正折磨人的是那种“明明觉得没问题但它就是不对”的无力感。就像你跟一个人吵架你觉得自己说得有理有据逻辑闭环但对方就是不听。你没法证明你是对的只能等时间给你答案。Bug也一样。有时候你改了代码测试通过了但你心里还是没底。你不知道它是不是真的好了还是只是这次运气好没触发。你得等等它在线上跑几天等监控曲线平稳等用户不再反馈问题。这个过程很煎熬。但当你终于确认问题解决了的那一刻那种感觉又很奇妙。不是狂喜不是激动就是一种很平静的踏实。像是终于把一块石头从心里搬走了可以好好睡一觉了。我关掉IDE把凉透的咖啡倒进水池。窗外天还是黑的但东边好像有一点点灰蓝色的光。该睡了。明天还有新的Bug等着我。哦对了刚才改代码的时候顺手把那个list换成了CopyOnWriteArrayList读多写少的场景刚好合适。不过写的时候还是得注意这玩意儿写操作是加锁的别在高频写入的地方用不然性能直接拉胯。算了不写了越写越精神。晚安各位还在加班的码农。愿你们的Bug都能在今夜被找到愿你们的代码永远不需要// TODO: fix this later。虽然我们都知道later永远不会来。