5.1 软件工程
20世纪60年代,为了解决软件危机,提出了软件工程的概念。
软件危机的具体表现:
- 软件开发进度难以预测;
- 软件开发成本难以控制;
- 软件功能难以满足用户期望;
- 软件质量无法保证;
- 软件难以维护;
- 软件缺少适当的文档资料。
5.1.1 软件工程定义
软件工程师应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则和方法,以提高质量、降低成本和改进算法。其中,计算机科学、数学用于构建模型与算法;工程科学用于制定规范、设计范式、评估成本及确定权衡;管理科学用于计划、资源、质量、成本等管理。
软件工程过程是指获得软件产品,在软件工具的支持下由软件工程师完成的一系列软件工程活动,包括4个方面:
- Plan:软件规格说明
- Do:软件开发
- Check:软件确认
- Action:软件演进
5.1.2 软件过程模型
软件经历需求设计、软件设计、软件开发、运行维护,直至被淘汰的全过程称为软件的生命周期。
为了使软件生命周期种的各项任务能够有序地按照规程进行,对各项任务给予规程约束的工作模型称为软件过程模型(软件生命周期模型)。
1、瀑布模型
2、原型化模型
3、螺旋模型
5.1.3 敏捷模型
20世纪90年代,软件开发受到两个因素影响:面向对象编程开始取代面向过程编程;互联网泡沫刀纸快速投向市场以及公司的快速发展成为关键商业因素。
快速变化的需求需要短的产品交付周期,从而诞生了敏捷方法的概念。
1、敏捷方法的特点
- 敏捷型方法是“适应性(adaptive)”而非“预设性(predictive)”的;
- 敏捷型方法是“面向人的(People-oriented)”而非“面向过程的(Process-oriented)”。
2、敏捷方法的核心思想
- 敏捷方法是适应型,而非可预测性;
- 敏捷方法是以人为本,而非以过程为本;
- 迭代增量式的开发过程。
3、主要敏捷方法简介
- 极限编程(Extreme Programming,XP)
- 水晶系列方法
- Scrum,迭代式增量软件开发过程,侧重于项目管理
- 特征驱动开发方法(Feature Driven Development,FDD)
- 6种关键项目角色:项目经理、首席架构设计师、开发经理、主程序员、程序员和领域专家;
- 5个核心过程:开发整体对象模型、构造特征列表、计划特征开发、特征设计和特征构建。
5.1.4 统一过程模型(RUP)
统一过程模型(Rational Unified Process,RUP)描述了如何利用商业的、可靠的方法开发和部署软件,是一个重量级过程。
1、RUP的生命周期
9个核心工作流:
- 业务建模
- 需求
- 分析与设计
- 实现
- 测试
- 部署
- 配置与变更管理
- 项目管理
- 环境
多个循环软件开发生命周期中的4个阶段: - 初始阶段
- 细化阶段
- 构造阶段
- 移交阶段
2、RUP中的核心概念
- 角色(Role)
- 活动(Activity)
- 制品(Artifact)
- 工作流(Workflow)
3、RUP的特点
- 用例驱动
- 以体系结构为中心
- 迭代和增量
5.1.5 软件能力成熟度模型
软件能力成熟度模型(Capability Maturity Model for Software, CMM)是一个概念模型,模型框架和表示是刚性的,不能随意改变的,但是模型的解释和实现具有一定弹性。
软件能力成熟度模型集成(Capability Maturity Model Integration for Software, CMMI)是在CMM的基础上发展而来的。
CMMI提供了一个软件能力成熟度的框架,将软件过程改进的步骤组织成了5个成熟度等级,共包括18个关键过程域,52个过程目标,3168种关键时间,它为软件过程不断改进奠定了一个循序渐进的基础。
- Level 1 初始级
- Level 2 已管理级
- Level 3 已定义级
- Level 4 量化管理级
- Level 5 优化级
注:有关软件能力成熟度模型的详细介绍,需参考CMM相关专业书籍。
5.2 需求工程
需求工程是指应用已证实有效的原理、方法,通过合适的工具和记号,系统地描述待开发系统及其行为特征和相关约束。
需求工程的目标简单命令:确定客户需求,定义设想中系统的所有外部特征。
需求工程的活动主要被划分为以下几个阶段:
- 需求获取
- 需求分析
- 形成需求规格(需求文档化)
- 需求确认与验证
- 需求管理
5.2.1 需求获取
1、需求获取的基本步骤
- 开发高层的业务模型
- 定义项目范围和高层需求
- 识别用户角色和用户代表
- 获取具体的需求
- 确定目标系统的业务工作流
- 需求整理与总结
2、需求获取方法
- 用户面谈
- 需求专题讨论会
- 问卷调查
- 现场观察
- 原型化方法
- 头脑风暴
5.2.2 需求变更
1、变更控制过程
2、变更控制委员会
变更控制委员会(Change Control Board,CCB)是项目所有者权益代表,负责裁定接受哪些变更。CCB是决策机构,通常通过评审手段来决定项目是否能变更,但是不提出变更方案。
5.2.3 需求追踪
需求追踪提供了由需求到产品实现整个过程范围的明确查阅能力。需求跟踪可以建立与维护“需求-设计-编程-测试”之间的一致性,确保所有的工作成果符合用户需求。需求跟踪有两种方式:
- 正向跟踪:检查每个需求能否在后续工作成功中找到对应点;
- 反向跟踪:检查设计文档、代码、测试用例等工作能否在需求中找到出处。
5.3 系统分析和设计
系统分析阶段是应用系统思想和方法,把复杂的对象分解为简单的组成部分,找出这些部分的基本属性和彼此之间的关系的过程。其基本任务是系统分析师和用户在充分了解用户需求的基础上,把双方对新系统的理解表达为系统需求规格说明书。
系统设计的目标是根据系统分析的结果,完成系统的构建过程。其主要目的是绘制系统的蓝图,权衡和比较各种技术和实施方法的利弊,合理分配各种资源,构建新系统的详细设计方案和相关模型,指导系统实施工作的顺利开展。系统设计的主要内容包括概要设计和详细设计。
5.3.1 结构化方法
结构化(Structured Analysis and Structured Design,SASD)方法,也可称为面向功能的软件开发方法或面向数据流的软件开发方法。
结构化开发方法提出了一组提高软件结构合理性的准则,如分解和抽象、模块独立性、信息隐蔽等。针对软件生存周期各个不同阶段,它有结构化分析(Structured Analysis,SA)、结构化设计(Structred Design,SD)和结构化编程(Structured Programing,SP)等方法。
1、结构化分析
一般利用图形表达用户需求,使用的手段主要有:
- 数据流图(Data Flow Diagram,DFD):从应用系统的数据流着手以图形方式刻画和表示一个具体业务系统中的数据处理过程和数据流;
- 数据字典(Data Dictionary):数据字典是描述数据的信息集合,是对系统中使用的所有数据元素定义的集合。数据字典的作用是给数据流图上每个元素加以定义和说明;
- 结构化语言
- 判定表
- 判定树
2、结构化设计
以结构化分析阶段所产生的数据流图和数据字典等文档为基础,是一个自顶向下、逐步求精和模块化的过程。结构化设计的基本思想是将软件设计成由相对独立且具有单一功能的模块组成的结构,分为概要设计和详细设计两个阶段。
- 模块结构:信息隐藏和抽象、模块化、松耦合、高内聚
- 系统结构图(模块结构图):模块的实现算法、所需的局部数据结构
3、结构化编程
程序 = 算法 + 数据结构,自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。
4、数据库设计
数据库设计的内容包括:
- 概念结构设计:通常采用实体-联系图(Entity Relationship Diagram,E-R图)来表示。
- 逻辑结构设计
- 物理结构设计
- 数据库的实施
- 数据库的运行和维护
5.3.2 面向对象的方法
面向对象开发方法将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学。
面向对象开发方法是以用例驱动的、以体系结构为中心的、迭代的和渐增式的开发过程,主要包括:需求分析、系统分析、系统设计、系统实现。
1、面向对象分析(OOA)
- 面向对象分析的基本原则:抽象、封装、继承、分类、聚合、关联、消息通信、粒度控制、行为分析;
- 面向对象分析的基本步骤:确认对象和类、确定结构、确定主题、确定属性、确定方法。
2、面向对象设计(OOD)
类封装了信息和行为,是面向对象的重要组成部分,它是具有相同属性、方法和关系的对象集合的总称。在面向对象设计中,类可以分为3种类型:实体类、控制类和边界类。
- 实体类:映射需要中的每个实体,在系统的整个生存期中通常都是永久性的,一般类名以名词命名;
- 控制类:用于控制用例工作的类,将用例的特有行为进行封装,一般由动宾结构的短语(“动词+名词”或“名词+动词”)转化来的名词;
- 边界类:用于封装在用例内、外流动的信息和数据流。边界类用于系统接口与系统外部进行交互,将系统与外部环境的变更分隔开,通常情况下边界类可以既有属性也有方法。
3、面向对象编程(OOP)
面向对象编程达到了软件工程的3个主要目标:重用性、灵活性和扩展性。
面向对象编程 = 对象 + 类 + 继承 + 多态 + 消息,其中核心概念是类和对象
面向对象编程的基本特点:封装、继承和多态。
4、数据持久化和数据库
在面向对象开发方法中,对象只能存在于内存中,如果要永久保存对象的状态,需要进行对象的持久化(Persistence):将内存中的对象保存到数据库或可永久保存的存储设备中。
5.4 软件测试
软件测试是使用人工或自动的手段来运行和测定某个软件系统的过程,其主要目的就是确保软件的质量、确保软件以正确的方式做了用户所期望的事情;同时还要给开发人员提供信息,以方便其为风险评估做相应的准备。
5.4.1 测试方法
以测试过程中程序执行状态可依据分为:
- 静态测试(Static Testing,ST)
- 动态测试(Dynamic Testing,DT)
以具体实现算法细节和系统内部结构的相关情况可分为: - 黑盒测试
- 白盒测试
- 灰盒测试
从程序执行方式可分为: - 人工测试(Manual Testing)
- 自动化测试(Automatic Testing)
5.4.2 测试阶段
从阶段上划分,软件测试可以分为:
- 单元测试(Unit Testing,UT)
- 集成测试(Integration Testing,IT)
- 系统测试(System Testing,ST)
系统测试中又细分为多种不用的测试种类,如: - 功能测试
- 性能测试
- 验收测试
- 压力测试
5.5 净室软件工程
净室软件工程(Cleanroom Software Engineering,CSE)是一种应用数据与统计学理论以经济的方式生产高质量软件的工程技术,力图通过严格的工程化的软件过程达到开发中的零缺陷或接近零缺陷。
净室软件工程师一种在软件开发过程中强调在软件中建立正确性的需要的方法,针对高质量软件的生产,降低风险及成本,满足用户需求,提供竞争优势。
净室软件工程是软件开发的一种形式化方法,它可以生成质量非常高的软件,强调将正确性验证(而不是测试)作为发现和消除错误的主要机制。
5.5.1 理论基础
- 函数理论:一个函数定义了定义域到值域的映射,一个好程序的规范就是一个函数的规范,应具有:完备性,一致性和正确性;
- 抽样理论:把软件的所有可能的使用情况看作总体,通过统计学手段对其进行抽样,并对样本进行测试,根据测试结果分析软件的性能和可靠性。
5.5.2 技术手段
- 统计过程控制下的增量式开发:控制迭代
- 基于函数的规范与设计
- 正确性验证
- 统计测试和软件认证
5.6 基于构件的软件工程
基于构件的软件工程(Compoment-Based Software Engineering,CBSE)是一种基于分布对象技术、强调通过可复用构建设计与构造软件系统的软件复用途径。
基于构件的软件工程(CBSE)体现了“购买而不是重新构造”的哲学,将软件开发的重点从程序编写转移到了基于已有构件的组装,以更快地构造系统,减轻用来支持和升级大型系统所需要的维护负担,从而降低软件开发费用。
5.6.1 构件和构件模型
基于构件的软件工程(CBSE)构件的特征:
- 可组装性
- 可部署性
- 文档化
- 独立性
- 标准化
构件模型定义了构件实现、文档化以及开发的标准,构件模型包含了一些模型要是,这些要素信息定义了构件接口、在程序中使用构件需要知道的消息,以及构件应该如何部署。
5.6.2 CBSE过程
CBSE过程中的主要活动包括:
- 系统需求概述
- 识别候选构件
- 根据发现的构件修改需求
- 体系结构设计
- 构件定制与适配
- 组装构件,创建系统
5.6.3 构架组装
- 顺序组装:上一个构件的输出,与下一个构件的输入相兼容;
- 层次组装:被调用构件为调用构件提供所需的服务;
- 叠加组装:两个或两个以上构架放在一起创建一个新构件。
5.7 软件项目管理
5.7.1 项目管理概述
软件项目管理的对象是软件工程项目,它所涉及的范围覆盖了整个软件工程过程。
软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对人员(People)、产品(Product)、过程(Process)和项目(Project)进行分析和管理的活动。
5.7.2 软件进度管理
所谓进度,指的是对执行活动和里程碑所制定的工作计算,而进度管理指的是为了确保项目按期完成所需要的管理过程。在软件进度管理过程中,一般包括:活动定义、活动排序、活动资源估计、活动历时估计、制定进度计划和进度控制。
1、工作分解结构(Work Breakdown Structure,WPS)
当软件项目比较大而复杂时,往往需要进行层层分解,将大的任务分解成一个个的单一小任务进行处理。
2、任务活动图
活动定义时指确定完成项目的各个交付成果所必须进行的各项活动,需要明确每个活动的前驱、持续时间、必须完成日期、里程碑或交付成果。
在项目管理中,任务活动图是项目进度管理、项目成本管理等一系列项目管理活动的基础,通常采用甘特图的方式来展示和管理项目活动。
5.7.3 软件配置管理
软件配置管理(Software Configuration Manaagement,SCM)是一种标识、组织和控制修改的技术。
软件配置管理的核心内容包括版本控制和变更配置:
- 版本控制(Version Control):对软件开发过程中的各种程序代码、配置文件及说明文档等文件变更管理;
- 变更控制(Change Control):对变更进行管理,确保变更更有序进行。
5.7.4 软件质量管理
软件质量就是软件与明确地和隐含地定义的需求相一致的程度。(软件质量是软件符合明确地叙述的功能和性能需求、文档中明确地描述的开发标准以及所有专业开发的软件都应具有的隐含特征的程序。)
从管理角度出发,可以将影响软件质量的因素划分为3组:产品运行、产品修改、产品转移。
1、软件质量保证
软件质量保证(Software Quality Assurance,SQA)是建立一套有计划,有系统的方法,来向管理层保证拟定出来的标准、步骤、实践和方法能够正确地被所有项目所采用。
软件质量保证的主要任务有三个方面:
- SQA审计和评审
- SQA报告
- 处理不符合问题
2、软件质量认证
质量认证用来检验整个企业的质量水平,注重软件企业的整体资质,全面考察软件企业的整体质量体系,检验该企业是否具有设计、开发和生产符合质量要求的软件的能力。
目前国内软件企业主要采用的是ISO 9000和能力成熟度模型(Capability Maturity Model,CMM)。
5.7.5 软件风险管理
软件项目风险管理是软件项目管理的重要内容,风险管理的主要目标是预防风险。
软件项目风险是指软件开发过程中遇到的预算和进度等方面的问题,以及这些问题对软件项目交付的影响。