3.1.2 基于Scrum的敏捷实践
Scrum是一个轻量级的敏捷开发框架,它兼顾计划性和灵活性,鼓励团队在处理问题时灵活应变,总结迭代过程中的得与失从而不断改进。Scrum一词原本是橄榄球运动中的术语,将敏捷开发流程称之为Scrum,意味着在开发过程中要像打橄榄球一样动作敏捷,富有激情,你争我抢。Scrum之父Jeff Sutherland与Ken Schwaber给出了Scrum的价值观:
Scrum的成功应用取决于人们变得更加精通践行并内化5项价值观:承诺、专注、开放、尊重和勇气。
通常,一个Scrum团队的成员在10人以下,团队以迭代的方式交付项目,每个迭代周期称为Sprint,一般2~4周。
Scrum团队使用产品待开发清单(Product Backlog)来管理产品需求。待开发清单是一种从客户价值角度定义优先级的需求列表。待开发清单一般以条目化的方式来组织,每一条可以是新功能、对已有功能的改进,也可以是线上的缺陷。高优先级的条目要有详尽的描述。
在每个Sprint的开始阶段,团队成员要坐在一起开Sprint计划会议(Sprint Planning),针对待开发清单展开讨论,并选择合适的条目进入当前迭代周期,确定Sprint待开发清单(Sprint Backlog)与团队的共同目标(Sprint Goal)。
开发过程中要有每日立会(Daily Scrum),即每日站立会议,团队的开发人员需要回顾前一天做了什么并基于Sprint目标进行工作调整。每个Sprint内要完成开发测试及发布工作。Sprint结束之前要召开评审会议(Sprint Review)和回顾会议(Sprint Retrospective),用来审视当前Sprint内的成果,反思此Sprint内的得与失,从而在接下来的迭代周期内进行持续改进。此外,Scrum的Scrum(Scrum of Scrum)作为Scrum的补充,可以有效解决不同Scrum团队之间的合作问题。
上述Scrum的流程如图3-2所示。
图3-2
在实际的项目开发中,我们采用了Atlassian公司出品的项目与事务跟踪工具Jira。Jira作为一个商业平台被广泛用于项目管理、需求收集、敏捷开发、缺陷跟踪等领域。我们使用了Jira的Scrum Board、Scrum Backlog、Sprint燃尽图等敏捷管理功能。读者可以根据公司的实际情况,选择合适的敏捷管理平台。
此外,我们推荐使用基于Scrum的敏捷开发流程,并不意味着要将Scrum的理论生搬硬套到微服务开发过程中,而是要将理论与实践相结合,灵活变通进行实践。
传统的瀑布模型无法拥抱变化,也忽视了和用户的沟通,但作为经典的软件开发标准,它并非没有可取之处。例如开发的流程化、设计实现的文档化等瀑布模型所追求的方面,都有助于团队中经验不足的成员成长。另一方面,虽然Scrum定义了Scrum的角色与Scrum的事件,但并没有定义团队成员该如何实践,因此更加具体的实践有助于Scrum的实施。
下面我们将对如何实践Scrum进行介绍。
1.什么是Sprint
Sprint是指迭代周期,一个Sprint一般是2~4周,不同Scrum团队的Sprint时长也不同,但对于同一团队,一个Sprint应当是固定时长的。上一个Sprint结束后,下一个Sprint应当立即开始,以保证迭代的连贯性。Sprint是Scrum的核心,在Sprint内,团队成员应当为了同一个Sprint目标而努力。在此期间,Sprint目标不可随意更改,但Sprint待开发清单可以进行适当的调整与细化。
为了确保Sprint目标顺利完成,我们采用了Jira提供的Sprint燃尽图来进行进度预测。图3-3是Jira的Sprint燃尽图示例。燃尽图是一种表示剩余工作量的图表,横轴用来表示时间,纵轴用来表示工作量。通过对比理想剩余工作量曲线(①曲线)和实际剩余工作量曲线(②曲线)即可看出Sprint的完成情况。如果实际剩余工作量曲线远高于理想剩余工作量曲线,说明Sprint内存在任务失败的风险,需要及时调整,反之则表示需求被过高估计了,导致团队提前完成了任务。当然,实际使用时也离不开团队成员基于过往经验所做出的的判断。
图3-3
2.计划会议
Sprint计划会议要求Scrum团队全体人员参加,其目标是制订团队工作计划。与会人员要共同参与讨论,并回答如下三个问题。
问题一:当前Sprint的价值是什么?
Sprint的价值即Sprint目标,整个团队应当确立同一个Sprint目标,这个目标可以用于告知项目的利益相关方为什么Sprint是有价值的。Sprint目标应当在计划会议中确立。
问题二:当前Sprint内要做什么?
Scrum团队从产品待开发清单中挑选出一些条目,从而确定好当前Sprint待开发清单。在此过程中,团队的开发人员可以进一步确认需求,从而细化这些条目。
问题三:如何完成Sprint内的工作?
每个团队成员应当承担一定量的待开发清单条目。为此,需要对每个条目进行工作量预估。此外,团队成员还应当对待开发的条目进行进一步拆分,将其转化为一个个开发任务,如前端开发、后端开发、数据库设计等。
“用户故事”与“计划扑克”有助于对待开发清单进行评估。待开发清单中的每一个条目称为用户故事,用户故事要求以用户的视角描述需求,并体现故事的价值。这样待开发清单既描述了产品需求,又重视了用户体验。待开发清单和用户故事可以使用Jira进行管理和跟踪。计划扑克则是一种估算用户故事工作量的方法。针对每个用户故事,与会人员从手中的扑克牌中选出自认为合适的数字并同时亮出牌面。数字一般采用斐波那契数列中的数字,即1、2、3、5、8、13……游戏参加者,特别是亮出数字最大的和最小的人需要解释选择数字的原因。接下来团队成员需重新亮牌,直到大家的评估值比较接近为止。
3.每日立会
在橄榄球运动中,队员们会在开球前进行列队,其目的是让队员在场上相互熟悉,并产生化学反应。每日立会的作用和橄榄球赛前列队的作用类似,能够让团队成员之间相互了解,从而使Sprint透明公开。这样一来,每个团队成员既能了解到Sprint的进展,又能了解到相关开发任务的进度,还可以提出自己的问题或帮助团队其他成员解决难题。每日立会一般不应超过15分钟,具体内容可以视团队情况而定,但一般分为三类。
● 我昨天做了什么。
● 我今天打算做什么。
● 我遇到了什么难题。
可以从这些问题中看出任务的进展,讨论这些问题也可以帮助团队发现问题,从而在会后解决问题。此外,这种强制分享的方法也可以激励每个团队成员,增强团队凝聚力。
我们没有采用在白板上贴贴纸的形式进行更新,而是借助了Jira的Scrum Board。如图3-4所示,TO DO表示还未开始,IN PROGRESS表示正在进行,DONE表示已完成。Scrum Board可以很直观地反映出团队成员的工作进展。此外,还可以使用Sprint燃尽图来跟进整个团队的进展。通过使用成熟的商业敏捷管理平台,团队可以有效管理敏捷开发过程中的每个步骤,也能有效提高诸多Scrum事件的完成效率。
图3-4
4.日常开发
在每个迭代周期中,团队成员需要完成开发、测试甚至上线部署的工作,从而实现Sprint目标。Scrum引入了每日立会,但并没有定义日常开发实践。我们采用以敏捷开发为主,以瀑布模式为补充的方式开展日常开发工作。
以敏捷开发为主,是指在Scrum的基础上引入更多的敏捷实践。采用结对编程的方式可以写出更好的代码。结对编程是指两个开发人员使用一台计算机工作,一人输入代码,另外一人审查输入的代码,两人可以不时地互换角色。结对编程可以提高代码质量,也可以提升开发人员的水平。采用持续集成与自动化单元测试可以保证产品质量。持续集成通过持续频繁地构建与测试来尽早发现错误,让最新的程序代码处在可运行的状态中。读者可以在本书第9章查看更多的关于持续集成和持续部署的内容。
以瀑布模式为补充,是指团队不应彻底放弃文档。我们推荐团队成员撰写开发设计文档和测试用例文档。如果开发任务足够轻,团队成员可以直接在Jira的用户故事上简单描述开发设计与测试用例;如果开发任务过重,团队成员有义务去撰写详细的文档,并将文档和用户故事进行关联,团队资深成员也有义务对此类文档进行审阅。
5.评审会议
评审会议旨在展示整个团队在一个Sprint内的工作成果。评审会议也应当邀请项目的利益相关方。团队成员可以在会上演示可运行的产出,也应当讨论在这个迭代周期做了什么,从而避免将评审会议变成单纯的展示会议。作为Sprint中的倒数第二个事件,评审会议应该成为团队庆祝成功的一种手段。
6.回顾会议
回顾会议发生在Sprint结束之前,是对当前迭代周期的回顾与总结,需要团队全体成员参与讨论。讨论的问题一般分为三类。
● 有哪些是我们做得好的。
● 有哪些是我们做得不好的。
● 有哪些是值得去改进的。
通过对上述问题的讨论,团队应当找到提高质量与效能的办法,并将其应用到未来的Sprint当中。使用在白板上贴贴纸的方式进行回顾可以避免团队成员之间相互影响。贴纸应当分为三种颜色,对应上述三类问题,如图3-5所示(本书中无法体现颜色区分,各位读者在实际操作中应注意)。团队成员将问题写到贴纸上并分类贴到白板上。最终,团队应当对贴纸上的问题逐条进行讨论,并将讨论结果转化为行动项目(Action Item),从而指导未来的迭代周期。
图3-5
7.Scrum的Scrum
Scrum建议一个团队的人数在10人以内,但企业大型项目开发往往需要数十人,因此势必引入多个Scrum团队进行合作。Scrum的Scrum正是为了解决多个团队合作的问题而产生的。Scrum的Scrum可不定期举行,每个Scrum团队需要选举一名代表参加。代表不一定是Scrum负责人或产品负责人,但要对项目中出现的跨团队问题有深入的了解,代表需要回答如下问题。
● 我的团队正在做或者计划做哪些影响其他团队的工作。
● 我的团队需要哪些团队的协助。
● 我的团队的开发进度有没有风险。
Scrum的Scrum是对Scrum的一种补充,可以帮助企业更大规模地实施敏捷开发。
基于Scrum的敏捷开发实践是一种轻量级的敏捷开发实践,其目的是让传统的软件开发流程转变为快速迭代的敏捷开发流程,同时调动团队成员的积极性,促进团队的迭代式成长。微服务架构作为一种敏捷软件架构,其迭代式的、增量式的演进更加离不开敏捷开发实践。