1.4 什么是软件危机?它有哪些典型表现?为什么会出现软件危机?
软件危机:软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 典型表现: (1) (2) (3) (4) (5) (6) (7)
对软件开发成本和进度的估计常常很不准确。 用户对“已完成的”软件系统不满意的现象经常发生。 软件产品的质量往往靠不住。 软件常常是不可维护的。 软件通常没有适当的文档资料。
软件成本在计算机系统总成本中所占的比例逐年上升。
软件开发生产率提高的速度,既跟不上硬件的发展速度,也远远跟不上计算机应用
迅速普及深入的趋势。
产生软件危机的原因: 除了软件本身的特点,其原因主要有以下几个方面: (1) 缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作计划很难制定。 (2) 软件人员与用户的交流存在障碍,使得获取的需求不充分或存在错误。 (3) 软件开发过程不规范。如,没有真正了解用户的需求就开始编程序。
(4) 随着软件规模的增大,其复杂性往往会呈指数级升高。需要很多人分工协作,不仅涉及技术问题,更重要的是必须有科学严格的管理。
(5) 缺少有效的软件评测手段,提交给用户的软件的质量不能完全保证。
1.5 什么是软件工程?
软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
1.6 简述软件生存期由哪些主要的阶段组成,每一阶段的主要任务是什么?
(1) 问题定义与可行性研究:问题定义必须回答的关键问题是:“要解决的问题是什么”。
可行性研究要回答的关键问题是:“在成本和时间的条件下能否解决问题?是否值得做?”。
(2) 需求分析:这个阶段的任务仍然不是具体地解决客户的问题,而是准确地回答“目标
系统必须做什么”这个问题。
(3) 软件设计:本阶段要回答的关键问题是“目标系统如何做?”为此,必须在设计阶段
中制定设计方案,把已确定的各项需求转换成相应的软件体系结构。结构中的每一组成部分都是意义明确的构件,此即所谓概要设计。进而具体描述每个构件所要完成的工作,为源程序编写打下基础,此即所谓详细设计。
(4) 程序编码和单元测试:本阶段要解决的问题是“正确地实现已做的设计”,为此,需要
选择合适的编程语言,把软件设计转换成计算机可以接受的程序代码,并对程序结构中的各个模块进行单元测试,然后运用调试的手段排除测试中发现的错误。要求编写出的程序应当是结构良好、清晰易读的,且与设计相一致的。
(5) 集成测试和系统测试:集成测试的任务是将已测试过的模块按设计规定的顺序组装起
来,在组装的过程中检查程序连接的问题。系统测试的任务是根据需求规格说明的要求,对必须实现的各项需求,逐项进行确认,判定已开发的软件是否符合用户需求,能否交付用户使用。为了更有效地发现系统中的问题,通常这个阶段的工作由开发人员、用户之外的第三者承担。
(6) 运行维护:已交付的软件投入正式使用,便进入运行维护阶段。这一阶段可能持续若
干年。软件在运行中可能由于多方面的原因,需要对它进行维护。通常有四种类型的维护:改正性维护、适应性维护、完善性维护和预防性维护。
1.7 常见的软件生存期模型主要有哪些?每种模型的优缺点是什么?
常见的软件生存期模型主要有瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型和统一过程。 (1) 瀑布模型
优点:可强迫开发人员采用规范化的方法;严格地规定了每个阶段必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。
缺点:由于瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真正满足用户的需要;用户往往需要等待很长时间才能看到可以运行的程序;适应需求变更的能力比较差。
适用范围:瀑布模型只适用于项目开始时需求已确定的情况。 (2) 快速原型模型
优点:有助于满足用户的真实需求;原型系统已经通过与用户的交互而得到验证,据此产生的规格说明文档能够正确地描述用户需求。 缺点:要求开发人员快速建立原型。 适用范围:适用于需求不明确的软件项目。 (3) 增量模型 优点:
能在较短时间内向用户提交可完成一些基本功能的产品,即从第一个构件交付之日起,
用户就能做一些有用的工作。
逐步增加产品的功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新
的软件可能给用户组织带来的冲击。
项目失败的风险较低,虽然在某些增量构件中可能遇到一些问题,但其他增量构件将能
够成功地交付给客户。
优先级最高的服务首先交付,然后再将其他增量构件逐次集成进来。因此,最重要的系
统服务将接受最多的测试。 缺点:
在把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产
品。
软件体系结构必须是开放的,即向现有产品中加入新构件的过程必须简单、方便。 适用范围:适用于工期紧张、功能可以划分、比较复杂的软件项目。软件工程师必须有较高的技术水平,能够设计出开放的软件体系结构。 (4) 螺旋模型 优点:
对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开
发的一个重要目标;
减少了过多测试或测试不足所带来的风险;
在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别。 缺点:螺旋模型是风险驱动的,因此要求软件开发人员必须具有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险:当项目实际上正在走向灾难时,开发人员可能还以为一切正常。
适用范围:适用于内部开发的大型软件(开发周期长、比较容易受到社会因素影响的软件项目),软件开发人员具有丰富的风险评估知识和经验。 (5) 喷泉模型
优点:在开发过程中使用统一的概念和方法,各阶段之间没有明显的界限,容易实现各个开发过程的多次反复迭代,达到了认识的逐步深化,降低了出错的可能性。
缺点:由于各个阶段之间的界线不明确,容易造成软件开发过程的无序。 适用范围:适用于面向对象的软件开发。 (6) 统一过程
优点:提高了团队生产力,在迭代的开发过程、需求管理、基于组件的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面,针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供了较大的通用性。
缺点:RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容;此外,它没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。 适用范围:适用于基于构件的软件开发。
2.1 软件工程的三种基本要素是什么,各自的作用是什么?
软件工程的三种基本要素是方法、工具和过程。
(1) 软件工程方法(method)为建造软件提供技术上的解决方法(“如何做”)。目前使用得最广泛的方法是传统方法(结构化方法)和面向对象方法。
(2) 工具为方法的运用提供自动的或半自动的软件支撑环境。
(3) 过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
2.2 简述传统方法和面向对象方法的特点。
(1) 传统方法的特点
传统方法也称为生命周期方法或结构化范型。它采用结构化技术来完成软件开发的各项任务。这种方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地逐步完成每个阶段的任务。每一个阶段的开始和结束都有严格的标准,对于任何两个相邻的阶段而言,前一个阶段的结束标准就是后一阶段的开始标准。
传统方法的主要缺点是在适应需求变化方面不够灵活,另外,结构化方法要么面向行为,要么面向数据,缺乏使两者有机结合的机制。
(2)面向对象方法的特点
面向对象方法把数据和行为看成同等重要,是将数据和对数据的操作紧密地结合起来的方法,这也是面向对象方法与传统方法的重要区别。
面向对象方法的出发点和基本原则,是尽量模拟人类习惯的思维方式,使开发软件的方
法和过程尽可能接近人类认识问题和解决问题的方法与过程,从而使描述问题的问题空间与其解空间在结构上尽可能一致。对于大型、复杂及交互性比较强的系统,使用面向对象方法更有优势。
3.2顶层数据流图或称环境图的作用是什么?
顶层数据流图(或称环境图)仅包括一个数据处理过程,也就是要开发的目标系统。其作用如下:
(1) 确定系统在其环境中的位置,与系统有联系的外部实体(包括硬件、软件、组织机构及人)有哪些。
(2) 通过确定系统的输入和输出与外部实体的关系确定系统的边界,也就是要确定哪些功能或处理属于系统范围之内,哪些属于系统范围之外,需要由其他系统处理或人工处理。
3.3 在对数据流图进行分解时需要注意哪些问题?
在对数据流图进行分解时,需要注意以下两个问题:
(1) 当对数据流图分层细化时必须保持信息连续性,也就是说,当把一个处理分解为一系列处理时,分解前和分解后的输入/输出数据流必须相同。
(2) 注意分层细化时对编号的处理方法。
3.4 银行存款业务如下:客户到银行柜台存款时,首先填写存款单(包括帐号、姓名、存款金额、存款类型),如果还没有开户,则需要先开户,填写开户单(包括姓名、身份证号、地址、xx、是否留密码)。填写完存款单或开户单后,交给营业员,营业员将存款单或开户单信息输入计算机,系统记录开户信息或存款单信息,如果是开户并选择留密码,则需要客户输入密码。最后印出开户单或存款单给用户。请画出银行存款业务的分层数据流图(至少画出两层)。
(1) 识别外部实体及输入输出数据流 外部实体:储户、业务员。
输入数据流:存款单,开户单,密码。可以将存款单和开户单抽象为事务。 输出数据流:存款单,开户单。 (2) 顶层数据流图
(3) 一层数据流图
对银行储蓄系统进行分解,从大的方面分解为接收事务、处理开户、处理存款三部分,得到一层数据流图。
(4) 二层数据流图
对 “处理存款”及“处理开户”进行进一步分解,得到二层数据流图,即处理存款的数据流图和处理开户的数据流图。
处理存款的数据流图
处理开户的数据流图
3.5 按照以下描述,画出ER图。
一本教材由许多章组成,每一章包含许多节、小结和习题组成,章和节都具有标题和序号属性。 ER图如下:
小结 习题 教材 章 节 序号 标题 序号 标题 4.13 对于图4-49所示的流程图,试分别用N-S图和PAD表示之。
START
P A T F END
图4-49 流程图
T B Q F
对应的N-S图如下: 对应的PAD如下:
while P A B until !Q while P A until !Q B 4.14 图
4-50所示的流程图完成的功能是使用二分查找方法在table数组中找出值为
item的数是否存在。
(1) 判断此算法是否是结构化的,说明理由。
(2) 若算法是非结构化的,设计一个等价的结构化算法,并用N-S图表示。
table(i)=item
start=i+1
table(i)>item T finish=i-1 F F T table(I)- 图4-50 二分查找算法的流程图
(1) 不是结构化的,最上面的循环有两个出口,最下面的分支有三个入口。 (2) 等价的结构化算法如下: T FLAG=1 FLAG=0 START=I+1 T I=(START+FINISH)/2 (FINISH-START)>1 && TABLE(I)!=ITEM I=(START+FINISH)/2 TABLE(I)- FLAG=0 (FINISH-START)>1 && FLAG==0 I=(START+FINISH)/2 T TABLE(I)==ITEM F FLAG=1 TABLE(I)
- =0 && FLAG==0 I=(START+FINISH)/2 T TABLE(I)==ITEM F FLAG=1 TABLE(I)
- 1.注意运算符的优先级,并使用括号明确表达式的操作顺序,避免使用默认优先级。
2.避免使用不易理解的数字,用有意义的标识符来代替。
6.5 假设汽车的车牌号可由车主人在规定范围内自选,若其规定为:
(1) 车牌上应有7个字符; (2) 为首的字符限定为汉字“京”; (3) 第2个字符可任选一字母(A~Z); (4) 第3~7个字符可选任意数字。
请为相关的处理程序采用等价类划分方法设计等价类表及相应的测试用例。
等价类表
输入数据 有效等价类 无效等价类 字符个数 7个(1) 0~6个(2),>7个(3) 首字符 “京”(4) 非“京”(5) 第2个字符 字母(6) 非字母(7) 第3~7个字符 数字(8) 非数字(9) 测试用例如下:
1)京H87774 }(1),(4),(6),(8) 2)京H8777 }(2)
3)京H877745 }(3) 4)冀H87774 }(5) 5)京987774 }(7) 6)京BA7774 }(9)
6.6 比较测试与测试,说明其异同。
测试与测试都是集成测试之后所进行的测试,都属于系统测试。所不同的是,测试是在开发环境中所做的测试,主要由开发方人员进行。而测试则是在用户实际工作环境中所做的测试,不受开发人员的干预。
6.4说明白盒与黑河的区别,做了其一还需做另一个?
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。 2 不需要
7.1 uml中有哪几种图?每种图的作用?
用例 类 交互 状态 活动 实现图(6种) 用例 :描述参与者所理解的系统功能 类:显示类,类的内部结构以及其他类的联系
交互:是为用例、用例组或局部用例开发的(它包括顺序图和协作图) 状态图:描述一个特定的所有可能的状态以及引起状态装换的事件 活动图: 用来捕捉用例的活动,用框图的方式显示动作及其结果
实现: 显示系统构建及其结构、相互依赖以及在计算机节点上如何部署。
8.1比较面向对象的分析方法和面向数据流的分析方法,阐述它们各自的特点。
面向对象的分析方法使用用例模型来表示用户的功能需求,用例模型相当于功能模型,在对用例模型进行细化的过程中,也伴随着对功能的分解。但面向对象的分析方法并不是以功能分解为核心,在获取并分析用户的功能需求之后,重点以类和对象为核心,建立对象模型,交互模型也是围绕对象模型进行的。面向数据流的分析方法是从建立顶层数据流图(环境图)开始,之后逐层对加工进行分解。面向数据流的分析方法是以功能分解为核心的。
8.2 面向对象分析需要建立的三个模型是什么?
面向对象分析需要建立的3个模型是:由用例和场景表示的功能模型(用例模型);用类和对象表示的静态模型(对象模型);由状态图和顺序图表示的动态模型(交互模型)。
8.3 用例建模的主要步骤是什么?
用例建模的主要步骤如下:
(1) 确定业务参与者──可以是与系统有交互的外部硬件、软件、组织、人等。
(2) 确定业务需求用例──参与者需要系统提供的完整功能。
(3) 创建用例图──标识参与者与用例之间、用例与用例之间的关系。
8.5 用例与用例之间的关系主要有哪两种?其区别是什么?
用例之间的关系主要有《包含》(也称《使用》)和《扩展》。
《包含》表示一个用例所执行的功能中总是包括被包含用例的功能;《扩展》是指一个用例的执行可能需要由其他用例的功能来扩展,《扩展》联系可用于对期望或可选的行为建模,但其主要用途是使基本用例的功能不依赖于扩展用例。
8.6 对于复杂的系统,其对象模型应该由哪五个层次组成?
对于复杂的系统,对象模型应该由下述5个层次组成:主题层(也称为范畴层)、类-对象层、结构层、属性层和服务层,如图所示。
对象模型的五个层次
8.7 解释关联类的作用,在什么时候需要使用关联类?
关联类的作用是描述关联的属性。
在关联关系比较简单的情况下,关联关系的语义用关联关系的名字来概括。但在某些情况下,需要对关联关系的语义做详细的定义、存储和访问,为此可以建立关联类(association class)。
8.8 按照以下描述,画出UML类图:
一本教材由许多章组成,每一章包含许多节、小结和习题组成,章和节都具有标题和序号属性。
UML类图如下: