【系统分析师之路】第九章 软件工程(上)

【系统分析师之路】第九章 软件工程(上)

1.软件工程基础知识:软件生命周期及其模型;软件需求分析与定义;软件设计;设计测试与评审;软件维护;文档编制标准。

信息系统生命周期:系统规划,系统分析,系统设计,系统实施,运行维护。(具体见上图)
信息系统生命周期分四个阶段:规划,开发,运维,消亡(关键字:花开云散)。在开发阶段不仅包括系统分析,系统设计,系统实施,还包括系统验收。如果从项目管理的角度来看,项目的生命周期又可以划分为启动,计划,执行和收尾。

四个阶段 信息系统生命周期简化版的定义说明
立项阶段 包含概念形成过程和需求分析过程。形成需求规格说明书,并确定立项。
开发阶段 在开发的角度来看,可简化为总体规划,系统分析,系统设计,系统实施,系统验收。(划分即试验)。其中系统实施阶段工作量最大。
运维阶段 信息系统通过验收,正式移交用户。分为排错性,适应性,完善性,预防性。
消亡阶段 系统不可以一直运行,应在初期就注意消亡的条件,时间以及由此花费的成本。

信息系统项目的生命周期结构具有以下特征:
1)成本和人力投入在开始较低,在工作执行期间达到最高,并在项目快要结束时迅速回落。
2)风险与不确定性在项目开始时最大,并在项目的整个生命周期中随着决策的制定与可交付成果物的验收而逐步降低。
3)在不显著影响成本的基础上,改变项目最终特征的能力在项目开始时最大。并随着项目的进展而减弱。做出变更和纠正错误的成本,随着项目越来越接近完成而显著提高。
常用的软件开发方法有:结构化方法,面向对象方法,面向服务的方法,原型化方法,逆向工程方法,净室软件方法。


1)结构化方法:
也叫做生命周期法,其精髓是自顶向下,逐步求精,模块化设计。瀑布模型适合适用的开发方法就是结构化方法。
结构化方法的特点:开发目标清晰化,开发工作阶段化,开发文档规范化,设计方法结构化。
结构化方法不足之处:开发周期长,难以适应需求变化,很少考虑数据结构。
2)面向对象方法:
OO方法也划分阶段,但其中的系统分析系统设计和系统实现三个阶段已经没有明显的间隙,也就是说这三个阶段的界限已经变得不明确。
一些大型信息系统的开发,通常是将结构化方法和OO方法结合起来,使用结构化方法进行自顶向下的整体划分,然后自底向上的采用OO方法进行开发。因此结构化方法和OO方法任然是两种在系统开发领域中互相依存的,不可替代的方法。
根据处理范围不同,设计模式可以分为类模式和对象模式。
面向对象的方法主要包括:OMT,Coad/Yourdon方法,OOSE,Booch方法。

面向对象的方法
Booth 认为软件开发是一个螺旋上升的过程。每个周期包括四个步骤:分别是标识类和对象,确定类和对象的含义,标识关系,说明每个类的接口和实现。它的基本模型包括类图和对象图。它不仅建立了开发方法,还提出了设计人员的技术要求以及不同开发阶段的人力资源配置。
OMT 作为一种软件工程方法学,支持整个软件生存周期,覆盖了问题构成分析,设计(对象设计,系统设计)和实现等阶段。
从三个不同的角度建立了三类模型:对象模型(对象图),动态模型(状态图),函数模型(DFD图)。
OOSE 建立在OMT的基础上,对功能模型进行了补充,提出了用例的概念,取代数据流图来进行需求分析和建立功能模型。
OOSE建立的五类模型:需求模型,分析模型,设计模型,实现模型,测试模型。
Coad/Yourdon 主要由面向对象的分析,和面向对象的设计构成。OOA的任务主要是建立问题域的分析模型。OOD由四部分组成:人机交互部件,问题域部件,任务管理部件和数据管理部件。

3)原型化方法
和结构化方法和OO方法不同的是,在系统开发初期没有明确的系统要求和边界的前提下才使用的方法。它根据用户初步需求,利用系统开发工具,快速地建立一个系统模型展示给用户,在此基础上与用户交流,最终实现用户需求的信息系统快速开发方法。
原型按功能划分可以分为水平和垂直原型两种。从原型的最终结果来说,可分为抛弃式原型和演化式模型。

  原型的分类 原型别名 说明
按功能 水平原型 行为模型 用来探索预期系统的特定行为,并达到细化需求的目的。它只是导航功能不实现功能。主要用在UI界面上。
垂直原型 结构化模型 它实现一部分功能,它主要用在复杂的算法实现上。
按结果 抛弃式模型 探索式模型 达到预期目的后,原型本身被抛弃。抛弃型模型主要用在解决需求不确定性,二义性,不完整性。
演化式模型 增量式模型 为开发增量式提供基础,逐步将原型演化为最终系统。主要用在必需易于升级和优化的场合,特别适用于Web项目。

原型法的优缺点:

原型法的优点 以客户为中心,成本风险降低,开发速度加快。由于用户的参与,不仅有利于系统移交,有利于系统的运行和维护。
原型法的缺点 分析层面难度大,技术层面难度不大的系统。但对于技术层面难度大的系统,不适合使用原型开发。

4)面向服务的方法
对于跨构件的功能调用,则采用接口的形式暴露出来。进一步将接口的定义与实现进行解耦,则催生了服务和面向服务(SA)的开发方法。
如何使信息系统快速响应需求和环境变化,提高系统的可复用性,信息资源共享和系统之间的互操作性,成为影响信息化建设效率的关键问题,而SO思维方式恰好满足了这种需求。
5)净室方法
软件开发的一种形式化的方法,可以生成高质量的软件。它使用盒结构进行分析和设计建模,并且强调将正确性验证(而不是测试)作为发现和消除错误的主要机制,使用统计的测试来获取认证被交付的软件的可靠性所需的出错率信息。
它是一种强调正确性的数学验证和软件可靠性的认证的软件工程模型,其目标和结果具有非常低的出错率。
净室中三种盒类型:黑盒,状态盒,清晰盒。
正确性验证:软件构件的过程被划分为一系列子函数为每个函数定义出口条件并实施一组子证明。
统计的测试:一组使用场景,确定对每个场景的使用概率及定义符合概率的随机测试来进行软件测试。将产生错误取样可以数学的计算软件构件的可靠性。
6)逆向工程法
6.1)再工程:对现有软件系统重新开发的过程。包括逆向工程(反向工程),新需求的考虑(重构),正向过程三个步骤。它不仅可以从已有的程序中获得设计信息,而且还能使用这些信息改建或重构现有的系统。
再工程的基础是系统理解,包括对运行系统,源代码,设计分析和文档等全面的理解。
6.2)软件重构:对源代码,数据进行修改,使其易于维护以适用将来的变更。重构并不修改体系结构,而是关注模块的细节。它的意义在于提高软件质量和生产率,减少维护工作量,提高可维护性。
6.3)逆向工程:
力求在比源代码更高的抽象层次上建立程序表示的过程。逆向工程是一个设计恢复的过程,其工具可以是从已有的程序中抽取数据结构,体系结构和程序设计信息。
在大多数情况下随着抽象层次的增高,完整性就降低。

主要的软件开发模型有:瀑布,增量,螺旋,喷泉,智能,V模型,快速应用开发模型,构件组装模型,敏捷方法和统一模型。

No 模型 说明
1 瀑布模型 也称为生命周期法,是结构化方法中最常用的开发模型。它把软件开发过程分为六个阶段:软件计划,需求分析,软件设计,程序编码,软件测试,运行维护。它是软件工程最早的模型,它有利于大型软件开发过程中人员的组织与管理,它自上而下呈线性图式。它只适用于需求不怎么变更的项目。它是一个经典的软件开发生命周期模型。一般将软件开发分为可行性分析,需求分析,软件设计(概要设计和详细设计),编码(含单元测试),测试,运行维护等几个阶段。
2 V模型 以测试为中心的开发模型。它宣称测试并不是一种事后的补救行为,而是一个同开发过程同样重要的过程。V模型描述了一些不同的测试级别,并且说明这些级别所对应的生命周期中不同的阶段。适合与需求明确,或者需求不是频繁变动的场合。
3 快速应用开发模型RAD 是一个增量型的软件开发过程模型,强调极短的开发周期。它是瀑布模型的一种高速变种,通过大量使用复用的构件,赢得快速开发。其流程是:业务建模(数据流图),数据建模(数据模型,ER图),过程建模(细化数据流图),应用程序生成,测试与交付(只做总体测试,因为大量的复用)
4 敏捷方法 不同的流派:极限编程XP,自适应软件开发,水晶方法,特征驱动开发。XP是一种轻量高效,低风险,柔性,可预测,科学且充满乐趣的软件开发方式。
5 统一过程RUP 它是一个通用过程框架。使用UML建模的基于构件的迭代的软件开发过程。
6 演化模型 在快速开发一个原型的基础上,获得用户反馈后改进,重复这个过程直到演化出新的产品。
7 螺旋模型 以原型为基础,增加了风险分析。沿着螺旋自内向外旋转。是一个演化的软件过程模型。将原型实现的迭代和线性顺序模型中控制的和系统化的方面结合起来,它有四个阶段构成分别是制定计划,风险分析,实施工程和客户评估。它适用于庞大而复杂的,高风险的系统。
8 喷泉模型 主要支持面向对象的开发方法。体现了迭代和无缝隙的特征。无缝隙是指分析设计和编码之间不存在明显的边界。
9 智能模型 基于知识的软件开发模型。它综合了若干模型,并于专家系统结合在一起。  
10 增量模型 瀑布的基本成分和迭代的基本特征。与原型不同的是他强调每个增量都发布一个可操作产品。每个序列产生一个可发布的增量,每个增量产生一个可操作的产品,第一个增量是核心产品。它适合于需求经常发生改变的软件开发过程。
11 迭代模型 每一次迭代都可以产生一个发布产品,这个产品是最终产品的一个子集。它适用于不能事先完整定义产品需求的场合,计划多期开发的项目。它分四个阶段分别是初始,细化,构造,移交。
12 构件组装模型 将整个系统模块化,并在一定构件模型的支持下复用软件构件,通过组合手段,高效构造应用软件系统的过程。
13 原型模型 特点有实际可行,具有最终系统的基本特征,构造方便快捷,造价低。而对于用户的需求是动态响应随时纳入的。可以将原型开发分为抛弃型原型和演进型原型。

RAD的缺陷:
RAD对模块化要求比较高,并非所有的应用都适合。
开发者和客户必需在很短的时间完成一系列的需求分析,任何一方配合不当都会导致RAD项目失败。
只能用于信息系统开发,不适合技术风险很高的项目。
敏捷方法的特点
·在更短的周期内尽早提供具体持续的反馈信息。
·迭代计划编制,最开始迅速生成一个总体计划,然后在项目进行中不断发展它。
·依赖TDD尽早的捕获缺陷
·依赖口头交流,用测试和源程序沟通
·倡导持续演化式的设计
·依赖于开发团队内部的紧密动作
·尽可能达到程序员短期利益和长期利益的平衡
统一过程RUP分为四个阶段:

初始阶段 确定业务模型并确定项目的边界。系统的阐述项目的范围,选择可行的系统构架,计划和准备业务案例
细化阶段 分析问题领域,建立健全的体系结构基础。细化构想,细化过程和基础设施,细化构架并选择构件
构建阶段 要开发所有剩余的构件和应用程序功能。资源管理,控制和过程最优化。完成构件的开发并依照评价标准进行测试
交付阶段 基线足够完善,可以安装到最终用户实际环境中是,则进入交付阶段。同步并使并发的构造增量集成到一致的实施基线中,与实施有关的工程活动(商业包装,生产,人员培训等),根据完整的构想和需求集的验收标准评估实施基线

RUP的工作流分为两部分:核心工作流程和核心支持流程。
核心工作流程:需求建模,设计分析,实施,测试和部署。
核心支持建模:环境,项目管理,配置与变更管理。

软件设计活动:包括4个既独立又相互联系的活动,即数据设计,软件结构设计,人机界面设计和过程设计。

No 软件设计活动 软件设计活动说明
1 数据设计 数据结构对软件质量的影响是深远的。好的数据设计将改善程序结构和模块划分,降低过程复杂性。
2 软件结构设计 开发一个模块化的程序结构。并表示出模块间关系。它将程序结构与数据结构结合。
3 人机界面设计 和协作系统间,软件与用户间如何通信。
4 过程设计 每个逻辑元素有可预测的逻辑结构,从顶端进入底端退出的过程流。

在结构化设计中,模块化是一个很重要的概念,每个模块可以独立地开发和测试。这是一种复杂问题分而治之的原则。
它包括:
1)抽象化
它又包括过程抽象,数据抽象,控制抽象。
2)自顶向下,逐步求精
3)信息隐蔽
通过隐蔽可提高软件的可修改性,可测试性,可移植性。它是现代软件设计的关键原则。
4)模块独立
每个模块完成一个相对独立子功能。高内聚低耦合。
软件设计常用的工具:程序流程图,盒图,PAD图,PDL图。
工作流设计:
工作流管理系统:通过软件定义,创建工作流并管理其执行。实际企业中运作的工作流管理系统,是一个人和电脑结合的系统。

2.需求分析和设计方法:包括需求的分类,结构化分析(数据流建模,控制流和控制规格说明)分析设计图示(掌握数据流图的含义和用法,理解数据字典的含义以及用法,熟练掌握流程图的含义和用法),模块设计(内聚,耦合);人机界面设计。
软件需求的基本特征是可验证性
需求的目的:检测和解决需求之间的冲突,发现软件的边界,以及软件如何与外界交互,详细描述系统需求和软件需求。
需求包括:用户需求,系统需求,业务需求。

No 需求包括 说明
1 系统需求 从系统的角度来说明软件的需求,包括功能需求,非功能需求和设计约束等。功能需求也称为行为需求,他规定了开发人员必须在系统中实现的软件功能。
1.1 功能需求 通过系统特征的描述表现出来,所谓特征,是指一组逻辑上相关的功能需求,表示系统为用户提供某项功能,使用户的业务目标得以满足。
1.2 非功能需求 系统必须具备的属性和品质,又可细分为软件质量属性和其他非功能要求。
1.3 设计约束 也称为制限条件或补充规约。通常是对系统的一些约束说明,例如必需采用国有知识产权的数据库系统。必需运行在UNIX操作系统下等。
2 业务需求 反映企业或客户对系统高层次的目标要求。
3 用户需求 描述的是用户的具体目标,用户要求系统必须完成的任务。

需求分析的工作:需求分析人员把杂乱无章的用户要求和期望转化为用户需求的过程。
需求分析可以分为三个阶段:需求提出,需求描述,需求评审。
QFD将软件需求分为三类:常规需求,意外需求,期望需求。

No 分类需求 说明
1 常规需求 系统应该做到的功能或性能,实现越多用户会越满意。
2 期望需求 用户想当然认为系统应具备的功能或性能。如果期望需求没实现,会让用户感到不满意。
3 意外需求 兴奋需求,是用户要求范围外的功能或性能(软件开发人员乐意去做的),如能实现用户会更高兴,如不实现也不会影响购买决策。

需求工程包括:需求开发和需求管理。


1)需求开发包括:需求获取需求分析需求定义(SRS)需求验证四个阶段。广义上需求分析就是需求开发中四个阶段。而不严格区分的情况下,需求分析就是指需求开发。

需求开发 对需求开发的说明
需求获取 主要解决需求调查的问题。需求获取的方法:用户访谈,问卷调查,采样,情节串联板,联合需求计划。
需求分析 包括结构化分析,面向对象分析,面向问题域分析三种。面向问题域的分析:更多的强调面向描述,而少强调建模。
需求定义 需求定义的过程也就是形成需求规格说明书的过程。有两种需求定义的方法,分别是严格定义方法和原型方法。
需求验证 一致性验证,现实性验证,完整性验证,有效性验证。

1.2)需求分析


完整的需求分析过程包括四项:获取用户需求分析用户需求编写需求说明书需求评审
业务流程分析:就是了解各个业务流程的过程。明确各个部门之间的业务关系和每个业务处理的意义。然后作成DFD图。
数据流图:从数据传递和加工的角度,利用图形符号通过逐层细分地描述系统内各个部件的功能和数据在它们之间的传递的情况,描述系统内部逻辑过程。
DFD中有四个符号:数据流(箭头),加工(圆圈),数据存储(直线段),外部实体(数据源或数据终点,用方块表示)画分层DFD就是为了突出其自顶向下逐层分解的特点。



数据字典:是关于数据信息的集合,也就是对DFD中包含的所有元素的定义的集合。DFD和数据字典共同构成系统逻辑模型。
数据字典的设计包括:数据流设计,数据元素字典设计,数据处理字典设计,数据结构字典设计和数据存储设计。
对加工的描述方法有三种:结构化语言(半形式语言),判定树(一个动作依赖多个条件),判定表(条件多,取值多)
使用SA方法进行需求分析:
需求分析建立模型的核心是数据字典。围绕这个核心有三个层次的模型,分别是数据模型,功能模型,行为模型(状态模型)。

需求模型 表示图 说明
数据模型 实体联系图 ER图主要描述实体属性,以及实体之间的关系。
功能模型 数据流图 用数据流图表示功能模型,DFD说明系统所完成功能,从数据传递和加工的角度,利用图形符号通过逐层细分描述系统的各个部件的功能和数据在他们之间传递的情况,来说明系统所完成的功能。
行为模型 状态转换图 用状态转换图表示行为模型,STD通过描述系统的状态和引起系统状态转换的事件,来表示系统的行为,指出做为特定事件的结果将执行哪些动作。

需求评审:就是对SRS进行技术评审。在实际工作中,一般通过需求评审和需求测试工作来对需求进行验证。
1.3)需求定义

需求定义的三个方法
1 严格定义方法 在每一个工作阶段中,都用上一阶段所提供的完整,严格的文档作为指导文件。
2 原型定义 开发人员与用户通力合作的反复过程。根据用户要求不断对系统进行完善,它实质是一种迭代的循环型开发方式。
3 SRS软件需求说明书 需求开发活动的产物,是项目干系人和开发团队对系统的初始规定有一个共同的理解,是软件项目后期开发和维护的基础

需求定义的目标:根据需求调查和分析结果,进一步定义准确无误的产品需求,形成SRS,系统设计人员将依据SRS展开设计工作。
SRS需要把用户对软件的功能需求和非功能需求进行详细记录和准确描述,描述系统预期的外部行为和用户可视化行为。
SRS包括的内容有:范围,引用文件,需求,合格性规定,需求可追踪性,尚未解决的问题,注解,附录。
SRS的三种编写方法:用好的结构化和自然语言编写文本型文档;建立图形化模型;编写形式化规格说明。
1.4)需求验证
一般特别需要验证的方面有 

一致性验证 主要是分析需求描述中是否存在一些需求冲突问题 
完整性验证 需求必须是完整的,规格说明书应该包括用户需要的每一个功能或者性能 
现实性验证 验证需求内容的可实习性
有效性验证 验证需求对于实际的问题解决确实是正确有效

2)需求管理:
包括定义需求基线,处理需求变更,需求跟踪等工作。它起到了支持和保障的作用。
需求跟踪分为正向和逆向跟踪。当发生变更时要建立与维护需求跟踪矩阵。
需求跟踪的主要目的:
1)审核确保所有需求被应用
2)在增加,删除,修改需求时可以确保不忽略每个受到影响的系统元素。
3)能正确完整实施变更
4)获得计划功能当前实现的记录
5)再工程记录旧系统将要替换的功能在新系统中的位置。
6)可以减少关键成员离开项目风险
7)测试出错时指出最可能有问题的代码段

猜你喜欢

转载自blog.csdn.net/Last_Impression/article/details/88701945