对程序员来说,架构是一个常见词汇。如果想成为一名架构师,对架构概念的理解必须清晰。否则,在制定架构方案时,肯定会漏洞百出,问题频发,这将对你的面试、晋升和团队领导产生负面影响。
我们看下维基百科关于架构的定义:
软件架构是抽象描述系统的一组结构,以及构建这些结构的规则。这些结构包括:软件要素、要素之间的关系以及它们的属性。
在这个定义中,核心概念为系统、要素、关系。
系统
在软件架构中,"系统"是指由多个相互作用的部分组成的复杂整体,这些部分共同完成特定的功能或任务,而架构设计就是对某个系统的抽象描述。
要素
“要素”是构成系统的基本单元,通常有子系统、模块、组件。
可能有人对模块、组件的概念比较懵。简单来说,模块是从业务逻辑维度上的划分,组件是从技术维度上的复用。下面还会用一个例子说明它们的区别。
关系
”关系“指的是系统中各个要素(如子系统、组件、模块、类等)之间的连接和交互方式。这些关系定义了要素如何协作,以及它们如何共同实现系统的功能。
我们以新零售SaaS系统为例,解释一下各个概念:
在工作当中,我们经常会听到以下说法:
上面提到的架构到底是指什么?这些说法究竟对还是错?
其实上面的说法都是对的,只是采取的视角不一样。
因为复杂系统涉及的利益干系人众多,例如:客户、产品经理、研发、销售、运营、管理层等。由于背景不同,认知不同,每个人看待系统的角度、方法都不相同。
为了控制复杂度,我们需要设计一整套架构描述物,并且为它们做好分类和定义,让每种架构描述物都有自己的侧重,让每个利益干系人都能快速获取关注的信息。
为了达成这个目标,首先需要理解视图与视角的概念。
什么是视角?大白话就是你站在什么地方看。
我们以城市系统为例,你站在城市的某条马路上,能看到什么?
能看到几座楼房,几排树木,几条大马路,熙熙攘攘的一些人。
但是你坐在飞机上看,能看到什么?
能看到一片片的楼盘,能看到群山,能看到江河湖海。所以,你能看到什么和你站在什么地方看有很大关系,同时也会影响你看待事物的粒度。
如果把视角比作一个坐标点,那它需要一套坐标系,坐标系通常有4个维度:广度、深度、视图类型、时间。
广度是指看待事物的宽度,以业务流程为例,根据出发点不同,有时需要看一个部门内的流程,有时需要看多个部门的协作流程,有时需要看端到端跨部门的流程。
深度是指看待事物时,要到达哪个细节层次,例如看业务流程,需要看到组织级、部门级、还是某个岗位的具体操作步骤。看软件系统,需要看到系统级、模块级、还是一行行的代码。
广度和深度一般是相互影响的,如果看待事物的广度越宽,那么层次就会越抽象,这和组织架构的设计也是相辅相成的,一般高层管理者看问题非常全面,但对细节不关注,一线执行人员,对问题的细节非常了解,但视角却非常窄。
视图类型是为利益干系人量身打造的一组关注点的集合,下文中会详细介绍。
时间维度比较好理解,就是看待事物的时间点,过去、现在、还是未来。
什么是视图?大白话就是你想看到什么。
视图是为利益干系人量身打造的一组关注点的集合。
同样以城市系统为例,想要赶早高峰的上班族,他的关注点是哪条路线最快,因此他需要一副地铁公交路线图。
想要租房的租客,他的关注点是公司附近有哪些小区,租金多少,因此他需要一副租房地图。
想要疏通下水道的工人,他的关注点是下水道是怎样排布的,因此他需要一副下水道的排布图。
同一个城市系统,不同角色的关注点是完全不一样的,想要获取的信息也是完全不一样,如果把所有信息杂糅在一起,不做视图隔离,导致的结果就是信息太庞杂,每个人都很难获取想要的信息。
同理,不同干系人看待软件系统的关注点也是迥然不同的,为了把不同人的关注点区分开,诞生了很多软件视图的分类方法,比较著名的有“4+1”视图,TOGAF的业务架构、应用架构、数据架构、技术架构等视图分类法。
我们重点说下TOGAF的视图类型:业务架构,应用架构,数据架构,技术架构。
其中业务架构是灵魂,应用架构,数据架构,技术架构都是支撑业务架构而存在的,后三者也统称IT架构。
通过视图与视角,我们可以分离关注点,将复杂问题进行拆解,让每个局部的复杂度控制在一个可以接受的范围。
同时,团队有了统一的认知坐标系,进一步促成了业务标准化,以业务标准化为基础,通过分离不变点与变化点,提炼出可复用的组件,快速响应业务需求变化。
本文已收录于,我的技术网站:tangshiye.cn 里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享。