618 结束后的第二天,我是被闹钟从半死不活的状态里强行拉起来的。
准确地说,不是起床,是系统恢复。
前一天凌晨两点多我才从公司回来,洗完澡躺床上的时候,身体虽然已经进入待机模式了,脑子里的线程池还在满负荷运转。优惠券状态流转、活动页埋点、那几个差点把人送走的边界条件,一个个像没处理干净的异步回调,在我脑子里来回蹦。
程序员熬完大促以后最痛苦的,不是困。
是你明明人已经躺平了,脑子还在后台偷偷跑定时任务。
我摸到手机看了眼时间,7:42。
锁屏通知一打开,密密麻麻挂了一排,像凌晨三点的监控面板。部门群里有人问“兄弟们活过来了没有”,测试群里还在补昨晚没来得及整理的问题,顺哥凌晨四点多发了一句:
“今天十点复盘,别迟到。”
后面还跟了一个微笑表情。
那个表情我太熟了。
表面看是微笑,实际上跟线上事故责任确认函差不多。语气越平静,事越不小。
我盯着那行字看了两秒,心里很快得出一个结论:
618 只是主流程勉强跑通了,真正的长尾任务,现在才开始排队执行。
很多刚入行的程序员都以为,大促熬过去、系统没崩、老板没骂、用户还能领到券,这事就算结束了。后来我才知道,不是。大促结束更像是一次高风险发布勉强成功,接下来还有复盘、补日志、清脏数据、还技术债、修文档、补流程。你以为自己终于下线了,实际上只是从“线上救火模式”切到了“会后清算模式”。
我从床上爬起来,对着镜子看了一眼,觉得自己那张脸已经不能用“憔悴”来形容了。
更像一台连续跑了三天压测、散热还坏了一半的老服务器。表面电源灯还亮着,实际上 CPU 温度高得我自己都想给自己做熔断。
到公司楼下的时候,我感觉连风都是困的。
电梯里站着几个同事,大家一个个都安静得很,像刚经历完线上事故的项目组。没人说话,但互相对一眼就都懂了:别寒暄了,能活着来打卡,已经算服务可用了。
出了电梯,办公室里弥漫着一股很复杂的味道。
咖啡、红牛、困意、外卖、以及“我昨晚真的没睡好”的怨气混在一起,闻着就像互联网公司的默认运行环境。小马哥正抱着杯冰美式瘫在椅子上,眼神空得跟刚被 GC 清理过一样。伟源在那边一边开电脑一边叹气,说他做梦都还在点活动页。
我刚把包放下,电脑都还没来得及开,企业微信就弹了条提醒:
《618 项目复盘会》
时间:10:00
地点:三号会议室
我看着这几个字,心情一下就复杂了起来。
以前上学的时候,我一直觉得考试最难顶。后来上班才发现,真正难顶的不是考试,是你考完了还得自己上台讲错题本,讲完还要顺便承诺下次不会再错。
“雷哥,脸色不错啊。”小马哥抱着咖啡飘过来,笑得像个幸灾乐祸的监控机器人,“一看就是大促的男人。”
“你要实在不会说话,可以把嘴捐给产品。”我一边开机一边回他,“至少他们提需求的时候用得上。”
“别这样。”他拉了张椅子坐我旁边,“我是真佩服你。昨晚一点多我走的时候,你还在和测试群里对埋点。那架势,不知道的还以为你在给系统办后事。”
“差不多。”我点开 IDE,叹了口气,“区别在于系统最后抢救回来了,所以今天得轮到我来写病历。”
小马哥笑得一抖一抖的,刚准备继续贫,小璇从设计那边走了过来,手里拿着一杯豆浆。
“吃早饭了吗?”她问我。
我摇头:“没胃口。”
她把豆浆放到我桌上,语气平静得像在发一条普通工作通知:“没胃口也喝两口,不然一会儿顺哥还没开口,你先低血糖把自己下线了。”
我抬头看了她一眼,心里那点因为复盘会生出来的烦躁,居然莫名其妙被压下去一点。
有时候我觉得恋爱这东西很神奇。
它不能替你改 bug,也不能帮你写复盘,更不会让顺哥突然转性,在会上对你温柔一点。但它像一个很轻的后台守护进程,平时没什么存在感,真到你状态快崩的时候,它会默默把你那颗快打满的 CPU 稍微降一点温。
我低声说了句谢谢。
她点点头,转身回工位,动作自然得像一次再普通不过的状态同步。
十点整,三号会议室。
整个项目组坐得整整齐齐,投影一开,复盘表挂在屏幕上,我一眼看过去,感觉像看见了自己这几天的全部罪证。
顺哥坐在最前面,表情不重,语气也不凶,上来先说了一句:
“先说结论,这次 618 核心链路稳住了,整体结果没问题,大家辛苦了。”
我听到这里,心里刚升起一点“行,至少不是纯挨骂局”的侥幸,顺哥下一句就到了:
“但是,没出大事故,不代表没问题。今天复盘,不是为了找人背锅,是为了下次别再靠命兜底。”
我心里那点侥幸瞬间就被回滚了。
这话其实一点都不狠,甚至很合理。可合理的东西,有时候最扎人。因为你没法反驳。就像 code review 里别人把你最自信的那一段圈出来,说这里有隐患。你可以难受,但你不能嘴硬,因为你自己心里也知道——他说得对。
后面的流程跟我预想得差不多。
测试开始捞问题,产品开始补需求变更记录,前端和后端对链路,设计讲交互变动。整个会议室像一个大型问题回放现场,昨晚还在群里飞来飞去的那些临时处理、热修方案和甩锅边缘试探,这会儿全被拉成了清清楚楚的调用链。
轮到我时,顺哥把文档切到一页,点了三个问题。
“你说一下这几个点。”
“第一,优惠券详情页埋点漏了一个点击事件,凌晨一点热修补上的。第二,活动状态在边界时间点切换时,字段语义没写清,导致前端展示逻辑改过一次。第三,联调文档更新以后没有同步到测试群,这个为什么会漏?”
他每说一个点,我心里就像被人精准点掉一个异常堆栈。
最难受的是,这三个问题没有一个是纯冤枉的。
第一个是我确实漏了。第二个不全怪我,但我也跑不了。第三个更烦,因为这不是能力问题,就是忙乱里流程没守住。
“第一个是我疏忽了。”我开口的时候嗓子有点干,“当时主要盯支付链路和优惠券核销,详情页埋点检查漏掉了,后来线上看数不对才发现。第二个状态字段,我这边定义得不够死,前后端理解有偏差。第三个……是我更新完文档,没同步到测试群。”
会议室里安静了几秒。
顺哥看着我,问了一句:
“那你自己觉得,哪个最不该出?”
这问题一出来,我就知道他不是在问答案,他是在看我有没有真的做完自我排查。
我沉默了两秒,说:“第三个最不该。前两个还能归到复杂度和边界条件上,第三个本质是流程漏了。不是不会,是没守住。”
顺哥点了点头:“知道就行。技术问题可以靠经验补,流程问题最容易在你忙的时候捅你一刀。越是节奏乱,越要把这些低级错误卡死,不然最后线上不一定是技术把你弄死,可能是你自己文档没同步把自己送走。”
我点头的时候,心里其实有点堵。
不是不服,是那种很典型的程序员式委屈:你明明已经熬了几天夜,把系统从崩溃边缘硬拽回来了,结果一开复盘,屏幕上还是刷出来一排历史告警。你不能说这些告警不该报,因为它们都是真的;但你也很难不烦,因为那一刻你最想要的不是问题清单,而是先让自己从高负载状态里喘一口气。
小璇在讲交互联动时,平静地补了一句:
“这个地方最后一版设计改得确实比较急,研发、设计、产品三边都赶,信息没完全对齐。”
她没有替我洗地,也没有刻意帮我拆锅。
就只是很平静地把事实讲清楚。
但偏偏是这种平静,让我舒服很多。因为它不像情绪安慰,更像有人在问题链路上帮你补了一段准确日志。没有夸张,没有倾向,只有清楚。
会开到十一点多才结束。
大家从会议室出来的时候,表情都差不多:没崩,但也绝对算不上开心。像刚把线上事故压住,监控恢复正常了,可事故群还没解散,复盘文档已经在路上。
我回到工位,坐下,盯着电脑发了会儿呆。
屏幕上还停着那份复盘表,一条条问题像排列整齐的异常记录。看着看着,我心里忽然冒出来一点说不清的委屈。
那种委屈挺复杂。
不是想甩锅,也不是觉得自己冤。更像你拼命把一个差点崩的系统顶住了,结果系统刚稳定,所有人第一件事不是说“辛苦了”,而是开始逐行分析你昨晚到底哪里写得不够优雅。
这事合理吗?合理。
难受吗?也确实难受。
我正发呆,企业微信弹出来一条消息。
是小璇发来的。
我点开一看,是一份她整理好的交互变更记录,时间、版本、影响页面、联动字段,全写得清清楚楚,连哪次是因为产品临时改需求都标出来了。
我抬头看她。
她没过来,只是在那边冲我抬了抬下巴,示意我看消息。
我回了个问号。
她发来一句:
“别急着委屈,先把坑记下来。下次你就不是被点名那个了。”
我盯着那句话看了两秒,突然觉得心里那团堵着的东西松了一点。
不是因为被哄好了。
而是因为她这话特别像一个成熟程序员会说的东西——别沉浸在情绪里,先把这次异常链路记录清楚。线上已经出过一次问题了,最亏的做法不是挨批,而是挨完批以后什么都没留下。
中午吃饭时,小马哥还在那边幸灾乐祸,说我这次能活着从复盘会出来,已经算命大。伟源啃着鸡腿问我是不是又要开始写“防傻逼操作指南”了。
我翻着白眼骂他们:“你俩以后要是谁挂线上,我能笑到下个季度。”
顺哥刚好端着餐盘坐下来,听见这句,特别平静地补了一刀:
“别等以后了,下个月七夕活动,你们还有机会。”
整桌人同时安静了两秒。
小马哥筷子都停了:“不是吧,618 尸体还没凉,七夕就立项了?”
顺哥喝了口汤,语气自然得像在说天气:“运营说今年想把情绪价值做起来,产品说传播要有爆点,老板说节点不能轻。你们自己体会。”
我当时脑子里只剩一个想法:
互联网活动节奏这东西,像极了消息队列。你以为消费完一批就能歇会儿,结果生产端根本没停,下一批任务已经排着队进来了。
下午回到工位,我没让自己继续在情绪里卡着。
程序员有时候就这样,一旦情绪解释不动了,就会本能地去处理问题。因为情绪这玩意儿像模糊异常,越想越乱;但问题一旦被拆成列表、优先级和责任项,脑子反而能慢慢恢复秩序。
我新建了一个文档,标题写上:
《618 项目问题整理与优化建议》
第一部分,记录已经暴露的问题。
第二部分,拆我自己能立刻补的东西:埋点检查清单、字段语义说明、联调文档同步规则。
第三部分,补流程:需求冻结时间、变更通知机制、测试群同步模板。
写着写着,我情绪真就慢慢顺下来了。
这事说出来挺像程序员的土办法,但很有效:你把委屈和烦躁从心里抽出来,翻译成 checklist,它们就没那么吓人了。就像一堆本来乱飞的异常,一旦被你落成日志、归类、排优先级,它们依然烦,但至少不再无序。
快下班的时候,小璇走过来敲了敲我桌子。
“还没写完?”
“快了。”我伸了个懒腰,“顺哥今天这波教育有点深,我怕以后脑子缓存过期,先落盘。”
她低头看了眼我屏幕上的文档,嘴角轻轻弯了一下:“行,至少没白挨这一轮 code review。”
“这也能叫 code review?”
“怎么不算。”她看着我,“区别只是平时 review 代码,这次 review 的是你整个人的工作流。”
我被她说得一愣,随即笑了。
这比喻太准了,准得我都没法反驳。
顺哥这时正好从旁边路过,看了眼我桌上的文档,点点头:“整理完发群里,别只写给自己看。一个人踩过的坑,最好别让整个组重复踩。”
“好。”
他嗯了一声,走出两步,又像想起什么似的回头补了一句:
“对了,下个月七夕活动,设计、前端、后端这次会更早拉通。你们先把命养回来,别到时候又一副刚从 ICU 热修完出来的样子。”
他说完就走了。
我坐在椅子上看着他背影,心里缓缓浮出一句特别朴素的话:
Bug 才刚下线,报应又要上线。
小璇站在旁边,听见我小声念叨,没忍住笑了一下:“怎么,怕了?”
“怕倒不至于。”我保存文档,合上电脑,“就是突然觉得,程序员这职业挺不讲武德。”
“哪里不讲武德?”
“你以为熬过一个节点就能喘口气,结果系统刚稳定,下一波需求就开始排队了。”我看了她一眼,“跟谈恋爱也差不多。”
她挑了挑眉:“怎么说?”
“项目里你以为发版成功就是结束,后来发现最难的是后续维护。恋爱里你以为在一起就算通关,后来才知道,真正的难点是怎么把日子稳定运行下去。”
她看着我,眼睛里带了一点笑:“所以你现在是把恋爱也写成长期维护项目了?”
我想了想,认真点头:“至少不能无监控裸跑。”
她抬手就在我胳膊上拍了一下。
我一边躲一边笑,跟着她往电梯口走。办公室灯光从身后慢慢暗下去,走廊尽头还有人没下班,打印机在角落里低声响着,像这个城市永远停不掉的后台任务。
电梯门关上的那一刻,我突然觉得,今天其实也没那么糟。
是,我挨批了。
是,我被复盘了。
是,下一轮活动已经在排队了。
但至少我知道了两件事。
第一,大促结束以后,最亏的不是被点名,而是被点完以后还不长记性。
第二,爱情确实不能替你写事故报告。
但如果有人在你写报告的时候,顺手帮你补了一段关键日志,再陪你一起去面对下一轮需求——
那这日子,至少还算能跑。