2.1 过程与生命周期
2.1.1 过程的定义
1-1. 什么是软件过程
软件过程:一组有序的开发任务,它涉及活动、约束和资源使用的一系列步骤,用于产生某种想要的输出。
过程不仅仅是步骤,过程是步骤的集合,它将步骤组织起来使人们能够生产满足一系列目标和标准的产品。
2.1.2 软件生命周期
软件开发过程描述了软件产品从概念到实现、交付、使用和维护的整个过程,因此,有时把软件开发过程称为软件生命周期。
2.1.3 过程的重要意义
1-2 软件过程为什么重要
强制软件开发活动具有一致性和一定的结构,帮助开发人员理解、控制、检查、改善开发过程,使我们获取经验并把经验传授给他人。
- 它强制活动具有一致性和一定的结构。
- 过程结构允许我们分析、理解、控制和改进组成过程的活动,并以此来指导我们的活动。
- 它使我们获取经验并把经验传授给他人。
1-3 软件生命周期
软件生命周期:产品从概念到实现、交付、使用和维护的整个过程。
2.2 过程模型
2.2.1 原因
形成对软件开发中的活动、资源和约束的共同理解
有助于开发团队发现过程及其组成部分中存在的不一致、冗余和遗漏。修改后,过程会变得更加有效
发现并评价达到过程目标的合适的活动,根据模型评估候选活动是否合适
根据具体情况对每一个过程进行修改
2.2.2 瀑布模型 Waterfall Model
2-1. 瀑布模型
需求分析→系统设计→程序设计→编码→单元测试→集成测试→系统测试→验收测试→运行与维护
线性的安排每一个阶段,将开发阶段描述为从一个阶段瀑布般地转换到另一个阶段。一个开发阶段必须在另一个开发阶段开始之前完成。
需求分析
优点
2-2. 瀑布模型优点
优点:过程可见、方便监控
它的简单性使得开发人员很容易向不熟悉软件开发的客户作出解释。
每一个过程活动都有与其相关联的里程碑和可交付产品,以便于项目经理评估项目进度。
瀑布模型是最基础的模型,很多其他更复杂的模型实际上是在瀑布模型的基础上的润色,如加入反馈循环以及额外的活动。
缺点
2-3. 瀑布模型缺点
缺点:用户很难从一开始确定所有的需求,没有迭代,很难改变需求;没有把软件开发看成问题求解的过程
除了一些理解非常充分的问题之外,实际上软件是通过大量的迭代进行开发的。软件是一个创造的过程, 不是一个制造的过程。软件变动时, 该模型无法处理实际过程中的重复开发问题。
文档转换有困难。它说明了每一个活动的产品(例如,需求、设计或代码),但没有揭示一个活动如何把一种制品转化为另外一种制品(例如,从需求文档转化为设计文档)。
没有涉及到迭代,用户可能会频繁修改需求
原型化瀑布模型
确认:确保系统实现了所有需求。
验证:确保每一项功能都是正确的。
确认保证开发人员构造的是正确的产品,而验证检查实现的质量。
2.2.3 V模型 V Model
V 模型是瀑布模型的变种,它说明测试活动是如何与分析和设计相联系的。
编码位于 V 型的顶点,分析和设计在左边,测试和维护在右边。测试的每个步骤都与分析和设计相对应,如果在验证和确认期间发现了问题,可以重新执行响应的步骤加以修正。验收测试对应需求分析,系统测试对应系统设计,单元测试和集成测试对应程序设计。
V 模型与瀑布模型的区别:
- V 模型使得隐藏在瀑布模型中的迭代和重做活动更加明确。
- 瀑布模型关注文档和制品,V 模型关注活动和正确性。
2.2.4 原型化模型 Prototyping Model
之前在瀑布模型的优化中介绍了原型化的思想,原型化并不依附于瀑布模型,原型化模型本身是有效的过程模型的基础。因为它允许用户以独立的工程模型的方式, 每一阶段都基于原型的建立, 以快速构造系统, 逐步完成各阶段任务。
如上图所示,原型化模型并不依赖于明确的需求或设计,在情况不明朗的情况下使用原型化模型,先根据简单的需求和设计构造系统的简单样品以理解或澄清问题,以确保开发人员、用户和客户对产品达成共识。也就是说,要根据对每一阶段样品的反响明确需求和设计的具体内容。原型化设计有助于开发人员和客户达成共识,减少了开发中的风险和不确定性。但是为达成共识可能会需要反复进行原型设计。
2.2.5 阶段化开发模型 Phased Development: Increments and Iterations
3. 分阶段开发模型 分类特点
含义:将软件产品分阶段、分功能,一部分一部分的交付
特点:大幅缩短循环周期,有两个运行版本
分类:
- 增量式开发
- 迭代式开发
增量开发和迭代开发
因为有不断发布的开发系统和已经运行的产品系统,我们需要有一种组织两者的方式。增量开发和迭代开发是两种最常用的方式。
- 增量开发:系统需求按照功能分成若干子系统,开始建造的版本是规模小的、部分功能的系统,后续版本添加包含新功能的子系统,最后版本是包含全部功能的子系统集。(小的子系统→不断增加功能)
- 迭代开发:系统开始就提供了整体功能框架,后续版本陆续增强各个子系统,最后版本使各个子系统的功能达到最强。(全系统→不断完善功能)
两种开发方式结合的原因:
①观察用户反馈。
②为新功能开拓市场。
③及时修复问题。
④针对不同版本设置不同专业领域技术的优化。
2.2.6 螺旋模型 Spiral Model
4. 螺旋模型
含义:类似于迭代模型,将风险控制(risk control)结合起来,以控制最小化风险。
四个象限:计划;确定目标、可选方案及约束;评估风险;开发与测试
四次迭代:操作概念、软件需求、软件设计、开发与测试。
螺旋模型每次迭代有四个任务,依次是计划、目标/可选方案、风险评估、开发与测试。
螺旋模型共有四次迭代,依次是操作概念、软件需求、软件设计、开发与测试。
计划 目标 风险 开发测试
概念→需求→设计→测试
2.2.7 敏捷方法 Agile Methods
5. 敏捷开发 代表性方法
定义:重量级开发的对立面,具有下面4个原则的方法:
强调个人价值
时间花在写软件,而不是文档上
将精力集中在于客户合作而不是谈判
专注于对变化的反应而不是自定义计划后严格遵循
四个特性:
交流、简单性、勇气、反馈
敏捷开发过程的几种方法
①极限编程(XP):激发人员创造性,使管理负担最小的一组技术,是敏捷方法中最主要的流派。(稍后有详细介绍)
②Crystal (水晶法):每一个不同的项目都需要一套不同的策略、约定和方法论
③SCRUM(并列争球法):使用迭代的方法,其中把每 30 天一次的迭代称为一个“冲刺”,并按需求的优先级别来实现产品。
④Adaptive Software Development(ASD) (自适应软件开发)
⑤Feature Driven Development(FDD) (特征驱动软件开发)
这几种方法知道名字即可
敏捷方法的四条原则:
①个体和交互的价值胜过过程和工具。
②可以工作的软件胜过面面俱到的文档。
③客户合作胜过合同谈判。
④响应变化胜过遵循计划。
这四条原则反映了敏捷方法的软件过程倾向性。它强调人与人之间的交互是复杂的,并且其效果从来都是难以预期的,但却是工作中最重要的方面。
敏捷开发的总体目标:尽可能早的,持续的对有价值的软件的交付活动,以客户满意。
极限编程
四个准则:
①沟通: 客户与开发者之间持续的交流意见。
②简单性: 鼓励开发者选择最简单的设计或实现来应对客户的需求。
③反馈: 指在软件开发过程中的各个活动中,包含各种反馈循环工作。
④勇气: 指尽早的和经常性的交付软件功能的承诺。
十二条原则:
计划游戏、小版本、隐喻、简单设计、测试、重构、结队编程、代码集体所有、持续集成、每周工作 40 小时、现场客户、编码标准
2.3 过程建模工具和技术
2.3.1 两种主要种类的模型
静态建模——Lai 表示法
描述一个过程如何由输入转换为输出。
综合的过程符号描述系统, 允许人们在任何详细的层次上对任何过程建模, 该模型范式中可由人员完成角色,由资源完成活动, 最后导致软件工件/制品的产生。过程模型可以用角色、活动、加工项(工件)来显示彼此之间的关系,用状态表显示每个加工项(工件)在特定时间的完成情况。
过程的元素:
①活动:过程中要发生的事件。各种前后关系、触发条件、规则、团队成员等等。也可以理解为子过程。
②序列:活动顺序等等。
③过程模型:小型工程可以认为是开发方式等描述。
④资源:活动所需的各种资源标注。
⑤控制:针对活动的外部影响等。
⑥策略:各种指导原则,包括约束等。
⑦组织:各种层次化结构等描述。包括物理的和软件逻辑的结构。
动态建模
推演一个过程,用户和开发人员可以看到中间产品和最终产品如何随着时间的推移进行转换。
系统动力学:展示资源流(非一般性输入)如何通过活动成为输出。
什么是UP、RUP
RUP(Rational Unified Process):迭代开发的一种具体模型,是Rational软件公司创建的SE方法,是一种重量级的开发方法(适合大软件、大团队的开发)
UP是一种大的类型,RUP是这个公司开发的一种方法
习题
- 画一个图,描述为一次商务旅行购买飞机票的过程
- 选择一种表示法,并使用该表示法画出一个软件开发过程的过程图,对3种不同的设计进行原型化,并选出其中最好的一种设计