上周三的技术评审会,我们为一个跨系统的对账方案吵了四十分钟。架构师画到第三张时序图的时候,老周把笔接了过去,没看任何文档,从用户态、锁行为、数据表锁首行索引,到重试补偿的异常路径,一条一条画完整,然后说了一句让会议室瞬间安静的话:"这里如果主库切换,binlog回放会晚两秒,那两秒会导致重复入账。"在场二十来号人,没人再质疑方案。
老周今年40,是我们技术部的Leader。他说的那句话我一直记得:"如果你到了35岁,还要跟25岁的人拼手速,那你肯定输了。"
这句话很容易被误解成"35岁就该转管理、别再碰代码了"。但恰恰相反,他直到今天还在写核心代码,每周提交的PR平均四十个文件上下,而且大部分关键评审都会卡在他的节点上。这篇文章想聊聊,为什么一个40岁的人敢理直气壮地说自己不担心被优化,以及他那些能直接抄走的做法。不管你是刚入行的开发,还是正在经历35岁焦虑的技术人,这篇都值得看完。
1. 40岁Leader那句话,到底在说什么
很多人听到"别跟25岁的人拼手速",下意识反应是"35岁拼不动了,所以赶紧转管理层"。这个理解不能说错,但非常片面。老周的原话有个被我忽略的前置条件——他说的是"如果你到了35岁,还要跟25岁的人拼手速,那你肯定输了"。重点不在"手速",在"还"字。一个35岁的人如果还在用25岁的维度跟年轻人竞争,这才是必输的点。
1.1 这句话背后藏了三层意思
第一层,手速从来不是写出好代码的核心变量。25岁的程序员每分钟能敲六七十行代码,但核心代码的难度从来不在敲键盘的速度,而在"你知道该往哪里敲"。老周写代码很慢,他一个方法经常写十几分钟,但写出来基本不返工。他花时间的地方是思考状态流转、异常路径、数据一致性,这些思考不会因为你打字快就变快。
第二层,35岁不是不写代码,而是选择写"什么样的代码"以及"用什么方式写"。老周也写业务代码,但他写业务代码的方式和应届生完全不一样。应届生拿到需求先搜索有没有现成的开源轮子,再开始拼装;老周拿到需求先问这个需求为什么存在、用户是谁、数据量级是什么、会触碰哪些现有模块、有哪些隐性约束,然后才动手。同样一个需求,年轻工程师可能三小时交付,他可能要一天,但后者交付的东西三天之后不用回头改,前者可能第三天就被测试打回。
第三层,被优化与否的真正变量从来不是年龄,而是"是否稀缺、是否不可替代、是否值得公司付出成本去保留"。一个40岁的人如果只有年龄大这一个特征,那确实危险;但如果他手里捏着公司核心系统的存量知识、关键链路的判断力、线上故障的兜底能力和团队方向的定力,年龄反而是优势。不是公司舍不得老人,是公司舍不得老人脑子里的那张"系统全景图"。
1.2 35岁焦虑的真相是可替代性焦虑
我们团队有一个28岁的小伙子,业务能力很强,但他有一天跟我说,他特别焦虑,觉得如果自己35岁还不是Leader,就会被优化掉。我问他为什么这么想,他说网上都这么说。我当时没反驳他,但后来想明白了:35岁焦虑的本质不是年龄焦虑,是"可替代性焦虑"。
同一条业务线,同样的需求,让一个25岁工程师和一个40岁工程师来处理,差异非常明显。我拿老周和组里的一个三年经验开发做过对比,同样接到"改造订单查询接口,支持分页和筛选"这个需求:
| 对比项 | 三年经验开发的做法 | 老周的做法 |
|---|---|---|
| 第一步 | 打开项目搜ORDER相关代码,找个相似的接口照着写 | 问这个接口的调用方有哪些、QPS多少、超时容忍度多少 |
| 第二步 | 用MyBatis Plus的分页插件直接查库 | 先看现有SQL的执行计划,确认索引命中情况 |
| 第三步 | 写完接口,本地用Postman测一下200就提交 | 构造脏数据、超大数据量、并发请求各测一轮 |
| 第四步 | 评审时被问"改了这个字段会不会影响别的接口",回答"应该不会" | 能准确说出"这个字段还被另外两个接口用了,一个读的是缓存,一个读的是主库" |
三年经验的开发不一定错,但他是"可替代的"——换一个人,给他相同时间,也能完成。而老周是不可替代的,因为他脑子里装的东西不是从需求文档里读到的,而是在这个系统上踩了六年坑踩出来的。公司不会轻易优化一个"他一走系统就没人完全懂"的人。
所以老周那句话的真正含义是:35岁之后,你不能再靠"我干活快"来保命,你要靠"有些活只有我能干"来保命。后者和年龄没关系,和你的积累有关系。
2. 他常年留在核心代码一线,图的根本不是工作量
写到这里,你可能以为老周是个"技术很厉害的老程序员"。不完全是。他留在核心代码一线,其实有非常清醒的职场策略考量,而且这套策略他自己承认过,原话是:"一个技术Leader如果不写代码,半年之后就会被架空,变成传话筒,然后他就会开始焦虑,然后他就会开始抢年轻人的活,然后整个团队都累。"
2.1 核心代码的复杂度门槛,才是真正的护城河
很多人觉得核心代码难,难在算法、难在并发、难在性能优化。这些确实难,但都是"可以查文档解决的难"。真正让核心代码成为护城河的,是那些看不见的状态。
我说个真实的例子。老周两年前负责一个资金对账模块,这个模块的核心是一张状态机表,记录每一笔交易的流转状态。有一次我们要加一个新渠道,我看了半天代码,觉得逻辑挺清晰,于是准备加一个状态字段。老周在评审会上问我:"你注意到状态机里有一个PENDING_REVERSAL状态吗?它是什么时候引入的?"我当时愣住了,git log显示这个状态是两年前一名离职员工加的,代码注释只有一行"用于渠道侧超时逆向",但没写触发条件。老周说:"这个状态如果不处理,新渠道上线第三天就会有一批单子挂在中间态永远消不掉。"
这就是核心代码的真相:最难的永远是那些不在需求文档里、不在注释里、只在某个人脑子里的"历史包袱"。年轻工程师可以在两周内学会一个新框架,但没办法在两周内学会一个人六年的踩坑经验。老周常年守在这个模块里,从表面看是在写代码,实际上是在持有一家公司的"系统真相"。谁持有真相,谁就拥有安全感。
2.2 "写核心代码"和"写业务代码"是两种完全不同的能力
这个区分是我从老周身上学到的,特别重要。业务代码追求的是快、多、看起来正常;核心代码追求的是稳、正确、可回归。两者的评价体系完全不一样。
| 维度 | 业务代码 | 核心代码 |
|---|---|---|
| 核心目标 | 快速交付、满足需求 | 正确性、稳定性、可回溯 |
| 返工成本 | 低,改个页面重发一版就行 | 高,一次故障可能影响全平台 |
| 依赖关系 | 依赖别人,别人也依赖它 | 谁都不敢依赖,改了处处受影响 |
| 知识密度 | 看文档就能写 | 必须长期浸染才能理解 |
| 对错误的态度 | 出错修一下就行 | 出错就是事故,要写复盘 |
老周带过一个应届生,能力很强,三个月就上手了某个业务模块。后来这个应届生觉得自己行了,申请去支付组,结果干了两个月,改了一个超时时间的常量,当天晚上就收到告警。他一脸懵——他改的是"看起来只影响请求超时"的常量,但那个常量同时被内部的补偿调度器引用,超时时间一改,补偿任务集体提前触发,大量重复入账。这个应届生后来跟我说,他第一次感受到"核心代码不是靠聪明就能碰的东西"。
老周自己说,他写了二十年代码,真正让他站住脚跟的不是多会用Spring Cloud或者Kubernetes,而是那些"别人不敢动、动错了会出事"的模块。你维护一个高频迭代的业务页面,换了谁都能接;但你要是能维护一条资金链路还能三年不出事故,你在这家公司就是定海神针。
2.3 他图的是信息优势和控制感
还有一个很现实的原因,老周没有明说,但我看得出来:写核心代码让他始终处于一个"能判断事情真伪"的位置。技术Leader最怕什么?最怕下属汇报什么他就信什么,最怕离代码太远导致做决策全靠二手信息。
他每周都会抽出两天下午,专门去翻核心代码的提交记录,不看功能,只看diff。他跟我说:"提交记录是人类行为的投影,你能从diff里看出谁在赶工、谁在裸奔、谁在给自己留后路、谁在给别人挖坑。"他通过这种持续的一线参与,保持着对团队真实技术状态的信息优势。他做技术决策时,不需要问"现在系统到底长什么样",他自己看过代码,他知道系统长什么样。
这种"控制感"其实是反焦虑的关键。一个人焦虑,往往是因为他无法预测即将发生的事;而老周对核心系统的可控程度足够高,所以他很少因为技术不确定性而焦虑。
3. 35岁之后,手速和体力的真实占比
很多人对"35岁写不动代码"有一个刻板印象——年纪大了,精力跟不上,通宵扛不住,学新东西慢。我不否认这些生理层面的变化确实存在,但落到真实的工作产出上,"手速和体力"在核心开发里的权重,可能比你想象的低得多。
3.1 拼手速在成本账上根本不成立
我帮老周做过一次小学数学题。假设一个25岁工程师手速快,每天能比老周多完成20%的需求量。一年250个工作日,他大约多做50天的工作量。听起来很多对吧?但这个"多出来的量"需要建立在"他写的代码不用返工"的前提下。而事实上,核心模块的新人代码,一次评审打回、一次线上事故、一次数据修复,消耗的时间就能把这50天的"余量"全吃掉。
我亲眼见过一次线上事故,就是一个新人快速改了一个缓存过期策略,导致线上数据错乱了三个小时,最后老周带着四个人花了两天时间写数据修复脚本、更新缓存、核对账务。两天时间,足够老周写两个核心模块了。所以"手速"这个维度在核心代码领域是伪优势——它的收益极低,而它的错误带来的成本极高。
再补一个事实:线上故障的修复,真正耗时的从来不是"敲代码的速度",而是"定位问题的速度"。老周处理线上问题有个固定习惯,先不做任何修改,花十分钟把故障变更范围锁死,然后看监控、看日志、看链路,搞清楚"到底是哪个状态被破坏了,到底是从哪条路径进来的"。他不会一到现场就急着改代码,因为他知道,在没搞清楚状况的时候就动手,很容易按下一个问题冒三个新问题。
3.2 精力管理比时间管理重要得多
老周40岁,精力肯定不如28岁的小伙子,但他产出并不低。区别在于他怎么分配精力。
他每天上午手机静音,不参加会议,不看即时通讯,专门用来做深度工作——写核心代码、做关键评审、啃复杂问题。下午才开处理会议、回消息。他跟我算过一笔账:上午4小时的深度工作,产出约等于下午碎片化8小时的产出。因为他上午写代码是"纯写",下午的碎片化时间只能干点"不需要动脑子的活"。
这不是什么新鲜理论,但他有个执行细节特别狠:任何会议如果超过30分钟还没有产出结论,他会直接叫停,说"我们先各自想清楚再开下一轮,否则是浪费彼此时间"。他把这种会定义为"低水平重复劳动",坚决不参与。年轻工程师恰恰相反,最爱在各种群里长时间来回讨论问题,看起来忙,实际上大量精力花在无效沟通上。
3.3 35岁以后的学习方式也必须换挡
以前我也以为老周这种资深工程师肯定天天刷新技术,后来发现他刷的东西和我想的不一样。他会看某些领域的paper,会研究存储引擎的实现,会重新翻《操作系统导论》,但他极少追新框架。
他说:"框架是工具,工具会换,但底层的操作系统、网络、数据结构、数据一致性、缓存一致性的原理几十年不变。你要在一个系统里待十年,决定你上限的不是你会多少个新框架,而是你吃透了几个不变的东西。"
有一个细节特别体现这一点。去年我们校招生面试,有一道算法题是"求1到N的所有质数",大部分人上来就写埃氏筛法。老周在面评的时候随口提了一句:"埃氏筛法的核心是标记合数,时间复杂度O(N log log N),但空间上有个优化思路,用bitmap标记,可以把空间降到N/8字节;如果N特别大,还可以分段筛。"他讲得相当熟练,完全不是背答案的味。后来我问他是专门复习过吗,他说:"上个季度有个数据清洗需求,要在一批几千万的ID里筛出素数ID做抽样,没用现成库,自己写了个分段筛加bitmap的版本。"
这对我触动很大。老周不是靠"记住"保持算法功底的,他是靠"真的用"保持的。他学习任何东西,最终都要落在一个真实问题上,从来不为了学而学。这种学习方式到了35岁以后尤其重要——你的时间变少了,你必须确保每一分钟的投入都沉淀在能复用的事情上,而不是追着热点跑。
4. 从老周日常里,能直接抄走的工作习惯
这部分是纯干活内容。我从老周身上观察到一些特别具体、特别可复制的习惯,全写出来,你不需要成为40岁的Leader,从现在开始就能用。
4.1 评审会上只问三个问题
老周做设计评审,几乎不问"你用什么技术栈""表结构怎么设计的""接口性能怎么样",他永远只问三个问题:
- 这个改动动了哪些状态?
- 这些状态坏了怎么恢复?
- 失败路径是否可补偿?
这三个问题起初我以为是他的个人风格,后来发现它们几乎覆盖了核心系统所有故障的可能成因。系统里所有的事故,本质上都能归纳为:状态被破坏、状态不可恢复、失败后无法补偿。你用这三个问题去审任何设计,当场就能揪出一堆问题——"如果服务刚好在写入缓存之后、落库之前挂了,你的幂等逻辑扛得住吗?"——扛不住,这就是"失败路径不可补偿"。他这套方法论就是用最朴素的方式抓住了分布式系统的命门,和潮流没有关系,和原理有关系。
4.2 坚持维护一份"技术债台账"
很多团队都会说自己在还技术债,但大部分只是在那口头上说说,没有任何管理动作。老周的做法很不同:他让团队维护一份技术债台账,但这不是简单记录"这里很烂、那里该重写"。每条技术债至少包含四个字段:债务位置、债务成因、触发条件、偿还方案。
我举个例子。台账里有一条记录是"订单表order_id的索引冗余",别的团队可能就写"索引过多,影响插入性能"就完了。老周要求补全后边的信息:这个索引是两年前大促时为了一个报表临时加的,那个报表的定时任务每天凌晨跑一次,所以触发条件是"每天凌晨2点",偿还方案是"等报表任务下线后删除该索引,并行用新的覆盖索引替代"。这么一条一条记下来,技术债才从"一种情绪"变成了"可管理的风险"。
有了这份台账,老周排期做"技术债偿还"的时候就能有理有据地说"这周要还这三条,因为其中两条触发条件已经被触发三个月了,第三条的偿还方案依赖的下游服务下周就上线"。这个习惯的意义在于:技术债不可怕,可怕的是你不知道债在哪里、什么时候要还利息。
4.3 "慢就是快"的落地方式
老周写核心代码的固定节奏,我观察了很久,总结出来就是三步走:
- 先画状态图。不管需求多小,只要涉及数据变更,先在白板上画出所有状态和流转条件。状态没有理清楚之前,不动键盘。
- 再写失败用例。把"如果这里挂了会怎样""如果重复调用会怎样""如果参数非法会怎样"写成测试用例,先让它们全部跑红。
- 最后才写实现代码。实现的目标只有一个:让这些失败用例全部转绿。
这套流程看起来非常"慢",尤其是第一步,在很多人看来是浪费时间。但实际上,绝大多数返工都源于状态没理清就动手写代码。老周说:"代码写错了改起来快,但状态设计错了,改设计就不只是改代码,是要改数据,是要修线上,那就慢了。"
我带过一个小项目,当时想着"这个需求很简单,不用画图了",直接写代码,结果中间改了三版,最后因为没考虑到退款状态和作废状态的重叠,导致一张订单可以同时被作废又被退款。后来我学乖了,再小的改动也先花十分钟把状态图画出来,整体耗时不升反降,因为返工的次数几乎归零。
5. 被优化焦虑的真实解法:把自己活成那个"不能没有的人"
这部分不聊虚的,直接聊"被优化"这件事到底怎么防。老周说他不担心被优化,不是盲目自信,也不是相信公司有情怀。他说的是实话——他把自己活成了一个"重建成本极高"的人,公司不是不想动他,是动不起。
5.1 忠诚和资历统统没用,要有"重建成本"
你去问任何一个管理者,裁员名单是怎么定的?表面上是"绩效末位",实际上的逻辑是"评估替代成本"。一个员工的替代成本高,公司就不会动他;替代成本低,绩效稍微波动一点,就很危险。
怎么理解替代成本?很简单,问一句:这个人明天不来了,系统会怎样?
- 如果他负责的是一个标准模块,换个人两周就能接手——替代成本低。
- 如果只有他一个人知道某个中间件的账务逻辑、知道某条核心链路的隐藏坑在哪里、知道那个三个月才触发一次的老Bug的修复方式——他不在,这个模块出问题后,可能全组要花半个月才能摸清底细。这就是高替代成本。
老周在团队里就是后一种。他常年维护着那些"看不见但很值钱"的领域。不是支付、不是DAU最高的页面,而是中间件、账务、对账、权限、数据迁移这一类——平时没存在感,一出事就卡脖子的东西。他说:"你要让自己成为系统的最后一道保险丝。保险丝平时没人注意,但烧断的那一瞬间,所有人都会想起你。"
5.2 一份可以直接对照的反脆弱自查清单
我根据老周的做法,整理了一份自查清单,你可以拿来自测——如果下面五条你能满足三条以上,你的被优化焦虑大概率比同龄人小得多:
- 你是否长期维护着一个"离开你两周别人就无法上手"的领域?
- 你是否掌握着公司核心系统的隐性知识——不是文档里写的那种,而是只有踩过坑才知道的那种?
- 你是否具备"危机时刻当定心丸"的能力——线上出大事时,大家会不会第一时间想到找你?
- 你是否还能独立写出核心模块的关键代码,而不是只在嘴上指点江山?
- 你是否有一个"即使离开这家公司,也能立刻带走并复用"的核心技能?
前两条拼的是存量积累,第三条拼的是信任,第四条拼的是"手没有离开代码",第五条拼的是"能力不绑定平台"。老周五条全占,所以他敢笑着说自己不担心被优化。你占得越多,安全感越强。
5.3 别和公司绑定,要和"解决问题的能力"绑定
老周说过一句我印象特别深的话,他说:"我不是不担心被优化,我是就算被优化了,也有地方去。"
这句话才是终局。一个人如果只有"不被优化"这一个目标,那他永远会被动,因为决定权在公司。但如果他把自己训练成"不管去哪家公司,都能解决那家公司最头疼的问题",他就有了选择权。有了选择权的人,不会焦虑"被优化"这回事,因为他知道自己的价值可以平移,平台只是放大器,能力才是本体。
老周能写核心代码,能搞定复杂状态,能判断系统风险,能带团队,这些能力不绑定任何一家公司的业务,它们是通用的。所以他从来不焦虑"如果明天被裁了怎么办",因为他知道,明天被裁了他也能很快找到下一个需要"有人看懂核心系统"的地方。安全感从来不来源于"公司不会开我",而来源于"就算开了我,我也不怕"。
最后说点我自己的感受
写了这么多,其实最想分享的是一个小细节。老周的办公桌抽屉里放着五六本A5的活页本,按年份标着序号,每本都密密麻麻记着他这些年踩过的坑、修过的事故、做过的决策。有一次我问他为什么不放到Wiki上,他说:"Wiki是给组织用的,本子是给我自己用的。我从来不跟年轻人比手速,我只比谁看过的坑更多。"
这句话我琢磨了很久。在真正核心的岗位上,年龄从来不等于劣势,它只等于一件事——你看过的坑够多,多到一眼就能认出前面有个坑。你不需要在35岁变成管理者,你只需要在40岁变成那个"别人一提起来就放心"的人。
愿你到40岁那天,也能像老周一样笑着说:我不担心被优化。