为什么软件项目需要架构设计?

复杂的软件项目通常有两个明显的特征:需求不确定和技术复杂 需求不确定来自于客户,我们今天主要来看看技术的复杂性,而技术的复杂性主要体现在 1 需求让技术变复杂

复杂的软件项目通常有两个明显的特征:需求不确定和技术复杂

https://cdnss.haodaima.top/uploadfile/2024/0308/20240308063058870.jpg

需求不确定来自于客户,我们今天主要来看看技术的复杂性,而技术的复杂性主要体现在

1.需求让技术变复杂

    需求本身很复杂,对应的技术也会很复杂,比如说让你做一个个人博客网站和做一个淘宝这样的网站,技术复杂度是有天壤之别的。

    要响应需求的变化,也会让技术变得复杂,对于明确的需求,相对来说技术实现是容易的,但是,随着需求的不断变化,新的需求可能会破坏原有的代码架构,导致系统越来越臃肿复杂,维护也更加困难。

2.人员会让技术变复杂

    现在软件开发通常不是一个人,而是一个team,团队内部成员水平不一样,擅长的技术方向也不一样,所以有效协作是很大的考验。

3.技术本身也是复杂的

    现在软件项目中选择编程语言、框架、技术组件、数据库等技术或工具,甚至像微服务、大数据、人工智能技术,都是很复杂的,普通人都需要通过一定的学习才能掌握。

4.要让软件稳定运行是复杂的

    明星发布八卦会导致微博宕机,阿里云宕机导致基于阿里云的系统一起罢工。这些技术的复杂性,会导致软件开发变得复杂,开发成本很高,架构设计恰恰可以很好解决技术复杂的问题。

首先,架构设计可以降低满足需求和需求变化的开发成本

    对于复杂的需求,架构设计通过对系统抽象分解,把复杂系统拆分,例如淘宝这类复杂的网站,最终拆分成一个个小的微服务,单个微服务开发的难度,其实和个人博客网站的难度相差无几,普通程序员都可以完成。

    对于需求的变化,已有一些成熟的架构实践,例如分层架构,把UI界面和业务逻辑分离,把UI的变动不影响业务逻辑的代码。

其次,架构设计可以帮助组织人员一起高效协作

    对复杂系统的抽象拆分后,开发人员可以独自完成功能模块,最后通过约定好的接口协议集成。

    前后端分拆后,有的开发人员就负责前段UI开发,有的就负责后端服务的开发,再根据团队规模大小,前段还可以再细分,有的负责iOS,有的负责网站,有的负责android,这样最终各个开发小组规模不大,既有效协作,又能各自保证战斗力。

再次,架构设计可以帮助组织好各种技术

    架构设计可以用合适的编程语言和协议,把框架、技术组件、数据库等技术或者工具有效组织起来,一起实现需求目标。

    经典的分层架构,UI层通过选择合适的前端框架,例如React/Vue实现复杂的界面逻辑,服务层用Web框架提供稳定的网络服务,数据访问层通过数据库API读写数据库,数据库就负责记录数据

最后,架构设计可以保障服务稳定运行

    现在很多成熟的架构设计方案,可以保障服务的稳定运行,比如分布式的架构,可以把高访问量分摊到不同的服务器,这样即使流量很大,分流到单台服务器压力也不大,比如异地多活这样的架构方案保证一个机房宕机,还可以继续服务。

    我们可以这么说,架构设计就是通过组织人员和技术,低成本满足需求和需求变化,保障软件稳定高效运行。

什么是架构设计?

    架构设计的目标,是用最小的人力成本来满足需求的开发和响应需求的变化,用最小的运行成本来保障软件的运行。

    架构设计,已经有很多成熟的方法,比如:

  1. 使用微服务这样的架构,把复杂系统拆分成一些列小的服务,服务再拆分功能模块,人员更好地分工协作
  2. 通过前后端分离,让程序员更专注于某个知识领域,降低开发难度
  3. 用分层设计来隔离业务逻辑,减少需求变更带来的影响

这些架构设计方法其实都是基于工程领域分而治之的策略,本质上就是将系统拆分,人员拆分,但是拆分了还不行,还需要能够拼回来,所以你要清楚架构设计的“道”。

    架构设计的道,就是组织人员和技术把系统和团队拆分,安排好拆分后的排列关系,让拆分后的部分能通过约定好的协议相互通信,共同实现最终的结果。

    这个让我想起了孩子玩的乐高玩具,将一个个小的模块通过接口拼接一起,达成一个大模型,程序中是换成了其他形式的接口,比如前后端的REST协议接口。

如何做好架构设计?

    架构设计要做好,不是一件容易的事情,需要大量的经验积累,但是我们业界已经有了很多成熟的架构设计模式,我们不需要闭门造车,可以在理解清楚业务需求后,找到类似的架构设计,基于成熟的架构设计方案,进行改造,变成适合自己业务需求的架构。

    假设我们要设计一个服务端,我们来说明一下如何做架构设计。

第一步:分析需求

    架构设计基本需求就是满足业务需求,搞清楚需求至关重要,产品需求,只有功能的描述,界面的交互,还需要进一步进行抽象。

    一个常用的分析方法就是分析用例,了解角色和使用场景。

第二部:选择相似的成熟的架构设计方案

 业界流行的分层架构设计

https://cdnss.haodaima.top/uploadfile/2024/0308/20240308063059539.png

 

第三步:自顶向下层层细化

    架构设计好的实践是自顶向下层层细化:

  1. 部署架构

分层架构网站部署为了减少运维成本,可以基于云服务设计部署架构。

  1. 分层和分模块

用户界面层、服务层、业务逻辑层、数据访问层、数据存储

  1. API设计、数据库设计、模块的设计

第四步:验证和优化架构设计方案

    方案验证是否满足设计的目标,是否满足需求和未来需求的变更,能否保障软件有效运行。这个是贯穿整个设计始终的,一个完整的架构设计方案,是需要多次评审会议、收集多方反馈,反复修改后才能最终确定下来。方案不但要不断迭代,还需要考虑架构预期是满足多长时间的业务增长。