软件工程面试题:生命周期模型:瀑布、V、增量、原型、螺旋
复试面试软件工程相关题目总结,主要涉及生命周期模型:瀑布模型、V模型、增量模型、原型开发、螺旋模型 的概念,优缺点。
https://www.docin.com/p-1217261520.html?docfrom=rrela
https://www.cnblogs.com/jojop/p/11801241.html
软件危机
软件危机:计算机软件在开发和维护过程中遇到的一系列严重问题。
一般有如下一些表现形式:
- 对软件开发成本和进度估计不准确
- 软件成本,在总成本所占比例逐年上升
- 用户对“已完成软件”常常不满意
- 软件往往不可维护
- 软件没有文档资料
软件
软件:软件是程序(指令集合)、数据结构以及文档描述的集合。
- 程序是完成预定功能和性能的可在计算机系统上的指令序列;
- 数据是可以使程序适当处理信息的数据结构;
- 文档是在软件开发过程中所使用的一系列图文资料。
软件工程
软件工程:
(1)把系统的、规范的、可度量的方法应用于软件开发、运行和维护过程,即把工程化方法应用于软件
(2)在(1)中所述方法的研究
软件工程层次化技术

软件开发生命周期SDLC
瀑布模型waterfall model/经典生命周期classic life cycle
是一种系统化的、顺序的软件开发方法。
活动从用户需求规格说明开始,通过策划、建模、构建和部署的过程,最终提供一个完整的软件并提供持续的技术支持。


特点:系统化+顺序自上而下输出+文档+强调早期需求
- 各项活动按自上而下,相互衔接的固定次序,如 同瀑布逐级下落(阶段间具有顺序性和依赖性)
- 每个阶段必须完成规定的文档;每个阶段结束前完成文档审查
- 每个阶段都要有明确的输出,作为下一阶段的输入。如果下一阶段出现问题,就要返工,回到上一个阶段。
- 强调早期调研和需求分析,推迟编码实现
缺点:文档驱动,最后才有可交付产品,强调早期需求导致
- 不能对软件系统进行快速创建,对于一些急于交付的软件系统的开发很不方便。
- 系统中存在的重大缺陷,如果再可执行程序评审之前没被发现,修改成本巨大(如图1模型中,运行阶段发现需求问题,虚线就要回归到需求极端再走一遍瀑布模型)
- 客户必须有耐心,在可运行的软件产品交付给用户之前,用户只能通过文档来了解产品是什么样的。对最终开发出的产品可能并不是用户真正需要的。
- 用户没有反馈和修改需求的机会,所以必须要求开发项目需求是稳定的,开发人员很熟悉这次开发才可以,否则稍有变动,前面的开发就是无效的,前功尽弃的。
- 依赖早期调研和需求分析,但客户通常很难清除描述所有需求,必然存在早期的不确定性
- 实际项目很少遵守瀑布模型顺序,这些变更会导致混乱。
- 人员闲置(阻塞状态),一些成员要等待另一些成员工作完成,才能开始工作,等待时间可能超过生产时间。
适用于:
1、瀑布模型适合于需求明确,且无大的需求变更的软件开发(编译系统、操作系统等)。而对于分析初期需求模糊的项目,瀑布模型也并不适合
2、能采用线性方法开发的工程
V模型:重视测试的瀑布模型

特点:本质瀑布,强调测试
1、V-model是瀑布模型的一个变体。
软件开发工作沿着V模型左侧向下推进(需求分析、概要设计、详细设计、软件编码)
2、编码结束后,沿着V模型右侧向上推进测试工作(单元测试、集成测试、系统测试、验收测试)。这些测试验证了左侧推进过程中生成的每个模型。
3、本质上和瀑布模型没区别,只是将验证确认动作应用于早期软件工程工作中,强调了测试阶段的重要性(对测试进行分级,并和开发阶段相对应)。
4、但是仍然一开始需要固定需求,没有改变瀑布型的缺点。阶段仍然是串行,用户没有反馈的机会
增量模型increment model:迭代的瀑布模型
增量模型 = 迭代的瀑布模型
可以迅速为用户提供一套功能有限的软件产品,然后在后续版本中细化和扩展功能。
增量过程模型以迭代的方式运用瀑布模型,把软件产品作为一系列的增量构件来设计、编码、集成和测试。
增量模型时,第一个增量往往是核心功能。
模型特点:
- 当使用增量模型时,第一个增量往往是核心产品(core product);
- 客户对每个增量进行评价,根据评价结果制定下一个增量计划;
- 每个增量采用瀑布模型开发,提交一个可运行的产品。
模型优点:省人省钱+用户需求+风险小
- 开发人员不足时,增量模型十分有用,早期的增量可以由少量人员实现,口碑不错的话,则可以继续投入人力
- 更易于融入用户需求,因为每次曾两开发的时间很短。
- 根据市场决定策略
- 规避风险:风险分解到小增量,而不是全在一个线性大型开发中
- 早期增量避免使用如交付时间不确定的硬件等等,避免延期。第一个可交付版本所需要的成本和时间很少;
模型局限:
- 要避免把难题往后推,首先完成的应该是高风险和重要的部分
- 管理发生的成本、进度和配置的复杂性可能会超出组织的能力;
适用场景:
项目在既定的商业要求期限之前不可能找到足够的开发人员的情况。
演化模型:原型开发
软件开发过程中,开发初期需求模糊,容易变更。为了适应这种需求的不确定性和变化,于是出现了快速原型(Rapid Prototype)开发方法。
模型特点:重点是给用户看可见功能,试探用户需求
1、快速原型通过【沟通-快速策划-快速建模-构建原型-部署】用来获取用户需求的,试探设计是否有效,根据反馈,不断细化软件需求。
集中于软件中那些对客户可见的部分的表示
2、一旦需求或设计确定下来了,原型就将被抛弃。因此,快速原型要求快速构件、容易修改,以节约原型创建的成本、加快开发速度;
3、快速原型是暂时适用使用的,因此并不要求完整。
它往往针对某个局部问题建立专门原型,如界面原型、工作流原型等;
4、快速原型不能贯穿软件的整个生命周期,它需要和其他的过程模型相结合才能产生作用。
例如,在瀑布模型中应用快速原型,以解决瀑布模型在需求分析时期存在的不足。
模型优点:
1、 启发,明确需求,达成共识:能渐进地启发客户提出新的要求或任务,促使开发人员和用户达成共识;
2、减少了开发风险:避免了因为需求不确定而在开发过程中浪费了大量的资源。
模型局限:
1、没有考虑到软件的整体和长期的可维护性;
2、可能盲目为了方便给客户演示功能:采用不合适的算法,不合适的开发工具,还有不合适的操作系统被选择等等。
适用场景:
- 用户需求不清、需求经常变化的情况。
- 当系统规模不是很大也不太复杂时,采用该方法比较好。
演化模型:螺旋模型
螺旋模型= 原型迭代+瀑布系统性可控性
螺旋模型将瀑布模型和演化模型结合起来,加入了两种模型均忽略的风险分析。
自内向外每旋转一圈便开发 出更完善的一个新版本。
- 保留了瀑布模型中系统逐步细化的方法
- 同时纳入迭代框架。
- 在项目的所有细化阶段,始终考虑风险。
螺旋一圈/一层演化要经过的4个步骤是:
- 制定计划:确定软件的目标,选定实施方案,明确项目开发的限制条件;
- 风险评估:原型作为降低风险的机制;
如果风险不能排除,则停止开发工作或大幅度地削减项目规模。如果成功地排除了所有风险,则启动步骤3
- 实施工程:实施软件开发
本步骤从内到外相当于一个瀑布模型线性的生命周期
- 用户评估,提出建议,计划下一阶段。
模型优点:
1、规避风险、早期错误,提供纠错机会
2、强调阶段质量
模型局限:
- 开发人员需要有较强的风险评估的经验;
适用场景:适用于开发大型系统,每个演化层都可以应对风险
螺旋模型强调风险分析,开发人员和用户在每一个演化层次,都可以更好地理解应对风险。因此,该模型适合用于庞大、复杂并且具有高风险的系统。
--------------
结构化方法
结构化方法 = 面向过程的方法= 传统软件开发方法
特点:
- 自顶向下分析设计,逐步求精
- 在获取完整需求之后实施开发部署
面向对象
面向对象 = 对象 + 类 + 继承 + 通信
- 认为客观世界由对象组成
- 具有相同属性和操作的对象,抽象为类,对象是类的一个实例
- 继承:类可以派生出子类,子类继承父类的全部属性和方法之外,还可以有自己的属性和方法
- 通信:对象之间通过消息传递维系
面向对象特点
- 抽象性:对象的数据抽象和行为抽象;
- 封装性:信息隐蔽
- 共享性
同一类中所有实例共享数据结构和行为特征;
同一应用中所有实例通过继承共享数据结构和行为特征;
不同应用中所有实例通过复用共享数据结构和行为特征
名词解释
对象 = 一组属性+对属性的操作
类:具有相同属性和操作的对象,抽象为类,对象是类的一个实例
对象vs 类
- 类包含对象所有属性和操作,是对象的抽象末班;对象是类的实例
- 类可以创建多个对象
- 类本身不完成操作,只定义;对象完成操作
消息:实现对象间监护的手段
继承(Inheritance):抽象
继承是用来实现代码复用和设计复用的机制,是面向对象程序设计的重要特性之一。设计一个新类时,如果可以继承一个已有的设计良好的类然后进行二次开发,无疑会大幅度减少开发工作量。
把几个类之间共有的属性和行为,抽取放在一个泛化类中
把几个类各自特有的属性和行为,放在特殊化类中。
则可建立区特殊化类,对泛化类的继承。
派生类可以继承父类的公有成员,但是不能继承其私有成员
- 子类救护车,警车,消防车类都可以继承汽车父类的轮胎,方向盘公有属性,以及启动,刹车等共有方法。
- 子类救护车,警车,消防车类各自可以有各自的颜色,尺寸属性;
多态
是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。
如:派生类继承了基类行为和属性之后,对继承来的某些行为进行改变。
>>> class Animal(object): # 基类
def show(self):
print("i'm an animal")
>>> class Dog(Animal): # 继承基类的show方法
def show(self): # 重写
print("i'm a dog")
>>> class Cat(Animal):
def show(self):
print("i'm a cat")
>>> class Test(Animal):# 没重写
pass
>>> Dog().show()
i'm a dog
>>> Cat().show()
i'm a cat
>>> Test().show()
i'm an animal
UML
RUP统一开发过程(rational unified process)
面向对象的软件工程过程。
采用准确的UML描述系统模型基础体系结构。
定义:RUP是用例驱动的,以体系结构为核心的,以质量控制和风险管理为目标的,迭代的,增量的开发过程。
二维软件开发模型:
- 横轴:时间(周期:初始、细化、构造、移交)
- 纵轴:内容(开发过程的工作流)
更多推荐


所有评论(0)