1、1第一章 软件工程介绍1.软件的特点? P4软件是设计开发的,而非传统意义上的生产制造。软件不会“磨损” ,但会退化。不断的变更是软件退化的根本原因。磨损的硬件部件可以用备用的构件替换,而软件却不存在备用构件。2可复用构件的含义与应用实例。 P6含义:现代的可复用构件封装了数据和对数据的处理,使得软件工程师能够利用可复用的构件构建新的应用程序。应用实例:例如,现在的用户界面就使用可复用构件构造图形窗口、下拉菜单和各种交互机制,并采用可复用构件库存储和管理构造用户界面所需要的数据结构和处理逻辑。3.软件维护的四种主要类型? P8程序纠错;调整软件以适应新的环境;满足用户新特性和功能的需求;对软件
2、实施再工程以便在现代应用中发挥作用。4.对软件神话的正确认识? P1011(详解见课本 9 大神话)管理神话。用户神话。从业者神话。第二章 过程综述1.理解软件工程包括的内容 P17软件过程: 软件过程构成了软件项目管理控制的基础,并且建立了一个环境以便于技术方法的采用、工作产品(模型、文档、数据、报告、表格等)的产生、里程碑的建立、质量的保证、正常变更的正确管理。软件工程方法: 软件工程方法依赖于一组基本原则,这些原则涵盖了软件工程所有技术领域,包括建模和其他描述性技术等。软件工程工具: 软件工程工具为过程和方法提供自动化或半自动化的支持。2.五个最基本的过程框架活动 P18(1)沟通:这个
3、框架活动包含了与客户(和其他共利益者)之间大量的交流和协作,还包括需求获取以及其他相关活动。(2)策划:指为后续的软件工程工作制定计划。它描述了需要执行的技术任务、可能的风险、资源需求、工作产品和工作进度计划。(3)建模:包括创建模型和设计两方面。创建模型有助于客户和开发人员更好地理解软件需求;设计可以实现需求。(4)构建:包括编码(手写或者自动生成的)和测试(测试是为了发现编码中的错误) 。(5)部署:软件(全部或者完成的部分)交付到用户,用户对其进行评测并给出反馈意见。3.采用软件过程模型鱼项目成功之间是否有必然的因果关系 P21对软件过程的适应性调整是项目成功的关键24.CMMI 的观点
4、及给我们的启发 P24-25观点:为了避免过于简化问题,CMMI 认为软件开发过程必须严肃对待必须详细计划,一致控制,准确跟踪,专业化地执行,必须以项目共利益者的要求,软件工程师的技能和最终产品的质量为核心启发:CMMI 是软件工程的伟大成就。在构建计算机软件时到底该采用哪些活动和动作,CMMI 对此提供了全面的讨论。尽管软件组织不会采纳 CMMI 的所有细节,但是每个软件开发队伍都应该接受其主旨,并从其对软件工程过程和实践的讨论中提高认识。第三章 过程模型1 瀑布模型适用情况 p33需求必须是准确定义和相对稳定的。2.增量模型的基本特点 p34-p351)迫切需要为用户迅速提供一套功能有限的
5、软件产品,然后在后续的版本中再细化和扩展功能;2)增量模型发布一系列称为增量的版本,随着每个版本的交付,逐步为用户提供更多的功能;3)运用增量模型的时候,第一个增量往往是核心产品;4)增量过程模型,具有迭代的性质。3.原型开发 p371)理想状况下,原型系统提供了定义软件需求的一种机制;2)在大多数项目中,构建的第一个系统通常都会被丢弃。4.螺旋模型的特点 p391)螺旋模型是一种演进式软件过程模型;2)在每次演进的时候,都要考虑风险;3)螺旋的第一圈一般开发出产品的规格说明,接下来开发产品的原型系统,并在每次的迭代中逐步完善,开发不同的软件版本。第五章 系统工程1. 系统工程的观点: P72
6、(1).软件工程化之前必须了解该软件所处的外部“系统” 。(2)软件工程从系统工程演变而来。(3)相比之前只专注于软件个体的情况,系统工程关注各种要素的分析、设计,并将其组织成系统。第六章 需求工程1.需求工程的基本概念 P87-88需求工程的概念:(1)作用: 需求工程帮助软件工程师更好地理解他们将要解决的问题。(2)人员: 软件工程师(有时涉及系统工程师或分析师)和项目共利益者(项目经理、客户、最终用户)都将参与需求工程(3)步骤:1.需求工程首先定义将要解决的问题范围和性质2.引导、帮助客户定义需要什么3.精练需求,精确定义和修改基本需求。当客户提出问题后,就要进行协商:优先次序如何定义
7、?什么是必需的?何时需要?4.以某种形式明确说明问题,再经过评审或确认以保证我们和客户对于问题的理解是一致的。(4)重要性 :需求工程为设计和构造奠定了 坚实的基础。如果没有需求工程,那么实现的软件很有可能无法满足客户的需求32.需求工程过程的 7 个活动 P89-921.)需求工程过程通过执行七个不同的活动来完成:起始、导出、精化、协商、规格说明、确认和管理起始:在项目起始阶段,软件工程师会询问一些似乎与项目无直接关系的问题,目的是对问题、方案需求方、期望方案的本质、客户和开发人员之间初步的交流和合作的效果建立基本的谅解。导出:2)清晰地理解客户的需求为什么很困难的?为此需求工程师必须以有条
8、理的方式展开需求收集活动精化:3)精化的最终结果是形成一个分析模型,该模型定义了问题的信息域、功能域和行为域。协商:4)不同的客户或用户提出了相互冲突的需求,需求工程师必须通过协商过程来调解这些冲突。规格说明:5)规格说明是需求工程师完成的最终工作作品,它将作为软件工程师后续活动的基础,它描述了一个基于计算机系统的功能和性能,以及那些将影响系统开发的约束确认:6)确认这一步将对需求工程的工作产品进行质量评估管理:7)需求管理是用于帮助项目组在项目进展中标识、控制和跟踪需求以及变更需求的一组活动。:第七章 构建分析模型1.分析模型的作用 P108(1)需求分析向软件设计者提供信息、功能和行为的表
9、示。(2)这些表示可以被转化为结构、接口和构件级的设计。(3)在软件完成后,分析模型和需求规格说明就为开发人员和客户提供了评估软件质量的手段2.分析的经验原则 P109(1)不要陷入细节。即不要试图解释系统将如何工作(2)关于基础结构和其他非功能的模型应推延到设计阶段再考虑。(3)尽可能保持模型简洁。3.构建分析模型的方法 P107(1)基于场景的建模。(2)面向流的建模。(3)基于类的建模。(4)行为建模。4.掌握面向流的建模的方法 (考试时会给图,要会检验图上的错误)画 DFD 的方法与注意事项。PPT 上的示意图画 DFD 的方法(一):顶层 DFD依据:系统的业务流程图重点:识别作为数
10、据源点与终点的外部实体作用:明确系统的范围和目标4检验顶层 DFD与业务规则是否一致数据能否守恒画 DFD 的方法(二):建立 DD,说明顶层 DFD对顶层 DFD 进行分解为什么要分解?如何分解?根据业务规则,分类管理自顶向下,逐步细化分解结束的标准?处理算法的意义明确,功能简单易实现画 DFD 的方法(三):分解 DFD分解后形成 0 层、1 层、2 层DFD 图形中的每个元素需要一个合适的唯一的名称分解后要对处理算法进行编号分解的同时需要建立 DD 进行说明画 DFD 的方法(四):检验方法分解能否与业务逻辑自然衔接每个处理的数据是否守恒分解后能否与上一层保持数据平衡DD 是否完整、一致
11、第八章 设计工程1.设计工程的基本概念。 (内容,目标,特点) P146-147(1)内容:设计工程包括一套原理、概念和实践,可以指导道高质量的系统或产品开发。(2)目标:设计工程的目标是创作出坚固、适用和赏心悦目的模型或设计表示。(3)特点:1)计算机软件设计工程随着新的方法、更好的分析和更广泛的理解的演化而不断变化。2)当前大多数软件设计方法都缺少那些更经典的工程设计学科所具有的深度、灵活性和定量性。2.软件设计的重要性。 P148软件设计的重要性可以用一个词来表达质量。 (详解看课本)3.优势设计的特征。 P1491)设计应展示出这样一种结构:(a )已经使用可识别的体系结构风格或模式创
12、建;(b)由展示出良好设计特征的构件构成;(c)能够以演化的方式实现,从而便于实现和测试。2)设计应该模块化;也就是说,软件应按照逻辑划分为元素或子系统。3)设计应该包含数据、体系结构、接口和构件的清楚的表示。4)设计应导出数据结构,这些数据结构适于要实现的类,并由可识别的数据模式提取。5)设计应导出显示独立功能特征的构件。6)设计应导出接口,这些接口降低了构件之间以及与外部环境连接的复杂性。7)设计的导出应根据软件需求分析过程中获取的信息采用可重复使用的方法进行。8)应使用能够有效传达其意义的表示法来表达设计。54.模块化原则。 P153(1)分而治之。(2)可以得出结论:如果我们无限制地划
13、分软件,那么开发它所需的工作量会变得很小到可以忽略!不幸的是,其他因素开始起作用,导致这个结论是不成立的。(3)随着模块数量增加,集成模块的工作量(成本)也在增加。(4)我们缺乏必要的技术的来精确地预测 M。5.信息隐藏及其作用。 P153-154含义:信息隐蔽的目的是在一个模块接口后面隐蔽数据结构的细节和过程的处理,模块的用户不需要知道细节。作用:(1)把信息隐蔽用作模块化系统的一个设计标准,在测试和随后的软件维护过程中,在需要修改时将提供最大的益处。(2)因为大多数数据和程序对软件的其他部分是隐蔽的,因此在修改过程中,无意地引入错误并传播到软件其他地方的可能性会很小。6.功能独立。 P15
14、41)具体体现 (1)通过开发具有“专一”功能和“避免”与其他模块过多交互的模块,可以实现功能独立。(2)我们希望软件设计时要使每个模块仅涉及需求的某个特定子功能;(3)每个模块只有一个接口。2)重要性(1)功能被分割而且接口被简化。(2)独立模块更容易维护(和测试) ,因为修改设计或修改代码所引起的负作用被限制,减少了错误扩散。(3)模块复用也成为可能。(4)功能独立是优秀设计的关键,而设计又是软件质量的关键。3)定性标准独立性可以使用两条定性的标准评估:内聚性和耦合性。7.求精。 P154(1)逐步求精是一种自顶向下的设计策略。(2)求精实际上是一个细化的过程。(3)高抽象级上定义的功能陈
15、述只是概念性描述,没有细节。(4)并随着每个精化(细化)的持续进行将提供越来越多的细节。(5)跳过求精步骤而直接转移到最底层的细节。这将导致错误和疏忽,并使设计更加难以评审。还是进行逐步求精为好。8.重构。 P155(1)技术核心:不改变代码 设计 的外部行为而是改进其内部结构。(2)处理结果将实现一个更容易集成、更容易测试和更容易维护的软件。 (重构的目的是优化设计结构而不是提高效率)9.设计模型的四个主要元素。 P158设计模型为 4 个主要元素:数据,体系结构,构件和接口。6第九章 进行体系结构设计1.什么是软件体系结构 (PPT)软件体系结构是具有一定形式的结构化元素,即构件的集合,包
16、括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。(PPT 上找不到,百度的)2.映射数据流到软件体系结构 (PPT)两种映射方法:事物映射变换映射变换型 DFD事务型 DFD初始 SC变换映射的初始 SC 模型:主模块输入模块 变换控制模块 输出模块事务映射的初始 SC 模型事务控制模块接收模块 动作发送模块动作 1 模块 动作 2 模块 动作 3 模块7变换映射方法确定变换中心一级分解二级分解确定输入、输出的边界顶层和第二层
17、的四个模块DFD 中的每个处理对应一个适当的模块变换映射例第一步:确定输入流和输出流的边界,就可以找出变换中心第二步:按一级分解的要求,确定四个模块(主模块、输入模块、变换控制模块、输出模块)第三步:二级分解自顶向下分解,设计出每个分支的中、下层模块事务映射方法(二级分解不考)确定事务中心一级分解二级分解事务映射例第一步:确定:(1)事务中心(2)接收路径(3)动作路径第二步:按一级分解的要求,确定接收和发送的模块第十章 构件级设计建模1.什么是构件? P197-198(1)构件是计算机软件中的一个模块化的构造块;(2)严格定义上系统中某一定型化的、可配置的和可替换的部件才是构件;(3)在面向
18、对象软件工程环境中,构件包括一个协作类集合;8(4)在传统软件工程环境中,一个构件就是程序的一个功能要素。2.构件级设计建模的意义? P197当设计模型被转化为源代码时,必须遵循一系列设计原则,以保证不仅能够完成转化任务,而且还能够保证不在开始时就引入错误。3.设计传统构件 决策表分为四个部分,左上部列出了所有条件,左下部列出了所有可能的动作,右半部构成了一个矩阵,表示条件的组合以及特定条件组合对应的动作,因此矩阵的每一列可解释为一条处理规则。开发决策表步骤:1、 列出特定过程(或模块)相关的所有动作;2、 列出执行该过程的所有条件(或所有决策) ;3、 将特定的条件组合与特定的动作相关联,消
19、除不可能的条件组合;或者找出所有可能的条件排列;4、 定义规则,指出一组条件对应哪个或哪些动作。实例参考,书 P215216 掌握决策表的应用第十一章 完成用户界面设计1.界面设计的黄金规则。 P222224(1) 置用户于控制之下。(2) 减少用户的记忆负担。(3)保持界面一致。第十二章 软件测试策略1. 软件测试的组织。 P246错误的认识 :(1) 软件开发人员根本不应该做测试;(2) 应当让那些无情地爱挑毛病的陌生人做软件测试;(3) 测试人员仅在测试步骤即将开始时参与项目;正确的观点:(1) 软件开发人员总是要负责程序的个别单元(构件)的测试,确保每个单元完成其功能或显示出被设计的行
20、为;(2) 在大多数情况下,开发者也进行集成测试,集成测试是其中一个测试步骤,它将给出整个软件体系结构的构造(和测试) ;(3) 只有在软件体系结构完成后,独立的测试组才开始介入。2. 传统的软件测试总体策略。 P247 (图 12-1) 软件测试策略也可以放在螺旋模型中来考虑。(1) 单元测试(起始于螺旋的漩涡中心) ,侧重于以源代码形式实现的每个单元(即构件) ;(2) 集成测试(沿着螺旋向外) ,侧重于软件体系结构的设计和构造;(3) 确认测试(沿着螺旋向外再走一圈) ,依据已经建立的软件,对需求进行确认;(4) 系统测试(螺旋最外圈) ,将软件与系统的其他成分作为一个整体来测试。3.
21、单元测试。 P250-251基本概念(侧重点):1)单元测试侧重于软件设计的最小单元(软件构件或模块)的验证工作;2)利用构件级设计描述作为指南,测试重要的控制路径以发现模块内的错误;3)单元测试侧重于构件中的内部处理逻辑和数据结构。9单元测试内容:1)测试模块的接口是为了保证被测程序单元的信息能够正常地流入和流出;2) 检查局部数据结构以确保临时存储的数据在算法的整个执行过程中能维护其完整性;3) 走遍控制结构中的所有独立路径(基本路径)以确保模块中的所有语句至少执行一次;4) 测试边界条件以确保模块在到达边界值的极限或受限处理的情形下仍能正确执行;5)要对所有的错误处理路径进行测试。4.
22、集成测试。 P253为什么要进行集成测试?(1) 数据可能在穿过接口时丢失;(2) 一个模块可能对另一个模块产生负面影响;(3) 子功能接合在一起并不能达到预期的功能;(4) 单个模块中可以接受的不精确性在连接起来之后可能会扩大到无法接受的程度;(5) 全局数据结构产生问题。集成测试可以发现什么错误: 发现与接口相关的错误的测试。5. 回归测试。 P2551)概念:回归测试是重新执行已进行测试的某个子集,以确保变更没有传播不期望的副作用;2)目的:回归测试能保证变更(由于测试或其他原因)不引入无意行为或额外的 错误。6.确认测试。 P258259 测试: 是由最终用户在开发者的场所进行。在受控
23、的环境下进行。 测试: 在最终用户场所执。与 测试不同,开发者通常不在场。第十三章1.测试的目标 P270(1)发现错误,且好的测试发现错误的可能性较大;(2)达到用最小的工作量发现最多错误的目标。2.白盒测试和黑盒测试检查的问题 P272、279白盒测试:(1)保证一个模块中的所有独立路径至少被执行一次;(2)对所有的逻辑值均需测试真(true)和假(false) ;(3)在上下边界及可操作的范围内执行所有的循环;(4)检验内部数据结构以确保其有效性。黑盒测试:发现以下错误(1)功能不正确或遗漏;(2)接口错误;(3)数据结构或外部数据库访问错误;(4)行为或性能错误;(5)初始化和终止错误。3.白盒测试的应用(1)导出流图(2)计算环路复杂度(3)确定线性独立路径