第六章 敏捷开发与配置管理

课程来源: 学堂在线 -- 清华大学 -- 软件工程

6.1敏捷开发之Scrum

Scrum方法是1995年由Ken Schwaber和Jeff Sutherland博士共同提出,已被众多软件企业广泛使用,如Yahoo, Microsoft, Google, Motorola, SAP, IBM 等。

Scrum框架

整个开发过程是由若干个很短的迭代周期组成,一个短的迭代周期称为一个Sprint。

  • 一个Sprint是一个1-4周的迭代,它是一个时间盒。
  • Sprint的长度 一旦确定,将保持不变
  • Sprint的产出是"完成 "的、可用 的、潜在可发布的产品增量。

Scrum团队角色

自组织团队是敏捷软件开发的基本观念,即团队被授权自己管理他们的工作过程和进度,并且团队决定如何完成工作(任务的分配、技术决策、制定团队内部行为准则、保持过程透明度、监督和管理团队工作过程和进度)。

Scrum制品

产品订单:包含开发和交付成功产品所需要的所有条件和因素。产品订单的条目可以是功能性需求也可以是非功能性需求,还可以是主要的技术改进目标(如用Java代替C++重写系统以及已知的缺陷)。

迭代订单:团队承诺的在当前迭代要完成的任务列表,是通过选取产品订单项,来进一步细化和分解形成的。目的是将产品订单项转化为潜在的、可交付的产品增量。

可工作软件: 迭代开发的产出结果,是可以交付的产品增量,可交付的标准是在迭代初期设定的,每一次迭代都应该是一个可运行的版本。

产品订单

在迭代计划时,产品负责人告诉开发团队需要完成产品订单中的哪些订单项,开发团队决定在下一次迭代中他们能够承诺完成多少订单项。在迭代的过程中,没有人能够变更迭代订单,这意味着在一次迭代中需求是被冻结的。

用户故事

用于描述产品订单条目,是从用户的角度来描述他所期望得到的功能。

可视化管理

任务白板是团队开发的晴雨表,它将团队的任务和进度可视化地展现出来。而引入电子白板可能会削减团队之间的沟通,降低团队的透明度,违背了敏捷重视人和团队的原则。

燃尽图:以图形化方式展现了剩余工作量(Y轴)与时间(X轴)的关系。

Scrum规划

迭代计划会议

在每次迭代(或冲刺)开始时召开,一般是2~4小时,目的是选择估算本次迭代的工作项

  • 第一部分:以需求分析为主,选择和排序本次迭代需要实现的订单条目
  • 第二部分:以设计为主,确定系统设计方案和工作内容

整个团队全员参与,产品负责人逐条讲解最重要的产品功能,开发团队共同估算所需工作量 ,直到本次迭代的工作量达到饱和为止。

产品负责人回答与需求相关的问题但不干涉估算的结果

每日站立会议

会议目的

  • 团队在会议中做计划,协调其每日活动,还可以报告和讨论遇到的障碍。
  • 任务板帮助团队聚焦于每日活动上,应在这个时候更新任务板和燃尽图。

每个团队成员需要回答

  1. 上次例会后完成了什么?
  2. 遇到了什么困难(或障碍)?
  3. 下次例会前计划做什么?

有简要的问题澄清和回答,但不应该有任何话题的讨论,是开发团队内部沟通会议,<=15min

迭代评审会议

会议目的

Scrum团队在会议中向最终用户展示迭代的工作成果,团队成员希望得到反馈,并以之创建或变更 Backlog 条目。

基本要求

  1. 由团队展示有可能发布的产品增量,听取用户对产品功能的反馈
  2. 允许所有参与者尝试由团队展示的新功能
  3. 用户对团队演示的产品功能进行反馈

在迭代结束时候召开,由开发团队和相关人员一同评审迭代产出

迭代回顾会议

每一次迭代完成后,都会举行一次迭代总结会,会上所有团队成员都要反思这个迭代。举行迭代总结会议是为了进行持续过程改进,时间限制在1小时左右。

关键要点

  • 会议气氛:团队全员参加,气氛宽松自由,畅所欲言,发现问题和分析原因;
  • 关注重点:每次仅就1-3个关键问题做出可行的(方法简单、影响范围小、见效快,目标现实可行、积少成多)解决方案;
  • 跟踪闭环:可以放入下一次迭代订单中执行改进。

6.2 用户故事与估算

用户故事

用户故事(User Story)是从用户角度对功能的简要描述。

  • 独立性::尽可能避免故事之间存在依赖关系,否则会产生优先级和规划问题。
  • 可协商:故事是可协商的,不是必须实现的书面合同或者需求。
  • 有价值:确保每个故事对客户或者用户有价值的,最好是让用户编写故事。
  • 可估算:开发者应该能够预测故事的规模,以及编码实现所需要的时间。
  • 短小的:故事尽量短小,最好不超过10个理想人天,至少在一个迭代中完成。
  • 可测试:所编写的故事必须是可测试的。

用户故事类型

功能性需求,具体的是什么类型的用户,有什么样的需求,最终为了呈现什么样的效果

非功能性需求,如需要使用什么样的浏览器类型、技术增强以及缺陷修复等

产品订单

一系列用户故事的列表

敏捷估算

测算时,统计每个迭代所有已经完成的故事,对于没有完成的故事不计算在内

原则:开发团队一起估算,产品负责人和Scrum主管不参与实际估算(产品负责人负责阐述的澄清,Scrum主管负责指导和引导)

估算不是承诺,不应因其他因素而人工放大,成为团队与管理层之间的抛球游戏

准确与精确:估算应该准确但不必过分精确,过于精确的估算是浪费。

应该使用相对大小而非绝对大小进行估算

度量单位

故事点:一个相对度量单位。使用时,可以给每个故事分配一个点值;点值本身并不重要,重要的是点值的相对大小。

理想时间:一个绝对度量单位。理想时间是某件事在剔除所有外围活动以后所需的时间;一般为一天有效工作时间的 60-80%比较合理,但绝不会是全部。

理想时间

估算方法:团队查看每个故事,针对前面介绍的复杂性要素讨论故事,然后估计要用多少理想时间可以完成该故事。

  • 这种方式是人们平时习惯使用的,容易理解和使用
  • 人天生不擅长做绝对估计,很难达成共识
  • 不同人的理想时间估算是不同的,因每个人的能力和认识的不同而不同
  • 每个人的理想时间是不一样的,这种估算不能相加,由此产生的计划肯定是不准确的

故事点

基本做法

  • 给一些简单的"标准故事"设定一个"标准点数",形成比较基线;
  • 其他故事与标准故事进行比较,给出一个相对的比例,得到该故事的一个估计值。

使用难点

  1. 故事点的项目或产品特征很明显,几乎无法进行跨团队比较;
  2. 如果没有历史数据,很难设定标准故事。

敏捷估算扑克

本质上是扑克牌,它基于Delphi估算原理,可以快速地估算出需要的数字。

分牌:每名参与估算的成员分得相同花色的一组牌,两张Joker不参与估算。

讲解订单故事:产品负责人从Backlog中选择一个条目,为大家详细讲解该条目;团队成员进行讨论并提问,产品负责人逐一解答大家的问题。

估算:当团队成员确认已经对该条目完全了解且无任何重大问题后,大家开始进行估算,同时选出代表自己估算值的纸牌,在所有成员选牌完毕后大家同时亮牌。

争论与讨论:若每张牌估算值差距明显,代表大家对该条目没有获得共识,需要对评估结果进行讨论。

共识:对该条目重新进行估算,直到团队的评估数值达成一致。

  • 一般情况下,最多三轮就可以得出一个比较统一的意见;如果三轮之后依然没有得到统一的意见,那么Scrum主管应立即中断估算,取平均值或其他大家接受的值作为估算结果。

6.3 团队协作工具Tower

6.4 配置管理

软件配置管理

一种标识、组织和控制修改 的技术,它作用于整个软件生命周期,其目的是使错误达到最小并最有效地提高生产率。

软件配置项

软件配置项(Software Configuration Item,简称SCI)是为了配置管理而作为单独实体处理的一个工作产品或软件。

版本

版本是在明确定义的时间点上某个配置项的状态;版本管理是对系统不同的版本进行标识跟踪 的过程,从而保证软件技术状态的一致性,是软件配置管理的核心内容

一个配置项,例如一个源程序文件,可以有一个主干版本,也可以由某个版本的状态产生若干分支,分支版本也可以合并到主干上面

基线

基线(Baseline)是软件配置项的一个稳定版本,它是进一步开发的基础,只有通过正式的变更控制过程才能改变。

版本控制

独占工作模式

并行工作模式

支持多个人共同修改同一个文件

分支管理

分支包含了一个项目的文件树及其发展的历史,记录了一个配置项的发展过程。分支包含了一个项目的文件树及其发展的历史,记录了一个配置项的发展过程。

  • 代码库应该有一个且只有一个主分支,所有提供给用户使用的正式版本都在主分支上发布
  • 主分支只是用来发布重大的版本,日常的开发应该在另外的分支上完成
  • 如果开发分支上的文件需要正式对外发布,就在主分支上对开发的分支进行合并
  • 除了主干和日常开发分支之外,还有一些临时性的分支,用以应对一些特定目的的版本开发,例如功能分支或者缺陷修复分支等

实现多人并行开发一个新系统,同步地更改多个并行版本的错误以及同时集成和发布多个版本

软件配置管理工具

Git

最初由 Linux Torvalds 编写,用作Linux 内核代码的管理,后来在许多其他项目中取得很大的成功。它除了常见的版本控制管理功能之外,具有处理速度快、分支与合并表现出色的特点。

Github是一个基于 Git 的开源项目托管库,目前成为全球最大的开源社交编程及代码托管网站。它可以托管各种 Git 库,并提供一个 Web 界面。

6.5 软件配置管理工具Git

版本库

远端版本库:非本机上,例如放在服务器上或第三方托管主机上

本地版本库

创建与提交

Unix系较新的操作系统一般自带,Linux在apt-get可以安装,OS X可以port安装或在htt p://sourceforge.net/projects/git-osx-installer/下载安装。

Windows没有自带git,msysGit项目提供了安装包,可以在https://git-for-windows.github.io/下载安装。

git init 将创建的空文件夹变成一个空的版本库

git status 列出当前版本库尚未提交的改动(将这些改动称为未跟踪的文件)

git add file.txt 将file.txt文件标记,该文件被git版本库获知了(已经被跟踪了)

git commit -m "msg" msg为提交消息,这样就会把版本库中已经被跟踪的所有文件一同提交到版本库中

克隆到本地

从远端拉取

将远端版本库的内容与本地版本库进行同步

git pull 自动从远端拉取文件commit,这样变动的文件就同步到本地

提交到远端

将本地版本库中的变动同步到远端版本库,实现远端版本库的文件变动

git push 要求本地版本库有远端版本库中所有的commit

一般先git pull 再进行文件变动并提交后再git push

撤销变动

git reset HEAD file4.txt 将fiile4.txt的改动设置成未跟踪的状态,但是改动仍然存在

git checkout --file4.txt 彻底抛弃这个文件改动,恢复到上次commit的样子

修改提交

git commit --amend 将此次的修改增加到上一次的commit中

增加新分支

合并分支

冲突处理

删除本地分支以及远端分支

Sourcetree | Free Git GUI for Mac and Windows

6.6 持续集成与交付

DevOps基本概念

为什么需要DevOps?

快速的集成和交付部署

  • 更快从用户那里得到使用反馈
  • 更可以迅速对产品进行改进
  • 更好地适应用户需求和市场的变化

DevOps和敏捷开发的关系

开发团队和运维团队的协同成为快速交付高质量软件的瓶颈

DevOps是什么

目的:加强开发团队和运维团队的协作 使用自动化工具,尽早发现风险,实现持续、快速、可靠地交付高质量软件产品

DevOps实践

总结+概括如下

配置管理

软件配置管理的核心是版本控制。

持续集成(Continuous Integration CI)

开发者在代码的开发过程中,可以频繁地将代码部署和集成到主干,并进行检查、自动化测试和编译构建。

持续交付(Continuous Delivery CD)

在持续集成的环境基础上,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状况。

持续部署:在持续交付的基础上,把部署到生产环境的过程自动化。

提交集成:开发人员在开发环境中完成编码和单元测试之后,将代码提交到仓库中并发起集成

提交集成会触发私有构建,其目的是防止具有明显错误的代码进入仓库,从而保证代码的质量

集成构建:构建出产品的部署包,按线序进行编译、单元测试、代码扫描、打包

自动化功能测试、手工验收测试: 新功能是否符合要求

性能测试、安全测试:部署到预发布环境中,并进行印证,确定是否可以部署到生产环境中

DevOps工具链

相关推荐
Wh0taku20 小时前
【软件工程大系】净室软件工程
软件工程
lina_mua3 天前
软件工程知识体系全面梳理
软件工程
光头颜4 天前
UML之序列图的消息
软件工程·uml
aiden:)4 天前
设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用
java·开发语言·设计模式·软件工程·软件构建
Dola_Zou4 天前
在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系
安全·自动化·软件工程·软件加密
未定义.2215 天前
UML-饮料自助销售系统(无法找零)序列图
设计模式·流程图·状态模式·软件工程·需求分析·uml
MyselfO(∩_∩)O6 天前
软件工程第二章
软件工程
未定义.2216 天前
Java设计模式实战:装饰模式在星巴克咖啡系统中的应用
java·开发语言·设计模式·软件工程
江城月下6 天前
SOLID原则详解:提升软件设计质量的关键
java·spring·mybatis·软件工程·设计原则·设计规范