软件工程笔记2-软件生成期模型
Published:
在一座黑塔里住着野兽,那座塔没有门也没有窗,没人能进去,也没人能离开。塔顶有一座骨头制成的牢笼,笼中羁押着的灵魂窥视着太阳。那座塔是我的身体,年笼是我的头骨,那正在唱歌聊以自慰的灵魂是我。但我还是很痛苦,我很孤独。杀了我吧。
软件生成期模型
瀑布模型、快速原型模型、增量模型、喷泉模型、统一过程、基于构建的开发模型、敏捷模型

瀑布过程
早期使用的模型。顺序依赖,物理实现推迟,保证质量,规范开发过程
需求分析→规格说明→设计→编码→综合测试→维护
强调反馈和迭代

瀑布模型特点
- 阶段间具有顺序性和依赖性
- 必须等前一阶段的工作完成之后,才能开始后一阶段的工作
- 前一阶段的输出文档就是后一阶段的输入文档
- 推迟实现的观点
- 瀑布模型在编码之前设置了系统分析和系统设置的各个阶段。分析和设计阶段的基本任务规定,在这两个阶段主要考虑目标系统的逻辑模型,不涉及软件的无力实现
- 清楚地区分逻辑设计与物理设计,尽可能推迟软件的无力实现,是按瀑布模型开发软件的一条重要指导思想
- 质量保证的观点
- 每一阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务
- 每个阶段结束前都要对所完成的文档进行评审,以便及时发现问题,改正错误
瀑布模型优点
- 可强迫开发人员采用规范化的方法
- 严格规定了每个阶段必须提交的文档
- 要求每个阶段交出所有产品都必须是经过验证(评审)的
瀑布模型缺点
- 由于瀑布模型几乎完全依赖于书面的规格说明,可能最终开发出来的软件产品不能真正满足用户的需要。如果需求规格说明与用户需求之间有差异,就会发生这两种情况
- 瀑布模型只适用于项目开始时需求已确定的情况
V模型:瀑布模型的变体

快速原型模型
快速原型完成的是最终产品功能的一个子集,解决瀑布模型需求分析不完善的问题。快速原型本质是快速,目的是获知用户的真正需求,需求确定了就可抛弃原型或在原型的基础上继续开发。

快速原型的优点
- 有助于满足用户的真实需求
- 原型系统已经通过与用户的交互而得到验证,产生的规格说明文档能正确的描述用户的需求
- 不会因规格说明文档的问题进行较大返工
- 开发原型的过程积累的经验,会在设计编码阶段发生错误的可能性更小,减少后续阶段弥补错误的可能性
- 开发按线性顺序进行。
增量模型
将软件产品作为一系列增量构建来设计、编码、集成、测试。每个构建2由多个相互作用的模块构成,并且能完成特定的功能

增量模型的优点
- 较短时间内就可以完成一些有用的工作产品,用户就能做一些有用的工作
- 用户有较充裕的时间学习适应新产品,降低软件给用户带来的冲击
- 项目失败风险低,若增量构建出问题,其他构建仍可以交付给用户
- 优先级高的服务先交付,然后再其他增量构建,因此最重要的服务将接受最多的测试
增量构建的开发可采用瀑布模型方式

开发时需注意
- 软件体系需开放,以便向现有产品加入新构建
- 新的构建不得破坏原有软件产品
螺旋模型
将瀑布模型与快速原型模型结合起来,并且加入两种模型均忽略的风险分析。可以把他看作每个阶段之前都增加了风险分析过程的快速原型模型


在螺线上每个循环表示过程的一个阶段:
对于每个阶段:
- 确定该阶段的目标,为实现这些目标选择方案及设定这些方案的约束条件(约束:非功能需求)
- 从风险角度分析上一步的工作结果,努力排除各种潜在的风险(通常使用建造原型的方法)
- 以瀑布模型的方法开发本阶段
- 评价本阶段工作成果,并计划下阶段的工作
螺旋模型的四项活动(对应四个象限):
- 目标设定:定义目标,理清限制条件,指定管理计划,识别分析(并设置风险对策)
- 风险估计与弱化:分析风险,设想弱化风险的步骤
- 开发与验证:选择系统开发模型
- 计划:评价开发工作,确定是否进行下个循环以及下阶段的工作
螺旋模型的优点:
- 强调可选方案和学术条件,有利于已有软件的重用,将软件质量作为软件开发的重要目标
- 减少过多测试或测试不足带来的风险
- 维护是模型的另一个周期,因此在维护和开发之间没有本质区别
螺旋模型的缺点:
螺旋模型是风险驱动的,软件开发人员必须具有丰富的风险评估经验
喷泉模型
喷泉模型是典型的面向对象生命周期模型,“喷泉”一词体现了迭代和无间隙特性

统一过程

统一过程的工作流:
- 业务建模工作流:用商业用例为商业过程建立文档
- 需求工作流:描述做生命,需明确系统的功能需求和非功能需求(约束)
- 分析设计工作流:说明如何做,结果是分析模型和设计模型
- 实现工作流:用分层的方法组织代码结构,用构建形式实现类,对构建进行单元测试,将构建集成到可执行的系统中
- 测试工作流:验证对象间的交互,构建集成完整,需求完全实现,差错并改正
- 部署工作流:制作发布版,软件打包,分发,为用户提供支持
统一过程的阶段:初始、细化、构造、移交
- 初始阶段:关注项目计划和风险评估
- 细化阶段:关注系统的总体框架,细化初始需求,体系结构,监控风险并细化优先级,细化业务案例以及指定项目管理计划
- 构造阶段:建立系统,以交付β测试版本结束
- 移交阶段:包含β测试时期,以发布完整的系统终止
基于构建的开发模型
考虑的焦点是“集成”,而不是“实现”。开发可复用的构建来满足大型软件系统中存在的共用性
体系结构设计完成后,并不立即进行详细设计,而是针对每一系统需求考虑以下问题:
- 现有的商品化构建(COTS)能否实现该需求?
- 内部开发的可复用构建是否能实现该需求?
- 可用构建的接口与待构造的体系结构是否相容?

开发步骤(不考虑构建的开发技术):
- 对于该问题领域的基于构建的可用产品进行研究和评估
- 考虑构建集成的问题
- 设计软件架构以容纳这些构件
- 将构建集成到框架中
- 进行充分的测试以保证功能正常
敏捷过程
敏捷原则
- 我们最优先要做的是通过尽早、持续交付有价值的软件来使客户满意。
- 即使在开发的后期,也欢迎需求变更。敏捷过程利用变更为客户创造竞争优势。
- 经常交付可运行软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
- 在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
- 围绕有积极性的个人构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。
- 在团队内部,最富有效果和效率的信息传递方法是面对面交谈。
- 可运行软件是进度的首要度量标准。
- 提倡可持续的开发速度。责任人(sponsor)、开发者和用户应该能够长期保持稳定的开发速度。
- 不断地关注优秀的技能和好的设计会增强敏捷能力。
- 简单——是减少不必要工作量的艺术——是必要的
- 最好的架构、需求和设计出自于自组织团队。
- 每隔一定时间,团队会反省如何才能更有效地工作,并相应调整自己的行为。
敏捷开发宣言
- 个体和交互胜过过程和工具
- 可工作软件胜过宽泛的文档
- 客户合作胜过合同谈判
- 响应变更胜过遵循计划
敏捷开发更适合具有以下特征的软件开发项目:
- 难以预测哪些需求稳定,哪些需求困难
- 设计和构建是交错进行的(在构建验证之前很难估计应该设计到什么程度)
- 分析,设计,构建,测试并不像设想中那么容易预测
极限编程(Extreme Progrmming, XP)
最为广泛使用的敏捷过程,包括策划、设计、编码、测试,四个框架活动的规则和实践
极限编程的主要目标在于降低因需求变更而带来的成本。 采用迭代的交付方式,每个迭代很短(1-3周时间)。在每个迭代结束的时候,团队交付可运行的,经过测试的功能,这些功能可以马上投入使用。
极限编程的框架活动:
- 策划:
- 构建“用户故事”,评估每个故事给出成本
- 将故事分组用户可交付增量,并对发布时期做出承诺
- 第一个版本发行后,项目速度将邦族建立后续发布日期
- 设计:
- 保持简洁原则,鼓励使用CRC(类,责任,协作者)卡片
- 对实现困难的部分设计可执行原型,实现并评估原型
- 鼓励重构
- 编码:
- 建议在编码之前为每个故事建立一系列单元测试
- 鼓励结伴编程
- 测试:
- 所有单元测试每天都要执行
- 验收测试由用户定义,着眼于用户可见的,可评审的系统级的特征和功能



敏捷开发流派
Scrum开发模型


SAFe,精益企业规模化敏捷框架





迭代前开发准备

用户故事
迭代前开发准备







迭代开发




















