做了这么多年后端开发,我拆过的“过度设计”比写过的业务代码还多。每一次拆除,都是一次认知升级。以下是我亲手拆过的七个典型“过度设计”,每一个都曾让我夜不能寐。
一、为“微服务”而微服务
三个人的团队,把项目拆成六个微服务部署。这是我见过最荒唐的过度设计。某初创电商团队在用户量不足1万、日均订单仅数百笔时,对标头部平台搭建了12个独立服务,同步引入服务注册中心、配置中心、链路追踪、分布式事务框架等全套组件。原本6人可完成的开发任务,因服务间通信调试不得不扩招至15人。一次简单的“下单-支付-发货”流程需跨6个服务调用,响应时间比单体架构慢3倍。教训:微服务是手段不是目的,业务规模和团队能力才是边界。
二、消息中间件“全家桶”
接口调用还没超过10QPS,就搭建Kafka加Redis加RabbitMQ三件套。运维成本翻了三倍,日常维护成了噩梦。而真实业务场景下,一个简单的数据库轮询就足够了。教训:选型要看当下,不要为“万一”买单。
三、抽象地狱
接手一个订单管理系统,第一反应是加抽象层——泛化服务、共享仓库、各种基类。理解订单流程需要在接口和基类之间来回切换,业务规则分散在各个层级。一个简单的“用户积分增加”逻辑,被写成工厂模式加策略模式加抽象接口加依赖注入。教训:抽象消除重复,但也抹去了含义。简单的系统,出了故障一目了然;复杂的系统,一旦故障则难以捉摸。
四、为“未来”设计
“咱们加个缓存接口吧,以后可以换Redis或者Memcached。”但现在连用户量都没破千。“做个抽象层吧,说不定后面接入第三方支付。”但其实你短期根本不打算加。YAGNI原则(You Aren't Gonna Need It)的核心是:别为未来做设计,除非它真的已经来了。教训:90%的业务永远不会遇到你想象中的“亿级流量”,而即使遇到了,演进式的架构调整远比一开始就搞复杂架构的成本低得多。
五、把“功能拆分”当成“业务拆分”
某零售系统按功能模块拆分后,“创建订单”需同时调用用户、商品、支付、物流四个服务,每个服务都需访问其他服务的数据库才能完成校验。跨服务数据依赖让服务间耦合度远超单体架构,分布式事务处理不当导致“超卖”“漏单”等严重问题。教训:拆分要看数据的流转逻辑,而不是功能的字面归属。
六、技术栈“追星族”
某金融科技团队三年内经历了四次技术栈重构:从LAMP到Spring Cloud,再转向Service Mesh,最终采用Serverless架构。每次迁移都伴随着6到8个月的开发停滞。“把大厂在用”当成选型唯一标准。教训:大厂的架构适配的是亿级用户体量,给自行车装飞机发动机,不仅跑不起来,还会直接把车拆碎。
七、“为技术而技术”的炫技
某团队在内部协同工具中强行接入机器学习推荐模块,数据量不足导致推荐效果糟糕,部署时间从2小时延长至8小时。架构成了“技术展示柜”。教训:架构的核心价值在于赋能业务增长,而非标榜技术能力。
回顾这些拆除经历,我发现过度设计从不以错误的面目出现——它总是披着“前瞻性”的外衣。架构设计的本质,是用最低的成本解决核心业务问题。在“够用”与“预留”之间找到平衡,比掌握任何一种技术都更难。