最近在学习极客时间《从0到1学架构》,记一些笔记。

每一个从事技术工作的同学,都有一个成为架构师的梦想,去从事设计架构方面的工作。那么架构这个词具体是什么?

在我平时的工作中,会进行团队内部分大功能的架构设计,平时也会通过各种渠道了解其他公司的架构设计。

但当我们聊架构的时候,我们具体是在聊什么?

基础名词

在具体定义什么是架构前,先将架构设计中经常提到的一些名词,先进行梳理。

系统和子系统

系统

系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。它的意思是“总体”“整体”或“联盟”。

引用的是来自维基百科的定义,有一些特点,如下所示:

关联: 系统是有一群有关联的个体所组成的,没有关联的个体不能够成为一个系统,也就是说在一个系统内部的东西,肯定是互相有所关联的。比如说我们在打造一间卧室,不可能把厕所放进卧室,只有当床,书桌,灯这些东西都在一个房间内时,才组成了卧室。如果从技术系统的角度上来说,我理解就是,一个系统内的功能或者模块的存在都是为了这个这个系统的定位服务的,比如说一个负责商户管理的系统,往往不会把用户相关的管理放进来。

规则: 一个系统内的个体肯定是按系统统一的规则运作,规定了系统内个体之间分工和协作的方式。比如一个交易系统,会定义校验模块,风控模块,限流模块,算价模块,落单模块,发券模块等,会定义好每个模块的职能以及协作的方式,完成整个交易流程。

能力: 个体组合在一起产生了新的系统能力,是单个个体所不具备的,比如汽车能够载重前进,但汽车中的单个个体抽出来都不具备这样的能力,比如发动机、变速器、传动轴、车轮。

子系统

我理解子系统的定义其实和系统是一样的,一个系统可能就是另一个系统的子系统。拿交易系统举个例子。

  1. 交易系统本身是一个系统,又包含了支付,退款,结算,下单等子系统
  2. 支付系统里可能又包含了对接支付系统和处理支付回调的系统。

模块和组件

维基百科定义如下

软件模块(Module)是一套一致而互相有紧密关连的软件组织。它分别包含了程序和数据结构两部分。现代软件开发往往利用模块作为合成的单位。模块的接口表达了由该模块提供的功能和调用它时所需的元素。模块是可能分开被编写的单位。这使它们可再用和允许人员同时协作、编写及研究不同的模块。软件组件定义为自包含的、可编程的、可重用的、与语言无关的软件单元,软件组件可以很容易被用于组装应用程序中。

我觉得模块,从个人感受上来说,模块主要定义的是功能的集合,是为了职责上进行分离,比如交易系统的下单流程 可能会分为 校验模块,优惠计算模块,风控模块,下单模块等,每个模块各司其职,只关注在自己的事情,当有一些业务需求变更时,只需要改动相应的模块,不会影响其他模块。

我觉得组件的话,从其英文单词component上,也可以翻译成零件一次,感觉像是独立可替换的东西,我个人对组件的理解是一个可复用的东西,可以根据需求放在不同模块里去使用,比如定义一个数据转换组件,统一的校验组件,统一的异常处理器,都可以理解是组件。

框架和架构

学习时,作者提到,很多人往往分不清楚框架和架构。但我个人理解框架和架构还是很好区分的。

框架,从维基百科的释义上是:

软件框架(Software framework)通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。

也就是说框架关注的是规范,按照某一个规范去用这个框架,去实现我们要求的功能,并且额外提供一些基础功能,比如Srping MVC 是MVC的开发框架,除了满足MVC的规范,还提供了很多基础功能帮助开发者实现功能,比如注解,Security,JPA等。

框架,我的个人层面理解就是一种帮助开发者实现软件功能的工具,而架构是开发者决定如何去设计软件。

架构,从维基百科上的释义是:

软件架构指软件系统的“基础结构”,创造这些基础结构的准则,以及对这些结构的描述。

架构更关注的是结构,如何组成你的整个软件系统这件事。但由于在软件架构的定义中,并未将什么是基础结构明确说明,所以从不同的角度解读架构,其实都可以。

比如从业务逻辑角度来说,学生管理系统的架构可以是:

从物理部署的角度,学生管理系统的架构可以是:

从开发规范的角度,因为采用标准的MVC框架开发,学生管理系统的架构又可以是:

这些“架构”,都是“学生管理系统”正确的架构,只是从不同的角度来分解而已,这也是 IBM 的 RUP 将软件架构视图分为著名的“4+1 视图”的原因。

架构比较合理的理解

架构是一个软件系统的顶层结构,就像建筑设计师的草图,定义了整体的骨架,每一块布局之间如何串联,形成协同效应。

架构定义了软件中的各个系统,子系统,模块和组件,如何组成,并且如何运作和协作。

比如同样的一个交易系统,因为选择的架构不同,各个系统之间的交互方式,组成方式也会不同。

所以我的理解是架构决定的是软件系统的顶层设计,而且细化到每个单独的系统,也有其自己的架构设计。

站的视角越高,看到的架构越宽泛一些。

总结一下

架构是顶层设计;框架是面向编程或配置的半成品;组件是从技术维度上的复用;模块是从业务维度上职责的划分;系统是相互协同可运行的实体。


程序员小岑成长记
1.7k 声望276 粉丝

90后互联网工程师,5年互联网服务端开发经验。