后端开发十年,我重新理解了“简单”二字

📅 2026/8/17 17:57:29
后端开发十年,我重新理解了“简单”二字
十年前我第一次提交后端服务组长在 review 后面只留了一句话“这段逻辑能不能再简单一点”我当时盯着自己刚写完的几十行代码心里不服这不已经很直白了吗十年前的我以为简单就是把代码写得少、写得快最好再带点别人看不懂的技巧。现在十年过去我才明白他说的“简单”和我理解的“简单”根本不是一回事。真正的简单不是代码变少而是认知负担变轻。简单的第一层代码量少的幻觉入行前几年我笃信“简单”等于行数少。为了把十个 if 折叠成一个三元表达式为了一段流程能用一行流式操作搞定我可以熬到深夜。那时候我觉得会做减法的人才是高手。直到我接手一个“精简”得吓人的老服务所有变量都被缩写成一个字母所有方法名都短到读不出来整个模块像一副没有头绪的棋局。我花了一个星期才搞懂它到底想干什么。过早抽象的代价是把名词变成迷宫。代码量少并不等于复杂度低真正昂贵的复杂度往往藏在那些“看起来很简单”的聪明写法里。那次教训让我第一次怀疑自己坚守的审美。复杂度的真正来源是业务这种怀疑在我开始接触核心交易场景后变得具体。支付状态机、库存超卖、幂等与重试、分布式事务……这些问题纠缠在一起的时候我才意识到复杂度的核心不在技术而在业务语义。你不能凭空简化一个本来就需要记录大量分支规则的领域只能想办法让规则变得清晰可控。我一度疯狂套用设计模式以为工厂加策略加观察者就能让代码“优雅”结果换来一堆名词连自己都迷路了。用模式去掩盖混乱得到的只会是更混乱。后来我学会先问自己这里最本质的规则是什么用一张表、一个枚举、一组不变式能不能把它们说清楚只有把业务语义表达清楚了技术上的“简单”才有了根。把复杂度放在该放的地方真正改变我的是一次订单系统重构。订单状态变化很乱很多人用 if 嵌套状态一多就晕。我们没有用魔法去消灭状态而是把状态转移表放进一个明确的对象里让每种变化都有据可查。这样局部仍然是复杂的但全局变得简单——所有人都知道状态相关问题去查那张表。把复杂度收敛在正确的位置比试图消灭它现实得多。那一刻我理解了真正的设计不是让代码变得没有结构而是把结构摆在显而易见的地方。一个系统可以有一两个复杂的角落但绝不能在每个角落都撒一把复杂度。混沌不可怕可怕的是把混沌均匀地散布到整个系统里。可读性比“聪明”更重要这类混沌在可读性面前会原形毕露。代码的世界里写永远只占一小部分。一段代码写出来可能要读几十次、改十几次、被很多人盯着看。所以一个方法如果让读者反复回看那它再高效也谈不上简单。代码是给人读的只是顺便让机器执行。后来我给自己定了一条规矩提交之前先假设自己是从没见过的陌生人打开这段代码看看能不能在五秒内明白它在一层一层地干什么。如果不能就继续拆。用可读性换一点点性能是最划算的买卖。这个习惯让我学会警惕一切“聪明的写法”比如超长的链式调用、没有注释的位运算、以及那些故作迷人的反射。简单是接口设计的边界感可读性指向代码内部而接口设计则决定了代码之间如何对话。十年前我总喜欢把接口做得“通用”一个接口能传各种参数内部去猜客户端想干什么。结果是调用方摸不着头脑每个人都要翻源码。后来我学会把接口设计得尽量具体一个接口只做一件事参数少到不能更少错误信息清晰到可以当答案用。接口的简单是边界清晰不讨好所有人。在一个多团队协作的代码库中边界模糊才是最大的浪费。你省掉的参数校验会变成对方深夜发来的消息你故意留下的“灵活”会变成团队里永远的迷。简单需要成本而且是昂贵的成本有人觉得“简单”是偷懒的借口恰恰相反。简单是一种反直觉的奢侈它需要你花更多的时间去思考然后用更少的东西来表达。想起我写过一个支付回调的校验逻辑第一版用了反射动态匹配字段看起来通用其实每个接入方都要专门调参还容易在隐蔽处踩雷。后来我把它拆成三个明确的分支代码长了三倍但所有排障都变成了一目了然。能用时间换清晰就别用聪明换复杂。这种成本不是一次性的它要你在每一次接需求时重新审查是否有新增的路径可以先不做是否有更简单的实现可以替代。愿意为“简单”持续付费的人不多所以简单在大多数团队里难得一见。维持简单要敢于拒绝真正让我改变工作方式的是一次架构评审。我带着精心设计的“灵活可扩展”方案去讲演自我感觉良好。一位老前辈看了半天问了一句“这个功能现在需要吗如果不需要为什么让每个新来的人都承担这个复杂度”我当时愣住了。维持简单需要持续说“不”。每多一个设计多一个依赖多一个配置项都是在透支团队的认知预算。扩展性不是靠提前做好万全准备而是靠保持结构的整洁让未来有能力在不破坏整体的前提下加入特性。拒绝多余的“可能”是后端工程师最宝贵的纪律。自那以后我的设计文档里多了一栏明确不做什么比明确做什么更重要。简单是凌晨三点也能睡好觉拒绝多余的复杂度不只是为了代码好读更是为了让故障不再吓人。后端开发的“简单”最终要落到运行时的可恢复性上。一个系统设计得再漂亮一旦出问题没有清晰的日志、没有粗暴简单的降级开关、没有一眼能看懂的状态那它在运维者眼里就是灾难。简单是生产环境里最稀缺的奢侈品。我见过太多优雅的系统在凌晨故障时变成黑洞因为它的“优雅”意味着难以下手。后来我学会在做设计时问一句如果这个进程挂了我需要几步才能确认影响范围超过三步设计就要重新考虑。好的系统应该能让你在凌晨三点半接电话时三分钟内找到止损开关。这不是胆小是体面。重新定义“简单”现在回想组长当年那句话我大概明白他想要的是什么样的“简单”了。它不是代码行数的绝对值不是放弃必要的复杂度更不是拒绝思考。它是一种贯穿所有决策的倾向对认知负担的克制对业务语义的尊重对运维手段的体贴。十年前我以为简单是天赋是可以拿来炫耀的聪明十年后我知道简单是责任是反复雕琢后的诚实。一个系统最终会变成它所有决策的集合你每一次不耐烦的“先这样吧”都会在系统里留下痕迹而你每一次多花半小时思考“有没有更简单的做法”同样会沉淀下来。如果不能被下一个值班者在一小时内理解再聪明都算失败。这就是我理解的简单它从来不是起点而是反复打磨后的终点。