《软件工程》综合考核指南
关于考试:
1、本次考试为开卷形式,按照相关规定只允许携带课本,不允许夹带任何资料;
2、作答时不能简单堆砌教材中的概念或内容,需要对题意有正确的分析,通过适当举例说明等方式,有理有据,逻辑清晰,条理清楚,简明扼要的说明自己的理解。
试卷结构组成:
一、简析题:共7小题,每小题6分,共计42分
二、应用题:共4小题,每小题8分,共计32分
三、综合题:共2小题,每小题12/14分,共计26分
主要知识点与考核要点
Part1:软件工程基本概念
1、软件=程序+文档+数据
2、软件复杂程度的提高给软件开发带来的影响
3、软件工程的定义与工程思想
4、软件产品与项目管理
考核要点:对相应概念的理解,以及综合应用相应概念对相应观点进行辨析。
样例:
Q:试说明"软件=程序+文档+数据"中的文档和建模存在什么样的关系。
Part2:软件开发过程模型
1、软件开发典型阶段及其方法、任务与制品(里程碑)
2、软件开发分阶段进行的意义
3、典型软件开发过程模型
考核要点:对相应概念的理解,以及综合应用相应概念对相应观点进行辨析。
样例:
Q:在软件开发过程中分阶段建立里程碑有何意义?
Part3:需求工程
1、需求工程与需求分析
2、需求的定义、层次与分类
3、需求分析与建模:UML(用例图与用例描述、概念类图、系统顺序图)
考核要点:对相应概念的理解,以及综合应用相应概念对相应观点进行辨析,能针对具体问题建立需求分析模型(如根据需求完成用例图与用例描述、概念类图、系统顺序图等UML模型的建立)。
样例:
Q:高"吞吐量(Throughput)"是否意味着高"负载(Load)" ?请举例说明,并给出自己的判断及理由。
Part4:软件设计
1、软件设计核心思想:分解与抽象
2、软件体系结构的定义以及对应的软件实现机制
3、体系结构的集成与测试、桩代码与驱动代码的编写
4、典型的体系结构与详细设计模型: UML(包图、构件图、部署图、类图、顺序图)
5、设计质量、模块化与信息隐藏
6、耦合/解耦与内聚
考核要点:对相应概念的理解,以及综合应用相应概念对相应观点进行辨析,针对具体问题进行建立系统模型(如基于UML完成详细设计),设计模型的相互转换与实现(如根据UML顺序图绘制类图或给出代码实现),解决高耦合/低内聚问题(如识别耦合并修改代码解耦)。
考核重点:软件工程思想在设计中的综合应用
样例:
Q1:已知客户端调用某操作的顺序图形如图所示,试根据顺序图绘制大致的类图,要求说明类应该包含的操作,以及类之间的关系。
Q2:已知详细设计代码,根据代码的协作关系,绘制顺序图。
bash
public class Application {
public static void main( String[] args)
{ //设置语言
LangFactory factory = new LangFactory();
if( args.equals("Chinese"){
factory.setLang();
}else{
factory.setOtherLang(args);
}
}
}
bash
public class LangFactory{
public Lang setLang(){
//TODO:设置为中文
}
public Lang setOtherLang(String[] lang){
//TODO:设置其他语言
}
}
Part5:软件构造、测试与维护
1、软件构造及代码设计的准则
2、软件测试与软件质量的关系
考核要点:对相应概念的理解,以及综合应用相应概念对相应观点进行辨析。
样例:
Q:为什么要"设计易读的代码"?
注意:以上列表仅列出课程期望掌握的主要内容,仅供复习参考使用,并不表明考核内容全部在此范围之内,所列举的题目类型并不表明该样例是实际考核内容以及对应的考核难度。
个人整理复习汇总:
一、理论部分:
名词解释--人月
答案:人月是软件开发工作量的单位,1人月表示1个程序员1个月的工作时间所开发的代码量。
1.请解释软件缺陷、错误和失败,并简单举例说明。(课本P322页)
答案:缺陷(defect)指系统代码中存在不正确的地方。
错误(error)指系统执行到缺陷代码,就可能是的执行结果不符合预期且无法预测。表现出来不稳定的状态。
失败(failure)指由于错误的发生使得软件的功能失效。
举例:计算式中存在除0--缺陷。计算出现除0时会发生错误。系统无法输出正确结果或异常终止等为失败。
1、说明"软件=程序+文档+数据"中的文档和建模存在什么样的关系?(P3)
文档和建模是密切相关的。
文档和建模是相互支持的。例如,文档可以指导建模的方向,建模可以帮助开发人员更好地理解文档。
文档和建模是相互补充的。例如,开发人员使用UML图对软件系统进行建模,而文档中的文字描述可以对UML图进行解释和补充,更好地表达软件系统的设计。
2.请简述文档在软件工程中的作用?
(1)作为开发人员阶段工作成果和结束标志;
(2)提高软件开发过程的能见度;
(3)记录开发过程的有关技术信息、管理信息;
(4)提供软件运行、维护和培训的有关资料;
(5)有助于进行软件工程过程的管理。
3、软件复杂程度的提高给软件开发带来的影响
软件的复杂性1)现实世界是复杂的
现实世界是复杂的,所以软件是复杂的 软件开发的目的是解决现实世界的问题
现实世界的问题是复杂的,解决办法也是复杂的 仅有程序员不能开发得到好的软件
程序员不知道问题和解决办法 没有人能清楚的告诉他们相关行业知识
2)软件的发展和变化的趋势,导致其高度复杂
软件的规模和复杂度日益增长 用于解决实际业务问题的应用软件越来越多
3)应用软件基于现实 又 高于现实
(1)开发周期和维护成本增加:需要更多的时间和资源来设计、实现、测试该软件
(2)质量控制变得更加困难:复杂度的提高可能会增加软件中的缺陷和bug数量
(3)团队协作的挑战加大:复杂度的提高需要更好的沟通和协作能力,以确保整个团队能够协调合作
(4)比如说带来的软件危机,这是由于使用硬件的思想来解决了软件的问题,1个人干10个月和10个人干1个月在软件思想上未必可行,这同时也引出了软件工程的重要性
4、软件工程的定义(什么是软件工程)它提出的目标是什么软件工程的思想是什么学习和应用软件工程的目的是什么?
(1) 定义:应用系统的、规范的、可量化的方法来开发、运行和维护软件,即将工程应用到软件,并对这些方法展开研究。
(2)软件工程目标:软件工程追求足够好,不是最好。成本效益比有效的方案,都是足够好的方案。付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移植;需要较低的维护费用;能按时交付用户使用;开发的软件可靠性高。
(3)思想:核心思想:抽象和分解 把软件当作一种工业产品,采用工程化的方法对软件的进行计划、开发和维护。是指将系统工程的原理和方法应用于软件的开发、运行和维护过程中,强调通过规范、系统化、可量化的手段来解决软件开发中的复杂性和不确定性问题。可与9页127相联系
(4)学习和应用软件工程的目的是1.保证某个团队的软件开发工作顺利进行;2.以科学知识为基础,建立成熟的方法与技术,通过可普及、可重复的生产方式开发软件;3.此外要对软件质量负责,遵从职业道德。4、软件工程是为了创造"足够好"的软件A. 用户满意度高 B. 软件质量可靠性好C. 软件开发流程质量高 D. 软件可维护性好
补:软件危机:
计算机软件的开发和维护过程中遇到的一系列严重的问题 开发成本超出预算,实际进度比预定计划一再拖延。 用户对"已完成"的系统不满意的现象经常发生。软件产品的质量往往靠不住,Bug一大堆,Patch一个接一个。软件的可维护性程度非常低。软件通常没有适当的文档资料。 软件的成本不断提高。 软件开发生产率的提高赶不上硬件的发展和人们需求的增长。
产生软件危机的原因:
一方面与"软"本身的特点有关;逻辑产品、不可见性; 规模庞大、复杂性高。
另一方面与软件开发与维护的方法不正确有关:早期个体化开发形成错误的认识和做法,认为软件开发就是写程序并设法使之运行,忽视软件需求分析的重要性,轻视软件维护。
对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程失败的主要原因之一。
对软件开发的正确认识:软件有其可遵循的生命周期;程序只是软件的一部分;一个软件产品必须由一个完整的配置(程序、文档及数据等)组成。
软件工程与计算机科学:
计算机科学的领域
偏理论 计算理论、信息和编码理论、算法和数据结构、形式化方法、程序设计语言。
偏实践 计算机体系结构、并行计算和分布式系统、实时系统和嵌入式系统、操作系统、计算机网络、科学计算、安全和密码学、人工智能(模式识别、机器学习、数据挖掘等)、计算机图形学、计算机视觉、多媒体、数据库和大规模数据处理、万维网、自然语言处理和语音、人机交互、软件工程。
二者区别
计算机科学(CS) 理论、基础
证明有关算法、设计、语言、定义知识表示方案的原理。时间无限性、确定性、完美、通用性。
各学科独立深入研究,做出成果。强调原创性,强调正确性。
软件工程(SE) 开发、实践
开发针对用户短期的特定问题的解决方案。应用计算机、语言、工具、技术和方法,对各种因素的折衷。
关注多个相关学科的知识,以解决问题。强调最好、最成熟的实践方法,强调可靠性。
5、对于"做软件=编程序"的看法是否认同?对于"软件工程师=程序员"的看法应当如何回应?
我不认同"做软件==编程序"的看法。虽然编写代码是软件开发的重要部分,但软件开发远不止于此。它涉及需求分析、架构设计、测试、维护等多个方面,要求工程师不仅具备编程技能,还需具备系统思维、团队协作和项目管理能力。
软件工程团队中,常见的分工角色由哪些?各自又承担什么任务?
在软件工程团队中,常见的角色包括项目经理需求分析师系统架构师开发工程师测试工程师、UI/UX设计师、运维工程师等。项目经理负责制定项目计划、进度控制和团队协调,确保项目按时完成。需求分析师与客户沟通,收集、分析并文档化需求,确保需求的准确性和完整性。系统架构师负责设计系统架构,选择合适的技术栈,并确保系统的可扩展性与性能。开发工程师根据需求和设计文档进行编码,实施功能开发并进行单元测试。测试工程师负责测试计划的制定、测试用例设计和执行,确保系统的质量。UI/UX设计师专注于用户界面和用户体验设计,确保系统界面友好且易用。运维工程师负责系统的部署、监控和运维,确保系统的稳定性和高可用性。每个角色通过密切协作确保软件项目的高效推进和成功交付。
软件开发中有哪几种过程模型?哪些适用于面向对象的软件开发?
常见的8种过程模型:构建-修复模型;瀑布模型;增量迭代模型;演化模型;原型模型;螺旋模型;RUP;Agile
适合于面向对象的开发的是:增量迭代模型、原型模型、螺旋模型、RUP和敏捷模型。
补:软件生命周期的基本任务:
定义时期:问题定义 可行性研究 需求分析
开发时期 :系统设计:概要设计 详细设计
系统实现:编码和单元测试 综合测试
运行维护时期:通过各种必要的维护活动时系统持久地满足用户的需要。
改正性维护 诊断和改正在使用过程中发现的软件错误。
适应性维护 修改软件以适应环境的变化。
完善性维护 根据用户的要求改进或扩充软件使它更完善。
预防性维护 修改软件为将来的维护活动预先做准备。
软件工程的层次模型
任何工程方法(包括软件工程)必须以有组织的质量保证为根源。 过程是软件工程的基础。
过程定义了一个框架以实施软件工程技术。 过程构成了软件项目管理控制的基础,建立了工作环境以便于应用技术方法、提交工作产品、建立里程碑、保证质量及正确管理变更。
方法为构建软件提供技术上的解决方法(如何做)。
工具为过程和方法提供自动化或半自动化的支持。
补: 极限编程 eXtreme Programming 是敏捷开发使用最广泛的一个方法。
核心思想: 从长远看,早期发现错误以及降低复杂度可以节约成本。极限编程强调将任务/系统细分为可以在较短周期解决的一个个子任务/模块,并且强调测试、代码质量和及早发现问题。通常,通过一个个短小的迭代周期,就可以获得一个个阶段性的进展,并且可以及时形成一个版本供用户参考,以便及时对用户可能的需求变更作出响应。
6.软件需求工程的基本活动包括哪些?
1.需求获取:收集需求。
2.需求分析:分析和整理需求。
3.需求规格说明:编写需求文档。
4.需求验证:验证需求的准确性。
补:1.2 问题域与解系统
当现实的状况与人们期望的状况产生差距时,就产生了问题。
要解决问题,就需要改变现实当中某些实体的状态或改变实体状态变化的演进顺序,使其达到期望的状态或演进顺序。
这些实体和状态构成了问题解决的基本范围,被称为该问题的"问题域"。
问题域是对现实世界运行规律的一种反应。
软件系统通过影响问题域中的实体状态来解决问题,被称为"解系统"。
数据模型
软件系统本质上是信息处理系统,因此,在软件系统的整个开发过程中都必须考虑两方面的问题
"数据"及对数据的"处理"。
在需求分析阶段则既要分析用户的数据要求(即需要有哪些数据、数据之间有什么联系、数据本身有什么性质、数据的结构等等),
又要分析用户的处理要求(即对数据进行哪些处理、每个处理的逻辑功能等等)。
为了把用户的数据要求清晰明确地表达出来,系统分析员通常建立一个概念性的数据模型(也称为信息模型)。
概念性数据模型是一种面向问题的数据模型,是按照用户的观点来对数据和信息建模。它描述了从用户角度看到的数据,它反映了用户的现实环境,且与在软件系统中的实现方法无关。
软件设计的基本原则包括哪些,请写出原则,并给出简单的解释?
软件设计的基本原则包括模块化、抽象化、高内聚低耦合、单一职责原则、信息隐藏、开放封闭原则和最少知识原则等。模块化强调将系统分解成小的、独立的模块,便于理解、开发和维护。抽象化通过隐藏细节,专注于系统的核心功能,使得设计更加简洁、易懂。高内聚低耦合要求模块内部功能紧密相关,同时与其他模块的依赖最小化,从而增强系统的灵活性和可维护性。单一职责原则指出每个模块应该只有一个职责,避免职责过多导致模块复杂。信息隐藏要求将模块的实现细节封装,只暴露必要的接口,降低系统的复杂度。开放封闭原则强调软件设计应对扩展开放、对修改封闭,即可以通过扩展功能而不影响已有的功能。最少知识原则建议一个模块应该尽量少地了解其他模块的内部实现,减少不必要的依赖,从而提高系统的稳定性和可维护性。这些原则有助于创建高质量、可扩展、易维护的系统。
补:软件体系结构设计
定义 软件体系结构(Architecture,也称"架构")从高层抽象的角度刻画组成目标软件系统的设计元素(包括子系统、构件及类)以及它们之间的逻辑关联和协作关系。
任务:建立满足软件需求的软件体系结构
明确定义软件各子系统、构件、关键类的职责划分及协作关系,描绘其在物理运行环境下的部署模型
针对软件系统全局性、基础性的技术问题给出技术解决方案
影响:体系结构设计影响软件质量
与详细设计相比,概要设计对系统性能、安全性、可维护性等质量需求的影响是全局的,是决定性的
在详细设计阶段再对体系结构进行调整优化的代价远大于概要设计时的代价
软件的质量特性有哪些?简述你的理解。
如何理解为变更而设计:
"为变更而设计"是一种软件设计理念,强调在开发初期就要考虑未来可能发生的需求变化、技术更新或外部环境变化,通过灵活和可扩展的设计来降低后期修改的成本和复杂性。具体来说,设计时要注重模块的松耦合和高内聚,通过信息隐藏和抽象接口来隔离变化的影响,确保变更只会影响到局部的实现,而不会波及整个系统。通过这种方式,系统能够在不需要大规模重构的情况下,快速适应新的需求或环境变化,从而降低维护成本并提高长期的可扩展性和灵活性。
12、根据抽象程度的不同,软件设计可以为分高层设计、中层设计和低层设计,各自的关注点在哪?并简要说明为什么需要分层进行软件设计。
关注点:高层设计基于反映软件高层抽象的构件层次,描述系统的高层结构、关注点和设计决策;中层设计更加关注组成构件的模块的划分、导人/导出、过程之间调用关系或者类之间的协作;低层设计则深人模块和类的内部,关注具体的数据结构、算法、类型、语句和控制结构等。
为什么需要分层进行软件设计:通过设计分层可以减少需要同时关注的细节,降低设计师同一时间需要处理的复杂度,从而更好地完成设计工作。
补:形式化方法设计
软件规格说明的两种抽象:过程抽象 过程抽象描述软件系统要实现的功能,而不是如何实现的具体步骤
数据抽象 数据抽象就是在规格说明中使用集合、关系、映射、序列、包等抽象的数学结构
为了克服自然语言和程序设计语言描述规格说明的缺陷,人们提出了一种新的软件开发范型,即通过形式化、规范化的数学理论,用描述"做什么"取代"怎么做"。
形式化方法设计
技术 形式规格说明技术
形式验证技术
都基于数学基础 集合论 逻辑 代数理论
形式化方法设计
形式规格说明语言的分类
基于模型
基本思想利用一些已知的特性的数学抽象来为目标软件系统的状态特性和行为特性构造模型。数学抽象包括域、元组、集合、序列、包、映射等。
代数方法
通过提供一些特殊机制以允许对目标软件系统描述的结构化,并支持目标软件系统中公共元素的重用。仅使用带有等词的一阶逻辑表示,不引入通常的数学对象。
进程代数
采用代数方法对并行或分布式系统进行研究的方法。提供了用于描述进程的规格说明的代数语言。提供了描述并发系统所需的并行复合、选择、顺序复合等语句,并可通过等式推理的方法来验证系统满足某些性质。
15、软件体系结构={部件(component),连接件(connector),配置(configuraion)}(Shaw,1995),如何理解这一定义?并简要说明应当如何进行软件体系结构的设计
这一定义表明,软件体系结构由三大基本元素组成:
部件:系统的功能模块或服务,负责执行特定的任务或功能。
连接件 :部件之间的通信机制,用于传递数据或控制信息。
配置:部件和连接件的组织方式,描述它们如何协同工作。
理解时,可以把软件体系结构视为构建系统的骨架,部件执行具体操作,连接件确保它们之间的互动,而配置定义了它们如何组合和协作。
如何进行软件体系结构的设计:
1、分析关键需求和项目约束;2、选择体系结构风格; 3、进行软件体系结构逻辑(抽象)设计;4、依赖逻辑设计进行软件体系结构物理(实现)设计;5、完善软件体系结构设计; 6、定义构件接口
体系结构设计过程
体系结构与软件需求的关系
体系结构是以需求的实现为目标的软件设计蓝图
软件需求是体系结构设计的基础和驱动因素
软件需求(尤其是非功能需求)对软件体系结构具有关键性的塑形作用
体系结构与详细设计的关系
详细设计是针对软件体系结构中某个未展开模块的局部设计,必须遵循体系结构中规定的原则、接口及约束
详细设计只能实现、不能更改体系结构中规定的模块的对外接口和外部行为
软件体系结构必须为详细设计提供可操作的指导和充分的约束
完整的体系结构应当包含以下视图
逻辑视图 开发视图 物理视图 运行视图 数据视图
逻辑视图: 体系结构中各软件模块的逻辑功能划分(职责分派)以及基于此划分的协作行为
开发视图: 软件源代码的程序分包及目录结构,采用的类库、中间件或框架(Framework),它们与逻辑视图各模块之间的映射关系
物理视图:安装部署的物理机器及网络连接,逻辑视图及开发视图中模块或程序包的物理部署位置
运行视图:软件运行时进程、线程的划分及其之间的并发与同步、瞬时快照(软件运行过程中某个特定时刻活跃的对象及其协作关系,以及它们与逻辑视图和开发视图的映射关系
数据视图: 持久数据的存储方案,数据传递、备份、恢复、同步方案,与物理视图之间的映射关系
逻辑视图:包图、构件图、(概念)类图
开发视图:包图
物理视图:部署图
运行视图:活动图、对象图
数据视图:类图(或实体-关系图)
16、为何说软件体系结构设计不应依赖于编程机制
软件体系结构设计应该是独立于编程机制的,这是因为软件体系结构是一种高层次的设计,它关注的是系统的整体结构和组成部分之间的关系,而不是具体实现细节。编程机制是实现软件体系结构的具体方式,它们可能会受到技术、平台、语言等因素的影响,因此如果将软件体系结构设计和编程机制紧密耦合在一起,就会导致设计的不灵活、不可扩展,难以适应未来的变化。此外,软件体系结构设计应该是独立于编程机制的,也是为了更好地支持多种编程机制。如果软件体系结构设计依赖于特定的编程机制, 那么将会限制软件的开发者在实现上的选择和灵活性。因此,软件体系结构设计应该是独立于编程机制的,以便能够支持多种编程机制和实现方式。
试举例说明什么是"桩"(stub)和"驱动"(driver),并说明其在软件工程中的应用。
在软件工程中,"桩"(Stub)和"驱动"(Driver)是用于替代未完成或无法访问的模块的测试替代物。桩通常用于模拟被测试模块中未实现或不可用的部分,它提供预定义的输出,帮助测试其他模块的功能。例如,当一个支付模块尚未开发时,可以使用桩来模拟支付过程,返回支付成功或失败的结果,从而测试订单处理模块的逻辑。驱动则用于模拟上游模块的行为,激活下游模块进行测试。例如,在开发嵌入式系统时,如果上层控制模块未开发完成,可以编写一个驱动程序模拟控制模块的输入,测试底层模块的功能。这两者在单元测试和集成测试中非常重要,能够帮助开发人员在模块间存在依赖或未完成时继续进行有效的测试,确保系统的质量和稳定性。
18、在体系结构的集成与测试中有所谓"桩"(Stub)的概念,试以伪代码举例说明什么是"桩",并简要说明其在系统集成与测试中的作用。
桩函数是白盒测试中的概念,是使用一些自己定义的测试函数来替换当前需要测试的函数。被替换的函数可能是目前还没写完的,这样能够加速开发,或更好的找错误源。
伪代码例子:想要对数据进行处理,但是处理部分还没有完成,采用桩函数,代码如下
def test(a,b) # 被测模块
c = a+b
stub©
def stub© # 桩函数
print©
if __name == "main ":
test(1,2) # 驱动程序
在软件工程中的应用:在软件工程中,"桩"通常指的是桩程序(Stub),它是一种用于模拟尚未完成或无法访问的组件、服务或模块的占位符。在单元测试或集成测试中,桩程序可以替代某些依赖模块,以便于测试目标模块的功能。通过桩程序,开发人员可以模拟外部接口的响应或行为,从而独立测试某个功能或模块的正确性,而不必等待其他部分的开发完成或在开发过程中无法访问的组件。桩程序常用于开发初期,帮助分阶段进行功能验证,确保系统整体的开发进度。
20、人机交互设计的目标是什么?如何理解易用性?
答案:易用性。包括易学性、易记性、效率、出错率和主观满意度。
21、结构化设计中的耦合与内聚都有哪些情况?按由低到高的顺序写出
答案:耦合(低到高):数据、印记、控制、重复、公共、内容;
内聚(低到高):偶然、逻辑、时间、过程、通信、功能、信息。
补:信息隐藏 :
在模块设计时,使其内部包含信息(数据和操作),对于不需要的外部模块实现隐藏,也即不能访问
不是隐藏模块,而是隐藏模块的实现细节
22、都有哪几种内聚,如何区分
(1) 偶然内聚:一个模块完成一组任务,任务间彼此存在松散关系,或完全不相关
(2) 逻辑内聚:几个相关功能放在同一个模块,根据调用传来的参数决定执行哪个
(3) 时间内聚:模块完成的功能必须在同一时间段内执行,功能只因时间因素关联在一起(是时间而不是时间段)
(4) 过程内聚:模块内各处理程序相关,且必须以特定次序执行
(5) 通信内聚:模块内各部分使用相同的输入数据,或产生相同的输出结果
(6) 顺序内聚:特定顺序执行,前者的输出是后者的输入
(7) 功能内聚:模块仅完成一项工作
(8) 信息内聚:模块仅对单一数据完成工作(如查询账户余额、更新账户余额,都是对账号余额这一个来做的)
23、为什么要进行边界值分析
(1) 等价类划分忽略掉了某些特定类型的高效测试用例,而边界值分析可以弥补其中的一些不足;
(2)编程的很多错误是发生在定义域或值域的边界上。因此针对边界情况设计测试用例,可以更好的检查错误,具有更高的测试回报率;
(3) 边界值数据本质上是属于某个等价类的范围,测试时确实有些重复,但是为了更好的测试质量(边界值特别容易出bug),适当的重复是可以接受的。
24、软件测试为什么需要选择不同的方法进行测试设计?
答案:首先,测试对象不同,决定测试使用的方法不同;
其次,测试设计的目的,是为了以最少的测试用例,检测和发现尽可能多的缺陷和错误,使得测试更加经济有效。
25、软件测试要执行那些活动,请加以描述。
答案:测试计划、测试设计、测试执行和测试评价。
测试计划:在开始具体的软件测试活动之前,必须明确软件测试的工作范围、资源与成本、基本策略、进度安排等。
测试设计:是软件测试的关键阶段,目标是进一步明确需要被测试的对象,为被测对象设计测试用例集合。
测试执行:严格按照测试用例执行测试,并记录测试结果。
测试评价:测试执行结束后,必须评价测试结果,以确定测试是否成功。
26、有人认为在软件测试中,应当找出软件中所有的缺陷和不足,从而确保软件产品的质量,请辨析该描述是否正确,并给出相应的解释说明。
该描述并不完全正确。在软件测试中,虽然发现缺陷和不足是一个重要目标,但"找出所有缺陷和不足"并不是实际可行的目标,也不是确保软件质量的唯一途径。首先,软件测试的目的是验证软件是否满足需求,并在各种使用场景下正确运行,确保软件的功能、性能、安全性等各方面都达到预期。因此,软件测试的重点是发现和修复关键缺陷,而不是试图找出所有缺陷。其次,软件质量是一个多维度的概念,除了缺陷数量,质量还包括易用性、性能、可维护性等因素。即使能够发现大量缺陷,软件依然可能存在其他质量问题。因此,测试应根据风险评估优先关注那些对系统影响最大的模块,而不是追求覆盖所有潜在缺陷。此外,完全消除所有缺陷不仅在实践中不可行,而且成本效益也低,因为测试需要耗费大量时间和资源,完全发现所有问题可能并不值得。因此,软件测试应采用合理的策略,确保软件在大多数真实环境中的可靠性,并在合理的时间和资源内提供足够的质量保证,而不是盲目地追求消除所有缺陷。
27、软件测试为软件质量的评估提供了最后堡垒,因此要将软件测试看作捕捉和发现各种错误的安全网。对此说法,你认为是否正确?为什么?
答案:软件测试是质量保障的重要方法之一,但软件质量不仅是在测试这一个阶段形成的,在软件工程的整个过程中,质量已经被包含在软件之中了。因此应该在整个软件过程中注重质量和错误检测,而不是由软件测试一个阶段来捕获和发现全部的错误。
28.做软件测试时,为什么要"尽早和不断地进行软件测试"?
在软件测试中,"尽早和不断地进行软件测试"是确保软件质量的关键策略。尽早测试能够帮助尽早发现和修复缺陷,从而减少后期修复问题的成本和时间。如果在开发初期就开始进行测试,能够及时识别需求不明确、设计缺陷或代码实现的问题,避免这些问题积累到后期,造成系统整体质量的下降。不断测试则强调测试应该贯穿整个软件开发周期,而不是仅仅依赖于开发完成后的最终测试。随着需求变化、代码迭代和系统集成,持续的测试可以确保每个阶段的工作质量,及时反馈问题,避免在后期发现积累的错误或系统集成问题,确保软件在不断变化的环境中始终符合预期。通过尽早和不断地进行测试,不仅提高了问题的发现效率,还能有效降低修复成本,提升软件的可靠性和稳定性。
30、为什么要"设计易读的代码"
设计易读的代码是为了让团队成员(包括自己)更容易理解代码的含义,从而更方便地对代码进行修改、维护和扩展。易读的代码有如下一些优点
(1)提高开发效率和可维护性:代码好理解,也就提高了项目的开发效率,也增强了项目的可维护性
(2)便于发现、减少错误:开发人员更容易发现代码中的错误,减少代码中的潜在缺陷和bug。
(3)便于团队合作:易读的代码让团队成员更容易互相理解和协作,从而提高团队的协作效率。
(4)便于代码重用:开发人员可以很快的找到需要的代码,重用起来也方便。
31、持续的构建-修复模型是否可对需求快速响应?是否可以用于替代极限编程?试简要给出理由
(1) 在程序规模比较小,对质量要求不高时,构建-修复模型可对需求快速响应,因为此时软件结构简单,开发人员可控,可以迅速地将新功能或修改推向市场,收集用户反馈并及时进行修复和调整。
但在程序规模较大时,构建-修复模型可能无法对需求快速响应。因为该模型没有分析、没有文档,也没有质量考虑,软件结构在不断的修改中变得越来越糟糕,甚至无法修改,导致无法再对需求进行快速相应
(2) 构建-修复模型不可用于替代极限编程。两者都强调快速响应变化和持续改进,但它们的具体实现方式有所不同。
构建-修复模型可以帮助开发人员更快地修复缺陷和改进产品,但它并没有像极限编程那样强调代码质量、自动化测试、持续集成等。极限编程可以更好地促进软件开发的质量和可维护性。
因此,持续构建-修复模型不能完全替代极限编程。应该根据具体的项目需求和团队情况,选择合适的开发方法。
32、SWEBOK(软件工程知识体系)定义的软件工程包括的知识领域有哪些?(软件工程学科内容)
SWEBOK第二版定义软件工程有10个知识领域,分别是:软件需求、软件设计、软件构造、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程、软件工程工具和方法、软件质量;SWEBOK第三版定义了另外5个知识领域,分别是:软件工程职业实践、工程经济学基础、计算基础、数学基础、工程基础。
33、在软件工程实践中,有人认为"软件工程存在最好的解决方案,也应该追求最好的方案",请辨析该说法是否正确,并给出相应的解释说明。
在软件工程实践中,认为"软件工程存在最好的解决方案,也应该追求最好的方案"的说法并不完全正确。首先,软件工程中的"最佳解决方案"通常是相对的,受制于具体项目的需求、技术栈、团队能力、资源限制和时间压力等多方面因素。因此,很难有一个通用的最优解。其次,过度追求完美方案可能导致过度优化,增加开发成本和时间,甚至影响项目进度,形成"优化过度"的困境。实践中,通常更强调寻求"足够好"的解决方案,即能够在当前环境下满足需求且具有良好的可维护性与扩展性的方案。软件工程强调迭代和灵活性,随着项目进展和需求变化,解决方案会不断调整和优化,而非一开始就设定完美的标准。因此,追求最好的方案可能会导致资源浪费,而实际中更应关注在可行性、效率和持续迭代中找到最佳平衡。
34、最好的方案能够得到的好处肯定不会低于足够好的方案,那人们为什么不追求最好的方案?试着举例说明你的观点。
答案:追求最好的方案意味着高代价(时间、成本),成功的软件工程项目是要在有限的时间和成本内,得到高质量的目标软件,因此软件工程追求的是成本效益比有效,而不是最好。
比如:对软件测试来说,追求"最好"即达到零缺陷,但为了证明零缺陷,需要进行穷举测试,这往往要付出几千年甚至更久的代价,超出了工程项目的时间和成本限制,通常无法实现。
因此,人们在软件测试时,通常选择在有限时间内完成尽可能高的覆盖率(足够好)即可。
35、以下A、B题项二选一作答:
A)试简要说明设计模式的目的,以及如何评价设计模式的优劣。
设计模式的目的是为了解决软件设计中的常见问题,提供一套经过验证的、可重用的解决方案。它通过抽象和分层来提高系统的模块化,减少耦合,增强扩展性,促进代码的复用性和可维护性,从而使得开发过程更加高效,并降低了后期修改和维护的复杂度。
评价设计模式的优劣时,可以从以下几个方面考虑:首先,是否能有效解决问题并简化设计,避免重复造轮子;其次,是否能够提升代码的可读性、可维护性和灵活性,如在需求变化时容易扩展;同时,设计模式是否引入了不必要的复杂性,导致系统过于臃肿,增加理解和维护的难度;最后,是否适应项目的规模和需求,避免过度设计或过度抽象。一个优良的设计模式应当是简单、易于理解的,且在项目生命周期内具有持久的价值,而不会因为过度复杂化反而影响系统性能和开发效率。
B)试简要说明软件维护的目的以及逆向工程的作用。
软件维护的目的是确保软件在其生命周期内能够持续稳定运行,满足不断变化的需求和环境。它包括修复缺陷、改进性能、增强功能和适应新技术等方面。维护过程不仅确保现有系统的可靠性,还帮助应对外部环境变化,如操作系统升级、硬件更替等。
逆向工程在软件维护中扮演着重要角色,尤其是在没有源代码或文档的情况下,它通过分析已有的二进制代码或程序行为,帮助开发人员理解系统的内部结构和工作原理,为修复缺陷、迁移到新平台或进行功能扩展提供基础。逆向工程能够有效支持遗留系统的维护,减少开发人员对系统理解的障碍,提升维护效率。
B)试简要说明为什么要"信息隐藏",并列举出至少两种以上实现"信息隐藏"的机制。
"信息隐藏"是软件工程中的一项重要原则,旨在通过将系统内部的细节和实现方式封装起来,只暴露必要的接口和功能,从而减少系统之间的耦合度,提高系统的可维护性和可扩展性。通过信息隐藏,可以确保系统内部的改动不会影响到外部接口,降低了复杂性并增强了模块的独立性,使得开发和维护更加高效。
实现信息隐藏的常见机制包括:1) 封装,在面向对象编程中,通过将数据和操作这些数据的方法包装在一起,仅暴露公共接口,而将具体实现细节隐藏在类的内部;2) 访问控制,通过使用访问修饰符(如private、protected、public)控制类成员的访问权限,将不需要外部访问的成员隐藏起来。两者结合可以有效地实现信息隐藏,降低系统复杂度,提高灵活性。
Q2:在软件开发过程中分阶段建立里程碑有何意义?
答案:在软件开发过程中分阶段建立里程碑具有重要意义。每个里程碑代表一个关键的进展点或目标的达成,帮助团队明确开发过程中的重要节点和阶段性成果,确保项目按计划进行。通过设定里程碑,可以对项目的进度、质量和风险进行有效控制,及时发现潜在问题并进行调整,避免出现延误或资源浪费。同时,里程碑也是沟通和评审的依据,为利益相关者提供透明的项目状态和进展报告,确保各方对项目目标、需求变更及资源配置等方面达成一致。总之,分阶段建立里程碑有助于提升项目管理的可控性,降低开发过程中的不确定性,提高软件项目成功交付的概率。
Q3:高"吞吐量(Throughput)"是否意味着高"负载(Load)" ?请举例说明,并给出自己的判断及理由。(P77,gpt)
答案:高"吞吐量"(Throughput)并不一定意味着高"负载"(Load)。吞吐量指的是系统在单位时间内处理的请求或任务数量,而负载则是指系统所承受的工作量或压力,通常与系统的资源消耗(如CPU、内存、磁盘IO等)相关。举例来说,一台服务器在处理大量小型请求时,吞吐量可能很高,但每个请求消耗的资源较少,整体负载并不大;而另一台服务器可能在处理少量的复杂计算时,吞吐量较低,但每个请求消耗大量资源,造成高负载。因此,吞吐量和负载之间没有必然的正相关关系。判断是否存在高负载,需要综合考虑系统资源的消耗情况和请求的性质,而不仅仅是吞吐量的高低。
补:软件设计与实现
软件实现阶段
软件实现是软件工程过程中的一个阶段,在此阶段开发出可执行的软件系统
软件设计与实现
软件设计和实现活动总是交叉进行的 软件设计是创造性活动,任务是基于客户的需求识别系统组件及其关系 实现是将设计转变为程序的过程
设计和实现是紧密相连的,通常在设计过程中需要考虑到实现的因素
程序设计语言的性能
- 心理特性
影响程序员心理的语言性能,包括歧义性、简洁性、局限性、顺序性和传统性。
2)工程特性
着重考虑软件开发项目的需要,包括可移植性、开发工具的可利用性、软件的可复用性、可维护性等。
3)技术特性
对软件工程各阶段都有影响。语言特性对软件的测试与维护也有一定的影响。
要根据项目的特性选择相应特性的语言。
软件测试的基本概念
质量保障(Quality Assurance)
所有的活动都是为了保障产品质量 质量保障覆盖所有阶段,包括计划和维护阶段
软件测试是软件质量控制的关键步骤 软件测试是在软件投入生产性运行之前,
对软件需求分析、设计规格说明和
编码的最终复审。
软件质量是"反映实体满足明确的和隐含的需求的能力的特性的总和"
测试定义
测试是为了发现程序中的错误而执行程序的过程
好的测试方案
是极可能发现迄今为止尚未发现的错误的测试方案
成功的测试
是发现了至今为止尚未发现的错误的测试
非功能测试
压力测试
测试软件在负载情况下能否正常工作
效能测试
测试软件的效能
可访问性测试
测试软件是否向特殊用户(如残疾人用户)提供了足够的辅助功能
本地化/全球化测试
测试软件是否考虑了本地语言文化/全球语言文化
兼容性测试
考虑软件在不同软硬件基础环境下是否能正常工作
配置测试
测试软件在各种配置下能否正常工作
易用性测试
测试软件是否好用
软件安全性测试
软件测试策略
测试步骤
单元测试
测试每个单独模块,确保单元功能正确
白盒测试方法
集成测试
集成模块形成软件包进行测试
白盒测试和黑盒测试相结合
系统测试
测试系统全部元素能够正常配合
黑盒测试
确认测试
由用户最终确认系统功能满足要求
静态测试
代码会审 Code Inspection
走查 Walk-Through
桌前检查 Desk Checking
动态测试
黑盒测试
白盒测试
穷举和选择测试
二、思考题
1、耦合都有哪些类型,解耦的方式是什么(根据找到的材料,现在能做的是判断是什么类型,解耦只会解标记耦合和控制耦合)
(1) 非直接耦合:无直接联系,完全通过主模块的调用实现
(2) 数据耦合(最低耦合):通过数据参数交换信息,且为简单数据
(3) 标记耦合:传的数据多于真实需要的
解耦方法:只提供所需要的数据,多一个数据不给
(4) 控制耦合:调用模块传递的信息,控制了被调用模块的内部逻辑
解耦方法:将被调用模块拆解,并将判定上移
(5) 重复耦合:两个模块有一部分逻辑代码是一样的,看似无耦合,但一改逻辑需要两处都改
(6) 公共耦合:两模块访问同一公共数据(如全局变量)
(7) 内容耦合:一模块可以直接访问另一模块数据
2、判断下面的代码为高耦合还是低耦合?如果是高耦合,如何降耦?
Public class Sales{
SalesMapper salesMapper;
public void endSales(){
salesMapper.save();
}
}
public class SalesMapper {
public void save(){//方法实现}
}
答案:高耦合
设计接口 SalesMapperService
让SalesMapper类实现接口;
让Sales类依赖接口。
该设计改进应用了针对接口编程原则和DIP(依赖倒置)原则。
3、在结构化程序设计中,耦合通常包括内容耦合、公共耦合、重复耦合、控制耦合、印记耦合、数据耦合,已知输出学生序号和软件工程成绩的函数体定义为
void print(int params[]){
System.out.println("序号"+params[0]);
System.out.println("成绩"+params[1]);
} 试指出其所属耦合类型,并尝试修改代码以降低其耦合程度。
答案:在结构化程序设计中代码为标记(特征)耦合,可将代码修改成
void print(int serial, int mark)
{ cout<<"序号"<<serial<<endl;
cout<<"成绩"<<mark<<endl; }
即可将标记耦合降低为数据耦合。
4:试说明调用代码中存在什么类型的耦合,并尝试改写 Main 函数中代码对其解耦,降低相应类之间的耦合程度。
答案:面向对象程序设计中代码为隐式访问耦合,可将代码修改成
class Program{
static void Main(string[] args){
Fisher fisher = new Fisher();
FishHawk fishHawk = fisher.goFishing();
fishHawk.catchFish(); }}
即可将隐式访问耦合降低为实现中访问耦合。
5、如识别耦合并修改代码解耦(附例题)
印记耦合:当被调用的模块可以使用的数据多于真实所需数据时,导致数据访问可能失控,给计算机犯罪提供机会.
解耦:只提供所需要的数据
void print(double height,double weight){
System.out.println("身高"+height);
System.out.printIn("体重"+weight);
}
二综合分析题应用画图题:
1.根据描述,建立实体关系图 和 DFD。
某大学图书馆系统的用户分为几种类型的借书人,分别是教职工借书人、研究生借书人和本科生借书人。借书人的基本信息包括姓名、地址和电话号码,其中教职工借书人还要包括办公室地址和办公电话信息,研究生借书人还要包括专业方向和导师信息等。
系统对借出的图书信息进行跟踪,即记录借书人在什么时间借阅了哪本图书,以及在什么时间归还了哪本图书。
借书人借书前可以根据书名进行图书检索,可以检索出图书的条码号、书名、作者、出版社、ISBN、出版日期、是否在馆等信息。
如果打算借阅的图书全部被借出,可以办理预约。每个预约只针对一个借书人和一个书名,需要记录预约日期、优先权和预约完成日期。
答案:实体:借书人(细分为教职工借书人、研究生借书人、本科生借书人)图书、借还书、预约
属性:借书人:姓名、地址和电话号码;教职工借书人:+办公室地址和办公电话;研究生借书人:+专业方向、导师信息。
图书:条码号、书名、作者、出版社、ISBN、出版日期、是否在馆
借还书:借书日期、借书人、借书名称、还书日期
预约:预约日期、借书人、预约图书、优先权、预约完成日期
关系:借书人借还、预约图书
2.根据描述,建立用例图。
某大学图书馆系统的用户分为几种类型的借书人,分别是教职工借书人、研究生借书人和本科生借书人。借书人的基本信息包括姓名、地址和电话号码,其中教职工借书人还要包括办公室地址和办公电话信息,研究生借书人还要包括专业方向和导师信息等。
系统对借出的图书信息进行跟踪,即记录借书人在什么时间借阅了哪本图书,以及在什么时间归还了哪本图书。
借书人借书前可以根据书名进行图书检索,可以检索出图书的条码号、书名、作者、出版社、ISBN、出版日期、是否在馆等信息。
如果打算借阅的图书全部被借出,可以办理预约。每个预约只针对一个借书人和一个书名,需要记录预约日期、优先权和预约完成日期。
答案:参与者:借书人(派生出教职工借书人、研究生借书人、本科生借书人)
用例:借书、还书、预约图书、检索图书。
3.根据描述,建立概念类图。
某大学图书馆系统的用户分为几种类型的借书人,分别是教职工借书人、研究生借书人和本科生借书人。借书人的基本信息包括姓名、地址和电话号码,其中教职工借书人还要包括办公室地址和办公电话信息,研究生借书人还要包括专业方向和导师信息等。
系统对借出的图书信息进行跟踪,即记录借书人在什么时间借阅了哪本图书,以及在什么时间归还了哪本图书。
借书人借书前可以根据书名进行图书检索,可以检索出图书的条码号、书名、作者、出版社、ISBN、出版日期、是否在馆等信息。
如果打算借阅的图书全部被借出,可以办理预约。每个预约只针对一个借书人和一个书名,需要记录预约日期、优先权和预约完成日期。
答案:概念类:借书人(细分为教职工借书人、研究生借书人、本科生借书人)图书、借还书、预约
属性:借书人:姓名、地址和电话号码;教职工借书人:+办公室地址和办公电话;研究生借书人:+专业方向、导师信息。
图书:条码号、书名、作者、出版社、ISBN、出版日期、是否在馆
借还书:借书日期、借书人、借书名称、还书日期
预约:预约日期、借书人、预约图书、优先权、预约完成日期
关系:借书人借还、预约图书
4、根据系统功能简介,抽象概念类并确定必要的关系
(1)酒店管理系统用于满足酒店工作人员和管理人员的需求。
(2)酒店管理人员和工作人员可以为酒店房间加入入住和退房记录,并生成相应的报表用于查阅,确认和保存,
酒店工作人员可以浏览、查询、统计、添加酒店房间的入住离开信息。
管理员可以查询房间信息、查询员工信息、更改房间信息、更改员工信息等。
(3) 客户在酒店前台申请入住酒店,酒店工作人员需要对客户的姓名、性别、身份证号、房间号、入住时间、联系方式等信息进行记录,客户退房时进行退房记录。
(4)管理员和员工可以通过姓名、入住日期、身份证号、房间号、联系方式等信息查询客户入住和离开情况。
答案:类:员工(姓名、性别、级别、用户名、密码) -- (派生)--酒店管理人员、工作人员
客户(姓名、性别、身份证号、联系方式)
客房(房间号、房间类型、房间状态)
房型(房型、单价)
入住/离开信息(姓名、身份证号、房间号、入住时间、房间单价、退房时间、房费总额)(关联类)
关系:客户--(入住、离开)--客房
员工 -- (查询)-- 入住/离开信息
酒店管理人员--(查询/修改)--房间信息
酒店管理人员--(查询/修改)--员工信息