尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

后端技术选型时,如何避开那些“过度设计”的坑

后端技术选型时,如何避开那些“过度设计”的坑 下午四点架构评审会开了三个小时。PPT翻到最后那个绿得发亮的Kafka集群图标还嵌在架构图正中央。有人小声问了一句“咱们现在日活多少”会议室安静了三秒。答案是八千。这不是编的故事是无数技术团队每天都在重复的剧本。做后端选型真正的坑从来不是技术本身不够好而是我们用一套为未来十年准备的技术栈去支撑一个连下个季度都看不清的业务。过度设计本质上是拿确定的当下去赌一个不确定的未来。这种赌法输的概率远超你的想象。需求预判是最昂贵的伪命题很多架构师喜欢说“要考虑到未来”。这句话本身没错错的是把“考虑”变成了“实装”。你预判业务会爆发于是直接上微服务、引入分布式事务、搭建多活容灾。第二年业务没爆发运维成本却爆了。维护一个只有三个节点却跑着完整Kubernetes集群的系统每个加班的深夜都在为当初的“高瞻远瞩”买单。你以为你在做技术选型其实你是在做需求预测。而预测三五年后的业务形态是所有技术管理者最容易犯的自大错误。更理性的做法是把当下的业务痛点拆解清楚选择今天能解决问题、明天有清晰演进路径的简单方案。演进路径不等于提前实现而是知道“如果量来了我下一步该往哪走”。手里有地图的人不需要现在就背上所有行李。技术债的本质不是代码烂是认知错位很多人把技术债定义为“当初图快写下的烂代码”这件事可以靠重构解决。但过度设计产生的是另一种债——解决方案和问题复杂度之间的严重错位。你把一个难而复杂的技术方案硬生生架在了一个简单问题上。这种债不是靠重构能还清的你必须推倒重来还要搭上整个团队的心气和信任。有个做电商SaaS的朋友早期为了让系统“架构优雅”把订单状态流转做成了一套完整的事件溯源模型。配上Event Sourcing和CQRS光基础设施就写了两个月。后来需求变更要支持预售、拼团、秒杀叠加那套优雅模型改起来像拆炸弹。最后整个模块重写两周搞定。为什么因为真实的订单场景在绝大多数情况下就是一个简单的状态机加一张关系表。你欠下的技术债不是你写下了多少糟糕的代码而是你让正在写代码的人每天都在为一个并不存在的复杂度打工。给系统“做减法”需要比“做加法”更大的勇气选型讨论会上最常见的场景是有人提出引入某个新组件理由是这个组件“以后肯定会用上”。一个不够两个也不够。等到盘点的时候系统里躺着NOSQL、搜索引擎、消息队列、注册中心、配置中心、链路追踪……就像刚拿驾照的人买了一台满配越野车四驱、差速锁、底盘护板全有结果每天走的是城市柏油路。敢于在选型时说不敢于在别人推荐“更先进方案”时坚持“够用就好”这不是技术保守这是对团队生命的尊重。每一个额外引入的组件都意味着未来的升级维护、故障排查、新人学习曲线。这些都是隐形成本不会写进选型报告但会写进每个人的加班时长里。伪需求才是过度设计的真正推手技术人最容易犯的错是喜欢解决“想象出来的问题”。产品经理提了个“预计未来要支持千万用户”的需求架构师立刻掏出分布式方案。可你仔细去看那个需求在真实场景里只是一个后台批量导出功能。数据的量级连MySQL的分库分表都用不上。过度设计的源头多半不在技术而在业务。当你把“别人也在用”当成“我们也需要”当你把“演示效果”当成“生产需求”技术方案就会不可避免地走向臃肿。最好的过滤器是让技术选型紧跟真实业务流。每一个方案在决定之前都问一句这个问题现在存在吗如果不存在它什么时候会发生如果发生了最简单的替代方案是什么大厂技术栈是最危险的“参考坐标”看看Github上那些大厂开源项目再看技术博客上那些“我们是怎么支撑双十一的”很多人热血沸腾转头就把人家的架构搬了过来。但你没有人家的业务体量没有人家的团队规模更没有人家的试错预算。大厂的方案是他们在特定历史阶段、特定资源约束下的最优解不是普适的银弹。把大厂的最佳实践直接套在自己的小业务上就像穿别人的鞋走路尺码不对走不远还会磨得鲜血淋漓。大厂可以用几百个节点扛住每秒十万的并发你可以用一台性能好点的机器扛住每秒一千的请求后者在99%的场景下都是更优的选择。毕竟你的用户等不起的那三秒钟原因永远不会是你没用上那个奇怪的哈希分片算法。KPI异化正在制造另一种“过度设计”有些团队做技术选型不是为了解决业务问题是为了写进晋升文档。“我主导了XX平台从0到1的建设采用了业界先进的XXX架构”——这样的句子在很多人的晋升PPT里都能看到。工具本身成了目的业务反倒成了背景板。当技术选型的动机从“解决问题”滑向“制造简历亮点”过度设计就会必然发生。你选了一个高难度的方案团队里的每个人都得跟着你学学习成本、维护成本、沟通成本全部真实发生。而你收获的可能只是一句“技术有深度”的评价。这话不假但毫无意义。复杂度的成本曲线是指数级的很多人在评估技术方案时只算了功能成本遗漏了运维成本。但更深的代价在别处一个系统的复杂度一旦越过某个阈值它就不再是团队的工具而是团队的负担。你引入分布式事务解决数据一致性结果这个分布式事务本身出了问题排查的难度是指数级上升的。你引入消息队列解耦结果消息丢失了你得在业务代码里加入大量的补偿逻辑。这些额外的工作每天都在消耗团队本可以用在业务优化上的精力。技术选型的本质是投资你要的是回报率而不是账面资产的规模。如果引入一套系统之后团队的迭代速度反而更慢了你的选型就已经失败了。这跟架构是否先进、技术是否前沿毫无关系。工程师的安全感不该来自技术复杂度心理学上有个概念叫“承诺升级”指的是人倾向于维护自己已经做出的决定即使这个决定被证明是错的。在技术选型里这表现为方案上了架构定了于是大家集体维护一个其实没人满意的复杂系统。谁都不肯承认当初的决策有问题因为承认就意味着之前的努力白费。克服这种心理惯性把“我认为应该这样”变成“业务需要我们这样”是技术决策者最重要的一课。真正的高手从不宣称自己是正确的而是持续地根据真实世界反馈优化路线。“不做什么”比“做什么”更能定义系统你可能觉得架构师的成就体现在做出了什么。但更常见的情况是好架构是被“减法”减出来的。当年那些被砍掉的组件、被否决的方案、被拒绝的新潮框架决定了你今天系统的稳定和轻盈。你说“不要用微服务”挡住了多少不必要的网络开销和运维梦魇。你说“不要用NoSQL”帮团队省下了多少个需要假装很懂分布式存储的心酸夜晚。判断一个技术决策是否“过度”有一个简单的标准如果这个组件现在没有被使用而它的存在让你还需要为它设计监控、写部署脚本、更新安全补丁那这就是过度设计。它是附在你系统生命体上的寄生结构健康与否取决于你到底有没有一份你完全能掌控、普通人也能看懂的部署文档。真正的长期主义是拥抱变化的简单有人担忧现在选简单的方案将来业务增长怎么办这个问题问得很好因为它触及了长期主义的本质。长期主义不是为遥远的未来预支今天的痛苦而是用进化的能力去对抗未来的不确定性。一个足够简单的系统面对变化时调整成本最低。用户量真的涨了你往MySQL上做读写分离、加缓存、分库分表。每一步都有清晰路径而且每一步都是基于真实的流量触发的。这才是健康的增长模式。选择简单的技术栈不是短视恰恰是远见。因为你留足了应变所需的时间和精力那些复杂方案消耗掉的正是你用来思考业务、完善产品的时间。架构的终极评价标准是它辅助业务的速度而不是它的壮观程度。写在最后决策者必须能回答的三个问题下次再面临技术选型当有人向你展示一个闪闪发光的新架构时你只需要问三个问题第一它解决了当前哪个具体的问题第二不引入它会有什么糟糕的后果第三引入它我们每个月要多付多少运维成本如果第三个问题你已经答不上来那可能这个方案本身就值得警惕。不存在的那个问题永远不需要被解决。真实存在的那个问题从来不需要用一个那么复杂的方案去解决。这才是对“技术选型”四个字最深的尊重。
返回列表