写给 40 岁的自己:如果人生是一次持续交付
明天我就 40 岁了。
没有想象中那种天翻地覆的感觉。早上起来,dorian 还是把一盒牛奶打翻在餐桌上,我还是先擦桌子再哄他吃饭。生活照旧,像一台运行了二十年的老系统,没有宕机,也没有升级提示。
但我知道,某些东西在悄悄变化。就像代码跑了很多年,突然有一天你想停下来,看一眼自己的提交记录。
于是我翻出了一个老笔记本,里面是十年前的自己写给现在的一封信。那封信的最后一句,我至今记得:
“希望 40 岁的你,已经活成了我想要的样子。”
我没有回信,也很难说活没活成。那天晚上躺在床上,我做了一件十年来从没做过的事——把自己当作一个正在交付的项目,从头到尾看了一遍。
前半生,我一直在”发布大版本”
做软件的都知道,交付有两种打法。
一种是憋大招:闷头开发一整年,把所有功能一次做完,挑个黄道吉日上线。版本号跳得很大,v1.0 直接变 v2.0,看着过瘾。另一种是小步快跑:每两周发布一次,每次只加一点点,上线、观察、反馈、再改。
我前半生,活成了第一种。
读书那十几年,是一个巨大的 v1.0——目标单一,就是考出去。毕业进大厂,是 v2.0,主题是”证明自己”。结婚生子,是 v3.0,主题变成了”把家撑起来”。
每一个版本之间,我都隔了很久。每次都憋着一口气,觉得”等我把这个阶段完成,就可以歇一歇”。可人生这玩意儿,从来不会给你一个”发布完成”的通知。你以为是里程碑的地方,跳过去一看,还是下一段路。
憋大版本的问题在于:你把自己的人生过成了一次性交付,可人生偏偏是持续交付。 没有终点,只有持续的上线与迭代。
40 岁最大的顿悟,就是我不再等待那个”从此以后就轻松了”的大版本了。
持续交付的第一课:频繁发布,小步验证
如果现在让我重写前半生的代码,我会改掉一个最根本的设计——把”憋大招”改成”小步快跑”。
很多人理解不了为什么要频繁发布。在他们心里,产品不够完美,就不该上线。可真正做过产品的人知道:不上线的代码,是不产生任何反馈的死代码。 你自以为完美的功能,可能上线第一分钟就被现实打脸。
人生也是这样。
我见过太多人,把”等准备好了再开始”当成一种负责。想写作,等文笔练好了再写;想创业,等风口来了再干;想跟父母和解,等赚到钱了再说。结果那个”准备好了”的时刻,永远没有来。
40 岁的我会告诉过去的自己:别等准备好了,先发布一个能跑的版本,然后让真实世界的反馈来告诉你下一步该怎么改。
我刚跳进安全这门行当的时候,写的第一份威胁评估报告烂得没法看。但我提交了,被 leader 打回来,改,再提交,再打回来。就这么改着改着,我成了能带团队的那个人。
如果当初我躲在角落把那份报告打磨成”完美”才交,我大概到今天还躲在那个角落。
持续集成的哲学:让每一个小改动都可测试
做持续交付,难的不是部署,是持续集成——你得让每一次提交都自动跑一遍测试,保证它不把整个系统搞崩。
我把这套逻辑翻译到生活里,发现它其实是在回答一个更朴素的问题:你怎么知道,你现在走的这条路是对的?
年轻的时候,我靠”感觉”判断。感觉这份工作有前途,感觉这个人值得托付,感觉这个决定不会错。可”感觉”是最不可靠的测试用例,它今天通过,明天就可能崩。
后来我给自己搭了一套”人生测试”:每隔一段时间,自动跑几个最基本的问题——我还在成长吗?我的身体还扛得住吗?我和老婆的话还说得进对方心里吗?dorian 看我的眼神,还是信任的吗?
这些问题没有标准答案,但它们像 CI 管道里的单元测试,会在我”感觉良好”的时候,冷静地告诉我哪里其实已经飘红了。
40 岁的人很容易活在一种”差不多得了”的惯性里。而持续集成教我的,是别让惯性代替判断。哪怕一切看起来都正常,也要定期跑一遍测试,看看有没有哪条默认路径已经悄悄烂掉了。
技术债:那些你拖着没还的东西,会复利
每个程序员都欠过技术债。
那段当年图省事写下的烂代码,现在每次改功能都要绕开它;那个早就该重构的模块,如今谁碰谁加班。你当年省下的那一小时,正在用无数个一小时慢慢还。
人生也一样。
40 岁之前,我欠了不少”人生技术债”:常年熬夜透支的健康,忙起来就冷落的老婆,为了工作错过 dorian 成长的那几年,还有那个憋在心里一直没跟父亲说完的疙瘩。
这些东西有个共同点:当下拖着不处理,它们不会消失,只会利滚利。 身体的债,到中年开始收利息;关系的债,往往在你最需要依靠的时候突然爆雷。
但技术债还有另一层温柔——它允许你重债,只要你别假装它不存在。 40 岁不是终点,恰恰是开始清账的好时候。那些还来不及还的,一件一件排期,一件一件还。慢一点没关系,开始还,就是转机。
我今年做的最重要的一件事,不是工作上的什么重构,而是把”陪老婆吃晚饭、给 dorian 讲故事、每周跟父亲打一个电话”这两三件事,写进了我人生的”必还清单”,并且真的开始还。
回滚与灰度:犯错不可怕,可怕的是不能回退
做运维的人最怕一个词:不可回滚。
一个改动一旦上线,如果出了问题撤不回来,那就是灾难。所以聪明的团队会做灰度——先放一点点流量进去,看它稳不稳,稳了再全量。
我年轻时最羡慕的,是那些”一条路走到黑”的人,觉得那叫坚定。40 岁才明白,真正的勇气不是不回头,而是随时保有回头的权利。
选择错了,可以回滚;婚姻走不到最后,可以体面地结束再开始;职业方向不对,可以止损调头。最可怕的,是把自己逼到一个”只能往前、无法回退”的死角里,然后拿”坚持”给自己壮胆。
灰度教我的,是把人生的大决定拆成小步试错。想转行,先利用业余时间做几个小项目试试水深,而不是裸辞。想搬到新城市,先住几个月感受,而不是把房子卖了押上全部。小步试错,成本是你付得起的学费;一步到位,代价可能是你输不起的赌注。
40 岁的我,学会了给自己留退路,也学会了不把留退路当成懦弱。
监控告警:身体和关系,都需要一条告警线
系统上线之后,靠什么活下去?监控。
没有监控的系统,出了事你都不知道,直到用户骂上门。有了监控,指标一飘红,告警一响,你就能在它变成大故障之前把它掐灭。
我这个人,前半生最缺的就是”人生监控”。
熬夜到三点,身体不发告警,我就不当回事;情绪绷到极限,心里没个阈值,就连轴转;跟老婆冷战,关系一条曲线跌到底,我才反应过来已经很久没好好说话了。
40 岁,我开始给自己架设告警线。体检查出的每一项指标,不再是医生嘴里的数字,而是我人生系统的监控面板;老婆那句”你最近很累吧”,是关系曲线开始下降的黄色告警;dorian 不再缠着我要抱抱,是父子亲密度跌破阈值的红色警报。
健康、关系、情绪,这些东西最大的敌人不是突发,而是”悄无声息地坏掉”。 你需要的不是等它崩了再抢救,而是早早设好阈值,在它刚开始往下掉的时候,就拉响那根警报。
SLA:对家人,你要守住你的可用性
做服务的都知道 SLA —— 服务级别协议,说白了就是”我承诺在多长时间内、以多高的可靠性,给你提供服务”。
放在工作里,这是契约。放在家里,它其实是一种更沉的东西。
我老婆做教培行业的设计师,经常加班到很晚。可她再忙,晚饭那一个小时,是雷打不动留给 dorian 的。她跟我说过:“我可以对公司 slacking,但不能对儿子降级。”
这句话我记到现在。它让我意识到,人生的 SLA,不是写给别人看的,是写给自己在乎的人看的。
40 岁之后,我给自己定了一条朴素的服务级别协议:只要我在家,晚饭时间就是一次”不可降级的发布”;只要 dorian 有事,我的可用性优先级永远高于工作。
听起来像句空话,但守住它的每一天,都在把”父亲”“丈夫”这两个角色,从一个口头标签,编译成真正能跑、能扛事儿的服务。
后半生路线图:少交付,交对的东西
如果非要给 40 岁之后定一份路线图,我会写这么几条:
第一,砍掉那些没有复利的版本。 精力是有限的,别什么功能都想上。聚焦两三件真正值得长期投入的事,其余的大胆下架。
第二,把”稳定”作为最高优先级。 40 岁的人最值钱的,不是再憋一个大招,而是成为一个靠谱的、可依赖的、不轻易宕机的人——对家人,对伙伴,对朋友。
第三,留出”重构”的时间。 别等到债务压垮才动手。定期停下来,把那些该修补的关系、该改善的习惯、该正视的问题,排上日程。
第四,也是最重要的一条——永远别停止发布。 40 岁不是 v4.0 的完结,而是下一个迭代的起点。只要你还愿意提交、愿意测试、愿意根据反馈去改,你就始终处在一个”正在变得更好”的状态里。
写到最后,我想起十年前那封”写给 40 岁的自己”的信。现在我可以回信了。
我会这样写:
亲爱的过去,你没活成我想象的样子,这很好。因为你想象的样子太完美,而完美的东西,是没办法持续交付的。
我更喜欢现在这样——一个还有技术债要还、还在发灰度、还会被现实打回来,但始终没有停止上线的 40 岁。
如果人生真的是一次持续交付,那我愿它永远处在”部署中”。
这,就够了。