第二十六章 马德华的离开
一
马德华最终还是走了。
不是因为裁员——他在裁员名单公布之前就拿到了新公司的 offer,主动提了离职。但他走的方式,让所有人都没想到。
二
事情发生在马德华离职前的最后一周。
他手头还有一个模块没有交接完——报表导出功能。这个功能是他半年前写的,代码质量一般,但一直在线上稳定运行。
交接的对象是张小龙。马德华花了两天时间给张小龙讲了代码逻辑,然后说:"差不多了,剩下的你自己看代码就行。"
张小龙看了看代码,发现有一段逻辑他看不懂——一个复杂的 SQL 查询,嵌套了三层子查询,没有注释,变量名全是 t1、t2、t3。
他去问马德华。马德华看了一眼说:"这段 SQL 是我从网上找的,当时能跑就没改。你要是看不懂,就别动它。"
张小龙不太放心,又去问王志远。王志远看了那段 SQL,皱了皱眉——这段查询的性能很差,在数据量大的时候可能会超时。但因为目前数据量不大,所以一直没出问题。
"这是一个定时炸弹。"王志远说。"数据量再涨一倍,这段 SQL 就会超时。"
他把这个问题记在了技术债务清单里,打算后面找时间优化。
三
马德华离职的前一天,出事了。
报表导出功能突然报错——一个客户要导出最近三个月的销售数据,系统超时了。
原因就是那段 SQL。三个月的数据量刚好超过了临界点,查询时间从 2 秒飙到了 30 秒,超过了系统的超时限制。
客户投诉了。周旋经理让马德华修复。
马德华看了一眼,说:"这个 SQL 要重写,工作量不小。我明天就走了,来不及。"
周旋的脸色很不好看:"你写的代码,你不修就走?"
"我已经交接给张小龙了。"马德华说。"让他修吧。"
张小龙一脸茫然——他刚接手这个模块,连代码都没完全看懂,怎么修?
王志远看不下去了。他站起来说:"我来修。"
他花了一个下午重写了那段 SQL——把三层嵌套子查询拆成了两个简单的查询加一个 JOIN,加了合适的索引。查询时间从 30 秒降到了 0.5 秒。
修完之后,他写了详细的注释,解释了每一段查询的逻辑和优化思路。
四
马德华离职的那天下午,来跟大家告别。
他走到王志远的工位旁边,站了一会儿。
"小胖,谢谢你帮我擦屁股。"他的语气里有愧疚。
王志远摇了摇头:"不是帮你,是帮张小龙。他刚接手,不应该背这个锅。"
马德华沉默了一会儿,然后说了一段让王志远意外的话:
"小胖,你知道吗,我当年也是像你这样的。"
"什么意思?"
"我刚入行的时候,也是认认真真写代码,认认真真做 Review,认认真真学新技术。那时候我觉得,只要技术好,就能在这个行业混得好。"
他靠在隔板上,眼神有点恍惚。
"但后来我发现,技术好不一定升得快。有些人技术一般,但会来事儿,升得比我快。有些人技术很好,但不会表现,一直在底层干活。我就开始……偷懒了。觉得反正认真也没用,不如混日子。"
"混着混着,就真的变成了一个混日子的人。代码能跑就行,文档能糊弄就糊弄,Review 能跳过就跳过。我知道这样不对,但改不回来了。就像……就像技术债务一样,欠得越多,越不想还。"
王志远没说话,把杯子里的啤酒喝了一大口。
他想起马德华平时的样子——嘻嘻哈哈、油嘴滑舌、能偷懒就偷懒。他从来没想过,马德华也曾经是一个认真的人。
"德华哥,"他说,"新公司好好干。"
马德华笑了笑,但笑容里有一点苦涩:"我试试。"
他拍了拍王志远的肩膀:"小胖,你比我强。别变成我这样。"
然后他转身走了。
五
马德华走后,王志远坐在工位上想了很久。
他想起赵北辰说过的一句话:"技术债务不会消失,只会越积越多。你现在偷的懒,将来都要加倍还。"
马德华的故事让他意识到——这句话不只是在说代码,也是在说人。
人也会积累"职业债务"。
每一次偷懒、每一次糊弄、每一次"能跑就行",都是在给自己的职业生涯欠债。欠得越多,越不想还,越不想还,欠得越多。最后变成了一个恶性循环——你知道自己在退步,但已经没有动力去改变了。
马德华不是一个坏人。他只是在某个时刻放弃了对自己的要求,然后一步一步滑了下去。
王志远告诉自己:不要变成马德华。
不是因为马德华不好,而是因为马德华曾经可以更好。
六
那天晚上,王志远在笔记本上写下:
Day 390
马德华走了。
他说他当年也是认真的人。后来觉得"认真也没用",就开始混日子。混着混着,就真的变成了混日子的人。人也会积累"职业债务"——每一次偷懒都是在欠债,欠得越多越不想还。
德华哥走的时候说了一句"别变成我这样"。我记住了。
认真不一定有回报,但不认真一定有代价。这话听着像鸡汤,但看着德华哥的背影,我觉得它是真的。
他合上笔记本,想起马德华离开时的背影。
一个曾经认真的人,变成了一个混日子的人。
这是他见过的最让人唏嘘的"技术债务"。
:::{admonition} 小胖的笔记 :class: tip
本章知识卡片:技术债务与职业素养
1. 技术债务(Technical Debt)
| 类型 | 示例 | 后果 |
|---|---|---|
| 代码债务 | 没有注释、命名混乱、重复代码 | 维护成本越来越高 |
| 测试债务 | 没有单元测试、测试覆盖率低 | bug 越来越多 |
| 文档债务 | 没有设计文档、API 文档过时 | 新人上手困难 |
| 架构债务 | 过度耦合、没有模块化 | 改一个功能影响全局 |
管理技术债务的方法: - 维护一份技术债务清单 - 每个 Sprint 分配 10-20% 的时间还债 - 新代码不欠新债(Boy Scout Rule:离开时比来时更干净)
2. 代码交接检查清单
| # | 交接项 |
|---|---|
| 1 | 代码仓库权限移交 |
| 2 | 核心逻辑讲解(最好有文档) |
| 3 | 已知问题和技术债务清单 |
| 4 | 线上配置和部署流程 |
| 5 | 监控和告警规则 |
| 6 | 上下游依赖关系 |
| 7 | 常见问题和排查方法 |
3. 职业债务
人也会积累"职业债务"。每一次偷懒、每一次糊弄,都是在给职业生涯欠债。
预防方法: - 保持对代码质量的要求,不因为"反正没人看"就降低标准 - 持续学习,不因为"够用了"就停止成长 - 定期反思,问自己"我比半年前进步了吗?"
:::