别再一上来就分层:新手最容易做错的系统设计决定

0 阅读5分钟

一个真实的场景

上周五下午,新人小李接到任务:"做一个用户注册功能"。

他的第一反应是打开画图工具,开始画架构图——Controller 层、Service 层、Repository 层、Cache 层、消息队列层……

周一 code review,他的"六层架构"被主管打了回来。不是因为分层本身有问题,而是:这个功能连数据库都还没建好。


01 为什么新手喜欢一上来就分层?

你可能也和小李一样——刚学完设计模式、架构原则,满脑子都是"高内聚低耦合"、"分层架构"、"可扩展性"。

这不是你的错。市面上太多教程都在教"标准答案",却很少告诉你:架构是解决实际问题后的自然结果,不是起点。

三个常见的思维误区:

误区一:把分层当目的

分层只是工具,不是目标。很多小系统,单机单库就能跑,何必非要搞七层架构?

误区二:把"大厂做法"当教条

你以为 BAT 的架构师都爱分层?错了。他们是因为用户量级、业务复杂度逼得不得不分。对于日活 1000 的系统,Monolith(单体)就是最优解。

误区三:先画图再想问题

拿到需求就画架构图,结果画完之后才发现:核心问题没解决,技术债务倒欠了一堆。


02 新手最容易犯的 5 个系统设计错误

错误 1:还没理解需求就开始画架构图

❌ 错误做法

"这个功能用微服务还是单体?我先画个架构图吧。"

✅ 正确做法

先问自己三个问题:

  • 这个功能要解决什么业务问题?
  • 当前最大的瓶颈是什么?(性能?一致性?可用性?)
  • 预计用户量和增长曲线是什么?

核心原则:架构服务于业务,而不是业务服从于架构。


错误 2:为"可能的需求"做过度设计

❌ 错误做法

"万一以后要支持多租户呢?我现在就把租户 ID 加上。"

✅ 正确做法

"先把这个需求解决。等真正需要多租户时,再重构也来得及。"

核心原则:YAGNI(You Aren't Gonna Need It)——你不需要它。

过度设计的代价:

  • 开发时间翻倍
  • 代码复杂度上升
  • 维护成本增加
  • 后来者读代码时骂你

错误 3:滥用缓存或完全不用缓存

❌ 错误做法 A

"缓存能提升性能,我给所有接口都加上缓存!"

❌ 错误做法 B

"缓存太复杂了,我们不用,直接查库吧。"

✅ 正确做法

先确定数据特征:

  • 数据更新频率如何?
  • 一致性要求多高?
  • 缓存失效后的雪崩风险大吗?

再决定是否缓存、缓存策略是什么。

核心原则:缓存是双刃剑,用对地方才是利器。


错误 4:把"扩展性"挂在嘴边,却不知道扩展什么

❌ 错误做法

"这个设计没有扩展性,换一种方式吧。"
"什么叫扩展性?""呃……就是以后能加功能。"

✅ 正确做法

先识别具体的扩展场景:

  • 用户量从 1 万增长到 100 万?
  • 要支持新的支付渠道?
  • 要接入新的数据源?

再评估当前设计能否支撑这些场景。

核心原则:脱离具体场景谈扩展性,都是耍流氓。


错误 5:忽视数据层设计

❌ 错误做法

"先把代码写完,数据库后面再优化。"

✅ 正确做法

把数据模型设计放在编码之前:

  • 核心实体是什么?关系如何?
  • 索引如何设计?查询模式是什么?
  • 数据量预估多大?要不要分库分表?

核心原则:大多数系统,瓶颈都在数据层。把数据设计好,事半功倍。


03 正误对比速查表

场景❌ 错误做法✅ 正确做法原因
接到新需求立即画架构图先分析业务问题和瓶颈架构是解决方案,不是起点
性能优化上来就加缓存/异步先定位瓶颈点,再针对性优化盲目优化是浪费
考虑扩展性设计"万能架构"识别具体扩展场景,按需设计YAGNI 原则
技术选型选"大厂标配"技术栈根据团队能力和业务需求选型合适的才是最好的
数据库设计最后再考虑编码前先设计数据模型数据层是大多数系统的瓶颈

04 给新手的行动指南

第一步:先问问题,再画图

拿到需求后,先回答这 5 个问题:

  1. 1.核心业务流程是什么?  用文字描述,不要画图。
  2. 2.当前最大的风险是什么?  性能、一致性、可用性、还是团队能力?
  3. 3.用户量和增长预期是什么?  决定技术选型的量级。
  4. 4.有哪些现成的轮子可以用?  不要重复造轮子。
  5. 5.最简单的可行方案是什么?  先跑通,再优化。

第二步:用最简单的方案先跑起来

"Perfect is the enemy of good."
完美是优秀的敌人。

先让系统跑起来,在实际运行中发现问题,比纸上谈兵强一百倍。

第三步:识别真正的瓶颈再优化

性能问题就像生病——你得先知道哪里疼,才能对症下药。

推荐工具:

  • APM 工具:Skywalking、Pinpoint
  • 数据库慢查询:MySQL slow log、Explain 分析
  • 系统瓶颈:top、vmstat、iostat

第四步:让设计决策有据可依

每个设计决策都应该能回答:

  • 解决了什么问题?
  • 有什么代价/风险?
  • 如果错了,怎么回滚?

05 总结

系统设计不是画图大赛。真正的高手,是能用最简单的方案解决实际问题的人。

记住三句话:

1. 先理解问题,再设计方案。
2. 简单优于复杂,能跑优于完美。
3. 用数据说话,用监控验证。

下次接到设计任务时,别急着打开画图工具。先问自己:我真的理解要解决的问题了吗?


你的第一个设计决定,应该是"不做什么",而不是"做什么"。


如果这篇文章对你有帮助,欢迎转发给需要的朋友。关注公众号,回复"系统设计",送你一份我整理的系统设计入门资料包。