软件架构(一) 软件架构

  本文主要阐述什么是软件架构、软件架构的重要性、什么时候软件架构尤其重要、什么是推定架构以及软件架构的三种使用方式。

1.什么是软件架构?

架构与详细设计

  软件系统的设计由开发者的决策与意图组成。设计可以被划分为软件架构和详细设计。

  专家们一致认同架构的主干,但是在细枝末节上却存在分歧,比如何时终止架构的设计而开始详细的设计。

  在实践中,也很难将架构和详细设计区分开来。

卡内基·梅隆大学软件工程研究所(SEI)对软件架构的定义:

  计算系统的软件架构时解释该系统所需的结构体的集合,其中包括:软件元素、元素之间的相互关系,以及二者各自的属性。

  定义中尤其重要的要素有:元素、关系和属性。架构时解释该系统所需的结构体的集合,而非简简单单地由这些要素组成。

  虽然这些要素不能完整的描述系统的架构,但是我们也可以使用这些要素对系统进行分析。比如,中国的哪些城市可以乘飞机抵达这类问题,无需中国的完整模型。

  上面关于架构的定义将架构描述为一组可以帮助我们进行系统推断和分析的要素,这有益于我们专注于架构的目的,但是模糊了架构与详细设计之间的界线。

  我们可以将架构理解为设计的宏观部分,且并非仅限于系统的宏观层面,即架构并非总是关注于设计的宏观部分,有时设计细节也被归属为架构的内容。

  那么,该如何判断这部分设计细节是否属于架构呢?这就要看设计细节是否能传达架构师的意图。

  架构师的某些高层意图或决策会影响到低层的细节,就好像传递意图的链条一样。尽管大多数细节对任何合理的实现保持开放,但对某些细节会有所限制,并可以沿着意图链条回溯到设计者的高层意图。这部分细节就属于架构层面。

2.软件架构的重要性

  软件架构会影响整个软件系统,所以它的重要性自然不言而喻。

a.架构扮演着系统骨架的角色

  所有系统都有架构,对于软件系统而言,不存在唯一正确的架构,却存在适合的架构。例如,三层架构使得信息技术系统可以把变更限制在局部范围,并可以处理事务性负载;协作进程架构可以隔离故障,更适合操作系统。

  但是,架构并非只是那些外部可见的主体部分,还包括某些不可见的部分,通常这部分更重要。例如 ,锁策略、内存管理策略或集成第三方组件的技术,都可以是架构的一部分,而在运行的系统或源代码中,这些都不可见。

b.架构影响质量属性

  开发者必须关注软件的功能,比如动画制作软件要可以制作软件。

  系统还要包含与功能无关的额外需求,称为质量属性需求,这也是开发者必须重视的,比如动画制作软件的运行速度。

  因此所选择的架构既要能支持所需的功能,也要能促进或抑制诸如安全性或性能等系统质量属性。通常而言,质量属性的演化比功能的演化更能促进系统的演变。

c.架构与功能(基本上)是正交的

  没有适合于所有功能的架构。但是我们要意识到架构和功能是可以互相混合的。同一功能可以用不同的架构来实现,同样的,同一架构也可以用来实现不同的功能。

  架构的选择和功能是相互独立的,然而,不合适的架构显然会导致功能和质量属性的实现变得障碍重重。

d.架构是对系统的约束

  任何系统都有约束,而架构正是对系统恰如其分的约束,这使得系统可以获得所需的质量属性。

  系统不做什么和做什么同等重要,我们通过施加约束来保证系统不做什么,这样系统可以具备某些特定的质量属性。比如我们对火车施加轨道的约束,火车就不再有随意行驶的灵活性,但获得了速度、安全等优势。

3.什么时候软件架构显得重要?

  大规模或者高复杂度的系统,要特别重视软件架构。

五种案例:

  a.小的解空间;

  b.高的失败风险;

  c.难以实现的质量属性;

  d.全新的领域;

  e.产品线。

4.推定架构

  推定架构是在特定领域中占据主导地位的架构族。在这些领域工作的开发者可能必须对有别于推定架构的抉择作出解释,却无需证明使用推定架构的合理性。

  推定架构可以很好地处理领域中常见的风险,所以十分成功。

  参考架构是描述了针对某一问题在架构层面的解决方案,通常以规格说明书的形式记录下来。

  参考架构可能成为、也可能永远不会成为推定架构。

5.软件架构的使用方式

  有时候,即使忽略了软件架构,许多系统仍然能够成功。但重视软件架构,可以排除因为软件架构而导致系统失败的情况。

三种使用软件架构的方式:

a.与架构无关的设计。

  很少关注架构,要么系统混乱不堪,要么形成并非有意为之的某种特定架构,要么在领域规范的引导下选择了某一推定架构。

b.专注于架构设计

  谨慎地选择软件架构,以满足系统功能和质量属性。

c.提升架构的设计

  将系统的某一功能或执行属性提升至架构之中,这时就无需写代码来实现它。

  总之,软件架构就是系统设计,和它对性能、安全和可修改性等系统质量所产生的影响。软件架构的抉择十分重要,它是系统的骨架,直接影响着系统的质量属性并对系统施加约束。此外,软件架构和功能几乎正交,二者的结合要相得益彰。

时间: 2025-01-01 22:04:05

软件架构(一) 软件架构的相关文章

软件架构的定义及其理解

一.定义 所谓软件架构,指的是软件系统的整体结构,包括软件子元素,这些元素的外部属性以及元素元素之间的关系. 这个定义包含了以下三层意思: (1)软件架构是对系统的抽象.它不仅规定了系统有哪些主要软件元素或模块,还定义了这些元素之间是如何交互的.它并不暴露每个元素的内部属性(也叫局部信息),也就是说每个子模块的私有信息是不划归到软件架构的范畴的.需要注意的是,每个元素的外部属性依然是软件架构的一部分.这里所谓的外部属性,指的是一个元素对其他元素所承担的责任实体,包括:提供的服务,所需的服务,性能

软件架构风格

# 软件架构风格 软件架构设计的一个核心问题是能否使用重复的架构模式,即能否达到架构级的软件重用. 也就是说,能否在不同的软件系统中,使用同一架构. 软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式. 架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效滴组织成一个完整的系统. - 数据流风格:批处理序列,管道/过滤器.- 调用/返回风格:主程序/子系统,面向对象风格,层次结构.- 独立构件风格:进程通信,事件系统.- 虚拟机风格:解释器,基于规则的系统

软件架构的演进:单体、垂直、SOA、微服务

软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程,以下为具体分类: 1.1.1      单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个war包部署到服务器. 3.应用与数据库分开部署. 4.通过部署应用集群和数据库集群来提高系统的性能. 优点: 1.项目架构简单,前期开发成本低,周期短,小型项目的首选. 缺点: 1.全部功能集成在一个工程中,对于大型项目不易开发.扩展及维护. 2.系统性能扩展只能通过扩展集群结点,成本高.有瓶颈

SoC嵌入式软件架构设计之四 :内存空间规划分配

本文继续阐述基于低端控制器CPU的SoC固件架构设计.第一节 SoC嵌入式软件架构设计之一:系统内存需求评估 讲述了系统内存需求的评估.这一节讲述内存空间的具体规划分配.CPU有两种体系结构:哈佛结构和冯诺依曼结构.哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如80251,代码空间与数据空间完全分开,独立编址:冯诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构,如MIPS,ARM等,其代码和数据空间是统一编址.这里就以冯诺依曼体系结构为例. 一.嵌入式系统软件分层

软件架构设计的目的

软件架构设计的目的简单说就是在保持软件内在联系的前提下,分解软件系统,降低软件系统开发的复杂性,而分解软件系统的基本方法无外乎分层和分割.但是在保持软件内在联系的前提下,如何分层分割系统,分层分割到什么样的粒度,并不是一件容易的事,这方面有各种各样的分解方法,比如:关注点分离,面向方面,面向对象,面向接口,面向服务,依赖注入,以及各种各样的设计原则等, 耦合可以分为以下几种,它们之间的耦合度由高到低排列如下: (1) 内容耦合:一个模块直接访问另一模块的内容,则称这两个模块为内容耦合. 若在程序

软件架构设计系列总结

架构引用维基百科:软件体系结构是构建计算机软件实践的基础.与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础.从和目的.主题.材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟.一个软件架构师需要有广泛的软件理论知识和相应的经验来实施和管理软件产品的高级设计.软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作.逻辑和流程.软件

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则

上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法,新设计的内存管理管理单元要实现虚拟内存管理还需要操作系统.代码分块(Bank)的支持,详见SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法.这里要阐述Bank设计的一些原则. Bank设计是为了实现不同时刻运行的Bank(代码块)运行在同一块内存上,所以在运行之前操作系统需要将已存在内存的代码/数据进行缓存处理,并加载将要运行的Ba

我的路子 - 发现游戏为模型的软件架构方式

总觉得如果一个内容被深刻地理解了,那么当在他口中说出来的时候,应该是很简单才对. 所以一直觉得,编程里那些不容易理解的,需要记住很多内容的东西都是有缺陷的.自己又比较自我认可强,看不到别人的角度,表现上有些自我.自己想的只是,事情还有很多解决方法,为什么要被那一种很难学的方式占了路子,而且找不到理解透彻的,有点为这种状况气愤,觉得肯定是没有好好做的原因,或者是一些人太安于现状的原因,或者是一些找不到出路就说没出路的人,自己没吃透却站在高处误导别人,阻碍大部分人的进一步思考. 即使这样,自己该做的

软件架构怎样进行架构

软件架构师一般都是具备计算机科学或软件工程的知识,由程序员做起,然后再慢慢发展为架构师的.在国内,很多大学目前还没有设立软件架构的学位课程,虽然IT业界对设计和架构的兴趣日渐高涨,但各学校还是无法在课程中增加相应的内容来体现这一趋势.从这个方面来说,学校教育已经远远落后于产业发展.因此,促进和发展软件架构学课程的任务将落在现在的软件架构师身上.目前的软件架构师应该帮助各大院校建立相关课程体系,一旦教育课程建立起来,知识体将不仅通过新毕业生的工作成果来得到扩展,同时也会从适合软件架构的教育研究和出