- 背景:当我们在编写一些小程序、小游戏的时候,我们可以凭借我们的经验,随性所欲地去实现它。但是如果开发一个大型的、复杂的系统,那必须对整个系统做一个详尽的规划,分成子系统,子系统再分成模块,然后再去实现它。每个模块的实现,就又到了我们靠经验去实现功能的过程。
打个比方,前者就好比是把石头、木头、草等等搭配在一起做了个小土屋。后者,则是钢筋混凝土的高楼大厦,没有合理的架构,经不起几十年的风吹日晒。所以必须要有对应的方法学,来指导我们进行构建。
个人理解 :从这里也可以体会出,最初进入公司,肯定是一个码农,首先能够独立实现某个模块的某个功能,然后要逐步做到负责某个模块,再到某个子系统…
1. 体系结构的定义
- IEEE的定义
体系结构是以组件(组成元素)、组件之间的关系(组成元素之间的关系)、组件与环境之间的关系(组成元素与结构的关系/元素之间如何交互)为内容的某一系统的基本组织结构以及指导上述内容设计与演化的原理。
从背景当中,我们就看出,系统变得越来越复杂。那么划分之后,子系统、子模块的分解使得系统呈现出不同的结构,所有这些结构的总和就是 architecture(建筑学) 所试图概括的情况。 - 对Software Architecture的常见中文翻译
软件体系结构(最直观)
软件架构(业界最常用)
软件构架(教科书所使用)
2. 软件体系结构(构架)所研究的问题
- 结构性问题
- 系统组织,由哪些组件构成(从IEEE的定义中不难看出)
- 全局性的控制结构
- 通讯、同步或访问的协议
正是通过上述两者的,组成元素之间才能有效地进行交互、联系 - 将功能分配到不同的系统组成部分
从背景可以看出,软件体系结构的出现是因为当前系统变得越来越大,越来越复杂。这种系统不可能靠一己之力去完成,所以这样的系统要分解为系统,子系统要进一步分解为模块、子模块。因此软件体系结构要解决的问题除了各个模块之间所呈现的结构性关系,组织性问题外,还要面临采用何种方式将系统功能划分到各个子模块当中去。 - 设计元素的组成
- 系统的物理分布
系统要部署到哪些不同的硬件当中去,软件功能的实现是要基于硬件的。 - 可扩展性、性能、安全性、可测试性等
3. 软件体系结构主要内容
- 主要内容包括
对系统组成元素的描述
这些元素相互之间的交互
系统组成的模式
模式的约束
对定义的一个再说明 - 所以在软件架构中,系统以组件和组件之间的交互进行定义
在软件构架这个领域当中,我们看待系统总是以组件、组件之间的相互交互来分解这个系统的。如下面的例子。 - 当前的系统同时可以作为更高层设计的一个系统组件
在数据库管理系统中,包括的组件有查询处理模块、存储管理模块、事务处理模块等等,而DBMS的功能正是通过这几个模块之间相互交互来完成DBMS所提供的功能。所以看待DBMS就可以将其看做查询处理模块、存储管理模块、事务处理模块等等这几个模块,以及他们之间相互交互、通信的一个结构性关系。但是在开发一个大的 WEB 项目的时候(比如:淘宝网),我们至少需要三个组件,浏览网站的浏览器,提供WEB服务的WEB服务器,以及对应的数据库服务器。而淘宝的整个功能,正是通过这三个组件之间的交互来完成。在这个更大的系统当中,DBMS扮演了其中的一个组件的角色。
4. 软件架构描述
- 对软件而言,有一个合适的体系结构是长期成功的保证(房子能坚持多久要看它的骨架能撑多久!)
- 当前对于软件架构的描述是
非正式的
因人而异
针对特定系统的
通常由框图和线条以及相关的解释所组成
因为软件体系结构是一门新兴的学科
5.一些典型的构架描述
- “Camelot采用了C/S结构并且使用远程调用方法调用(RPC)”
从这个描述当中,我们可以看到至少有两种组件服务器、客户机。是使用远程方法调用进行组件之间的交互,仅此而已。服务器、客户机有什么功能,完成什么任务,远程方法调用具体用何种方式进行调用,都没有更多的描述。 - “系统设计中采用了抽象分层和模块分解的方法”
抽象分层告诉我们系统是采用类似OSI七层网络模型的分层结构,这是对组件的描述。任何一层只能调用下一层,下一层只为上一层提供服务,这是对组件交互的描述 - “我们采用了一种分布式的、面向对象的方法进行信息管理”
系统的基本组成元素是对象,分布式告诉我们对象间通过网络来进行交互 - “将传统的顺序编译器改造成并发编译器的最简单的方法是将不同的编译阶段在多个处理器上并发执行”。
可以看到,对软件的构架并没有标准的描述
6.软件设计的层次
- 软件设计可以发生在多个不同的层次,在每一层我们都会发现相应的组件以及由这些组件组成更大的组件的组合机制。
- 二进制执行文件层(机器语言和汇编语言)
- 位模式
- 代码层(高级语言C++,JAVA)
- 编程语言的原语(对应多条指令)、操作符
- 记录、数组、过程
- 构架层
- 模块
- 模块
- 二进制执行文件层(机器语言和汇编语言)
7.工程学科的演化
- (1)