选自《软件工程——理论与实践》(第三版)许家珆
是自己本科时期期末复习整理的笔记,现将它上传到网上,某些地方可能出现一些格式错误,我会慢慢修正。
主要用处是记录自己的学习过程,如有错误欢迎指出。
第一章 软件工程概述
- 软件危机与软件工程的关系:
手工作坊的开发模式不仅效率低,质量更难以保证,致使大量质量低劣的软件产品涌向市场,有的甚至在开发过程中就夭折了。国际上软件系统的开发遇到了前所未有的困难,有的系统比原计划推迟了好多年,而且费用大大超过了预算,或者系统功能不符合用户的需求,也无法进行修改维护,系统最终彻底失败,即出现了“软件危机”。
软件工程是在克服20世纪60年代末国际上出现的“软件危机”的过程中逐渐形成与发展的。
软件危机主要表现在以下两个方面:
- 软件产品质量低劣,甚至在开发过程中就夭折。
- 软件生产效率低,不能满足需要。
- 软件工程的研究由以下10个知识域构成:
- 软件需求。涉及需求提取,需求分析,建立需求规格说明和确认,建模,经济与时间可行性分析。
- 软件设计。软件工程核心内容。主要活动有:软件体系结构设计,软件详细设计,涉及组件、接口、以及系统或组件的其他特征,软件设计质量分析和评估,软件设计的符号,软件设计策略和方法。
- 软件构造。通过编码、单元测试、集成测试、调试、确认等活动,生成可用的、符合设计功能的软件。
- 软件测试。涉及测试的标准、测试技术、测试度量、测试过程。
- 软件维护。软件维护是软件进化的继续。
- 软件配置管理。包括配置管理过程的管理,软件配置鉴别,配置管理控制,配置管理状态记录,配置管理审计,软件发布和交付管理。
- 软件工程管理。运用管理活动,确保软件开发和维护是系统的、规范的、可度量的。涉及:基础设施管理、项目管理、度量和控制计划3个层次。
- 软件工程过程。关注软件过程的定义、实现、评估、测量、管理、变更、改进,以及过程和产品的度量。
- 软件工程工具和方法。软件开发工具以计算机为基础,用于辅助软件生存周期过程。软件工程方法支持软件工程活动,典型的有结构化方法、面向数据方法、面向对象方法、原型化方法及基于数学的形式化方法等。
- 软件质量。软件质量管理贯穿整个软件生存周期,涉及软件质量需求、软件质量度量、软件属性检测、软件质量管理技术和过程。
(*)软件是程序以及开发、使用和维护程序所需的所用文档所需的所有文档。它是由应用程序、系统程序、面向用户的文档及面向开发者的文档4部分构成。
- 软件生存期分为以下几个阶段:(重要)
- 软件定义阶段。包括可行性研究和项目开发计划;“软件要解决的问题是什么”。
- 软件需求阶段。“软件系统必须做什么”,确定软件必须具备哪些功能和性能。
- 软件设计阶段。分为概要设计和详细设计(重要)。概要设计也称为总体设计,要完成软件体系结构的设计,将系统划分为若干子系统或功能模块,并建立模块间的联系。同时还要设计该软件系统的总体数据和数据库结构,即软件系统要存储什么数据,数据的结构和关系。详细设计也称为算法设计,对每个模块所完成的功能进行具体描述,把功能描述变为精确的、结构化的过程描述。
- 软件构造阶段。将每个模块的算法设计转换成计算机可接受的程序代码。
- 软件测试阶段。保证软件质量的重要手段。面向对象的测试贯穿软件开发全过程。测试可分为模块测试、组装测试、确认测试等阶段。
- 软件维护阶段。又称软件进化,是软件生存期中时间最长的阶段。已交付的软件投入使用后便进入软件维护阶段。
(*)软件工程具有方法、工具、过程3个要素。软件工程方法是研究软件开发是“如何做”的;软件工具是支撑软件开发方法的工具,为方法提供自动或半自动的支撑环境(CASE计算机辅助软件工程),软件工程过程是指将软件工程方法与软件工具相结合,实现合理、及时地进行软件开发的目的。软件过程将人员、方法与规范、工具与管理有机结合。
- 软件过程模型——瀑布模型
优点:简单易用,清晰地描述了软件开发和软件生命周期的全过程,在消除非结构化软件、降低软件的复杂性、促进软件开发工程化方面起了很大的作用。
缺点:是一种理想的线性开发模式,它将一个充满回溯的软件开发过程硬性分割为几个阶段,无法解决软件需求不明确或者变动的问题。
- 软件过程模型——原型模型
优点:该模型具有较大的灵活性,适合于软件需求不明确、设计方案有一定风险的软件项目。
缺点:快速建立起来的系统结构加上连续的修改可能会导致产品质量低下。
通常分为以下4步:
- 快速分析。快速确定软件系统的基本要求,确定原型所要体现的主要特征(界面、总体结构、功能、性能)。
- 构造原型。在快速分析的基础上,根据系统的基本规格说明,忽略细节,只考虑主要特征,快速构造一个可运行的系统。
- 运行和评价原型。用户试用原型并与开发者频繁交流,发现问题,目的是验证原型的正确性。
- 修改与改进。根据所发现的问题,对原型进行修改、增删和完善。
这4步按箭头顺序反复执行,直到用户对生成的原型评价满意为止。
- 软件开发方法——结构化开发方法(重要)
结构化开发方法是一种面向数据流的开发方法,它的基本原则是功能的分解与抽象。该方法提出了一组提高软件结构合理性的准则,如分解和抽象、模块的独立性、信息隐蔽等。
结构化方法的指导思想是“自顶向下、逐步求精”,建立软件模型。
结构化开发方法由结构化分析(SA)方法、结构化设计(SD)方法、结构化程序设计(SP)方法三部分构成,其中SA和SD是结构化开发的核心。
结构化开发方法的系统工作模型是瀑布模型。
- 软件开发方法——面向对象开发方法
面向对象的软件开发方法(OOSD)
面向对象的定义:
面向对象=对象+类+继承+消息
面向对象的开发方法以对象作为最基本的元素,对象是分析和解决问题的核心。类与对象是面向对象方法的最基本、最重要的概念。
- 对象
对象是客观事物或概念的抽象表述。对象类型有:
-
- 有形的实体:在显示世界中的实体都是对象,如飞机、车辆
- 作用:指人或组织,如教师、学生、政府机关、公司等所起的作用。
- 事件:指在某个特定时间内所发生的事,如学习、演出、开会。
- 性能说明:如对产品的性能指标的说明,如计算机主板的速度、型号、性能说明等。
每个对象都存在一定的状态、内部标识。对象通过其运算所展示的特定行为称为对象行为;对象本身的性质称为属性;对象将其自身的属性及运算“包装起来”,称为封装。
对象是一个封装数据属性和操作行为的实体。数据描述了对象的状态,操作可操纵私有数据,改变对象的状态。
- 类
类,又称对象类,是指一组具有相同属性和运算的对象的抽象,即一组具有相同数据结构和相同操作的对象的集合,类是对象的模板。
在进行系统分析和设计时,通常把注意力集中在类上。
- 继承
继承是以现存的定义作为基础建立新定义的技术,是父类和子类之间共享数据结构和方法的机制。继承关系是可传递的。
- 消息
消息是指对象之间在交互中所传送的通信信息。一个消息应该包含以下信息:消息名、接受消息对象的标识、服务标识、消息和方法、输入信息、回答信息等。
面向对象开发方法(OOSD)由面向对象分析(OOA)、面向对象设计(OOD)、面向对象程序设计(OOP)3部分组成。面向对象分析和面向对象设计是面向对象开发方法的关键。
- 面向对象分析(OOA):解决“做什么”。强调的是对一个系统中的对象特征和行为的定义。用于建立系统的三类模型:对象模型(信息模型)、状态模型(动态模型)、处理模型(函数模型),其中最重要的是对象模型。
- 面向对象设计(OOD):解决“如何做”。与OOA密切配合顺序实现对现实世界的进一步建模。
- 面向对象程序设计(OOP):是面向对象的技术中发展最快的,使用面向对象的程序设计语言进行编码。
- 敏捷软件开发方法(了解)
特点:以人为核心、迭代式的开发方法。敏捷开发更强调与客户的协作、人之间的交互与团队的协作,更重视不断向用户提交可运行的软件,而不把过多的精力放在编写详尽的文档上。该方法尤其强调对软件需求变化的快速应变能力。
书后习题:
6. 软件生存周期各阶段的主要任务是什么?
答:软件生存周期按瀑布模型分为6个阶段:
- 可行性研究与计划(确定系统的目标和规模,分析项目的可行性);
- 需求分析与规格说明(明确系统的规格和要求);
- 设计(包括概要设计和详细设计,将系统分解为模块);
- 编程(用程序语言实现每个模块,简单容易);
- 测试(发现并改正错误,分为模块测试、集成测试和系统联调三级);
- 运行维护(扩充功能、纠错等)。
第二章 软件需求工程
- 软件需求的任务
需求工程是包括创建和维护系统需求文档所必需的一切活动,是对系统应该提供的服务和所受到的约束进行理解、分析、检验和建立文档的过程。
软件需求的基本任务有以下4个方面:
- 确定系统的综合要求
- 确定系统功能要求。是最主要的要求。
- 确定系统的性能要求。系统性能根据应用领域的具体需求确定,如可靠性、联机系统的响应时间、存储容量、安全性能等。
- 确定系统的运行要求。主要是对系统运行时的环境要求,如系统软件、数据库管理系统、外存和数据通信接口等。
- 将来可能提出的要求。系统扩充及修改的要求预先做准备。
- 分析系统的数据要求
软件系统本质上是信息处理系统。
- 数据要求。需要哪些数据,数据间联系、数据性质、结构等。
- 数据处理要求。包括处理的类型、逻辑功能等。
- 导出系统的逻辑模型
系统的逻辑模型与开发方法有关。结构化分析法(SA),可用分层的数据流图(DFD)来描述;面向对象的分析方法(OOA),用例模型(Use Case Model)则是首选的描述工具。
- 修正系统的开发计划
对大、中型的软件系统,常借助模型来分析设计系统。
- 功能需求与非功能需求
软件系统的需求分为:用户需求和系统需求。软件需求阶段的主要任务就是要将客户等提出的用户需求转换为系统需求。
用户需求是从用户的角度描述系统的功能和非功能需求。
系统需求分为功能需求、非功能需求、领域需求。
- 功能需求
功能需求是对系统应该提供的服务、功能以及系统在特定条件下的行为的描述。
对大学图书管理系统,应具备以下功能需求:
- 基本数据维护功能
- 基本业务功能
- 数据库管理功能
- 信息查询功能
- 非功能需求
软件的非功能需求一般包括质量目标属性要求和约束性要求,主要反映用户提出的对系统的约束,它与系统的总体特性有关,如可靠性、反应时间、存储空间等。
非功能需求还与系统开发过程有关。非功能需求的分类:机构需求、产品需求、外部需求。
对大学图书管理系统,应具备以下非功能需求:
- 系统安全性需求。
- 对系统可用性的需求。
- 对系统查询速度的需求。
- 对系统可靠性的需求。
- 需求分析与建模
需求分析是需求工程的关键和核心步骤。
- 需求分析的基本任务
通常要做两类需求分析:一是分析数据,比如需要输入什么数据,要得到什么结果,最后应输出什么等;二是分析问题,进一步确定系统要解决的问题,要实现的功能、非功能及性能等。
在需求调查阶段已收集的数据中找出有价值的需求,称为需求整理;从这些收集起来的数据中发现新的需求,或规划产品的未来需求,称为需求挖掘。这两部分在需求分析的过程中是结合在一起的。
需求分析的基本任务:准确地定义系统的目标,以满足用户需求。回答系统必须“做什么”的问题,并给出需求规格说明书。
- 需求分析的主要工作
需求分析阶段的主要工作包括以下几方面:
-
- 确定系统范围
确定系统与其他外部实体或其他系统的边界和接口。
-
- 分类排序
对所收集的需求进行重新组织、整理、分类和筛选,并对每类需求按照重要性进行排序,确定哪些是最重要的需求。
-
- 建立需求分析模型
需求分析模型是需求阶段的主要描述手段。
模型是根据不同的分析方法建立的各种视图,如结构化分析方法所建立的需求模型是分层数据流图;信息系统建立的模型是实体关系图;面向对象方法采用UML建模,可建立用例图、类图、状态图及各种交互图等。
-
- 建立需求规格说明
软件需求规格说明(SRS)是将需求分析结果以文档的形式描述出来,需求分析模型则是需求规格说明书的重要组成部分。
需求规格说明一般包括以下内容:
- 对需求模型进行精准的、无二义性的描述。
- 对系统功能需求的说明。
- 非功能需求。
- 质量属性。
- 需求分析方法——结构化分析方法
结构化开发方法由结构化分析(SA)方法、结构化设计(SD)方法、结构化程序设计(SP)方法构成。
- SA法概述
结构化分析(SA)方法是面向数据流的需求分析方法。 SA法也是一种建模活动,主要是根据软件内部的数据传递、变换关系、自顶向下逐层分解,描绘出满足功能要求的软件模型。
SA法的基本思想是分解和抽象。
- 分解
对于一个复杂的系统,把大问题分解成若干小问题,然后分别解决。
- 抽象
先考虑最本质的属性,暂时把细节略去,以后再逐层添加细节,直至涉及最详细的内容。
- SA法的步骤
- SA法建模
- 数据流图(DFD)
图书预定系统的顶层DFD:
- 建立分层的DFD
采取“至顶而下,逐层分家”的技术,建立分层的DFD。
建立分层数据流图的一般原则是,先全局后局部,先整体后细节,先抽象后具体。同时还遵守以下具体原则:
-
- 数据守恒和数据封闭原则。
- 加工分解的原则。包括自然性、均匀性和分解度原则。
- 子图与父图“平衡”的原则。
- 合理使用文件
- 分层DFD的改进
- 检查数据流的正确性,考虑数据守恒,子图、父图的平衡,文件使用是否合理等方面。注意输入/输出文件的数据流。
- 改进DFD的易理解性:简化加工之间的联系;改进分解的均匀性;适当命名。
- 数据字典(DD)
对数据流图中包含的所有元素的定义的集合构成了数据字典。有4类条目:数据流、数据项、文件、基本加工
在定义数据流或文件时,使用下表给出的符号将条目组织起来,构成数据字典。
-
- 数据流条目:给出DFD中数据流的定义,列出该数据流的各组成数据项。
-
- 数据项条目:数据项条目给出某个数据单项的定义,通常是该数据项的值类型、允许值等。
-
- 文件条目:给出某个文件的定义。通常是列出文件记录的组成数据流,还可指出文件的组织方式。
-
- 加工条目:加工条目就是“加工小说明”。由于“加工”是DFD的重要组成部分,一般应单独进行说明。
- 加工逻辑说明(特别注意)
小说明中应精确地描述加工的激发条件、加工逻辑、优先级、执行频率和出错处理等。加工逻辑是其中最基本的部分,是指用户对这个加工的逻辑要求。
基本加工说明有以下3种描述方式:
-
- 结构化语言。(必须掌握)
结构化语言的特点:简单,易学,少二义性;但不好处理组合条件。
-
- 判定表。(熟练)
条件框表示条件定义,操作框表示操作的定义,条件条目表示各条件的取值及组合,而操作条目表示在各条件取值组合下所执行的操作。
判定表的特点:可处理较复杂的组合条件,但不易理解,不易输入计算机。
-
- 判定树(熟练)
特点:描述一般组合条件较清晰,但不易输入计算机。
- 用UML建立需求模型(考用例图)
<<include>>包含
<<extend>>扩展
- 需求规格说明书
作用:使用户和软件开发者双方对该软件的初始规定有一个共同的理解,使之成为整个开发工作的基础。
书后习题:
1. 需求工程包括哪些基本活动?各项基本活动的主要任务是什么?
答:需求工程过程包括如下主要活动:
⑴ 获取需求。深入实际,在充分理解用户需求的基础上,获取足够多的问题领域的知识,积极与用户交流,捕捉、分析和修订用户对目标系统的需求,并提炼出符合解决领域问题的用户需求。需求获取的方法一般有问卷法、面谈法、数据采集法、用例法、情景实例法以及基于目标的方法等。
⑵ 需求分析与建模。对已获取的需求进行分析和提炼,进行抽象描述,建立目标系统的概念模型,需求概念模型的要求包括实现的独立性:不模拟数据的表示和内部组织等;需求模拟技术又分为企业模拟、功能需求模拟和非功能需求模拟等。进一步对所建立的模型(原型)进行分析。需求模型的表现形式有自然语言、半形式化(如图、表、结构化英语等)和形式化表示等三种。
⑶ 需求规格说明。对需求模型进行精确的、形式化的描述,为计算机系统的实现提供基础。
⑷ 确认需求。以需求规格说明为基础输入,通过符号执行、模拟或快速原型等方法,分析和验证需求规格说明的正确性和可行性,确保需求说明准确、完整地表达系统的主要特性,就是对需求规格说明与用户达成一致。其主要任务是冲突求解,包括定义冲突和冲突求解两方面。常用的冲突求解方法有:协商、竞争、仲裁、强制、教育等,其中有些只能用人的因素去控制。
⑸ 需求管理。在整个需求工程过程中,贯穿了需求管理活动。需求管理主要包括跟踪和管理需求变化,支持系统的需求演进。由于客户的需要总是不断(连续)增长的,但一般的软件开发又总是落后于客户需求的增长,如何管理需求的进化(变化)就成为软件管理的首要问题。对于传统的变化管理过程来说,其基本成分包括软件配置、软件基线和变化审查小组。当前的发展是软件家族法,即产品线方法。多视点方法也是管理需求变化的一种新方法,它可以用于管理不一致性,并进行关于变化的推理。进化需求是十分必要的。
5. 如何画分层数据流图?有哪些基本原则?
答:总的原则是:至顶而下,逐层分解(画分层数据流图)。逐层分解的画法可以控制每一层的复杂度。
顶层:将整个系统作为一个加工,描述系统边界(输入与输出)。
中间层:将某个加工分解为一组子加工,其中的子加工还需进一步分解。
底层:由不再进行分解的基本加工组成。
画分层数据流图的基本原则有:① 数据守恒与数据封闭原则。② 加工分解的原则。③ 子图与父图“平衡”的原则。④ 合理使用文件的原则。
6. 加工小说明有哪些描述方法?它们各有何优缺点?为什么不采用自然语言进行描述?
答:主要的描述方法有三种;结构化语言、判定表和判定树。
● 结构化语言:介于自然语言和形式语言(如谓词逻辑)之间的的一种半形式语言,它是自然语言的一个受限制的子集。是在自然语言的基础上加上一些约束,一般分为两层结构:外层语法较具体,为控制结构(顺序、选择、循环);内层较灵活,表达“做什么”。
常用结构化英语或结构化汉语表示,精确、简明扼要、文体灵活。结构化语言特点:简单,易学,少二义性,但不好处理组合条件。
● 判定表:适用于表述比较复杂的加工逻辑,如具有多项选择条件的操作。判定表是一种二维的表格,常用于较复杂的组合条件。通常由四部分组成,如教材表2-2所示。对用结构化语言不易处理的较复杂的组合条件问题,可使用判定表。
● 判定树:本质上与判定表相同,图形表示更易于理解。描述一般组合条件较清晰,但不易输入计算机。
7. 考察图<2>中子图、父图的平衡关系。
参考答案:
⑴ 显然,图1中子图与父图不平衡。
⑵ 图2中,如果有如下数据条目:
订货单=客户+账号+数量
则子、父图平衡。
8. 画出银行取款过程的用例图。问题描述为:储户用存折取款,首先填写取款单,根据“ 银行卡”中的信息检验取款单与存折,如有问题,将问题反馈给储户,否则,登录“储户存款数据库”,修改相应数据,并更新“银行卡”,同时发出付款通知,出纳向储户付款。
参考答案图<3>:
分析所给出的需求,确定角色为:储户、存款数据库、存折、出纳。用例为:填写取款单、验证取款单与存折、银行卡管理、数据库管理、付款。