前几年有一次半夜上线,业务方在群里连环@,日志一行一行刷过去,我盯着屏幕忽然走神了:如果有一天这套系统、这份工作、这台笔记本都不在了,我手里还剩什么真正值钱的东西?这个问题没有当场答案,但我后来想了很久,断断续续想明白了一些。写这篇东西,是想把那些想法整理出来。它不是一个纯技术的教程,更像是一个老程序员在重构了无数代码之后,回头重构自己人生逻辑的过程。如果你也正在"天天写CRUD、感觉自己不值钱"的焦虑里打转,这篇东西应该能给你一些不一样的坐标。
1. 值钱的不是代码,是"需求"
先说一个我踩过的坑。
前年我接手一个内部老系统,大概跑了十年,技术栈旧得离谱,文档约等于没有,业务方也换了好几茬。我一开始以为这系统最大的问题是技术老化,于是兴冲冲地列了一堆重构计划,准备大干一场。结果跟业务方聊了三次之后,我整个人都不好了——这套系统真正支撑的需求,早在五年前就已经不存在了。
当时的业务方负责人自己都说不清楚某些页面是干嘛的,只知道"老领导在的时候就有""数据库不能动,动了怕出事"。于是系统就这么一直跑着,每个月花着云资源费用,每次发版都要小心翼翼的,像供着一个没人知道原理的老祖宗。
那一刻我意识到一个特别扎心的道理:代码本身没有值钱不值钱的问题,需求才有。一个需求如果还成立,哪怕下面的代码丑得没法看,它每天也在产生价值;一个需求如果已经消亡了,代码写得再优雅、再干净,也只是负债——它吃你的维护成本,吃你的注意力,吃团队的心智。
从那以后,我接任何系统、做任何方案,第一件事永远是问一句:这个需求还成立吗?它为谁解决问题?解决的是真问题,还是大家习惯了所以觉得"应该存在"的问题?搞清楚了再谈技术选型。这个顺序一旦反了,后面全是白忙。
这几年我带团队面试新人,特别喜欢问一个问题:你上一个项目的核心价值是什么?你能说清楚自己用了什么框架、写了多少接口、解决了什么技术难点,但很少有人能一句话说出"这个模块为谁、解决了什么问题、省了多少钱或者多少时间"。大部分人的反应是愣一下,然后开始讲功能清单。
这不是表达问题,是"需求感"的缺失。
我后来跟团队讲过一个很极端的例子。某次做报表需求,产品经理提了一堆筛选条件、图表类型、导出格式,前前后后排期三个月。开发做完了,上线两周,后台看埋点数据:使用量几乎为零。后来回访才发现,业务方真正想要的只是"每天下午五点自动收到一封昨日数据的邮件",他们甚至没时间打开系统去看那些炫酷的图表。
需求感强的人,第一反应应该是问"为什么需要筛选?谁在用?他拿到这个数据之后要做什么决定?"问到最后,答案可能就是一个定时邮件加一张Excel。三个月的工作量,压到三天就能交付。这就是真需求和伪需求的差别。
这个道理放到人生维度上,其实一样成立。
人这一辈子,最值钱的不是你掌握多少技能、写了多少行代码、攒了多少年的工龄,而是你能不能持续分清:自己真正需要的东西是什么,那些被社会、被焦虑、被别人的眼光塞进来的"需求",哪些是伪需求。
我们会把"想要"误当成"需要"。想要更大的房子,是因为觉得别人都有了;想要更高的职级,是因为怕自己掉队;想要更多收入,是因为被消费主义植入了一个"钱永远不够"的脚本。这些需求的共同特点是:满足一个,马上冒出下一个,永远填不满。
真需求长什么样?它一般能回答得更朴素——这件事做了,我的能力边界是不是扩大了?我的身体和精神状态是不是变好了?我身边的人是不是也变好了?答案如果是肯定的,那你是在满足真需求;如果只是缓解了当下某种焦虑,那你大概率是在给伪需求打工。
所以我现在的答案第一层是:值钱的核心不在"做什么",而在"判断哪个需求值得投入"的能力。这个能力,恰恰也是我后来重构代码之外,最先想重构的东西。
2. 一个具体的重构案例:十年老项目重写的取舍
空谈道理没用,拿一个真实做过的项目拆给你看。
某个内部系统X,是一个记账改成了订单管理又改成数据中台的老系统,前后被三拨人改过,代码里什么风格都有。它有一个最痛的点:订单状态流转里,被历任开发塞了十多个if补丁,什么"老客户专享赠送""某渠道优惠券过期不发赠送""后端重推时必须跳过状态快照",各种逻辑纠缠在一起。新人看了直接想跑路,老人也不敢乱碰。
所有人都觉得"该重写了"。但这个系统每天有几百个运营在点,说实话是当时公司的吃饭工具,停一秒钟都有人嗷嗷叫。所以我们当时做了一个看起来反直觉的决定:不重写,做渐进式重构。
2.1 为什么"该重写"却"不能重写"
我把决策过程摊开来说。想推倒重写的人,理由都很正当:代码烂、耦合深、测试没有、技术旧。但这些理由有一个共同前提——你能完整地预知这个系统在真实世界里的所有行为。
现实是,这个系统跑了十年,积累了大量边界行为,散落在代码里、甚至散落在资深运营的脑子里。比如"一个订单如果同时命中两个优惠活动,到底给哪个优惠""客户改过一次地址之后,物流单上为什么还显示旧地址""某一步点快了会触发重复提交,但系统居然能自我修复"。这些行为没有文档,没有测试用例,它们就像老员工脑子里的隐知识,你问十个新人,九个没听过。
重写一个这样的系统,相当于在废弃老发动机之前,先把满地图的暗礁全部标出来。做不到这一点,所谓重写就是重新踩一遍十年埋下的雷。
当时我们评估了一下:全量重写,保守估计要四个全职加三个月的周期,而且上线之后还得经历漫长的行为对齐期,中间业务还不能停。而渐进式重构,可以先挑最痛的模块动刀,每一刀都能拆开看、能回滚、能被验证。
当然,这里面有个很重要的前提:团队得有那么几个人,能同时看懂老代码和愿意接受新架构。如果没有这个人,渐进式重构也会变成"改了个寂寞"。
2.2 重构时我留下的东西和扔掉的东西
这次重构里,我们做了一件当时看起来很笨的事:花三周时间,把老系统的所有已知行为整理成了一张"行为清单"。
清单长这样:
| 业务行为 | 老逻辑现状 | 重构后逻辑 | 对应测试用例 |
|---|---|---|---|
| 用户重复提交订单 | 数据库唯一索引+代码幂等判断,偶尔报错但不丢单 | 保留幂等,统一异常提示 | OrderSubmitIdempotentTest |
| 库存超卖兜底 | 冻结库存+异步扣减,超卖时发告警邮件 | 保持扣减顺序,优化锁粒度 | StockOverSaleGuardTest |
| 优惠券过期提醒 | 每天凌晨定时任务扫一次,次日站内信 | 改为事件触发+定时补偿 | CouponExpireNotifyTest |
现在看会觉得很简单,但在当时,光是确认"这些行为是不是正确的"就废了无数口舌。很多逻辑连现任业务方都不知道为什么存在,我们只能一个一个去对历史邮件、对工单记录、找老同事打电话,最后把已知行为全部收敛成测试用例,作为重构的验收底线。
做完这件事之后,重构反而变得轻松了:我们不是用新代码重写老代码,而是用新代码去满足一份明确的行为契约。
重构时我们扔掉了什么?扔掉了大量"路径依赖式"的复杂度。比如早期对接的一个旧支付渠道,已经三年没有订单走那个渠道了,但代码里还有完整的回调处理逻辑;比如一个只在某次活动里用过一次的老会员等级,判断分支一直没删。这些就是代码世界里的沉没成本,不是因为还有用而存在,而是因为"没人敢删所以一直在"。删掉这些死分支之后,接口返回时间直接快了一半,真让人哭笑不得。
2.3 一个可迁移的"价值公式"
那次重构复盘时,我给团队写了个公式:
价值 = 行为正确性 × 未来维护效率 ÷ 复杂度
行为正确性是基础:东西能用、行为对,价值才能为正。维护效率取决于结构清不清楚、文档有没有、新人上手的坡度缓不缓。复杂度是分母,每多一个没人理解的历史分支,每多一处业务规则的重叠,都会把整体价值往下拉。
这个公式放在代码上成立,放在人身上也成立。
一个人的"总分",不是技能堆出来的加法和,而是一个类似的结构:价值 = 解决真实问题的能力 × 持续学习的能力 ÷ 内在复杂度。内在复杂度是什么?就是那些让你同时忙很多事、却每件事都做不透的焦虑;是明知道某段关系在消耗你,还不敢结束的犹豫;是熬夜透支健康攒下来的疲惫。这些东西不清理,你能力再强,总分的分母太大,最后也输出不了多少有效价值。
那次重构给我最大的改变,不是把系统改快了、改稳了,而是它给了我一个思考框架:任何一次改动之前,先想想你是在增加分子的能力,还是在减少分母的复杂度。两件事都值得做,但后者常常被我们忽略。
3. 关于"积累":我以为的和我现在信的
3.1 二十多岁时以为的积累
刚入行那会儿,我对"积累"的理解特别朴素:会的越多越值钱。
于是我跟集邮似的学东西。今天看到某新框架火了,赶紧学;明天看到别人在考证,也报名;GitHub上收藏了上百个"必学清单",收藏完就再也没打开过。简历上的技术栈越写越长,真正能说清楚"在什么场景解决过什么问题"的,一只手数得过来。
我有个同期入职的同事老K,比我更极致。他的业余时间基本全在追新语言、新框架、新架构,誓要做技术前沿的弄潮儿。他确实懂得多,前几年业内什么新词他都能接上话。但时间一长,问题就出来了:他什么项目都沾一点,没有哪个是深度扎进去做透的。有一次我们内部做一个高并发模块,要一个能把存储方案讲透的人,他反而讲不到底层,因为他一直在追新东西,没时间沉淀那块地基。
后来组织调整,我们那个小组被拆了一部分,老K首当其冲。我后来跟他吃饭,他说了句让我印象很深的话:我一直在给简历打工,忘了给自己打工。
我听懂了。他那些"积累"实质上是资产吗?更像是库存。东西堆了很多,但没有形成能持续产出的生产线。
3.2 十年后我重新排序的积累清单
三十岁以后,特别是经历了几个项目延期、带团队踩坑、身体报警之后,我把"积累"这件事重新排了个序。这个排序不是我拍脑袋写的,是从一次次试错里拎出来的。按抗贬值的程度排:
第一等,判断力。知道什么该做、什么不该做,什么值得坚持、什么需要放弃。这玩意儿别人拿不走,也最难速成。
第二等,信誉。包括技术信誉和人际信誉。你说的话大家信不信,你承诺的事能不能交付,你在关键时刻靠不靠得住。这是最硬通货的社交货币。
第三等,健康的身体和稳定的情绪。没有这两样,前面的判断力和信誉都是空中楼阁。身体垮一次,你可能要拿三年去还债。
第四等,通用的底层能力。表达、复盘、抽象建模、把复杂事情讲简单、带人的能力。这些跨项目、跨行业都能迁移。
第五等,具体的技能。语言、框架、工具、平台。这些会过时,但它们是前面几等的载体,缺了它们你也没法干活。
这个排序最反直觉的地方是:它跟"简历好不好看"的顺序几乎是反的。简历最容易写的是第五等,最难写的是第一等。但越到后面你越会发现,市场上真正稀缺的,不是"谁会某种冷门技术",而是"谁能判断我们该不该用某种技术"。
"积累"不是往仓库里堆更多东西,而是把一堆零散的零件组装成一个能运转的系统。系统运转久了,会长出流程、长出经验、长出信任,这些才是真正的复利。
4. 慢下来以后,我把"值钱"的标准重写了一遍
4.1 代码里的"慢即是快"与我人生的"慢"
写代码这么多年,我发现一个特别有意思的规律:线上事故很少发生在慢慢来的时候,几乎都发生在赶工的时候。代码写得急了,逻辑就不清楚,测试就不敢写,发布就跟赌博似的,赌它今天不出问题。
某次重构系统X的时候,我们把发布节奏从每周一次改成两周一次,重要模块上线前强制在压测环境跑满三天,还要过了行为清单上的全部用例才允许灰度。表面上看,整个团队的交付速度慢了,但那个季度的事故数反而降到了历史最低。业务方也不再抱怨"你们怎么又挂了",他们甚至会主动问"这次改动稳不稳,我们那边要不要配合降量"。
人其实也一样。我一直觉得自己应该跑得比周围人快,后来发现,很多问题恰恰是慢下来才看得见的。你整天忙得脚不沾地的时候,根本不会去想"我这件事为什么要做",你只会想"赶紧做完交差"。而那些真正能改变轨迹的决定——要不要换个方向、要不要停掉某个项目、要不要跟某个人深聊一次——几乎都是在没那么多事的时候才会浮上来的。
我现在会刻意给自己留一些"看似浪费的时间":每天午后十五分钟,什么都不干,就想想今天最重要的一件事是什么、明天最重要的一件事是什么;每周留半天空挡,不接新需求,专门清理上周的"技术债"和"情绪债"。这些时间不直接产出代码、不直接回复消息,但它们像代码里的定期重构——短期看是开销,长期看是在给未来的自己省时间。
4.2 人生里的"开源节流":减掉没必要的复杂度
代码系统里有一套经典的优化手段:死代码清理、接口收敛、依赖最小化、配置集中化。以前我只把这套东西用在技术上,后来发现它也是一套非常好用的人生方法论。
所谓死代码清理,对应到生活里就是:取消那些"有它不多没它不少"的社交,退出那些不知道当初为什么要进的群,停掉那些"别人都在做所以我也想做"的计划。我前年清点了一下自己加了上百个"技术交流群",真正会点开看的不超过五个,剩下全是数字噪音。退了之后,微信清爽了,注意力也回来了。
接口收敛,对应的是"尽量少开新的承诺接口"。能不答应的事就不答应,能合并解决的需求就不单独开会。我见过很多人活得累,本质上是给自己开了太多并发的"接口",每个接口都要维护,每个承诺都要兑现,最后CPU全被占用,真正重要的进程没有资源跑。
依赖最小化,对应的是"少依赖外部评价"。以前我很在意别人怎么看我,绩效出来了要焦虑,朋友圈点赞少了要失落。后来想明白:你的运行不应该依赖一个不可控的外部服务,你自己的评价体系才应该是本地优先、离线可用。
开源节流落到实处,我给自己建了一张"人生时间预算表",方法很简单:每周168个小时,先扣掉睡眠、通勤、吃饭这些硬支出,剩下的可支配时间里,给"重要不紧急"的事(阅读、运动、复盘、陪家人)预留固定的额度,然后再去分配那些"紧急但不重要"的琐事。如果这周琐事挤占了重要额度,下周就做减法,把一些会砍掉,别让它们回来。
这套东西本质上就是代码里的资源调度:给核心进程留足资源,及时终止那些消耗大、回报低的野进程。
5. 如果非要一个答案,我的"源码"是这样写的
5.1 一个老程序员现在的日常配置
很多人问我说,你想清楚了之后,现在的一天是怎么过的?
我现在的时间大致分成三块:三分之一给团队和业务,三分之一留给写作、复盘和一些带人的事,另外三分之一雷打不动地给睡眠和运动。这个配置听起来一点也不"奋斗",但我知道它就是我目前能稳定运行、长期不出事故的最优参数。
我给自己设了几个"监控指标",跟看系统一样:睡眠时长、静息心率、对一件事能连续专注的时间。这三个指标只要不出告警,我心里就有底;一旦哪个亮了红灯,我就知道该降载了。
也给自己留了"降级预案",忙到实在顶不住的时候,第一刀砍无效会议,第二刀砍不必要的社交,最后一刀宁可砍掉一个新项目的排期,也不能砍掉睡觉。为什么?因为睡觉和休息是我的核心路径,核心路径一崩,全链路都崩。
5.2 最后想对年轻时的自己说的话
如果我能回到刚入行那一天,我会对自己说几句话:
别急着把简历写满,先把手头这件事做到"行为正确"——你先搞清楚这个需求到底为谁解决什么问题,再谈用什么框架。
多问几个为什么,少收藏几个"必学清单"。收藏夹里的东西不会变成能力,做完、复盘、教会别人,才会。
把每一个新计划都当成人生代码里的一个分支提交。合入之前,先检查它对核心路径是不是必需的;如果不是必需,再潮、再流行、别人再说好,也不要合进去。
人这一辈子,说短不短,说长不长。最值钱的不是某个技能、某段履历,甚至不是某个亮眼的头衔,而是你内心那套稳定运行的"判定逻辑"——知道什么真正重要,什么不重要,并且敢为重要的事留出足够的时间。
代码可以重构,人生也可以。重写的过程往往很慢,甚至显得低效,但没关系。别停就行。