写点什么

第 1 课:什么是架构,你理解对了吗?

用户头像
Frank
关注
发布于: 5 小时前
第1课:什么是架构,你理解对了吗?

你好,我是华仔,迎来到架构实战营模块 1 第一课。

这一课的主题是什么是架构?你理解对了吗?

对于什么是架构这个问题的话,其实我之前跟很多同学交流过,我发现很多同学对于什么是架构这个问题,并不能很好地回答。为什么会出现这种现象呢?就是说架构这个词的话,平时大家工作接触都比较多,但是很少有人深入去研究,或者是说去探寻它的真正的定义。


你好 我是华仔

欢迎来到架构实战营模块 1 第一课

这一课的主题是什么是架构

你理解对了吗

对于什么是架构这个问题的话

其实我之前跟很多同学交流过

我发现很多同学对于什么是架构这个问题的话

并不能很好地回答

为什么会出现这种现象呢

就是说架构这个词的话

平时大家工作接触都比较多

但是很少有人深入去研究

或者是说去探寻它的真正的一个定义

和它一个详细的定义具体是什么

那这节课我就带你来详细地理解一下什么是架构

这节课的教学目标有两个

第一个就是掌握架构的准确的定义

掌握架构的准确定义的话

需要识别跟架构相关的几个特别容易混淆的一个概念

比如说系统 子系统 框架 模块 组件

这些概念的话跟架构都有一定的关系

但是又不等于这个架构

所以我在这一节课的话会带你详细地解读一下这些相关的概念

以及它们跟架构的一个具体的关系

为什么用这么一节课来讲述架构的定义和理解

因为如果架构是什么你都没有理解的话

那么后面所做的都是错的

为什么这么说呢

简单来说就像我们经常在知乎上大家常说的一句话叫

先说是什么再问为什么

如果架构是什么你都没有理解对

那么后面你对于架构的思考

你对于架构的阐述

以及具体你做的这个架构

设计本身都是可能存在问题的

这节课的目录包含四部分

第一部分我会带你解读一下系统跟子系统的一个详细的定义

第二部分我会带你解读一下架构跟框架的一个详细定义

第三部分会带你解读一下模块与组件的详细的定义

第四部分的话我会在前面解读的基础上

结合我自己的一个理解,重新定义架构以及进行剖析

首先我们来看一下系统与子系统的一个定义

我们参考一下维基百科关于系统和子系统的定义

维基百科上对系统的定义

大概是这么一个意思

简单来说系统就是一群有关联的个体组成的

然后个体按照某种规则运作,能够完成个别单元不能完成的工作

它的意思是总体和联盟

然后子系统的定义就跟系统的定义的话

相当于是一个递归的一个定义

子系统本身的话它也是一个系统

它是更大系统中的一部分

它其实也是符合系统的定义的

那么从维基百科里面关于系统和子系统的定义

我们可以提炼出几个关键点

首先是叫关联

就是这一部分

简单来说系统是一群有关联的个体组成的

那什么叫有关联的个体

我举一个形象的案例

比如说一辆汽车

有发动机

有变速器

有底盘

有控制系统

那它们之间相互配合

然后最后可以实现汽车的功能

能够让你坐在上面

能够跑起来

这就是一群有关联的个体

什么叫做无关联的个体?

举一个最简单的例子

你的电脑桌上面有电脑

有你的手机

还有书籍

那这些个体的话

虽然都是放在一起的

但是它们之间并没有什么关联

所以它们之间是不能组成一个系统的

这是关联这个关键词的一个理解和定义

那第二个关键词就是规则

也就是说个体之间是按照规则运作的

什么叫做规则

就是说发动机负责那个输出动力

然后变速器负责将动力转化为速度

然后传输给底盘

然后驱动这个轮子运作

这个就是规则

比如说你的书桌上

电脑跟你的书本是没有什么规则的

除非你拿你的书去砸你的电脑

当然这个就不是它们系统自发的一个规则

第三个就是能力

也就是说系统的能力是超越个体的能力的

我们同样以汽车为例

比如说发动机

它本身它虽然能产生动力

但是它不能跑

那变速器它当然也不能跑

那你单独把一个底盘或几个轮胎放在那里

它也不能跑

但是发动机加变速器加底盘加一个整车放在一起

它最后就能实现运动这个功能

而这个能力的话是单个的发动机 变速器 底盘这些都不具备的

所谓系统的能力

它是超越个体的能力的

大家注意这个关键词超越

不要以为是系统能力等于个体能力之和

你把个体的能力全部加起来

也不等于系统的能力

系统能力一定是超越个体的能力的

那最后一个关键词是分层

这个其实就是由系统跟子系统这个定义得来的

也就是说系统它是自顶向下 可以逐层分解的

比如说同样以汽车这个案例

汽车它可以分解为发动机 变速器 底盘

那发动机本身它其实也有自己的架构的

它里面也有更多的组件

也有更多的部件

所以发动机本身也是有架构的

所以就是说整个系统跟子系统

它的定义的关键的四个关键词就是:关联 规则 能力和分层

大家记住这个四个关键词

因为这四个关键词就是我们后面定义架构需要用到的几个关键的词

我们可以看一个软件系统的样例:

什么叫系统 什么叫子系统

我这里举的是微信的案例

我们可以看到微信这个级别的话

有用户 有聊天 有朋友圈 有支付业务 有四个业务

然后的话朋友圈的话它又可以分为动态 评论 消息跟广告四个部分

然后朋友圈的评论的话它又可以分为发布 审核 防刷跟分析四个部分

所以整个微信的系统

我们可以看到它可以自顶向下逐步地细化:

从微信这个级别细化到朋友圈

朋友圈再细化到评论

评论再细化到发布

对 这个就是系统跟子系统的一个定义和一个案例

接下来我们看一下模块与组件

模块与组件是大家经常在做架构设计的时候接触到的两个概念

我们同样参考维基百科

我们来看一下维基百科对软件模块的定义比较长

我把它简单提炼一下

软件模块, 它其实包含了程序跟数据结构两部分

然后的模块的主要目的是为了能够分开编写

然后可以允许人员同时协作

然后来编写和研究不同的模块

而软件组件的定义的话

跟软件模块的定义其实就有点差别

那软件组件的定义的话

它叫可编程 可重用的 与语言无关的软件单元

然后软件组件是能够被用于组装应用程序中

所以从维基百科里面对这个软件模块和软件组件的定义

我们可以提炼出这么一张图来展现它们的一个区别

同样是一个系统

我们可以看到按逻辑的角度拆分

可以得到模块

为什么要拆分模块呢 那拆分模块主要是为了职责分离

职责分离主要就是为了人员协同

或者是说多个团队协作来共同开发这个系统

那按照物理的拆分

一个系统的话可以得到组件

那组件的主要目的是什么

它其实是为了单元复用

那组件的英文当时叫 Component

Component 其实如果你去查字典的话

它还有个翻译叫零件

我觉得零件这个词的话

更加形象地反映了软件组织的这个概念

大家知道零件

机器里面有一个零件

你的手机里面有零件

如果你的某一个零件坏了

你不需要把你的整个机器跟手机丢了

你可能换一个零件

你的机器 你的手机就可以继续跑了

所以软件模块跟软件组件的定义其实还是有比较明显的区别

如果你不能很好地区分的话

你就想一想软件组件它就相当于一个零件

零件就相当于是可以单独替换的一个物理的单元

我们看一下模块跟组件的一个样例

我们举学生信息管理系统

都是这个系统

按模块分也是分这个系统

按照组件拆分也是分这个系统

我们看一下

如果按照模块去拆分的话

学生信息管理系统可以拆分为用户模块

成绩模块

班级模块跟课程模块

但是如果你按照组件去拆分的话

我们可以看到它就不再是拆分为什么用户模块 成绩模块了

而是拆分为 Nginx WEB 服务器 MySQL

不同的组件它承担的是不同的功能

比如说 Nginx 是承担负载均衡的功能

WEB 服务器是实现具体的业务的功能

MySQL 它是数据库:

它承担的是数据存储的一个功能

所以通过这个案例

我们能够清晰地看到模块跟组件它的定义以及它的作用

以及最后的这个架构拆分出来的架构图都是不同的

接下来我们看一下架构与框架详细的定义

我们同样参考维基百科

维基百科对于软件框架的定义

简单来说就是

软件框架它首先是一个规范

就是这个软件组织规范

如果你基于这个软件组织规范实现的一个产品

这个软件产品也可以叫软件框架

比如说 MVC 它是一个框架

那基于 MVC 开发的什么 Spring MVC

它本身是一个软件产品

那么 Spring MVC 其实也可以称之为一个软件框架

那维基百科对于软件架构的定义就比较简单了

它的定义是说软件架构是指软件系统的基础结构

创造这些基础结构的准则以及这些结构的描述

我们从这个框架和架构的定义里面提炼出一些关键词

首先软件框架的关键

就是组织规范跟软件产品

你可以是一个规范啊

也可以是基于这个规范实现的一个软件产品

软件架构的关键词是什么

第一个就是结构

它是指软件系统的基础结构

当然的话 维基百科里面它加了一个基础这个限定词

在实际的过程中的话

大家对于基础的理解并不完全一致

有的人把基础理解为底层的操作系统+磁盘+存储

有的人把基础理解为就是最像刚才学生管理系统这种模块拆分的这么一个基础结构

所以就是说维基百科关于软件架构里面的所谓的基础结构这一块的话

不同的人理解不一样

导致实际工作中的话大家很少答维基百科里面关于软件架构的定义

来去理解软件架构的

那维基百科里面关于软件架构的第二个关键词叫准则

这个其实跟我们的 4R 架构里面的 Relation 有点像

第三个就是描述

我觉得维基百科里面关于软件架构的描述的话

其实更多时候像一个软件架构的文档里面的一个内容

所以总的来说

虽然软件架构在维基百科有这个明确的定义

但是我觉得维基百科对于软件架构的定义的话

并不是很合理

或者是说并不是很好理解

我们看一下就是框架跟架构的一个简单的样例

这里举了几个框架

比如 spring 框架它是一个依赖注入的框架

DJango 是一个 Python 的 MVC 开发框架

Spring Boot 也是一个 Java 的 MVC 开发框架

那 ThinkPHP 是 PHP 的一个开发框架

那架构的话

那比如说 MVP 的一个架构

微服务的一个架构

这两种架构的话

在大家日常过程中也是经常接触到的

MVP 架构主要是用于客户端和前端

微服务架构主要是用于后端

然后这里考一考你一个问题

MVC 是框架还是架构

你可以思考一下这个问题

好 我来说一下我对这个问题的理解以及这个问题的答案

MVC 的话它首先肯定是一个框架

因为它是一个标准的框架的规范

那其次的话它也是一个架构

为什么会这么说呢

因为如果你的系统

你按照 MVC 的规范去实现的话

那么你单个的系统的架构

它就是 MVC 的架构

所以你跟别人说你的系统是 MVC 架构

这个是 OK 的

然后你跟别人说 MVC 是一个架构的框架

这个也是可以的

好 前面我在介绍相关的概念时候

提到维基百科对于这个软件架构的定义虽然简单

但是并不好理解

那么我在我自己的理解的基础上

结合我的经验

我来重新定义一下架构

我重新定义的架构这个有一个非常容易记住

也非常容易理解的一个名称叫 4R 架构

为什么叫 4R 架构呢

其实 4R 分别代表 4 个以 R 开头的单词

它们分别是 Rank、Role、Relation、Rule

有的同学可能会有一些疑问

怎么这么巧

你正好找了 4 个单词

确实是啊

我是先想到这个定义

然后我再去找跟定义相关这个单词

最后我发现还真巧

能找到 4 个 R 开头的单词

所以最后就把这个架构定义提炼为叫 4R 架构

这样的话你在后面不管是你自己学习理解啊

你跟别人沟通交流

你一说 4R 架构

那就非常清晰

也非常容易记住

那 4R 架构的详细定义是什么呢

我们来看一下

软件架构是指软件系统的顶层结构

它定义了系统由哪些的角色组成

角色之间的关系以及运作规则

这里面有 4 个关键词 就是我刚才讲到的 4 个 R

首先我们看一下顶层结构叫 Rank

它的意思就是说架构是分层的

我刚才在介绍系统跟子系统的时候

举的那个微信的例子其实就是这个意思

微信有微信的架构

微信里面的朋友圈也有架构

朋友圈里面的评论也有它的架构

那么你在做微信的架构的时候

其实你不需要关注评论那个子系统的架构

当然了你在做朋友圈评论这个子系统的架构的时候

你也不需要把整个微信的架构给它设计出来

那这个分层的意思就是自顶向下 逐步细化

不同的人它负责不同的层级

它进行不同的架构设计

那第二个关键词叫角色

你觉得系统包含哪些角色

这个其实就对应于维基百科里面对系统的定义里面所说的个体

我们用角色的话会更加直观一点

或者是说更加形象一点

为什么叫角色

大家看过电影可能会知道电影里面有主角 有配角

有正派的角色

有反派的角色

那这些角色的话每个角色都有自己的特点

也有不同的职责

然后第三个就是关系

叫 Relation

这个呢就是指角色之间的关系

这个其实也跟电影里面的关系非常类似

那个不同的角色之间有什么关系

有的是什么恋人关系

有的是兄弟关系

有的是仇人关系

那不同的关系就会决定了说不同的角色交互的方式

它的资金的那个接口的这个设计这些都是不同的

然后最后一个就是运作规则

就是说角色如何协作来完成系统的功能

我在前面解读这个系统的时候

提到了一个非常关键的概念

就是系统的能力

它是大于个体能力之和的

那个体如何配合

如何协作来实现整个系统的功能

这其实就是 Role 这一部分涵盖的这个内容

那这里考一考你一个问题

我们知道这个架构一词是来源于建筑

最早的像架构的模式

其实它都是来源于建筑领域的

那么软件架构的定义它适用于建筑架构吗

比如说你是否可以拿这 4R 架构去应用到建筑领域

你可以思考一下这个问题

好 我来说一下这个问题我的思考以及我的答案

软件架构的话跟建筑架构它其实是有本质的区别的

本质的区别的话有两点

第一点就是软件本身是可以变化的

那么软件的架构其实是可以不断在变化的

第二个就是软件架构其实它是一个动态的

什么意思呢

就是说软件你要跑起来

你的操作系统你要跑起来

你的电脑要跑起来

才能实现这个软件的功能

而建筑的话它的架构是静态的

所以软件架构跟建筑架构的核心的区别就在于规则这一部分

你可以认为建筑的架构其实是它没有运作规则这个说法的

我们举一个汽车的案例

为什么我在这里先举一个汽车的案例

它也是符合这个 4R 架构定义的

这是一个混动汽车的整体架构

我们按照 4R 架构的定义来看一下它每一个 R 分别对应什么

首先我们看一下 Rank

这张图是整个混动汽车整体架构

它包含了发动机

什么变速箱 离合器 电机 控制器这些东西

但大家也知道发动机肯定也有自己的架构

那分层的意思就是说你在这张架构图里面

你不需要把发动机内部的架构给展现出来

那第二个就是 Role

那这张图里面的角色很多了

最典型的有发动机 离合器 电机 变速箱

什么整车控制器 ABS

这些其实就是整个汽车的一个相关的一些角色

那关系是指什么

比如说发动机跟离合器连着

跟 ECU 连着

但是发动机跟仪表并不连着

那 ISG 电机跟离合器跟 AMT 变速箱连着

然后整车控制器又跟什么电机控制器 离合变速控制器进行连着

这些 Relation 的话

就说明了角色之间关系

那两个角色之间有连线跟没有连线

它们的架构图的含义跟它最后的架构实现的话

是有非常大的区别的

并不是说你随便把这个角色连起来就行了

当然的话在理解 4R 架构的时候

有两个非常容易混淆的概念就是:架构分层和分层架构

这里我用两张图来给你展示一下

左边是分层架构

右边是架构分层

相信通过这两张图

你应该能够比较容易地看出来

简单来说就是分层架构它其实是一种可扩展的架构模式

那可扩展的架构模式

还有微服务的架构

还有 SOA 的架构

那除了可扩展架构以外

我们还有高性能的架构

我们有高可用的架构

那架构分层的话

其实是指架构本身是自顶向下 逐步细化的

就像微信的这个例子

微信有微信的架构

朋友圈也有架构

朋友圈的评论也有架构

所以分层架构跟架构分层这两个概念一定要区分开

不要把架构分层理解为这个分层架构了

你掌握了市场架构的定义之后

它有哪些应用呢

简单来说跟架构设计相关的领域你都可以去应用

比如说你要思考一下架构师的职责是什么

你只要对照一下 4R 架构就能够基本上看出来

首先架构师要确定层级

你到底是微信的架构师

还是朋友圈的架构师

还是评论子系统架构师

不同的架构师你设计的架构是不一样的

你关注点也是不一样的

第二点就是拆解角色

你把微信裁剪为支付 朋友圈

你把朋友圈裁剪为什么动态 广告

第三个就是定义关系

第四个就是设计规则

这个刚才举的那些例子里面都有了

那第二个就是说 4R 架构也可以指导你来写架构文档

简单来说就是你的架构设计文档里面

就是要包含这个 Rank 的描述 Role 的描述 Relation 的描述

以及整个系统运作规则的描述

你把这些内容都写出来之后

基本上这个系统架构设计文档就已经 OK 了

那第三个常见的应用场景

就是说如果你想学习一个其它的系统

或者学一个开源系统

比如说你想学 Redis

你想学 MongoDB

你怎么去学

很多人都是一开始就钻进了源码里面去看,

其实这个是不对的

你应该按照 4R 架构的一个定义去学

比如说最开始学习一下它的顶层结构

它包含哪些角色

对它跟外部的系统是怎么交互的

然后角色之间的关系是怎么样的

然后这个系统里面它是如何实现一些功能的

比如说 Redis 是如何实现 Get 操作

如何实现 Set 操作

然后 MongoDB 的 Sharding

它如何实现这个分片读取跟写入的操作

你按照 4R 架构去学习这些开源系统

学习别人的系统的时候

就会发现思路是很清晰的

好 这节课的内容就到这里

我通过思维导图带你再回顾一下这节课的内容

首先我带大家解读了一下

跟架构相关的几个概念

包括系统 子系统模块 组件跟框架

然后的话在这个基础上再结合我自己的一些理解和经验

我重新定义的架构叫 4R 架构

它包含这个 Rank、Role、Relation、Rule

这是这一节课的随堂测验的题目

496

00:25:12.150 --> 00:25:14.500

你可以自己做一下

497

00:25:14.880 --> 00:25:19.520

如果你对你的答案不确定或者没有信心的话

498

00:25:19.530 --> 00:25:22.200

你可以找助教去沟通交流

499

00:25:22.430 --> 00:25:25.720

也可以直接在群里提出你的疑问

500

00:25:25.920 --> 00:25:28.960

助教和老师都会及时地回答你的问题

501

00:25:29.710 --> 00:25:29.780

用户头像

Frank

关注

还未添加个人签名 2018.05.04 加入

还未添加个人简介

评论

发布
暂无评论
第1课:什么是架构,你理解对了吗?