软件工程导论复习
软件工程导论
1.软件的概念?(判断?)
虽然软件对于现代的人并不陌生,但很多人对于软件的理解并不准确,“软件就是程序,软件开发就是编程序”的这种错误观点仍然存在。
什么是软件
2.什么是软件?
软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。
程序 按事先设计的功能和性能要求执行的指令序列。
数据 使程序能正常操纵信息的数据结构。
文档 与程序开发,维护和使用有关的图文材料。
2.软件危机及其具体表现?
主要表现为:软件的发展速度远远滞后于硬件的发展速度,不能满足社会日益增长的软件需求。软件开发周期长、成本高、质量差、维护困难。
(1)经费预算经常突破,完成时间一再拖延。由于缺乏软件开发的经验和软件开发数据的积累,使得开发工作的计划很难制定。主观盲目制定计划,执行起来与实际情况有很大差距,使得开发经费一再突破。由于对工作量估计不足,对开发难度估计不足,进度计划无法按时完成,开发时间一再拖延。
(2)开发的软件不能满足用户要求。开发初期对用户的要求了解不够明确,未能得到明确的表达。开发工作开始后,软件人员和用户又未能及时交换意见,使得一些问题不能及时解决,导致开发的软件不能满足用户的要求,因而导致开发失败。
(3)开发的软件可维护性差。开发过程中没有同意的、公认的规范,软件开发人员按各自的风格工作,各行其是,开发过程无完整、规范的文档,发现问题后进行杂乱无章的修改。程序结构不好,运行时发现错误也很难修改,导致维护性差。
(4)开发的软件可靠性差。由于在开发过程中,没有确保软件质量的体系和措施,在软件测试时,又没有严格的、充分的、完全的测试,提交给用户的软件质量差,在运行中暴露出大量的问题。
3.什么是软件工程?
软件工程是指导计算机软件开发和维护的工程学科。
采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
4.软件的工程的目标?
软件工程的目标是运用先进的软件开发技术和管理方法来提高软件的质量和生产率,也就是要以较短的周期、较低的成本生产出高质量的软件产品,并最终实现软件的工业化生产。
可靠性,可使用性,可维护性,可移植性。
可靠性:是指在规定的时间和条件下,软件能够正常维持其工作的能力
可使用性:是指为了使用该软件所需要的能力
可维护性:是指当环境改变,或软件运行发生故障时,为了使其恢复正常运行所 做努力的程度,
可移植行:是指软件从某一环境转移到另一环境时所做努力的程度。
5.软件生命周期或软件生存期?
软件生存期分为三个时期:软件定义,软件开发,运行维护
软件定义:主要任务时解决“做什么”的问题,包括确定工程的总目标和可行性; 导出现实工程目标应使用的策略及系统必须完成的功能;估计完成资 源所需要的资源和成本;制定工程进度表。它又通常分为三个阶段: 问题定义、可行性研究和需求分析。
软件开发:主要任务时解决“如何做”的问题,即具体设计和实现在前一个时期 定义的软件。它通常由概要设计、详细设计、编码和测试组成。
运行维护:主要任务是使软件持久地满足用户的需要。
完成开发过程的基本任务
完成各个阶段所需要的步骤?
- 问题定义与可行性研究
- 需求分析
- 软件设计
- 程序编码和单元测试
- 集成测试和系统测试
- 软件运行和维护
6.软件工程方法?
目前使用最广泛的软件工程方法学:传统方法学(结构化方法学),面向对象方法学。
三要素:方法、工具和过程。
第2章 软件生存期模型(选择题)(p21)
面向过程:瀑布模型,快速原型模型,增量模型,螺旋模型
面向对象:喷泉模型,统一过程,基于构件的开发模型,敏捷过程
瀑布模型:瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开, 便于分工协作,即采用结构化的分析与设计方法将逻辑实现与物理 实现分开。将软件生命周期划分为制定计划、需求分析、软件设计、 程序编写、软件测试和运行维护等六个基本活动,并且规定了它们 自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。
快速原型模型:它是增量模型的另一种形式;它是在开发真实系统之前,构造 一个原型,在该原型的基础上,逐渐完成整个系统的开发工作。快 速原型模型的第一步是建造一个快速原型,实现客户或未来的用户 与系统的交互,用户或客户对原型进行评价,进一步细化待开发软 件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以 确定客户的真正需求是什么;第二步则在第一步的基础上开发客户 满意的软件产品。
增量模型:将软件产品分解城一系类的增量构件,在增量迭代开发中逐步逐步 加入,为此,要求构件的规模适中,并且新构件集成到已有的软件 所形成的新产品必须是可测试的
螺旋模型:螺旋模型是一种演化软件开发过程模型,它兼顾了快速原型的迭代的 特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于 引入了其他模型不具备的风险分析,使软件在无法排除重大风险时 有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋 模型用以减小风险的途径。螺旋模型更适合大型的昂贵的系统级的 软件应用
喷泉模型:喷泉模型(fountain model)是一种以用户需求为动力,以对象为 驱动的模型,主要用于描述面向对象的软件开发过程。该模型认为 软件开发过程自下而上周期的各阶段是相互迭代和无间隙的特性。
统一过程:它提供了在开发组织中分派任务和责任的纪律化方法。它的目标是 在可预见的日程和预算前提下,确保满足最终用户需求的高质量产 品。统一过程模型是一种“用例驱动,以体系结构为核心,迭代及 增量”的软件过程框架,由UML方法和工具支持
基于构件的开发模型:是一种基于分布对象技术、强调通过可复用构件设计与构 造软件系统的软件复用途径。基于构件的软件系统中的构件 可以是COTS构件,也可以是通过其它途径获得的构件。CBSD 体现了“购买而不是重新构造”的哲学,将软件开发的重点 从程序编写转移到了基于已有构件的组装,以更快地构造系 统,减轻用来支持和升级大型系统所需要的维护负担 ,从 而降低软件开发的费用。
敏捷过程:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行 软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项 目,各个子项目的成果都经过测试,具备可视、可集成和可运行使 用的特征。换言之,就是把一个大项目分为多个相互联系,但也可 独立运行的小项目,并分别完成,在此过程中软件一直处于可使用 状态
3.2 结构化分析方法
功能建模 :功能建模的思想就是用抽象模型的概念,按照软件内部数据传 递、变换的关系,自顶向下逐层分解,直到找到满足功能要求 的所有可实现的软件为止。功能模型用数据流图来描述。
数据建模:在结构化分析方法中,使用实体—关系建模技术来建立数据模型。这 种技术是在较高的抽象层次(概念层)上对数据库结构进行建模的 流行技术。实体—关系模型表示为可视化的实体—关系图,也称为 ER图。 ER图中仅包含3种相互关联的元素:数据对象(实体)、 描 述数据对象的属性及数据对象彼此间相互连接的关系。
行为建模:状态转换图(简称状态图)通过描绘系统的状态及引起系统状态转 换的事件,来表示系统的行为。状态图中使用的主要符号如图所示。
结构化分析模型
第4章 结构化设计方法
体系结构设计→体系结构图(功能结构图)
结构话设计 数据设计→物理数据模型(PDM)
接口设计→界面设计例如(窗口,网页(PC端,移动端))
过程设计 图形工具:程序流程图,N-S图,PAD图,
决策树
表格工具:决策表
语言工具:伪代码
结构化设计或者结构化程序设计的特点?(简答)
①.如果一个程序的代码块仅仅通过顺序、选择和循环这三种基本控制结构进行 连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
②.复杂结构应该用基本控制结构进行组合嵌套。
③.建议从高级语言中取消GOTO语句;嵌套;子模块
④.自顶向下(Top-Down)、逐步细化(Stepwise Refinement)
⑤.使用的控制结构只允许有一个入口一个出口。
从软件工程的角度,程序设计语言如何选择? (简答)
详细设计应能直接地容易地翻译成代码程序。
源程序应具有可移植性。
编译程序应具有较高的效率。
尽可能应用代码生成的自动工具。
可维护性。
程序设计语言的选择 ? (简答)
在选择编程语言时,可以考虑以下因素。
应用领域:目标系统的应用领域不同,需要采取的系统开发范型也不同,所以要考虑支持相应范型的编程语言。
系统用户的要求。
编程语言自身的功能。
编码和维护成本及开发环境。
编程人员的技能。
软件测试的基本概念?
编写测试用例发现软件错误。
什么是软件测试?
(1) 软件测试是为了发现错误而执行程序的过程。
(2) 或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精 心设计一批测试用例。
测试用例?即输入数据及其预期的输出结果
黑盒测试(也叫功能测试):
测试要根据软件的外部特征进行,这种方法把测试对象看做一个黑盒子,程序人员完全不考虑程序内部的逻辑和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合他的功能说明。
白盒测试(也叫结构测试或逻辑驱动测试):
软件白盒测试是对软件过程性细节做细致的检查,这一方法是把测试对象看作一个透明的盒子,允许测试人员利用程序内部的逻辑通过不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
调试
调试也称排查或纠错,它是紧跟在测试之后要做的工作,但与测试不同之处在于:测试重于发现软件中有错,发现异常或软件运行的可疑之处;而调试是任务在于为错误确切的定位,找到出错的根源,并通过修改测序将其排除。
软件测试策略分?
通常软件测试过程按4个步骤进行,即单元测试、组装测试、确认测试和系统测试。
软件过程是什么?
应该以过程思维来重新认识软件业存在的问题,重视提高软件组织的过程成熟度,实施过程评估,找出已有过程的不足和缺陷,进而改进软件过程。把对软件产品本身的关注转移到对软件过程的关注上来,因为只有软件过程的问题解决好了,按其过程开发的软件产品才能符合要求。
软件过程成熟度模型?
CMM是能力成熟度模型Capability Maturity Model三个英文单词第一个字母组成的。事实上,该模型最早提出时,它指的是软件过程能力成熟度模型。
该模型按软件过程的不同成熟度划分了5个等级,1级被认为成熟度最低,5级则成熟度最高。
成熟度等级(ML,Maturity Level)
初始级(ML1) 已管理级( ML2) 已定义级(ML3) 已量化管理级(ML4)
优化级(ML5)
软件项目管理包含哪些?(填空?)
项目估算,风险管理,进度管理,需求管理,配置管理(再看看各自的意义)
一、 例3-1
银行储存系统的业务流程如下,存储填写的存款单或取款单由业务员键入系统,如果是存款则系统记录存款人姓名、住址、身份证号码、存款类型、存款日期、到期日期、利率及密码(可选)等信息,并印出存单给储户;如果是取款而且开户时留有密码,则系统首先核对储户密码,若密码正确,或存款时未留密码,则系统计算利息并打印出利息清单给储户。要求画出分层的数据流图,并细化到二层数据流图。
银行储蓄系统的E-R图
二、P87【例4.1】针对第三章3.1的银行储蓄系统,开发软件结构图
①第一步,对银行储蓄系统的数据流图进行复查并精化,得到如下图所示的数据流图。
三、提高模块的独立性,得到的软件结构如下图所示:
四、P103
要求用筛选法求100以内的素数。所谓筛选法,就是从2到100中去掉2、 3、 5、7的倍数,剩下的就是100以内的素数。
为了解决这个问题,可先按程序功能写出以下框架;
main(){
①建立2到100的数组A[],其中A[i]=i;
②建立2到10的素数表B[],其中存放2到10以内的素数;
③若A[i]= i是B[]中任一数的倍数,则剔除A[i];
④输出A[]中的所有没有被剔除的数;
}
上述框架中每个加工语句都可以进一步细化成循环语句;
main(){
//①建立2到100的数组A[],其中A[i]=i
for(i=2;i<=100;i++)A[i]=i;
//②建立2到10的素数表B[],其中存放2到10以内的素数
B[1]=2; B[2]=3; B[3]=5; B[4]=7;
//③若A[i]= i是B[]中任一数的倍数,则剔除A[i];
for(j=1;j<=4;j++)
检查A[]所以的数能否被B[j]整除的数从A[]中剔除
//输出A[]中所有被剔除的数
for(i=2;i<=100;i++)
若A[i]没有被剔除,则输出之
}
将语句逐步细化下去直到用程序设计语言来表示为止:
main(){
for(i=2;i<=100;i++) A[i]=i;
B[1]=2; B[2]=3; B[3]=5; B[4]=7;
for(j=1;j<=4;j++)
for(i=2;i<=100;i++)
if(A[i]/B[j]*B[j] == A[i] )
A[i]=0;
for(i=2<i<=100;i++)
if(A[i]!=0)
printf(“A[& d]=%d\n”,i,A[i]);
}
五、P109
4.13 对于图4-49所示的流程图,试分别用N-S图和PAD表示之。
对应的N-S图和PAD图如下:
六、
4.14图4-52所示的流程图完成的功能是使用二分查找方法在table数组中找出值为item的数是否存在。
(1)判断此算法是否是结构化的,说明理由。
(2)若算法是非结构化的,设计一个等价的结构化算法,并用N-S图表示。