2010年软件设计师考试复习资料 (42页完美打印版)
7.3风险管理 7.3.1 风险的定义
1.关心未来:风险是否会导致软件项目失败?
2.关心变化:在用户需求、开发技术、目标机器,以及所有其他与项目及时工作和全面完成有关的实体中会发生什么样的变化?
3.关心选择:应采用什么方法和工具,应配置多少人力,在质量上强调到什么程度才能满足要求? 7.3.2 风险的类型
1.项目风险:指潜在的预算、进度、人力(工作人员及组织)、资源、客户和需求等方面的问题以及它们对软件项目的影响。例如:项目复杂性、规模和结构不确定性等都是项目风险、项目风险威胁到项目计划,即如果项目风险变成现实,有可能会拖延项目的进度,增加项目的成本。
2.技术风险:指潜在的设计、实现、接口、验证和维护等方面的问题。此外,规约的二义性、技术的不正确性,陈旧的技术和“先进的”技术也是技术风险因素。技术风险威胁到开发软件的质量及软件交付时间,如果技术风险比恩成现实,则开发工作可能变得很困难或根本不可能。
3.商业风险:在信息系统项目中,商业风险威胁到要开发系统的生存能力。一般主要有5类商业风险: ? 市场风险:开发了一个没有人真正需要的优秀产品或系统 ? 策略风险:开发的产品不再符合公司的整体商业策略 ? 销售风险:开发了一个销售部门不知道如何去卖的产品
? 管理风险:由于重点的转移或人员的变动而失去了高级管理层的支持 ? 预算风险:没有得到预算或人力上的保证 7.3.3 风险管理活动
1.风险识别:找的哦啊潜风险并将其文档化,它包括项目风险、技术风险和商业风险三种
2.风险评估:可分为定量评估和定性评估。通过对各种风险发生的可能性和破坏性这两个方面进行评估,并将它们按优先级别进行排列。在进行软件工程分析时,项目管理人员要进行四种风险评估活动,包括建立表示风险概率的尺度,面熟风险引起的后果,估计风险影响的大小,确定风险估计的正确性
3.风险驾驭:利用某种技术,如原型化、软件自动化、软件心理学、可靠性工程学等方法设法避开风险。 统称可以把风险应对策略分为两种类型:防范策略和相应策略 (1)风险防范策略
? 规避策略:想方设法阻止风险的发生或消除风险发生的危害。避免策略如果成功则可以消除风险对项目的影响。
例如:针对技术风险可以采取聘请技术专家、针对项目进度风险可以采取延长项目时间或缩减项目范围的办法。 ? 减轻策略:当风险很难避免或转移时,可以考虑采取减轻策略来降低风险发生的概率或减轻风险带来的损失。 风险是一种不确定因素,可以通过前期的一些工作来降低风险发生的可能性;或者也可以通过一些准备来降低风险发生的损失。例如对于需求风险,如果认为需求变化可能很剧烈,那么可以考虑采用柔性设计的方法降低需求变更的代价。尤其对于IT项目而言,越早发现问题越容易解决,例如对于需求风险带来的问题,在设计阶段发现要好过编码阶段发现。针对这些特点,也可以采用尽早暴露风险的方法降低发生风险的损失。 (2)制定风险相应策略
注意,虽然我们采用了很多方法防范风险的发生,但风险本身就是一种不确定因素,不可能在项目中完全消除。 我们还需要制定一些风险发生后的应急措施来解决风险带来的问题。例如:对于系统性能的风险,由于不清楚目前的系统是否能够满足用户的需求,可能在系统发布后出现系统性能不足的问题。对于这个风险,我们可以定义其风险响应策略为增加硬件资源以提高系统性能。
风险响应策略与风险防范策略不同,无论风险是否发生,风险防范策略都需要体现在项目技术中,在项目过程中需求有人来执行对应的方法策略;而风险响应策略是在事件触发的,直到当风险发生后才会被执行,如果始终没有发生风险,则始终不会被安排到项目活动中。 7.3.3 风险曝光度
风险曝光度(risk exposure)=风险损失*风险概率
例如:正在开发的软件项目可能存在一个未将发现的错误,这个错误出现的概率是0.5%,给公司造成的损失将是100万元,那么这个错误的风险曝光度是5000元。
共42页 第11页
2010年软件设计师考试复习资料 (42页完美打印版)
八.模块化基本知识
模块是指执行某一特定任务的数据和可执行语句程序元素的集合,通常是指可通过名字来访问的过程、函数、子程序或宏调用等。
模块化就是将一个待开发的软件划分成若干个可完成某一子功能的模块,每个模块可独立地开发、测试,最后组装成完整的程序。 8.1模块特性 8.1.1 可分解性
如果一种设计方法提供了将问题分解成子问题的系统化机制,它就能降低整个系统的复杂性,从而实现一种有效的模块化解决方案。 8.1.2 可组装性
如果一种设计方法使现存的(可复用的)设计构件能被组装成新系统,它就能提供一种不需要一切从头开始的模块化解决方案。 8.1.3 可理解性
如果一个模块可以作为一个独立的单位(不用参考其他模块)被理解,那么它就易于构造和修改。 8.1.4 连续性
如果对系统需求的微小修改只导致对单个模块,而不是整个系统的修改,则修改引起副作用就会被最小化。 8.1.5 保护性
如果模块内部出现异常情况,并且它的影响限制在模块内部,不会影响其他模块,则错误引起的副作用就会被最小化。
注意“连续性”和“保护性”的区别!! 8.2 模块与模块的耦合性(7种)
耦合是对一个软件结构内不同模块之间互连程度的度量。 耦合可以分成下列几种,它们之间的耦合度由高到低排列。 8.2.1 内容耦合
直接操作或修改另一模块的数据,或不通过正常入口转入另一个模块。
软件设计时应坚决禁止内容耦合,应设计成单入口、单出口的模块,避免病态连接。 8.2.2 公共耦合
多个模块引用同一全局数据区。例如,C语言中的external数据类型、磁盘文件等都是全局数据区。 8.2.3 外部耦合
模块与软件以外的环境有关联。例如,输入输出把一个模块与特定的设备、格式、通信协议耦合在一起。 8.2.4 控制耦合
一模块明显把开关量、名字等信息送入另一模块,控制另一模块的功能。 8.2.5 标记耦合
两个模块之间通过传递公共指针或地址相互作用的耦合。 8.2.6 数据耦合
模块间通过传递数据交换信息。 8.2.7 非直接耦合(无耦合)
模块间无任何关系,独立工作
原则上讲,模块化设计总是希望模块之间的耦合表现为非直接耦合方式。 在以上耦合中,耦合度从高到低,内容耦合度最高,非直接耦合度最低。 总结:内公不好,家外被控了,标志数年心血白非了!(内功不好,家外被控了,标志数年心血白费了!) 8.3 模块的内聚性
内聚是指一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部的概念的自然扩展。设计时应该力求高内聚,理想内聚的模块应当恰好做一件事情。
1)偶然内聚:一个模块的各成分之间毫无关系。比如:一组语句在程序的多处出现,为了节省内存空间,这些语句放在一个模块中,该模块的内聚是偶然内聚的。
共42页 第12页
2010年软件设计师考试复习资料 (42页完美打印版)
2)逻辑内聚:把几种逻辑上相关的功能组放在同一模块中。 3)瞬时内聚(时间内聚):一个模块所包含的任务必须在同一时间间隔内执行,例如初始化模块。 4)过程内聚:一个模块的处理元素是相关的,而且必须按特定的次序执行。 5)通信内聚:一个模块的所有成分都结合在同一个数据结构上。
6)顺序内聚:模块的成分同一个功能密切相关,且输出,作为另外一个成分的输入。 7)功能内聚:模块内的所有成分属于一个整体,完成单一的功能。 在以上的内聚中,内聚度从低到高,偶然内聚度最低,功能内聚度最高。
模块的高内聚、低耦合的原则称为模块独立原则,也称为模块设计的原则。
巧记:偶然逻辑混乱,瞬间遗忘过程,打电话(通信)询问,顺序清楚,功能也搞定! 8.4 模块的深度、宽度、扇出与扇入 ? 深度:表示软件结构中控制的层数。
? 宽度是软件结构中同一个层次上的模块总数的最大值 ? 一个模块的扇入是指直接调用该模块的上级模块的个数。
设计原则:低扇出、高扇入。 8.5 模块作用域和控制域
软件设计时,模块的作用域应在控制域之内。 8.6 模块化基础知识小结
? 通过模块的合并和分解,降低模块的耦合度。 ? 模块的扇入应尽量大,扇出应尽量小。一个模
块的扇入是指直接调用该模块的上级模块的个数。一个模块的扇出是指该模块直接调用的下级模块的个数。扇入大表示模块的重用性高,利用率高。扇出大表示模块的复杂度高。所以要高扇入,低扇出。 ? 要将模块的作用范围限制在模块的控制范围之内。 ? 降低模块之间的复杂性,避免“病态连接”。 2006年上半年:
● 模块的耦合度描述了 (16) 。
(16)A.模块内各种元素结合的程度 B.模块内多个功能之间的接口 C.模块之间公共数据的数量 D.模块之间相互关联的程度 ● 内聚是一种指标,表示一个模块 (17) 。
(17)A.代码优化的程度 B.代码功能的集中程度
C.完成任务时及时程度 D.为了与其他模块连接所要完成的工作量 九.什么是软件开发方法?有哪些主要方法?
? 软件开发方法:使用已定义好的技术集及符号表示习惯组织软件生产的过程。 ? 结构化方法、面向对象方法、JACKSON方法、维也纳开发方法(VDM)等。 9.1 结构化方法学
结构化方法学也称为生命周期方法学(瀑布模型方法),是一种面向数据流的需求分析方法。它的基本思想是自顶向下逐层分解。
为了在需求改变时对软件的影响较小,结构化分析时应该使程序结构与问题结构相对应。 常用工具: 数据流图(DFD)、数据字典(DD)、实例—关系图(E-R图)及描述加工处理的结构化语言、判定表、判定树。 9.1.1数据流图(DFD图) ? DFD的基本成分
数据流图主要由4种成分组成,如下表所示:
共42页 第13页
2010年软件设计师考试复习资料 (42页完美打印版)
数据流(data flow):由一组固定成分的数据组成,表示数据的流向。它可以从源、文件流向加工,也可以从加工流向文件和宿,还可以从一个加工流向另一个加工。通常每个数据流必须有一个合适的名字,一方面是为了区别,另一方面也给人一个直观的印象,使人容易理解这个数据流的含义。但流向文件或从文件流出的数据流不必命名,因为这种数据流的组成部分就是相应文件的组成部分。
加工(process):描述了输入数据流到输出数据流之间的变换,也就是输入数据流做了什么处理后变成了输出数据流。每个加工有一个名字和一个编号。编号反映了该加工位于分层DFD的哪个层次和哪张图中以及它是哪个加工分解出来的子加工。
文件(file):可以表示数据文件,也可以表示一个数据记录。流向文件的数据流表示写文件,流出文件的数据流表示读文件,双向箭头表示对文件既读又写。每个文件都有一个文件名。
源/宿(source/sink):源是指系统所需数据的发源地,宿(也称数据池)是指系统所产生的数据的归宿地。无论源或宿,均对应于外部实体,在框内应加注实体的名字,在一个软件各级软件系统中,有些源和宿可以是一个外部实体,外部实体是指存在于软件系统之外的人员或组织,它指出系统所需数据的发源地和系统所产生数据的归宿地。 ? 分层数据流图
一套分层的的数据流图由顶层、底层、和中间层组成。
画分层数据流图基本原则与注意事项 a.自外向内,自顶向下,逐层细化,完善 求精。
b.保持父图与子图的平衡。也就是说,父
共42页 第14页
2010年软件设计师考试复习资料 (42页完美打印版)
图中某加工的输入数据流中的数据必须与它的子图的输入数据流在数量和意义上相同。 c.保持数据守恒。也就是说,一个加工所
有输出数据流中的数据必须能从该加工的输入数据流中直接获得,或者是通过该加工能产生的数据。 c.加工细节隐藏。根据抽象原则,在画父
图时,只需画出加工和加工之间的关系,而不必画出各个加工内部的细节。 d.简化加工间关系。在数据流图中,加工
间的数据流越少,各加工就越相对独立,所以应尽量减少加工间输入输出数据流的数目。 e.均匀分解。应该使一个数据流中的各个 加工分解层次大致相同。
f.适当地为数据流、加工、文件、源/宿命
名,名字应反映该成分的实际意义,避免空洞的名字。 g.忽略枝节。应集中精力于主要的数据流,
而暂不考虑一些例外情况、出错处理等枝节性问题。 h.表现的是数据流而不是控制流。 i.每个加工必须既有输入数据流,又有输
出数据流.在整套数据流图中,每个文件必须既有读文件的数据流又有写文件的数据流,但在某一张子图中可能只有读没有写或者只有写没有读。
小结:一个软件系统,其数据流图往往有多层。如果父图有N个加工(Process),则父图允许有0~N张子图,但是每张子图只能对应一张父图。在一张DFD图中,任意两个加工之间可以有0条或多条名字互不相同的数据流;在画数据流图时,应该注意父图和子图的平衡,即父图中某加工的输入输出数据流必须与其输入输出流在数量和名字上相同。DFD信息流大致可分为两类:交换流和事务流。 2006年上半年:
●在绘制数据流图时,要遵循的一个原则是父图与子图的平衡,所谓平衡是指___(31)___。 (31)A.父图和子图都不得改变数据流的性质 B.子图不改变父图数据流的—致性 C.父图的输入/输出数据流与子图的输入/输出数据流一致 D.子图的输出数据流完全由父图的输入数据流确定 9.1.2 数据字典
数据字典是关于数据的信息的集合也就是对 数据流图中包含的所有元素的定义的集合。
组成部分: a.数据项条目 b.数据流条目 c.文件条目 d.加工条目 加工条目是对数据流图中每一个不能再分解的基本加工的精确说明。
对于加工的描述是数据字典的组成内容之一,常用的加工描述方法有结构化语言、判定树和判定表。 9.1.3 结构化语言
结构化语言实际上是一种半形式化语言,它的结构通常可分为内外两层。外层接近于形式化语言,而内层近似于自然语言的描述。
9.1.4 实体-关系图(E-R图)
实体-关系图(Entity-Relabionship Diagram),简称E-R图,包含实体、关系和属性等3种基本成分。通常用矩形框代表实体,并用直线把实体(或关系)与其属性连接起来。
共42页 第15页