教材《软件工程 第三版》 钱乐秋著
第一章 概论
软件工程概念
- 软件工程是建立和使用一套合理的工程原则,以便获得经济的软件,这种软件是可靠的,可以在实际机器上高效运行。(NATO会议上提出)
- ①将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。 ②对在①中所述方法的研究。(IEEE)
- 软件工程是应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度实现满足用户要求的软件产品的工程,或以此为研究对象的学科。(《计算机科学技术百科全书》)
软件生存周期
- 计算机系统工程
(1)包括计算机硬件、软件,以及使用计算机系统的人、数据库、文档、规程等系统元素
(2)任务
①确定待开发软件的总体要求和范围,以及该软件与其他计算机系统元素之间的关系
②进行成本估算,做出进度安排
③进行可行性分析,即从经济、技术、法律等方面分析待开发的软件是否有可行的解决方案,并在若干个可行的解决方案中做出选择。 - 需求分析
主要解决开发软件要“做什么”的问题,确定软件的功能、性能、数据、界面等要求,生成软件需求规约(也称软件需求规格说明) - 设计
主要解决开发软件“怎么做”的问题。通常分为系统设计和详细设计。系统设计的任务是设计软件系统的体系结构,同时设计全局数据结构;详细设计的任务是设计各个组成成分的实现细节,包括局部数据结构和算法等。 - 编码
任务是用某种程序设计语言,将设计的结果转换为可执行的程序代码。 - 测试
任务是发现并纠正软件中的错误和缺陷。 - 运行和维护
当发现了潜藏的错误或需要增加新的功能或使软件适应外界环境的变化等情况出现时,对软件进行修改。
软件生存周期过程
- 基本过程
供各主要参与方在软件生存周期期间使用。 - 支持过程
具有不同目的,并作为一个有机组成部分来支持其他过程,以便取得软件项目的成功并提高软件项目的质量。 - 组织过程
可被某个组织用来建立和实现由相关的生存周期过程和人员组成的基础结构,并不断改进这种结构和过程。
能力成熟度模型(CMM)
其目的是提供一种评级软件承接方能力的方法,同时,也可用于帮助软件组织改进其软件过程。 五个软件过程成熟度等级:
- 初始级:无秩序的,甚至是混乱的。成功往往依赖个人或者小组的努力。
- 可重复级:建立了基本的项目管理过程来跟踪成本、进度和功能特性。制定了必要的过程纪律,能重复早先类似应用项目取得的成功。
- 已定义级:已将管理和工程活动两方面的软件过程文档化、标准化,并综合成该组织的标准软件过程。所有项目均使用经批准、剪裁的标准软件过程开开发和维护软件。
- 已管理级:收集对软件过程和产品质量的详细度量值,对软件过程和产品都有定量的理解和控制。
- 优化级:过程的量化反馈和先进的新思想、新技术促使过程不断改进。
能力成熟度模型继承(CMMI)
CMMI是若干过程模型的综合和改进,是支持多个工程学科和领域的系统的、一致的过程改进框架,能适应现代工程的特点和需要,能提高过程的质量和工作效率。
CMMI提供了两种表示法:阶段式模型和连续式模型。阶段式模型的结构类同于软件CMM,他关注组织的成熟度。连续式模型关注每个过程域的能力,一个组织对不同的过程域可以达到不同的过程域能力等级。
软件过程模型
-
瀑布模型:上一阶段的活动完成并经过评审后才能开始下一阶段的活动。
1)特征
①接收上一阶段活动的结果作为本阶段活动的输入。
②依据上一阶段活动的结果实施本阶段应完成的活动。
③对本阶段的活动进行评审。
④将本阶段活动的结果作为输出,传递给下一阶段。 -
演化模型
1)特征:从构造初始的原型出发,逐步将其演化成最终软件产品的过程。
2)适用场景:对软件需求缺乏准确认识的情况。 -
增量模型
1)特征:将软件的开发过程分成若干个日程时间交错的线性序列,每个线性序列产生软件的一个可发布的“增量”版本,后一个版本是前一个版本的修改和补充,重复增量发布的过程,直至完成最终的产品。
2)适用于需求经常发生变化的软件开发;此外,在市场急需而开发人员和资金都不能在设定的市场期限之前实现一个完善的产品时,也适用增量模型。 -
原型模型:通过不断构建和完善原型来确定需求,是一个循环的模型
-
螺旋模型:将瀑布模型与原型化模型结合起来,并加入了风险分析。
-
喷泉模型:喷泉模型认为软件生命周期的各个阶段是相互重叠和多次反复的,是一种支持面向对象开发的过程模型。
-
基于构件的开发模型:利用预先包装的构件来构造应用系统,支出软件复用。
-
形式化方法模型:建立在严格的数学基础上的一种软件开发方法。采用严格的数学语言,具有精确的数学语义的方法。
CASE工具与环境
- 计算机辅助软件工程(computer aided software engineering)是指使用计算机及相关的软件工具辅助软件开发、维护、管理等过程中各项活动的实施,以确保这些活动能高效率、高质量的进行。
- 分类:按软件过程的活动来分类
1)支持软件开发过程的工具
2)支持软件维护过程的工具
3)支持软件管理过程和支持过程的工具
敏捷开发
-
定义:在软件开发中,强调软件开发的灵活性的各种方法
-
特点
1)致力于降低变化带来的成本
2)强调价值
3)强调人的作用
4)使用增量和迭代的开发方法 -
价值观
1)个体和交互重于过程和工具
2)工作的软件重于详尽的文档
3)客户合作重于合同谈判
4)响应变化终于遵循计划 -
原则
1)我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。
2)欣然面对需求变化,即使在开发后期。善于掌控变化,帮助客户获得竞争优势。
3)经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
4)业务人员和开发人员必须紧密合作。
5)激发个体的斗志,以他们为核心搭建项目。提供他们所需的环境和支持,相信他们能够达成目标。
6)不论团队内外,传递信息效果最好,效率也最高的方式是面对面的交谈。
7)可工作的软件是进度的首要度量标准。
8)敏捷过程倡导可持续开发。责任人、开发人员和用户要能够共同维持其步调稳定延续。
9)持续地追求技术卓越和良好设计,可以提高敏捷性。
10)以简洁为本,极力减少不必要工作量。
11)最好的架构、需求和设计出自于自组织的团队。
12)团队定期地反思如何能更加高效,并依此调整团队的行为。 -
XP方法(Extreme Programming,简称XP)
极限编程是敏捷软件开发方法的代表, 极限编程是一种轻量级的、灵巧的、简单的软件工程方法。与传统的开发过程不同,极限编程的核心活动体现在需求→测试→编码→设计过程中。因此适用于规模小、进度紧、需求变化大、质量要求严的项目。它希望以最高的效率和质量来解决用户目前的问题,以最大的灵活性和最小的代价来满足用户未来的需求。
第二章 系统工程
可行性分析
- 概念:可行性分析主要从经济、技术、法律等方面分析所给出的解决方案是否可行,能否在规定的资源和时间的约束下完成。
- 分类
1)经济可行性主要进行成本效益分析,从经济角度,确定系统是否值得开发。
2)技术可行性主要根据系统的功能、性能、约束条件等,分析在现有资源和技术条件下系统能否实现。
3)法律可行性主要研究系统开发过程中可能涉及到的合同、侵权、责任以及各种与法律相抵触的问题。
第三章 需求工程
需求工程
- 需求获取
系统分析人员通过与用户的交流、对现有系统的观察以及对任务进行分析,确定系统或产品范围的限制性描述、与系统或产品有关的人员及特征列表、系统的技术环境的描述、系统功能的列表及应用于每个需求的领域限制、描述不同运行条件下系统或产品使用情况的应用场景等。 - 需求分析与协商
分析活动对需求进行分类组织,分析每个需求与其他需求的关系以检查需求的一致性、重叠和遗漏的情况,并根据用户的需要对需求进行排序。 - 系统建模
建模工具的使用在用户和系统分析人员之间建立了统一的语言和理解的桥梁,同时系统分析人员借助建模技术对获取的需求信息进行分析,排除错误和弥补不足,确保需求文档正确反映用户的真实意图。 - 需求规约
通过建立完整的信息描述、详细的功能和行为描述、性能需求和设计约束的说明、合适的验收标准,给出对目标软件的各种需求。 - 需求验证
需求验证对功能的正确性、完整性和清晰性,以及其他需求给予评价。 - 需求管理
对需求工程所有相关活动的规划和控制。
第四章 设计工程
软件设计的任务
- 数据/类的设计
- 体系结构设计
- 接口设计
- 部件级设计
软件设计的原则
-
抽象与逐步求精
-
模块化
1)概念:把软件按照规定原则,划分为一个个较小的、相互独立的但又相互关联的部件。
2)模块独立性(功能独立性):在设计程序模块时,使得模块实现独立的功能并且与其他模块的接口简单,符合信息隐藏原则。功能独立性比较强的模块应该是高内聚低耦合的模块。
3)度量指标:内聚度和耦合度
①内聚是一个模块内部各个元素彼此结合的紧密程度的度量,一个内聚程度高的模块应当只做一件事。
②耦合是模块之间的相对独立性(互相连接的紧密程度)的度量。
③降低耦合度的方法:尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免内容耦合,降低接口复杂性。 -
信息隐藏
第五章 结构化分析与设计
启发式设计策略
- 改造程序结构图,降低耦合度,提高内聚度
- 避免高扇出,并随着深度的增加,力求高扇入
- 模块的影响范围应限制在该模块的控制范围内
- 降低模块接口的复杂程度和冗余程度,提高一致性
- 模块的功能应是可预测的,避免对模块施加过多的限制
- 尽可能设计单入口和单出口的模块
如何判断数据流图的一致性和完整性? (答案不全)
子图的输入和输出数据流同父图相应加工的输入输出数据流必须一致。
第七章 第八章 面向对象
面向对象基本概念
面向对象=对象+分类+继承+通过消息的通信
对象是指一组属性以及这组属性上的专用操作的封装体。
类是一组具有相同属性和相同操作的对象的集合。
多态性是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。
动态绑定是指在程序运行时才将消息所请求的操作与实现该操作的方法进行连接。
用况建模
-
用况建模是用于描述一个系统应该做什么的建模技术,用况建模不仅用于新系统的需求获取,还可用于已有系统的升级。
-
步骤
1)定义系统
2)确定执行者
3)确定用况
4)描述用况
5)定义用况间的关系
6)确认模型 -
用况图中的关系
关联:执行者与他所参与的一个用况之间的通信路径。
扩展:扩展的用况到基本用况的一种关系,指出扩展用况所定义的行为如何插入到基本用况所定义的行为中。扩展的用况通过模块化方式增量的修改基本用况。
包含:从基本用况到另一个用况的一种关系。
用况泛化:一个一般用况与一个更特殊的用况之间的关系,特殊用况可继承一般用况的特征。
类图
-
类之间的关系
关联:类实例间连接的描述
依赖:两个模型元素之间的一种关系
泛化:更特殊描述与更一般描述之间的一种关系,用于继承和多态性类型声明
实现:规约与它的实现之间的关系 -
类的属性和方法
-
状态机图
-
顺序图
-
协作图
第十三章 软件测试
软件测试的目的
(1)测试是一个为了发现错误而执行程序的过程。
(2)一个好的测试用例是指很可能找到迄今为止尚未发现的错误的测试用例。
(3)一个成功的测试是指揭示了迄今为止尚未发现的错误的测试。
测试的目的是发现软件中的错误和缺陷,并加以纠正。应该排除对测试的错误观点,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误。
白盒测试
-
白盒测试又称结构测试,这种方法把测试对象看作一个透明盒子,测试人员根据程序内部的逻辑结构及有关信息设计测试用例,检查程序中所有逻辑路径是否都按预定的要求正确地工作。
白盒测试主要用于对程序模块的测试,包括:
● 程序模块中的所有独立路径至少执行一次
● 对所有逻辑判定的取值(“真"与"假”)都至少测试一次
● 在上下边界及可操作范围内运行所有循环
● 测试内部数据结构的有效性等
白盒测试方法主要有逻辑覆盖测试、基本路径测试、数据流测试和循环测试 -
逻辑覆盖测试
1)语句覆盖
2)判定覆盖
3)条件覆盖
4)判定/条件覆盖
5)条件组合覆盖
6)路径覆盖 -
基本路径测试
首先根据程序或设计图(流程图)画出控制流图,并计算其区域数,然后确定一组独立的程序执行路径(基本路径),最后为每一条基本路径设计一个测试用例。映射的前提是流程图的判定中不包含符合条件;如果包含符合条件,先将其转成等价的简单条件流程图。 独立路径数据=流图的区域数=流图的环形复杂度V(G)=E-N+2,E是边数,N是结点数。
黑盒测试
- 黑盒测试又称行为测试,这种方法把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能需求。
黑盒测试可用于各种测试,试图发现以下类型的错误:
● 不正确或遗漏的功能
● 接口错误
● 数据结构错误或外部信息访问错误
● 性能错误
● 初始化和终止错误
主要的黑盒测试方法有:等价类划分,边界值分析,比较测试,错误猜测和因果图方法。 - 等价类划分
将所有有可能的输入数据划分成若干等价类,然后在每个等价类中选取一个代表性的数据作 为测试数据。 等价类分为有效等价类和无效等价类。
有效等价类是指符合规格说明要求的合理的输入数据集合,主要用来检验程序是否实现了规格说明中规定的功能。
无效等价类是指不符合规格说明要求的不合理的或非法的输入数据集合,主要用来检验程序是否做了不符合规格说明的事。
利用等价类设计测试用例的规则如下:
● 设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直至所有的有效等价类都被覆盖为止。<=有效等价类个数
● 为每个无效等价类设计一个新的测试用例。=无效等价类个数
测试策略
(1)单元测试
(2)集成测试
(3)确认测试
(4)系统测试
(5)α测试
(6)β测试
(7)回归测试
(8)压力测试
(9)性能测试
第十五章 软件维护与再工程
1.软件维护的概念
2.软件可维护性,影响因素,维护的分类
3.再工程的概念
4.软件再工程过程
5.逆向工程概念