昨天四十岁。
早上醒来,手机里还是告警、群消息、周报,还是有点超重,腰还是那条腰。
没有什么突然开悟的时刻。
四十岁这件事,落到一个技术人的日常里,大概就是终于承认:很多问题不会因为你讲清楚了道理就消失,很多损失也不会因为你占理就退回来。
先躲开车
刘润在《底层逻辑》里讲过一个故事。一个人走在人行横道上,一辆卡车冲过来,所有人喊他躲开,他说:「他不能撞我。他撞我是违反交通法规的,他负全责。我就不让。」后来他被撞死了。
卡车司机有错。可人没了。
我年轻时很像那个行人。需求文档没写,我就等。接口没有按约定返回,我就骂。线上依赖方挂了,我第一反应是截图留证据。那时候我觉得自己很专业,因为边界清楚,责任清楚,话术清楚。
后来我发现,用户不会关心你截图多完整。老板不会因为你证明了别人有错就少焦虑。系统不会因为责任归属清晰就自动恢复。
成年人世界里,谁损失最大,谁最应该先行动。
这句话放在工程里,就是事故响应的第一原则。先止血,再恢复,再定位,再复盘,再追责。顺序反了,场面会有点难看。
成年人的账本
四十岁之前,我曾经以为成熟就是忍。后来发现,忍这个字有点糙。
有些事该忍,因为对抗成本太高。
有些事不能忍,因为对方会觉得你好欺负。
有些事要先忍一晚,第二天带着证据处理。
这几年带团队,我最怕一种状态:出了问题,大家都在证明自己无辜。
「这个不是我负责的。」
「我早就提醒过。」
「客户那边也没说清楚。」
这些话有时都是真的。但项目不会因为这些话自动变好。
我们的目标是什么?是要把项目变好,把蛋糕做大,让大家都能分到,一个大的蛋糕就算你只有 1%,那也很大,一个小的蛋糕,哪怕你有 99%,那也很小。
人到四十,最该丢掉的东西之一,就是无效悔恨。后悔会占用注意力,却不给下一次提供工具。
组织接口
三十五岁之后,我花在代码上的时间少了,花在人身上的时间多了。
刚开始很不适应。代码报错会给栈,人不会。代码超时会返回,人经常沉默。代码重试可能成功,人被催多了会烦。组织系统比软件系统难,因为它的状态不可见,反馈有延迟,很多变量还会装没事。
做管理之后,我慢慢把团队当成一个有接口的系统来设计。
需求入口要清楚。谁提出,解决什么业务问题,验收标准是什么,必须在什么时候交付,延迟的损失是什么。没有这些信息,研发排期就是猜谜。猜错之后,产品觉得研发不配合,研发觉得产品乱改,最后大家都累。
责任边界也要清楚。一个项目只能有一个最终负责人,可以有很多协作者。多人共同负责,最后经常变成没人负责。负责人不代表所有活都自己干,他要保证信息流动、风险暴露、决策推进、结果交付。出了问题,他先站出来组织处理。至于具体错误是谁造成的,事后再拆。
会议也要像接口。输入是什么,输出是什么,谁消费这个输出。没有输出的会少开。只同步状态的会改成文档。需要拍板的会提前把选项和代价写出来。很多公司一周十几个会,真正产生决策的不到三个。剩下的会消耗注意力,还制造一种大家都很忙的假象。
我不喜欢用「兄弟们冲」来管理团队。短期能冲,长期会透支。可交付体系要靠节奏,靠优先级,靠风险前置,靠承诺管理。研发可以加班救火,但不能把救火当默认交付方式。一个组织如果长期靠英雄主义维持,说明系统设计已经出问题了。
算了
我现在经常说「算了」。
但这个「算了」不是摆烂,也不是认输。它是一个止损动作。
有些争执,继续讲下去只是增加噪音。有些合作,继续磨下去只会消耗团队。有些关系,继续解释只会给对方更多误解你的材料。有些旧账,继续翻只会让现在的生活被过去占领。
要不要算了还是有一个逻辑在的,问一下这些:
- 损失还能不能追回。
- 对方有没有改变动机。
- 继续投入会不会影响当下更重要的事。
- 这件事会不会再次发生。
如果损失追回希望很低,对方没有改变动机,继续处理还会影响手头工作,那就算了。但算了之后要留下记录。下次不合作,边界提前说清,钱款先到账,关键沟通留文字。成年人嘴上算了,账本不能空。
太早说算了,也危险。
有些人会把你的退让当成入口。第一次拖款,你说算了;第二次改需求,你说算了;第三次把锅甩给你,你还说算了。到最后,你发现自己训练出了一个持续伤害你的环境。
所以「算了」要配套一个动作:修改规则。
朋友借钱不还,可以算了,但以后不借。客户反复越界,可以算了,但合同重写。团队成员多次低级失误,可以算了,但岗位调整。亲戚说话难听,可以算了,但减少见面。
年轻时把「算了」理解成吞下去。现在更像把这件事封存,还把门锁换了。
人间很苦
《西游记》里,神仙犯错,经常被打下凡尘。小时候看了个热闹,四十岁再看,原来最大的惩罚竟然是做人。
做人确实很累。
年轻时的累,多半来自能力不够。代码写不出来,方案讲不清楚,面试被虐,工资不高,机会不多。那种累有个好处:你知道该往哪里使劲。学技术,练表达,扛项目,跳出舒适区。
中年之后的累要复杂很多。父母变老了,孩子长大了,团队要结果,公司要现金流,客户要交付,身体开始提醒你别乱来。很多事情没有根因分析,只有风险缓释。很多问题没有最终修复,只有阶段性稳定。
技术人特别容易相信因果。出了问题就找原因,找到原因就修复,修复之后写单测,特别单纯。但生活没这么规整。有人生病,你做不了回滚。关系变淡,你找不到日志。机会错过,也没有补偿任务自动执行。
所以我现在对身体很认真。睡眠、体检、运动,这些东西以前听着像废话,后来发现它们是底层资源。
太祖老人家说过:身体是革命的本钱。没有这个本钱,判断力会下降,耐心会下降,情绪会失控。一个老板如果长期睡不好,白天做出的架构决策、人事决策、融资决策都会变形。
我以前觉得扛得住是本事。现在觉得能安排好节奏才是本事。夜里两点写方案,第二天照样开会,连续几个月这么干,这就是在欠债,迟早要还的!
留点余量
四十岁最明显的身体提醒,是余量变少。
以前连续熬夜,睡一觉还能回来。现在不行,得缓一周。以前接十个需求,靠兴奋顶住。现在会先看团队承载能力,看关键人的排期,看线上系统最近有没有风险,看自己接下来两周能不能正常睡觉。
年轻时我很喜欢把资源打满。机器要跑满,人也要跑满。排期压到最后一天,预算卡到最后一分,人力刚好覆盖每个任务。看起来效率很高,实际很脆。
系统里 CPU 长期 90%,没人会觉得健康。连接池打满、队列堆积、P99 拉长,大家都会紧张。可到了组织里,很多人又开始迷信 100% 利用率。每个人的日历塞满,每个 Sprint 塞满,每个季度目标塞满,然后一个线上事故、一个客户插单、一个核心同学生病,整条链路就开始崩。
我后来改了一个习惯:排期只排到七成左右。
剩下三成留给不确定性。线上问题要处理,需求会变,客户会反悔,依赖方会延期,评审会发现以前没看到的坑。研发不是流水线,软件也不是按图纸拧螺丝。只要系统里有人、有代码、有外部依赖,就一定会有抖动。
留余量有代价。
老板会觉得资源没用满,业务会觉得研发保守,团队里也会有人问:「明明还能做,为什么不接?」我的回答一般很简单:能做和能稳交付是两件事。今天把所有人压满,明天出事故就没人救火;这个月把所有技术债往后扔,下个月每个需求都要多绕三圈;这周靠熬夜把版本发出去,下周同样的人还要继续扛下一个版本,质量只会掉。
工程上的余量也一样。
核心链路不要只按平均 QPS 设计,要看峰值、突刺和失败重试。数据库连接数不要配到刚好够用,缓存容量不要顶着上限跑,消息队列不要等堆积到业务可见才处理。监控图上那些长期贴边的指标,都是系统在提醒你:它已经没地方躲了。
发布也要留余量。重大版本不要压在周五晚上,不要把数据库变更、缓存策略调整、核心依赖升级放在同一个窗口。每次上线最好只改变少数变量。出了问题,定位范围才不会爆炸。一次变更里塞五个风险点,回滚都不知道先回哪个。
人也需要余量。
我以前把累当成常态,觉得技术人就该扛。后来发现,长期疲劳会直接影响判断。架构评审时听不出风险,代码 Review 时漏掉边界条件,跟人沟通时一点就炸。很多所谓管理问题,根上就是人已经没电了。
现在我会强制给自己留空档。一天里不把会排满,一周里留半天处理积压事项,晚上尽量不做需要重大判断的决策。团队也一样,关键岗位必须有备份,核心系统必须有人能接手,文档要能让新人看懂。一个模块只有一个人懂,平时省了沟通成本,出事时成本会翻倍回来。
四十岁之后,我越来越不相信极限操作。
偶尔冲刺可以,长期贴边运行一定出问题。身体、团队、系统、公司现金流,都一样。留点余量,平时看起来慢一点,遇到突发情况时,才有空间转身。
四十以后
四十不惑,对我来说并不代表什么都懂了。
四十岁的不惑,对我来说范围很窄。
我依然有很多困惑。业务会变,技术会变,人会变,市场会变。今天看起来稳的东西,明年可能就没了。一个人如果声称自己什么都看透了,大概率是在装。
我能确定的事情少了一些。
看见卡车,先躲开。别站在路中间证明自己有理。
线上出事,先止损。别在用户失败时忙着划清边界。
技术债可以借,账本要写清楚。别把临时方案伪装成长期架构。
团队要讲责任,也要讲机制。别把所有问题都压到某个英雄身上。
有些事要追到底,有些事要算了。别把人生过成一条永远做不完的工单。
接受所能接受的。
四十岁没有把我变成更厉害的人,只是让我少浪费一点力气。少在无用的争辩里耗,少在错误的关系里耗,少在虚荣里耗,少在已经过去的事里耗。
四十岁也没有把我变得更通透。只是比以前少了一些争辩,多了一些预案;少了一些委屈,多了一些边界;少了一些幻想,多了一些愿意亲手处理烂摊子的耐心。
下午还有文档要写。晚上还会有告警。
日子照常跑。系统照常跑。人也照常往前跑。
该小酌小酌。该微醺微醺。
这就够了。
以上。