gitbook/软件工程之美/docs/85018.md
2022-09-03 22:05:03 +08:00

195 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 07 | 大厂都在用哪些敏捷方法?(下)
你好,我是宝玉,我今天继续与你分享大厂的敏捷方法应用。
在上一篇文章中,我们一起看了一下大厂和敏捷相关的一些流程规范,同时也为你留了一道思考题:
> 如果每周一个Sprint怎么保证每周都有交付还能保证产品质量
所以在这一篇中我们就以每周一个Sprint的小项目组为例看看它的日常是怎么应用敏捷开发的。
## 一个应用敏捷开发的小组日常
这个小组是做网站开发的基于微服务负责网站的某一个小模块。标准配置7人左右4个程序员至少有一个资深程序员有架构能力1个产品经理Scrum里面叫Product Owner1个测试1个项目经理Scrum里面叫Scrum Master。主要负责网站某模块的日常维护。
在分工上:
* 产品经理写需求设计文档将需求整理成Ticket随时和项目成员沟通确认需求
* 开发人员每天从看板上按照优先级从高到低领取Ticket完成日常开发任务
* 测试人员测试已经部署到测试环境的程序如果发现Bug提交Ticket
* 项目经理:保障日常工作流程正常执行,让团队成员可以专注工作,提供必要的帮助,解决问题。
在敏捷开发框架下已经形成了一些很好的敏捷实践这个小组也是基于Scrum方法做过程管理基于极限编程做工程实践看板可视化。每周一个Sprint。
* **如何完成需求和修复Bug**
这个小组的日常工作也是围绕Ticket来开展的。所有的需求、Bug、任务都作为Ticket提交到项目的Backlog每个Sprint的任务都以看板的形式展现出来。
每个人手头事情忙完后就可以去看板上的“To Do”栏按照优先级从高到低选取新的Ticket。选取后移动到“In Progress”栏。
* **每周一部署生产环境**
没有人愿意星期五部署,那意味着如果部署后发现故障,可能周末都没法好好休息了。所以即使程序早已经测试好了,除非特别紧急,否则都会留在下一周再部署。所以部署放在上半周,这样后面遇到问题还有足够的时间去应对。
部署很简单,按照流程执行几个命令就可以完成生产环境部署。部署完成后,需要对线上监控的图表进行观察,如果有问题需要及时甄别,必要的话对部署进行回滚操作。**但轻易不会打补丁马上重新上线,因为仓促之间的修复可能会导致更大的问题。**
像敏捷开发这样一周一个Sprint的好处之一就是即使这一周的部署回滚了下周再一起部署也不会有太大影响。
* **每周二开迭代回顾会议总结上个Sprint**
每周二的早上,这个小组一般还会预留一个小时的时间,因为常规的站会完成后,还有一个**迭代回顾会议(Sprint Retrospective)**会议,目的是回顾一下在迭代中,团队有哪些做的好的地方,有哪些做的不好的地方。
对于需要后续改进的需要创建相应的Ticket加入到Backlog中在后续迭代中改进完善。
例如会议上测试人员反馈说上一个Sprint开发人员上线前几个小时还往预部署的分支里面更新代码导致测试需要重新做回归测试但因为时间不够了没来得及测试完整导致上线后不稳定建议以后不要随意在上线前在部署分支更新代码。
对于这样的问题,可能不止一次发生,说明流程上还是存在问题。所以最后大家商定,以后如果不是紧急的修复,就不要在预部署的分支上更新,确实要加,需要和测试先确认。
如果会议中要形成涉及项目的决策,最好是通过集体表决的方式决策,尽可能避免独裁式决策。因为敏捷的原则之一是要**善于激励项目人员,给他们以所需要的环境和支持,并相信他们能够完成任务。**
* **每周四迭代规划会,计划下周工作**
每周四早上,也需要一个小时来组织会议。因为常规站会完成后,还有一个**迭代规划会Sprint Planning Meeting**。这个会议是要大家一起讨论下一个Sprint 的内容。
在开会之前产品经理和项目经理会商量好Ticket的优先级会议上大家一起按优先级从高到低的顺序从Backlog中选出下个Sprint的内容。
团队每个成员都要对候选的下个Sprint Backlog中的Ticket从1-5分进行打分1分表示容易1天以内可以完成的工作量2分表示2天内可以完成的工作5分表示非常复杂需要5天以上的工作量。
这里需要注意,打分时,要大家一起亮分,而不是挨个表态,不然结果很容易被前面亮分的人影响。
**评估每条Ticket工作量的大概流程如下**
1. 会议组织者阅读一条Ticket可能是用户故事可能是Bug可能是优化任务。同时会询问大家对内容有没有疑问。
2. 大家一起讨论这个Ticket确保充分理解这个Ticket。
3. 每个团队成员在心中对Ticket进行工作量估算。
4. 会议组织者确认大家是否都已经确定估算结果确认后开始倒数“321”大家一起伸出一只手亮出代表分数的手指头。
5. 如果估算结果存在分歧,出分最高的和最低的各自说明理由,讨论后达成一致。
这种估算工作量的方法有个名字叫估算扑克,因为亮分时用扑克牌亮分而得名,但并非一定要用扑克牌。
**用这种方式评估工作量有几点很明显的好处:**
1. **大家积极参与,详细了解需求。**相比以前,可能只有当某个功能模块分配到自己头上的时候,才会去详细了解那部分需求,而其他开发人员可能都不了解这部分需求。
2. **工作量是由实际参与开发的成员作出评估,往往更准确也更容易被接受。**以前项目经理代为估算的模式,很容易不准确,或者让开发人员抵触。
3. **促进成员的交流和经验分享。**我们知道一般经验浅的新手估算工作量都会偏乐观,而经验丰富的老手则会更准确,通过这种方式,新手可以向老手学习到很多工作量估算甚至技术实现的经验。
所以在经过几个Sprint的磨合后一般一个团队在每个Sprint的产出是比较稳定的。比如说这样一个7人的小团队一个Sprint预计可以完成20-30分的Ticket。
* **每周五分支切割**
周五标志着一周的工作要结束了所以下班之前4点左右要做branch cut分支切割也就是要把当前主干上的代码克隆到一个分支branch上。
为什么要做分支切割这一步操作呢?
经过一周的开发master 主干已经合并了不少新的PRPull Request合并请求但是如果你直接把master的代码部署到生产环境肯定还是不放心毕竟自动化测试还是不能完全代替专业测试人员的测试。
所以我们需要把master上的代码部署到测试环境进行测试并且对测试出来的Bug进行修复直到稳定下来为止。由于master还需要一直合并新的功能所以最好的方式就是每次Sprint结束从master创建一个分支版本出来然后基于这个分支部署和修复Bug。
所以需要基于主干做一个branch cut创建一个预部署的分支将预部署分支的代码部署到测试环境这样在下周测试人员就可以测试新的版本。测试验收通过后预部署分支的代码会部署到生产环境。
![](https://static001.geekbang.org/resource/image/a1/67/a1ff4dc93ffa7d68ab5d757317623167.png)
* **每周轮值**
小组里面除了日常开发工作以外其实还有不少琐碎的事情比如每周部署生产环境每天部署测试环境每周的branch cut分支切割回答其他小组的问题主持每日会议不一定需要项目经理这些事情如果都是一个人做难免会有些枯燥。
在敏捷开发中,鼓励发挥每个成员的主动性,所以每周轮值是一个不错的方式,可以让每个人都有机会去体验一下,帮助团队完成这些事情,更有集体荣誉感和责任感。
## 一些问题解答
上面只是选取的一个项目小组的日常,所以估计你看完还会有些疑问,在这里我把可能的问题列一下,先行解答一下。
**1\. 基于这种敏捷开发的方式加班多吗?**
其实加不加班,绝大部分时候和是不是敏捷开发没关系的,还是看项目组的情况。
通常来说基于敏捷开发一个Sprint、一个Sprint迭代节奏还是比较稳定的这个Sprint做不完的任务也可以顺延到下个Sprint不影响发布。不像瀑布模型那样前松后紧后期加班可能性大一些。
**2\. 一周一个迭代怎么保证质量?**
以前我在使用迭代模型开发时一般是4周左右的迭代周期2周就是极限了所以最开始看敏捷开发用1周的迭代周期心中也有疑惑1周时间又要开发又要测试怎么保证质量
实际实践下来发现1周一个Sprint确实可行而且质量也可以有保障这里面有几个因素
a 有足够比例的自动化测试代码,可以很好地保证质量。当用户的主要功能都通过自动化测试覆盖时,基本可以保证主要功能流程不会出问题。
b 一个Sprint开发完成后并不马上部署生产环境而是先部署到测试环境会有1周时间测试。
c 有专业的测试人员进行测试,并非完全依赖自动化测试。有时候一些大的功能更新,甚至会组织全组成员一起测试,以弥补测试人员不足的情况。
在一个Sprint开发结束后并不马上部署生产环境而是先部署测试环境测试。
![](https://static001.geekbang.org/resource/image/30/c5/30f2a81130d5adc74921c88a0f7464c5.png)
也就是说虽然是1周的Sprint但是其实还有1周的时间进行测试。每个Sprint不仅开发新功能还要同步修复以前版本的Bug。
这样基本上可以保证有好的质量。而且这种1周的迭代可以保持每周都有内容更新还有个好处就是每周更新的内容不多出现问题的话很容易就定位到是什么地方导致的问题。
**3\. 基于敏捷开发如何做计划?**
大厂里面通常会在上一年底确定第二年整年的大的开发计划,并确定上线的时间范围,每个季度再根据情况做一些调整。
这些大的计划最终会变成具体的开发任务一个大的开发任务会分拆到各个部门各部门再将任务分拆到各个项目组。基于敏捷开发的话主要就是看把这些开发任务放到哪几个Sprint去做并且确保在规定的时间范围内完成。
至于工期的估算在迭代规划会上会对每个Ticket进行打分根据分数可以预估有多少工作量要花多少时间。
**4\. 如何沟通协作?**
组和组之间的沟通协作主要通过邮件、会议、内部沟通工具最终任务会以Ticket的形式体现。
团队内部的话,因为都在一起,所以沟通起来很方便,每天站立会议都是很好的沟通方式。
在敏捷开发中,有一种实践叫结对编程,就是两个程序员在一台电脑上一起工作。这个一直争议比较大,但是如果用来两人一起排查一些问题,或者是资深程序员带新手程序员,则是一种非常好的协作方式。
**5\. 上面介绍的实践案例和标准Scrum有什么不同**
我上面介绍的内容确实和标准的Scrum有不少不一样的地方。
首先是角色名称不一样在Scrum里面是分Product Owner、Scrum Master和Team三种角色而在这个案例中是产品经理、项目经理和团队成员但其实只是名字叫法不一样。
还有要注意一点就是传统的项目经理会是偏控制型角色Scrum Master则更多是一种服务型的角色主要职责是保障敏捷流程的执行以及提供必要的帮助很多团队的决策就是采用集体决策的方式。
另外Scrum有四种会议除了前面介绍的三种每日站会Daily Scrum、Sprint计划会Sprint Planning和Sprint回顾会议Sprint Retrospective其实还有一种会议是Sprint评审会Sprint Review
Sprint评审会的作用是让客户审查Sprint的完成结果。因为上面这个小组并没有直接的客户都是完成产品经理提交的需求而且沟通紧密所以没有安排专门会议。
这个小组的站立会议并不是“标准”的站立会议Scrum的站立会议通常只有15分钟并且只有轮流发言环节。
这里增加的每天审查Ticket环节主要是为了将优先级高的Bug修复之类的Ticket放到当前Sprint及时响应及时处理。有的项目组没有这个环节是由测试人员或者Scrum Master直接将Ticket放到看板。
这个小组并没有使用用户故事来开发需求而是由产品经理事先写好需求文档。在上一篇文章里面提到了Scrum采用用户故事的方式分拆需求减少繁重的需求文档在实现的过程中再沟通确认需求。
这是Scrum推荐的一种方式也是一种高效的方式但并不代表这是唯一的方式。如果有产品经理可以提前几个Sprint就将需求文档写详细一样可以达到高效的理解需求的效果。
那么这样还算敏捷开发么?
其实在[《05 | 敏捷开发到底是想解决什么问题?》](http://time.geekbang.org/column/article/84351)就有讲过,是不是敏捷开发,核心并不是应用了哪个方法,而是应用的时候,是否遵循了敏捷开发的价值观和原则。
比如说非标准的站立会议效率更优,那么就应该采用非标准的站立会议;如果有专业产品经理事先做好需求分析,可以达到解释清楚需求的效果,就没必要一定要用用户故事来理解需求。
## 总结
上一篇文章我们讲了大厂里和敏捷相关的一些流程规范,这一篇又讲了一个小组是怎么应用敏捷开发来开发项目的。
现在看上一篇文章中我留的思考题如果每周一个Sprint怎么保证每周都有交付还能保证产品质量想必你已经有了答案。
要保障质量,还是离不开充分的测试,不仅要有自动化测试,还要辅助一定量的人工测试。敏捷开发虽然求快,但是不代表应该牺牲质量。
其实大厂的敏捷实践并不神秘关键是分而治之最终团队小项目小所以才可以敏捷起来。大厂会注重流程和工具的应用通过Ticket的方式来管理和跟踪开发任务通过自动化的方式来部署。
大厂的敏捷实践一般是基于Scrum、极限编程和看板针对各自项目组的特点会有所侧重有所调整在遵循敏捷的价值观和原则的前提下做到高效使用。
希望上面介绍的敏捷应用,能对你理解敏捷开发有所启发,帮助你优化改进日常项目流程。还有要注意的一点就是,没有万能的开发模式,只有适合项目的开发模式,最重要的还是要摸索出一套适合你自己项目特色的开发模式。
限于篇幅对于Scrum、极限编程和看板我并没有展开细讲还需要大家自己辅助看看书我在[《学习攻略 | 怎样学好软件工程?》](http://time.geekbang.org/column/article/82697)和[《05 | 敏捷开发到底是想解决什么问题?》](http://time.geekbang.org/column/article/84351)文章中也列了一些参考书籍。
留言区有同学推荐的文章[《天下武功,唯快不破—新时代敏捷项目管理之道》](http://mp.weixin.qq.com/s/puMNz91hiQgio4wSCIrTgQ)对敏捷开发也有很不错的讲解,推荐阅读。
## 课后思考
看完本篇内容,你可以将上面介绍的开发模式和你现在的项目开发模式对比,你觉得有哪些好的地方可以借鉴?你觉得有哪些做的不够好,可以改进的地方?
另外你也思考一下为什么文章中这个项目没有在一个Sprint里面同时完成开发和测试而是把测试放在下一个Sprint这样做有什么优缺点欢迎在留言区与我分享讨论。
感谢阅读,如果你觉得这篇文章对你有一些启发,也欢迎把它分享给你的朋友。