• 作者:老汪软件技巧
  • 发表时间:2024-09-18 17:02
  • 浏览量:

在技术面试中,系统设计能力被认为是非常重要的一项技能,尤其是对于中高级工程师或架构师职位。这种能力不仅仅是编写代码的技巧,还涉及到解决复杂问题、设计高效和可扩展系统的能力。那么,有没有什么结构化的方法,可以帮助我们更好地设计系统?这篇文章,我们来聊一聊。

设计思想

在系统设计中,主要包括两个关键阶段:High Level(也称宏观设计)和 Low Level(也称为详细设计)。

宏观设计是系统设计的初始阶段,主要关注系统的整体架构和主要组件的设计。这一阶段的目标是定义系统的结构、各组件之间的关系以及系统如何满足高层次的需求。

微观设计是系统设计的后续阶段,关注具体组件和模块的详细实现。这一阶段的目标是为每个组件和模块提供详细的设计,以指导开发工作。

为了更好地理解上面的设计思想,我们通过下面的 7个步骤来详细说明系统设计过程。

第1步: 明确需求

不管是系统设计还是业务开发,都必须先弄清楚需求,这好比是回答别人的提问,如果连对方的问题都没有弄清楚,后面所有的回答都可能是答非所问。

因此,系统设计的第一步是彻底理解需求,从实际工作经验来看,需求主要包括 2种类型:功能性需求和非功能性需求。

功能性需求

功能性需求是指系统需要执行的功能和行为,也就是系统实实在在要完成的功能,主要包含以下几个点:

非功能性需求

非功能性需求是指系统的质量属性和性能,主要包含以下几个点:

需求是整个系统设计的风向标,因此,明确需求是整个系统设计的第一步,尽早地弄清楚需求,可以帮助我们更好的把握系统走向。

第2步: 系统容量预估

在明确了需求之后,第二步要完成的事情就是评估系统的容量,只有知道了系统的容量,才能更好的预算开发周期、人力投入、服务器投入以及其他的投入,帮助我们更好地做好后期决策。

系统容量预估,一般需要评估以下几个指标:

另外,系统设计还需要做未来增长和可伸缩性要求考虑,比如支持数据几倍的增长以及支撑几年的数据增长,以确保系统能够处理随时间推移而增加的负载。

第3步: 架构设计

在做完需求分析和容量评估这些准备工作之后,我们就可以进入真正的设计阶段,系统设计(High-Level Design,HLD)是软件开发生命周期中最重要也是最难的一个阶段。

架构设计是一个宏观上的考虑,旨在定义系统的总体结构和高层次的架构,在这个阶段需要完成系统整体设计的蓝图,帮助开发团队理解和规划系统的各个组件及其相互关系,下图是 Google的一张系统设计蓝图:

通过上述的蓝图可以看出:系统设计蓝图中包含以下主要组件:

对于每个组件,一定要考虑权衡取舍,并说明为什么选择特定的技术或架构,关于设计图的绘制时,不要过度考虑小细节,而是更多站在宏观的角度。小细节可以在每个组件的设计中去推敲。

第4步: 数据库设计

绝大多数系统是需要和数据打交道的,因此数据库的设计也就显得至关重要,数据库设计通常包括数据库选型、数据建模、数据库结构设计等。

数据库选型

数据库选型通常是根据业务场景以确定最合适的数据库类型,主要包含以下几个考虑因素:

数据建模

数据建模通常会考虑以下因素:

数据库结构设计

数据库结构设计也就是真实的表结构设计,主要需要考虑以下因素:

另外,在更宏观的角度上,还需要考虑分库分表,多活,灾备等问题。

第5步: API设计和通信协议

API和通信协议,它定义了系统内不同的组件间该如何交互以及外部客户端如何访问系统的功能,通常会考虑以下因素:

明确 API要求选择 API类型定义API协议第6步:细化组件设计

在第3步中,我们分析了架构设计,但是它从宏观上的一个把握,而不会过分的关注细节,因此在此步骤中,我们需要对第3步中的一些核心组件进行更详细的设计,这里以 Java后端为例:

作为 Java后端,你需要了解自己业务的领域,比如金融,电商,财务,出行等,因为不同的领域会有一定的差异性。下面是组件细化的一些考虑点:

以下都是在后端组件中需要考虑的问题,当然,我们需要根据自己所处的角色和领域,灵活的设计。

第7步: 解决关键问题

系统设计中难免会遇到一些技术难点以及核心挑战,这些挑战主要包括可扩展性和性能,以及可靠性、安全性和成本问题。为了更好地解决这些问题,下面也给出了具体的思路:

解决可扩展性和性能问题解决可靠性问题

可靠性是指系统即使在出现故障或错误的情况下也能正确和一致地运行的能力。以下是系统在可靠性上的一些关键考虑因素:

总结

本文,我们详细地分析了如何设计系统,从思想层面到具体实施过程,从宏观角度到微观落地,并且通过 7个步骤详细地描述了系统设计的思路。

百种业务百种架构,在现实工作中,很难存在适用于任何业务的万精油设计,但是思维方式却是相通的,因此,实际业务中采用什么架构方式需要根据具体情况权衡。

文章总结不易,感谢小伙伴帮忙:点赞、在看、转发。关注**「猿java」,** 加入技术群,持续更新硬核文章。