代码之外09:团队离不开我,晋升名单却没有我

《代码之外:程序员重启人生》· 第09篇
上一世,他最自豪的一句话是:

“这个系统除了我,没人敢动。”

后来他才发现,真正困住他的,恰恰就是这句话。

周一上午十点。

技术周会刚结束,林川回到工位,赵明就把椅子滑了过来。

“老徐又请假了?”

“嗯。”

“那支付结算那边怎么办?”

林川看了一眼项目群。

群里已经连续@了好几次。

@徐志远 结算任务昨晚为什么没跑?

@徐志远 财务那边等着出账。

@徐志远 这个存储过程是不是只有你知道?

没人回复。

半小时后,部门负责人在群里说:

有谁熟悉结算系统,先帮忙看一下。

群里安静了。

没有一个人接话。

赵明小声说:

“这系统除了老徐,谁敢碰。”

林川没有说话。

因为他太熟悉这句话了。

上一世,他听到这句话时,甚至有一点羡慕。

徐志远是团队里资格最老的后端工程师。

工作八年。

技术强。

熟悉公司的核心交易系统。

数据库、结算、账务、定时任务、历史数据迁移,几乎没有他不知道的东西。

新人遇到问题都会说:

“问徐哥。”

线上出问题,第一反应也是:

“叫老徐。”

领导评价他时经常说:

“徐志远是团队定海神针。”

听起来几乎是技术人员能够得到的最高赞美。

林川以前也想成为这样的人。

最好整个系统都离不开自己。

最好别人一遇到关键问题,就必须来找自己。

那不就是不可替代吗?

可上一世,徐志远最后离职时,只说了一句话:

“我花了八年,把自己焊死在这个工位上。”

当时林川没有完全听懂。

现在,他懂了。


一、所谓“不可替代”,有时候只是“最方便继续用你”

下午一点。

徐志远终于上线。

原来早上孩子发烧,他带去医院了。

人还没回公司,电话已经打了三个。

第一个来自项目经理:

“结算任务失败了,赶紧看一下。”

第二个来自财务:

“今天必须出账。”

第三个来自部门负责人:

“这个事情比较急,你先远程处理。”

徐志远坐在医院走廊里,打开电脑连VPN。

二十分钟后,他找到问题。

上周修改了一张配置表,其中一条历史规则没有同步。

补完配置,重新执行任务。

系统恢复。

群里一片:

徐哥牛。

还得是老徐。

定海神针。

徐志远只回了一个:

已处理。

下午四点,他才到公司。

整个人明显很疲惫。

赵明笑着说:

“徐哥,你不在我们是真不行。”

徐志远也笑。

“所以我才不敢死啊。”

周围的人都笑了。

只有林川没笑。

因为他知道,这不是一句玩笑。

徐志远已经三年没有完整休过一次年假。

只要离开城市超过两天,就必须带电脑。

前年去海南,凌晨处理过结算问题。

去年春节,大年初二远程修过数据库。

老婆生孩子那天,他还接了两个生产电话。

大家都知道:

这个团队离不开他。

问题是——

晋升名单里,依然没有他。


二、最扎心的不是“你不重要”,而是“你太重要了,所以不能动”

半个月后。

年度职级评审结果出来。

赵明升了一级。

一名做平台建设的同事也升了。

徐志远没有。

办公室里没人敢主动提。

下午,徐志远被领导叫进会议室。

一个小时后才出来。

林川看了一眼他的表情。

很平静。

平静得有些反常。

晚上七点,办公室只剩下两个人。

徐志远突然问:

“林川,你觉得我还能升吗?”

林川没有说安慰话。

“领导怎么说?”

徐志远笑了一下。

“他说我的技术能力没有问题。”

林川也笑了。

程序员一听这句话,基本就知道后面是什么。

果然。

徐志远继续:

“但是影响力不够。”

“平台化建设不够。”

“团队培养也不够。”

“长期还是集中在结算和交易这些具体系统里。”

林川问:

“那这些系统为什么一直由你负责?”

徐志远沉默了几秒。

“因为别人接不住。”

“为什么别人接不住?”

“不熟。”

“为什么一直不熟?”

徐志远不说话了。

答案其实很简单。

因为过去几年,每次有人准备接手,都会遇到这种情况:

新人看代码太慢。

徐志远说:

“算了,我来吧。”

别人排查线上问题两小时没找到。

徐志远过去十分钟解决。

别人准备重构一段历史代码。

他一看:

“风险太大,你先别动。”

最后,所有最难的部分仍然在他手里。

团队确实越来越依赖他。

可他也越来越无法离开这些具体工作。

徐志远苦笑着说:

“最搞笑的是,领导今天还跟我说了一句话。”

“什么?”

“现在结算系统也确实离不开你,你要是转其他岗位,短期没人能接。”

两个人同时沉默。

这句话终于把整个逻辑闭环了。

不能晋升,因为影响力不足。

无法扩大影响力,因为必须继续负责原系统。

无法离开原系统,因为没人接手。

没人能接手,因为所有复杂问题最后还是他自己解决。

系统离不开他。

于是,他永远只能留在系统旁边。


三、程序员为什么会主动把自己变成单点

很多程序员并不是被强迫成为“单点”的。

最开始,甚至是主动的。

因为这种感觉很好。

别人搞不定的问题你能搞定。

领导只信任你。

关键系统只有你敢操作。

凌晨两点,所有人都在等你上线。

你会产生一种非常强烈的价值感:

我很重要。

尤其对技术人员来说。

我们不擅长复杂的人际表达。

代码和故障却会直接给反馈。

一个系统别人修不好,你修好了。

成就感非常真实。

时间久了,你开始享受这种依赖。

文档懒得写。

因为解释还不如自己改。

代码没有人评审。

因为没人比你熟。

新人问问题。

你直接告诉他答案。

别人准备处理。

你嫌他太慢:

“我来吧。”

所有事情短期效率都提高了。

但你在不断向团队写入一个隐藏规则:

遇到复杂问题,不需要学会解决,找我就行。

于是你越来越忙。

其他人越来越不懂。

最终形成一个完美闭环:

别人不会 ↓ 你自己做 ↓ 别人没有机会学 ↓ 别人更加不会 ↓ 更多事情只能你做

程序员把这种状态叫:

不可替代。

从系统设计角度看,它其实还有另一个名字:

单点故障。

任何架构师都知道,一个系统里存在单点,是重大风险。

可很多技术骨干,却亲手把自己设计成了整个团队最大的单点。


四、上一世的林川,也走过一模一样的路

林川重新活过一次后,最警惕的并不是别人甩锅。

而是自己重新变成徐志远。

因为他上一世也经历过同样的阶段。

负责会员系统以后,所有复杂需求开始找他。

最初,他很享受。

某个接口性能有问题。

他处理。

规则引擎出Bug。

他处理。

新人不知道怎么设计数据表。

他直接给方案。

线上有异常。

他第一时间上线。

慢慢地,大家产生了一个习惯:

有问题找林川。

甚至出现过这样的对话。

产品:

这个需求技术上怎么做?

开发:

先问一下林川。

测试:

这个算Bug吗?

开发:

问林川。

项目经理:

这个版本能不能上?

所有人:

看林川怎么说。

林川曾经很满足。

直到有一天,他发现自己一天参加七个会议。

没有时间写代码。

没有时间学习。

没有时间做真正重要的架构升级。

晚上八点,才能开始处理自己的任务。

他想培养新人。

可新人刚开始做得慢。

业务又催。

最后他总会忍不住说:

“我先来处理,这个后面再教你。”

那个“后面”,永远没有到来。

他也一点点把自己焊死在了系统里。


五、这一世,他第一次故意不去解决一个自己明明会的问题

周三下午。

会员系统出现一个数据同步Bug。

一名新同事小陈负责处理。

半小时后,他来到林川工位。

“川哥,能不能帮我看一下?”

“什么现象?”

“用户等级更新以后,权益没有同步。”

林川其实一听就大概知道问题。

大概率是事件消息里的旧版本号导致消费者忽略了更新。

如果他自己处理。

十分钟。

最多十五分钟。

但他没有接过键盘。

他问:

“查到哪了?”

“数据库等级已经变了。”

“权益库呢?”

“没变。”

“那中间经过哪些组件?”

“等级服务发消息,权益服务消费。”

“消息发了吗?”

“还没看。”

“那继续查。”

小陈愣了一下。

“你不帮我看看?”

“我正在帮你。”

“我是说……你直接看代码可能比较快。”

林川点头。

“我知道。”

“但今天快十分钟,下次还会继续找我。”

“你自己查可能要一个小时,但下次你就知道怎么排。”

小陈有点尴尬。

林川没有把他赶走。

而是给了一个排查框架:

第一,确认数据在哪一层开始不一致。

第二,确认事件有没有产生。

第三,确认消息有没有发送。

第四,确认消费者有没有收到。

第五,再看业务为什么没有执行。

“你按这个顺序查。”

“卡超过二十分钟,再来找我。”

小陈回去了。

四十分钟后,他突然在群里发:

找到了。生产消息里version还是旧值,消费者判断为重复事件直接忽略了。

林川回复:

把原因和排查过程整理进Wiki。

小陈问:

要写这么详细吗?

林川回答:

要。

下一个人遇到类似问题,不应该再从头问一次。

半小时后,Wiki增加了一篇:

《会员等级与权益不同步问题排查指南》

这件事看起来比林川自己处理慢了半小时。

但从团队角度,系统第一次多了第二个知道怎么排查这类问题的人。

真正的效率,从来不是今天最快解决一个问题。

而是下一次这个问题不用再找你。


六、很多技术骨干最大的错觉:我不亲自做,质量就会下降

两周后。

小陈负责一个新的会员批量升级功能。

方案评审时,林川发现设计并不完美。

小陈准备:

先查询符合条件的用户。

一次性写入升级任务。

再批量更新会员等级。

林川第一眼就看出了几个问题:

  • 大数据量可能内存过高
  • 批量失败后恢复困难
  • 重复执行缺少幂等
  • 无法精确知道每一批处理状态

上一世的林川会直接说:

“别这么做,我给你重新设计。”

然后打开白板。

十分钟后,方案变成自己的。

小陈负责照着实现。

最终项目成功。

所有人又一次证明:

还是林川技术强。

这一世,他没有直接给答案。

他问:

“如果处理到第八万条时服务挂了,怎么办?”

小陈愣住。

“重新跑?”

“那前八万会不会再执行?”

“要做幂等。”

“怎么做?”

小陈开始思考。

“给每次升级加任务号?”

“继续。”

“每个用户记录处理结果……”

“如果一次处理一百万用户呢?”

两个人讨论了四十分钟。

最后,小陈自己把方案改成:

  • 主任务拆分批次
  • 批次独立记录进度
  • 用户维度增加幂等
  • 失败批次支持重试
  • 全过程可监控

方案和林川心里想的非常接近。

但有一个本质区别。

这一次不是林川设计的。

是小陈设计的。

会议结束后,小陈明显很兴奋。

“川哥,我感觉这种方式比你直接告诉我印象深多了。”

林川笑。

“因为这是你自己想出来的。”

技术负责人最难的一次升级,往往就是接受:

别人做出来的80分方案,可能比自己亲手做的95分方案更有长期价值。

如果什么都追求自己做到最好。

你永远只能放大自己的产能。

如果允许别人学习、犯小错、逐步做到80分。

你开始放大整个团队的产能。


七、徐志远第一次休了一个完整的周末

林川开始推动一件事情。

核心系统轮值。

结算系统不能再只有徐志远一个人负责。

他找到徐志远。

“把结算系统拆一下。”

“怎么拆?”

“至少培养两个人可以独立处理常见问题。”

徐志远第一反应是摇头。

“他们搞不定。”

“现在当然搞不定。”

“那线上出问题怎么办?”

“你做二线。”

“新人一线排查。”

“半小时解决不了再找你。”

徐志远苦笑。

“最后还不是我。”

“开始会。”

“但三个月以后不一定。”

徐志远没有马上同意。

他说:

“以前也培养过人。”

“后来呢?”

“业务一催,我还是自己做了。”

林川看着他。

“那问题不是他们学不会。”

“是你等不起。”

徐志远沉默。

这句话扎得很准。

很多技术骨干嘴上说:

新人带不出来。

实际上是自己无法忍受:

别人比自己慢。

别人第一次做得不够漂亮。

别人需要试错。

于是每次到了关键时刻,都重新抢回控制权。

短期看,是救火。

长期看,是不断中断培养过程。

最终结论变成:

看吧,还是没人能替我。

徐志远最后同意。

结算系统安排两名后端轮值。

第一个月。

徐志远依然被叫了十几次。

第二个月。

降到五次。

第三个月。

有一周,没人找他。

那个周五下午,他站在林川工位旁,表情有些复杂。

“这周结算一次问题都没找我。”

“挺好。”

“感觉有点失落。”

林川笑了。

他懂这种失落。

当一个人长期通过“别人需要我”确认价值,突然没人找,会产生一种奇怪的不安全感。

好像自己没那么重要了。

徐志远也笑。

“但我明天终于不用带电脑出门了。”

那周末,他带孩子去了趟郊外。

手机一直有信号。

电脑留在了家里。

这是他三年来,第一个真正意义上完整的周末。


八、真正高级的技术影响力,是你不在时系统依然能运行

三个月后。

部门负责人重新评估技术岗位职责。

这次,徐志远负责的不再只是结算系统。

他的职责变成:

交易与结算技术域负责人。

具体包括:

  • 交易领域技术规划
  • 核心系统治理
  • 结算规范建设
  • 技术人员培养
  • 稳定性体系建设

原来由他一个人维护的结算系统,现在有三个人可以独立值守。

历史上只有他知道的十几个特殊逻辑,也全部进入文档和测试用例。

关键操作开始工具化。

常见故障形成Runbook。

上线流程增加自动检查。

他个人处理的事故数量下降了。

影响范围反而变大了。

年度评审前,负责人对他说:

“你这半年最大的变化,不是做了多少技术工作。”

“而是结算系统终于不依赖你一个人了。”

徐志远笑:

“以前不是说系统离不开我,说明我重要吗?”

负责人也笑了。

“重要和可晋升不是一回事。”

“一个系统只能你维护,说明你对这个系统重要。”

“一个领域因为你变得更稳定,团队能力整体提高,才说明你能承担更大的范围。”

这一次,徐志远晋升了。

没有人因为他“不再不可替代”而觉得价值下降。

恰恰相反。

他第一次从一个具体系统里走了出来。


九、程序员真正应该追求的,不是“谁都替不了我”

很多程序员都有一个很深的职业焦虑:

如果别人也会做我的事情,我是不是就不重要了?

于是本能地保护自己的技术壁垒。

关键代码只有自己懂。

部署脚本不写文档。

特殊流程放在脑子里。

所有核心任务都自己完成。

确实,这样很安全。

只要系统仍然存在,公司短期就很难失去你。

但这种安全感有一个代价:

你永远不能离开。

公司不会轻易让你去负责更大的事情。

因为你一走,原来的系统怎么办?

你的不可替代性,最后会变成一条链子。

把你和那个工位锁在一起。

真正健康的职业发展,不应该是:

只有我能做。

而应该经历三个阶段。

第一阶段:我能解决问题

这是个人能力。

别人搞不定的,我能搞定。

第二阶段:我能让别人解决问题

这是团队能力。

我可以教、带、评审、建立方法。

第三阶段:我让这类问题不再依赖具体的人

这是系统能力。

通过:

  • 文档
  • 工具
  • 标准
  • 自动化
  • 监控
  • 流程
  • 培养机制

让任何合格的人都能够接手。

真正高级的技术人员,不是在所有地方留下自己的名字。

而是把自己的经验写进系统里。


十、林川删掉了通讯录里的“7×24小时”

周五下午。

会员系统准备做一次大版本升级。

项目经理问:

“晚上上线,你要不要留下来盯?”

林川问:

“值班是谁?”

“小陈和赵明。”

“那我不留下。”

周凯有些意外。

“这是核心版本。”

“上线手册写了吗?”

“写了。”

“回滚方案验证了吗?”

“验证了。”

“监控和告警呢?”

“全部配置好了。”

“值班人员会处理吗?”

“做过两次演练。”

林川点头。

“那我二线待命。”

“真有解决不了的问题再叫我。”

周凯笑着说:

“你现在心挺大。”

林川也笑。

上一世,他每次核心上线都必须亲自守到最后。

不是因为团队真的需要。

而是因为他不敢相信:

没有自己,事情也能做好。

那其实也是一种控制欲。

晚上十一点。

版本上线成功。

小陈在群里发:

核心指标正常,观察30分钟无异常,版本发布完成。

没人@林川。

也没有人打电话。

林川已经睡了。

第二天早上醒来,他看到群消息。

没有失落。

反而有一种从未有过的轻松。

他突然想起上一世别人最喜欢夸他的一句话:

“林川在就放心了。”

过去他觉得这是赞美。

现在他更希望有一天,大家说的是:

“这套系统本身就让人放心。”

因为如果一个团队必须依靠某个英雄才能稳定运行。

那不是英雄很强。

是系统太脆弱。


十一、不要把“被需要”误认为“被认可”

这是很多技术骨干最容易混淆的两个概念。

别人天天找你。

不代表你的职业价值正在上升。

可能只是因为:

找你最快。

你不会拒绝。

你掌握最多历史信息。

你习惯兜底。

真正能够带来职业成长的,不只是“被需要”。

而是你创造的能力能够脱离你本人持续存在。

比如:

你解决一次线上事故。

这是贡献。

你建立一套事故响应机制,让团队以后都能快速处理。

这是影响力。

你优化一个慢查询。

这是贡献。

你建立SQL审核和性能监控,让类似问题提前发现。

这是影响力。

你带一个新人完成任务。

这是贡献。

你建立培养方法,让团队可以持续产生合格开发。

这是影响力。

职位越高,组织越关注后者。

因为高级岗位最大的价值,本来就不是:

一个人干更多事情。

而是让更多事情不再必须依赖自己。


写在最后

程序员年轻的时候,很容易追求“不可替代”。

觉得公司越离不开自己,职业就越安全。

工作时间越久,才会发现:

真正舒服的状态恰恰相反。

你休假,系统正常运行。

你不在群里,团队也能解决问题。

新人不需要每天问你。

核心经验不只存在你的脑子里。

你可以离开一个项目,去负责更大的事情。

这并不意味着你变得不重要。

恰恰意味着:

你的价值已经从“一个人的能力”,升级成了“一个团队的能力”。

如果一个程序员离开三天,整个项目就停摆。

他确实很重要。

但他也很危险。

对公司危险。

对自己更危险。

因为所有人都会想:

这个人不能动。

而职业发展最需要的,恰恰是:

你能够不断离开旧位置,进入更大的位置。

林川的重启仍在继续。

下一次,他会重新遇到很多程序员都害怕的一幕。

绩效面谈时,领导拿出一张表:

“你今年做得不错,但团队必须有人拿C。”

上一世,他以为绩效只和工作表现有关。

后来才发现,有些评价从会议开始之前,就已经有了答案。

这一世,他决定不再等到结果公布之后,才开始证明自己。


本篇留一句话

真正的不可替代,不是所有事情都必须由你来做,而是你离开以后,团队仍然在使用你留下的方法继续向前。