代码之外01:如果能重来,我不会再做那个只会埋头写代码的人
《代码之外:程序员重启人生》· 第01篇
那些年程序员吃过的亏,这一次全部重新来过。
凌晨两点十七分。
支付服务突然大面积超时。
告警群里连续跳出十几条红色消息,监控曲线像被人从中间折断,成功率从99.98%一路掉到了61%。
林川是被电话震醒的。
电话那头,项目经理只说了一句话:
“线上出问题了,你赶紧看看。”
林川翻身下床,打开电脑,连上公司VPN。
查日志、定位版本、对比数据库、回滚服务、修复脏数据、补执行补偿任务。
三个小时里,他只喝了半杯凉水。
凌晨五点四十三分,最后一批异常订单处理完毕。
监控曲线重新回到正常区间。
群里终于安静下来。
林川靠在椅背上,看着屏幕右下角的时间,眼睛发涩,手指还停留在键盘上。
他没有立刻睡觉。
而是又花了四十分钟,把事故原因、影响范围、修复步骤和后续方案整理成了一份文档。
做完这些,天已经亮了。
早上九点,公司召开事故复盘会。
部门负责人坐在会议室最前面,语气沉稳地说:
“昨晚系统出现了一次比较严重的波动。好在我第一时间组织协调,各位同事配合得也比较及时,最终没有造成更大的业务影响。”
林川坐在角落里,没有说话。
负责人继续说道:
“这次也暴露出我们研发团队的主动性不够。很多问题,不能总等着领导来协调。”
会议室里没有人看向林川。
仿佛昨晚查了三万多行日志、写了补偿脚本、一个人撑到天亮的人,根本不存在。
散会后,项目经理走过来拍了拍他的肩膀。
“辛苦了。”
林川点了点头。
项目经理又补了一句:
“不过你以后也要多从业务角度考虑,不能只会解决技术问题。”
林川愣了两秒。
最后还是回了一句:
“好的。”
这是他过去五年里说得最多的一句话。
一、代码是他写的,功劳却从来不是他的
林川工作五年,是团队里的后端骨干。
哪个接口性能有问题,找他。
哪个服务半夜报警,找他。
新来的同事搞不定环境,找他。
产品临时改需求,项目经理也找他。
在所有人的评价里,他都是一个“很好用的人”。
但“很好用”,并不是一个真正的褒义词。
它更像是说:
这个人不会拒绝。
这个人不会争。
这个人出了问题一定会兜底。
有一次,团队接手一个交付周期只有三周的项目。
正常情况下,至少需要两个月。
项目经理在会议上问:
“大家有没有信心?”
会议室里没人说话。
林川看了一眼需求文档,里面至少有十几个关键流程没有确认。
他刚想提醒风险,项目经理却看向他:
“林川,技术上应该没什么大问题吧?”
所有人的目光都落在他身上。
他沉默几秒,说:
“加班的话,应该可以。”
那一刻,他以为自己是在为团队负责。
后来他才知道,这句话相当于替所有人签了一份责任书。
接下来的三周,需求改了六次。
接口文档变了四版。
测试环境直到上线前三天才准备好。
项目延期后,复盘结论却写着:
研发前期评估不够充分,任务拆解不够细致。
那份结论经过所有人确认,最终进入了林川的绩效材料。
没有人提需求变更。
没有人提环境延迟。
也没有人提他连续两个周末没有休息。
因为这些事只发生在聊天记录和口头沟通里。
而那份正式的复盘文档里,只留下了八个字:
研发评估不够充分。
林川不是没觉得委屈。
他只是始终相信:
领导心里应该清楚。
公司不会亏待真正做事的人。
直到年底绩效面谈。
负责人翻着他的材料,语气很客气:
“你的技术能力大家都认可。”
林川听见这句话,心里已经凉了一半。
果然,对方接着说:
“但你目前主要还是偏执行,业务影响力不够,跨部门协作能力也有提升空间。”
林川问:
“这几个项目最难的部分,基本都是我处理的。”
负责人点了点头。
“这一点我们知道。但你要明白,做得多不等于影响力强。”
“那什么才算影响力强?”
负责人想了想,说:
“比如主动推动项目,协调资源,让团队看见你的价值。”
林川没有继续问。
他忽然发现,这是一场无法通过事实取胜的讨论。
他做过的事情,对方未必真的知道。
即使知道,也可以用另一套标准重新解释。
最后,他拿到了B。
而那个经常在项目群里发总结、在汇报会上负责展示、关键问题却总是找林川处理的同事,拿到了A。
对方晋升为技术负责人。
林川继续负责核心开发。
二、他一直以为,代码不会骗人
程序员对世界有一种朴素的信任。
代码能跑就是能跑。
接口超时就是超时。
日志里发生过的事情,不会因为谁声音大就改变。
林川也一直这样理解职场。
谁解决了问题,谁就应该获得认可。
谁承担了责任,谁就应该获得机会。
谁创造了价值,谁就应该获得回报。
可职场不是编译器。
它不会在你写错的时候明确报错。
它也不会在你写对的时候自动给出正确结果。
很多时候,你做的事情没有被记录,就像从未发生。
你提前发现的风险没有正式同步,事故发生后就会变成:
“你为什么没有早点说?”
你默默帮同事解决的问题,最后可能变成:
“这个项目是大家共同完成的。”
你接受了一个边界模糊的任务,最后所有未完成的部分,都可能默认属于你的责任。
代码世界里,输入相同,输出通常相同。
职场不是。
职场的输出,还取决于谁定义问题、谁记录过程、谁解释结果。
但那时的林川不懂。
他只会低头把代码写好。
他认为争取功劳是一件很难看的事。
认为强调困难是在推卸责任。
认为留下聊天记录是在防着同事。
认为拒绝别人会影响团队关系。
于是他一直选择那个看起来最体面的处理方式:
不说。
不争。
先把事情做完。
然后,他一次又一次成为那个最适合被忽略的人。
三、绩效结果公布那天,他趴在工位上睡着了
那天晚上,办公室只剩下林川一个人。
灯已经关了一半。
显示器上还开着事故复盘文档。
文档最后一页写着:
后续加强研发主动意识,提升业务责任感。
林川盯着这句话看了很久。
昨晚两点起床的是他。
一个人处理事故的是他。
早上写复盘材料的还是他。
最后需要提升责任感的人,也是他。
他突然觉得很好笑。
五年来,他帮公司解决了无数问题。
却从来没有认真解决过自己的问题。
他打开招聘软件,看了几分钟,又关掉。
不是因为不想走。
而是他忽然发现,即使换一家公司,他也很可能继续变成同一个人。
继续不拒绝。
继续不留痕。
继续相信做好事情自然会被看见。
继续在每一次不公平发生后,安慰自己:
算了。
他太累了。
趴在桌上,不知不觉睡了过去。
再次睁开眼时,办公室的光线很亮。
周围键盘声此起彼伏。
林川抬起头,看了一眼屏幕右下角。
时间是三年前。
他刚入职这家公司六个月。
桌上的保温杯还是新的。
显示器旁边放着一本刚买的《高性能MySQL》。
他的手机震了一下。
部门负责人发来消息:
小林,这个需求比较急,你今晚辛苦一下。后端做完以后,顺便帮前端把接口联调也处理一下。
林川看着这条消息,整整一分钟没有动。
他记得这一天。
就是从这一天开始,他第一次通宵加班。
那次需求本来不属于他。
前端接口之所以没有完成,是因为负责人临时把前端同事调去支持另一个项目。
上一世,他没有问原因,也没有确认优先级。
只回了一个字:
好。
那次之后,团队里所有人都知道了:
林川愿意兜底。
于是第二次、第三次、第四次,越来越多的“顺便”落到了他头上。
他从一个负责后端开发的程序员,慢慢变成了团队里负责一切没人愿意处理的程序员。
林川盯着那条消息,突然笑了。
他不知道自己为什么会回到三年前。
也不知道这一切是不是一场梦。
但他知道,这一次,自己不能再回复那个“好”字。
他把手放在键盘上,输入:
后端部分今晚可以完成。前端联调预计还需要半天,如果同时处理,订单模块优化会顺延一天。请确认一下两个任务的优先级,我按最终优先级执行。
他检查了一遍。
没有抱怨。
没有拒绝。
没有情绪。
只是把原本被隐藏的成本,清清楚楚地摆到了桌面上。
点击发送。
三分钟后,负责人回复:
订单优化先暂停,今晚先保证这个需求。排期变更你在项目群里同步一下。
林川没有像上一世那样私下接受。
他打开项目群,发送消息:
根据当前交付安排,今晚优先完成临时需求及前端接口联调。原定订单模块优化任务顺延一天,预计周四完成。相关安排已与负责人确认。
消息发出去后,群里很安静。
前端同事过了一会儿,私聊他说:
谢了兄弟,今晚又得辛苦你了。
上一世的林川会回复:
没事。
这一世,他回道:
联调我可以协助,但前端代码还是由你负责修改。我这边主要配合接口问题排查。
对方过了十几秒才回复:
行。
林川靠在椅背上,长长地呼出一口气。
事情没有失控。
领导也没有发火。
同事更没有因此和他翻脸。
原来拒绝承担不属于自己的全部责任,并不会让世界崩塌。
过去的他不是没有选择。
只是他从来不敢选择。
四、真正的重启,不是换一门编程语言
当天晚上,林川还是加班了。
但这一次,他没有一个人包揽所有事情。
前端同事负责修改页面逻辑。
测试人员提前介入验证。
产品经理确认了需求边界。
林川只负责自己应该负责的部分,以及必要的技术协助。
十一点二十分,功能联调完成。
比上一世提前了将近四个小时。
负责人在群里发了一句:
大家辛苦,配合得不错。
林川看着这句话,没有期待里面出现自己的名字。
他打开一份新的文档。
文档标题只有四个字:
工作记录。
他写下:
- 临时需求于今日下午加入,原订单优化任务顺延一天。
- 后端开发及接口调整由本人完成。
- 前端修改由前端同事负责,本人协助完成联调。
- 当前功能已验证通过,无遗留阻塞问题。
写完后,他保存了文档。
这不是为了防谁。
也不是为了抢功。
只是为了确保当未来有人重新解释这段经历时,他手里还有一份真实版本。
程序员习惯给系统留下日志。
因为没有日志,就无法定位问题。
可上一世的林川,从来没有给自己的职场留下日志。
他做了很多事。
但那些事情像临时缓存一样,项目结束后很快就被清空。
这一次,他决定不再让自己的价值只存在于别人模糊的记忆里。
五、第二天,第一次“甩锅”提前到来了
第二天下午,产品经理突然在群里问:
订单优化为什么延期了?这不是原计划今天完成吗?
上一世,林川看到这种问题,通常会立刻紧张。
然后用很长一段话解释前因后果。
越解释越像推卸责任。
这一次,他只回复了两句话:
昨天下午增加了临时需求及前端联调任务,经确认后调整了任务优先级。相关排期变更已于昨天下午在群里同步,订单优化预计明天完成。
随后,他转发了昨天的群消息。
没有情绪。
没有指责。
没有说“这不是我的问题”。
但责任链条清清楚楚。
产品经理很快回复:
看到了,那按明天完成推进。
对话就这样结束了。
林川盯着屏幕,有些恍惚。
上一世,同样的事情发生后,他花了半个小时解释。
后来项目周报里依然留下了一句:
研发任务延期一天。
这一次,只用了两句话,问题就结束了。
他终于明白:
很多职场冲突,不是因为事情复杂。
而是因为事实没有被提前固定。
当事实只存在于你的记忆里,它就可以被任何人重新定义。
当事实出现在公开的文字记录里,很多人就会突然变得讲道理。
六、他修改的第一行代码,是自己的边界
下班前,负责人从他工位旁经过。
停下来问了一句:
“你最近表达比以前清楚了。”
林川抬起头。
“以前不清楚吗?”
负责人笑了笑。
“以前就是让你做什么你都说好,也不知道你手上到底有多少事情。”
说完,他便离开了。
林川坐在原地,很久没有动。
上一世,他一直以为领导把任务交给他,是因为看重他的能力。
现在回头看,可能还有另一个原因:
交给他最省事。
不用解释。
不用协调。
不用重新安排资源。
只需要说一句“辛苦一下”,他就会自己消化全部成本。
这不完全是别人的恶意。
有时候,组织就像一个不断寻找最低阻力路径的系统。
哪里没有边界,任务就流向哪里。
谁从不拒绝,谁就会持续接收更多请求。
谁习惯沉默,谁就会被默认没有意见。
过去五年,林川把自己配置成了一个永远可用、从不报警、无需维护的公共服务。
所有人都可以调用。
没有权限控制。
没有流量限制。
没有异常提示。
直到这个服务彻底崩溃。
这一次,他不准备再这样运行。
他依然会认真写代码。
依然会帮助同事。
依然会在项目出现问题时承担责任。
但帮助不再等于包办。
负责不再等于背下所有结果。
配合也不再等于放弃自己的边界。
晚上七点,林川关掉电脑。
办公室里还有不少人。
有人抬头看了他一眼,似乎有些意外。
毕竟上一世的这一天,他加班到了凌晨三点。
林川背起电脑包,走向电梯。
电梯门即将关闭时,他回头看了一眼那排工位。
他知道,未来还有很多事情在等着他。
那场让他背锅的需求评审。
那个抢走他项目成果的同事。
那次被忽视的架构风险。
那场决定他绩效结果的汇报会。
还有三年后凌晨两点十七分,那次几乎让他彻底失望的线上事故。
那些事情都还没有发生。
或者说,它们即将以另一种方式发生。
电梯门缓缓关闭。
林川第一次准时走出了公司。
重启人生后,他没有学习新的编程语言。
没有获得顶级黑客系统。
也没有突然成为公司的核心高管。
他只是终于明白了一件事:
程序员修改系统之前,会先确认问题边界。
可很多程序员面对自己的人生时,却从来没有定义过边界。
而这一次,他修改的第一行代码,是自己。
写在最后
很多程序员不是能力不够。
只是太习惯用解决技术问题的方式,解决职场问题。
发现漏洞,就自己补。
看到异常,就自己修。
别人没完成,就顺手接过来。
可职场不是一个等待你不断修复的开源项目。
有些责任不说清楚,就会默认属于你。
有些价值不留下记录,就会像从未发生。
有些边界第一次不建立,以后就会越来越难建立。
林川的重启才刚刚开始。
下一次,他将回到那场改变自己绩效结果的需求评审会。
上一世,他替所有人承诺了三周上线。
这一世,他决定让每一个人都看见:
一个“不可能完成的排期”,到底是谁决定的。
本篇留一句话
职场里最危险的从来不是能力不足,而是所有人都知道:你的边界可以被随时越过。
