1 概述
对于程序员而言,开始关注架构就是重大进步。就已经从单纯写代码的层次里跳了出来,至少从“增删改查”中跳了出来,能以更宏观的视角去思考代码、思考软件工程!
这是一个新的起点,加油!
1.1 架构的定义
架构
是一个来源于传统领域的古老概念,用来指对房屋、桥梁等实体物理结构的设计与研究
。
后来,架构
的概念被引入到软件系统领域
,指对软件系统总体结构的设计
。
我们可以类比传统工程设计领域
的概念,将软件系统领域
的研究由上到下地分为三层:
理念层面
:研究软件系统开发中的理念和思想。
例如研究软件的开发模型、评价指标、架构风格等。类比于传统工程领域研究建筑质量标准、研究商业区与居住区的分布关系等。
架构层面
:研究如何协调和组织软件系统、子系统、模块之间的关系,从而指导系统实现并提升各类质量指标。
类比于规划和设计建筑物的承重结构、功能结构等,并协调各结构的关系等。
技术层面
:研究如何高效、可靠、经济地实现软件系统、子系统、模块等。
类比于搭建建筑物中的楼梯、墙体、阳台等。
这一样一类比,是不是就比较好理解了。
可见软件架构
位于承上启下的中间层
。因此,做出良好的架构需要我们对理念层面和技术层面的知识均由较为深刻的认识。
理念层面的知识为我们的架构提供了思路和目标上的指引,技术层面的知识为我们的架构提供了手段和工具上的支撑。
在软件开发过程中,架构发生在需求之后、规划之前。
经过需求
、架构
、规划
、开发
几个主要步骤后,一个软件便从最初模糊的需求演变为最终可运行的实体。
软件架构是在软件系统结构、行为和属性的高级抽象基础之上展开的全面的系统设计,其主要内容包括概要设计和详细设计两大步骤。
- 在
概要设计阶段
,研究构成系统的抽象组件以及组件之间的连接规则; - 在
详细设计阶段
,将这些抽象组件细化为模块、类、对象等实际的组件,并通过设计通信规则完成它们之间的连接。
软件系统架构
的好坏对软件质量
有着重要的影响。
在算法研究
中,我们常使用时间复杂度
和空间复杂度
等指标来衡量算法的性能优劣
。
然而,在一个完整的软件项目中,算法的研究与优化
只是软件开发阶段
的一个小环节,其对系统质量
的影响是有限的。
相比于算法优化,软件系统架构
则是从顶层
对软件系统的软硬件结构
进行设计,其设计的好坏对系统质量的影响更为重大。
通过架构,我们是要搭建一个高质量的软件系统。所以,我们需要先了解下什么是软件的质量。
1.2 软件的质量
作为一名软件开发者和用户,我们经常在工作和生活中接触各种各样的软件,也会从不同的维度对软件进行评判。
例如: 我们会使用“界面漂亮”、“好用”、“容易崩溃”、“功能强大”等各种类似的词语来描述一个软件,其实这都从不同的维度反映了一个软件的质量。
那有没有确切的标准来衡量一个软件的质量呢?
ISO/IEC 25010:2011
是软件工程-产品质量评价国际标准
。它给出了软件质量模型
(Product Quality Model
)并将软件质量
划分成了八个特性维度,如图所示:
这8个特性维度的介绍如下:
功能性
(Functional suitability):在特定条件下使用时,产品或系统提供满足指定和隐含需求的功能的程度。这里仅对是否满足功能做要求,而对功能的规范性不做要求。效率
(Performance efficiency):在指定条件下,软件产品对资源的占用。资源包括其他软件产品、系统的软件和硬件配置等。兼容性
(Compatibility):产品、系统或组件可以与其他产品,系统或组件交换信息或执行其所需功能,同时共享相同的硬件或软件环境的程度。易用性
(Usability):指定用户可以使用产品或系统在指定的使用环境下以有效、高效和满意的方式达到指定目标的程度。可靠性
(Reliability):系统、产品或组件在指定条件下在指定时间内执行指定功能的程度。这里所说的指定功能涵盖可用性、安全性、可维护性等。因为软件不会在运行过程中损耗,所以其不可靠是由于软件需求、设计、实施中的错误引发,或者是执行上下文变化引发。安全性
(Security): 产品或系统保护信息和数据的程度,以便人员或其他产品或系统具有与其权限类型和授权级别相适应的数据访问程度。可维护性
(Maintainability):预期的维护者可以修改产品或系统的有效性和效率的程度。可移植性
(Portability):系统、产品或组件从一种硬件,软件或其他操作或使用环境转移到另一种环境的有效性和效率的程度。
以上八个特性维度共同构成了软件的质量
。
例如:我们所说的“好用”、“界面漂亮”是在从
易用性维度
评价软件质量,“容易崩溃”是在从可靠性维度
评价软件质量,“功能强大”是在从功能性维度
评价软件质量。
在
软件架构设计过程
中,原则就是尽量保证设计出的软件能够在以上八个维度都有较好的表现。
当然,能在以上所有维度表现良好是理想情况,绝大多数时候,我们不得不做出取舍,为了某些重要的特性维度指标而牺牲一些次要的指标。
例如: 为了界面漂亮(易用性高)而导致界面的加载时间变长(效率降低),需要不断权衡。