软件体系结构——第一章<软件系统方法论>
一、软件危机
典型表现及产生原因:
(1)对软件开发成本和进度的估计常常很不准确——拖期、投资巨大,项目管理经验欠缺。
(2)用户对“已完成的”软件系统不满意的现象经常发生——模糊的需求 、闭门造车、盲于编程,仓促上阵、交付的日期没有保障。**
(3) 软件产品的质量往往靠不住——可靠性和质量保证欠缺,缺少测试、隐藏着很多Bug。
(4) 软件常常是不可维护的——设计死板,对整体设计考虑欠缺。
(5) 软件通常没有适当的文档资料——缺少设计资料、难以维护,写文档嫌麻烦。
(6) 软件成本在计算机系统总成本中所占的比例逐年上升——软件过于庞大,成本过高、复杂度高。
(7) 软件开发生产率提高的速度,远远跟不上计算机技术的发展——技术落后,技术过时、复用欠缺等。
如何克服:
(1)软件开发不只是技术问题,更重要的是管理问题。管理不善必然导致失败 。
(2)为了提高软件开发效率、产品质量、可维护性,缩短软件开发周期,必须采用工程化的开发方法与工业化的生产技术。
(3)技术上,采用基于重用的软件生产技术;管理上,采用多维的工程管理模式(如,健康码的开发)
(4)注重在实践中总结开发成功的技术和方法——开发经验和技巧的积累。
二、软件工程
软件工程三要素:方法、工具和过程
-
方法为软件开发提供了 “如何做” 的技术
-
工具为方法提供了自动或半自动的软件支撑环境——集成开发工具+CASE工具
-
过程是为了获得高质量的软件所需要完成的一系列任务框架。
追求:模块化、标准化、工厂化、流水组装
本质特性与重点:
(1) 关注于大型程序的构造——分析与设计
(2) 重要任务是学会控制系统的复杂性——分解
(3) 软件经常会发生变化——要有准确的需求
(4 )开发软件的效率非常重要——经验+技巧
(5) 和谐地合作是开发软件的关键——团队精神
(6)软件必须有效地支持它的用户——用户在用
(7)应具有知识面非常广的领域业务背景——缺乏应用领域的相关知识,是软件出现问题的常见原因
2.1、传统的结构化方法
也称为生命周期方法学或结构化范型。
它采用结构化技术(结构化分析(SA)、结构化设计(SD)和结构化实现(SP))来完成软件开发的各项任务。
特点:把软件生命周期的全过程依次划分为若干个阶段,前一个阶段是后一个阶段的基础。
2.2、面向对象方法学
该方法提出的原因:当软件规模庞大、或者对软件的需求是模糊的、或会随时间而变化的时候,使用传统方法学开发软件往往会不成功,而且,后期的维护工作量巨大、维护代价也非常高。
面向对象方法学4个要点:对象 + 类 + 继承 + 用消息通信
优点:简化了软件的开发和维护,提高了软件的可重用性。采用“迭代求精”的设计思想。
三、软件生命周期
软件开发过程中项目管理角度的任务:
-
坚持阶段性评审是关键,目的是发现技术方面的错误;
-
监督项目进度、经费开支、投资回收的前景等。
问题定义和可行性研究:
软件开发的需求工程和设计工程:
如果没有设计,只能建立一个不稳定的软件体系结构。
测试阶段:
-
测试方法:黑盒法与白盒法。
-
测试策略:单元测试、集成测试、确认测试、系统测试与验收测试。
运行和维护阶段:
-
改正性维护:运行中发现软件有错需要修正;
-
适应性维护:为了适应变化了的软件运行环境,需做适当变更;
-
完善性维护:为了增强软件的功能需做变更;
-
预防性维护:为了改进软件未来的可维护性或可靠性,主动对正在使用的软件系统完善其功能,使其寿命更长。
四、软件过程模型
软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤——是一个将用户需求转换为软件系统所需的活动集合。
即:项目管理 + 软件开发方法 = 软件开发过程
4.1、模型
瀑布模型——文档驱动
生命周期法:
特点:
⑴ 顺序性、依赖性
⑵ 推迟程序的物理实现——按步骤进行
⑶ 质量保证的观点 —— 阶段文档与评审的要求,利于尽早发现错误。
⑷ 易于组织,易于管理——严格规范
⑸ 致命缺点—— 阶段间文档驱动,可能开发失败
⑹ 需求变化后引起的代价将很高——维护难
(7) 适合在软件需求比较明确、开发技术比较成熟、工程管理比较严格的场合下使用,如:产品软件
快速原型模型——原型驱动
快速原型模型是为了克服瀑布模型的缺点而提出来的。它是通过采用迭代求精的思想:
首先,凭借系统分析人员对用户需求的理解,利用先进的软件工具快速地构建一个可以在计算机上运行的软件原型系统。然后,让用户试用原型并收集用户反馈意见的办法——目的是获取用户的真实需求。
“边开发边应用”原则
特点:用户时刻参与,便于交流,比较适合大型的、复杂的软件系统
RUP模型——用例驱动+迭代求精
核心思想是:用例驱动、以架构为中心的迭代增量开发过程
4.2、现代模型
关键技术:构件重用——减少重复性工作、提高软件生产率、降低开发成本、缩短开发周期。
主要开发方法:
-
基于组件(构件)的开发方法
-
面向领域的软件开发方法
-
极限模型与敏捷开发SCRUM
-
模型驱动架构(Model Driven Architecture, MDA)
①基于组件的开发方法
重用软构件有助于改善软件质量——大量使用软构件,软件的灵活性和标准化程度也能得到提高
②面向领域的软件开发方法
③极限模型
敏捷开发过程的方法:
SCRUM、Crystal、特征驱动软件开发(Feature Driven Development,简称FDD)、自适应软件开发(Adaptive Software Development,简称ASD)、以及最重要的极限编程(eXtreme Programming,简称XP)。
④敏捷开发SCRUM
SCRUM,是一种迭代式增量软件开发过程
优势:
-
采用迭代式开发,有效降低软件开发的风险。
-
灵活应付软件开发中的变更。
-
注重团队成员之间的沟通。
-
明确的产出物,相较于传统的开发模型,敏捷模型能够减轻开发人员的负担。
-
每一阶段的目标明确,有能够被认同的产出物。提升团队对产品的认知与成就感。
⑤模型驱动架构
-
MDA是由OMG定义的一个软件开发框架。
-
是一种基于UML以及其他开发、行业等标准的框架,支持软件设计和模型的可视化、存储和交换。
-
MDA把建模语言用作一种编程语言而不仅仅是设计语言。
-
MDA的关键之处是模型在软件开发中扮演了非常重要的角色。
实现步骤:
-
平台无关模型(PIM)建模:利用UML对应用领域进行高度抽象的建模。
-
平台相关模型(PSM)建模:用一个特定的实现技术(提供的某种架构)将PIM自动翻译实现为一个或多个PSM。比如EJB, 数据库模型,COM组件等等。
-
正向工程(从模型到代码生成):依靠某种特定的技术,PSM将被翻译成源代码。
应用前提:
只能应用于某一特定的应用领域工作——领域中的项目都具有一定的相似性——整个应用程序族或者不同的项目都属于同一个应用领域。
4.3、软件开发项目的基本目标
-
付出较低的软件开发成本
-
达到用户要求的软件功能
-
取得较好的软件性能
-
开发的软件易于移植
-
需要较低的维护费用
-
能按时完成开发工作,及时交付使用
五、软件架构设计模式及案例
软件体系结构:
-
是由结构和功能各异、相互作用并按照层次构成的部件集合——定义了软件局部和总体计算部件的构成——由构件和构件之间的相互作用组成。
-
构件可以是一个函数、一个类、一个应用程序,还可以是客户机和服务器、数据库、或是一个分层系统中的某层——粒度越大功能越复杂。
-
软件开发不再是“算法+数据结构”,而是“构件开发+基于体系结构的构件组装”。
①一般的架构设计流程
②四层驱动模型的架构设计方法
目标层的驱动因素是所要实现系统的各种相关角色,信息层的驱动因素是目标层中的各种目标,构造层的驱动因素是信息层中的各种信息及其信息活动,实现层的驱动因素是构件层中的类、对象、对象交互等各种面向对象设计的元素,实现层所产生的接口、类及其属性、方法的具体某种语言代码实现框架则对接下来的编码实现阶段提供直接的支持。
③基于宿主机的集中式计算模型
特点:
-
可使多个用户共享单独一台计算机上的应用程序、数据库和外部设备
-
客户应用程序是以文件形式共享的
-
安全性较差
-
网络传输负载大
④客户机/服务器(C/S)的分布式计算模型
特点:
-
所有应用程序必须安装在客户端的计算机上
-
客户应用程序是利用SQL语言针对小的特定数据集(如一个Table中某行的某一列)进行共享操作的
-
广域网应用维护非常困难
-
客户机/服务器每一个功能部件(数据库服务器、客户应用程序和网络)都能各负其责
⑤浏览器/服务器(B/S)的分布式计算模型
原理:
六、软件文档
写文档的目的:除了留住公司的无形资产之外,还可以规范不同人员的表达方式,减少不必要的信息沟通,提高交流的效率。