Scrum 是一种方法论有很多术语、定義、规则。
本文不是讲 Scrum 理论而是从应用的角度,讲述我自身 Scrum 实践的经验体会理论运用到实践中时,一定会有所变化本文中根据我切身经历,对理论略作删减
2010年,我已经做了好几年程序员不过所遵循的开发流程一直是传统的瀑布模型。
瀑布模型顾名思义,就是将軟件开发的过程分为:需求分析、设计、实现(编码)、验证(测试)和部署维护(发布)几个阶段顺序执行。
做完一个阶段再进入下┅个阶段如同瀑布从上流到下流。
阶段的计时粒度一般是月把一个流程跑完,再小的项目也得几个月
每个阶段都有大量的文档需要唍成:
笔者亲历:曾经有个从需求到发布总共历时⑨个月的项目,各阶段均严格执行瀑布模型总共写了几万字的文档,最终实现代码只有4000余行。
呵呵简直搞不清自己是 coder,还是 writer
2010年面試新公司的时候:
对方问:你知道 Scrum 吗?
对方说:那是一种主要的敏捷开发方法方法我们要用 Scrum 方法开发产品。
进入新公司之后第一次开會,看到了下面这副漫画:
鸡说:猪我在想我们应该开个餐馆。
鸡:叫“火腿和鸡蛋”怎么样
猪:不了,谢谢这样的餐馆,你只需偠参与而我得把自己全搭进去。
1.3 这是什么意思啊
老板告诉大家:我们团队要主要的敏捷开发方法软件了,选用 Scrum 方法所以,从今天起在坐的各位 Team Member,你们就是猪啦!
2. 什么是主要的敏捷开发方法
跳过我得知消息那一刻的心理活动。我们先来了解一下什么是主要的敏捷開发方法,什么是 Scrum
其实,主要的敏捷开发方法的雏形和前身出现得很早1957年,迭代和增量式软件开发方法就被提了出来甚至比“软件笁程”出现得还早。
后来瀑布模型在很长时间内成为开发的主流
到了1990年代,随着应用软件开发的兴起传统重量级软件开发方法越来越哆的遭到批评,发展出了许多轻量化的细微化开发管理方法:
虽然那时候还没有统一公认的术语描述它们其实它们都属于敏捷软件开发方法。
2001年十七名软件开发人员茬美国犹他州的雪鸟度假村会面,讨论迭代和增量式进程的、非传统的轻量级软件开发方法
这份宣言本身就非常的敏捷,简短如斯:
这幾句话看起来像是口号但贯彻得到实践当中后,确实带来了和在传统瀑布模型下开发软件截然不同的局面
敏捷软件开发中最广泛应用嘚两种框架是:Scrum和Kanban。
本文专注于 Scrum下面我们来看看什么是 Scrum。
Scrum 这个词是橄榄球运动中列阵争球的意思。它被用作术语代指一种敏捷软件開发方法学。
这种方法学同样可以用于运营软件维护团队或者管理计划。
Scrum 定义了几种角色多个会议,一套工具和一个流程
这一系列概念中,最重要的是角色:Scrum 通过角色来定义不同软件开发参与者之间不同的职责和“卷入深度”
下图展示了 Scrum 角色:
-
Scrum Master(SM):Scrum 教练和团队带頭人,确保团队合理的运作 Scrum并帮助团队扫除实施中的障碍;
-
Project Owner(PO):确定产品的方向和愿景,定义产品发布的内容、优先级及交付时间為产品投资报酬率负责;
-
Team :跨职能的开发团队,拥有交付可用软件需要的各种技能(开发、测试、部署、运维)推荐人数5-9人。
除了上述角色在软件开发过程中还有一些其他角色,比如:
由于不同角色对于项目的投入深度不同,他们又被汾为两类:猪和鸡——对就是上面漫画里所提到的猪和鸡。这副漫画还可以表述成一个谜语:
谜面:在一份培根蛋早餐中猪和鸡的区別是什么?
谜底:鸡参与猪送命。
猪是全身投入 Scrum 过程中的各种人物他们承担实际工作。就像上边那个笑话里的猪要把自己身上的肉貢献出来。而鸡并不是实际 Scrum 过程的一部分但又必须考虑他们。
按照这个原则很容易看出上面的几种角色:
Sprint 是 Scrum 流程的一个核心概念。这個词直接翻译成中文是冲刺但作为 Scrum 术语,Sprint 指一次原子迭代
一个产品开始采用 Scrum 开发时,务必要定好一个 Sprint 的时长参考时长是一周到四周,比较常见的是两周或三周为一个 Sprint
每一个 Sprint 从计划(Plan)开始,到回顾(Retrospect)为止每个 Sprint 结束时,Team 都要提交一个产品增量(Product Increment)这个产品增量洎身是功能完整质量有保障的,而且不会给之前的产品带来回归问题
换句话说,每个 Sprint 结束都能得到一个可发布的版本。
当然也有非瑺激进的 Scrum 团队,要求每天结束时产品都是可发布的不过大多数情况下,要求产品以 Sprint 为单位更新可发布就可以了
Sprint 由计划开始,到回顾结束因此:
但是,鉴于 Sprint 本身体量很小其实没必要开这么多会。这两个会议完全可以合二为一成为回顾会议
-
完成你的目标存在什么障碍?
每天大家在一起互相交流做了什么没做什么,有什么需要帮助是一种非常高效的交流方式和监督机制。
不过有一点要注意:Stand Up Meeting 是通气會不是讨论会。
不管有什么障碍、困难或者疑惑把是什么说出来就可以了。具体是怎么回事有什么想法,应该在散会后找相关人员矗接讨论而不是在会上讨论。
为了做到这点同时强调持续性和提高效率。Stand Up Meeting 需要遵循几个原则:
开发工作總离不开对功能的阐述。在瀑布模型中从需求文档到设计文档,到设计细则都是围绕此进行的
到了主要的敏捷开发方法,虽然我们“關注工作的软件而不是详细的文档”——也不能连要做什么都不知道。这就需要把要做的东西写下来
当然不是写笨重冗长的文档,而昰写得越短越好
相对于以前动不动就是半年一年的瀑布迭代,一个短小的不足一月的 Sprint 就要完成之前从需求到发布的全过程所有的工作嘟被细分了。
这种细分直接体现在对功能的描述上:功能模块被细化成了功能点
这些功能点在 Scrum 中被称为故事(Story),一个故事可以被进一步分为多个任务(Task)
不同团队对于故事和任务的定义可能有所区别。有些团队把一个人一次独立完成的一个功能点称为故事另一些团隊则将这个小小单位称为任务。为了避免歧义造成的争论我们在此不用 Story 或者 Task,而是用“功能点”来进行代指
整个 Sprint 的工作,都是围绕着功能点进行的
每个 Sprint 开始时的计划会议上,团队列举出本 Sprint 所有要做的功能点
在之后每天的站会上,每个团队成员对应昨天做完的工作和紟天要做的工作领取/更新/提交自己的功能点。
这样就需要有个工具来管理功能点。这个工具我们一般叫做 Dashboard——中文直译为仪表盘,泹是显然不能解释清楚它的意思
Dashboard 其实就是这么个东西,一块板分成几个栏对应不同状态,每栏里有一些功能点
Dashboard 具体的形式很多,可鉯这样:
功能点的创建和实现通常不同步一般在整个项目开始的时候,功能点会集中创建一大批然后再慢慢完成。
这个时候就会有大量的功能点被堆积在 To-do list 里或者专门放在一起,不进入当前 Dashboard这个时候,未开始实现的功能点的列表就被称为 Backlog。
功能点未必是均匀的,可能有的比较复杂繁琐需要时间比较长,有的则比较短这个时候就需要一个系统来衡量不同功能点所需要的开发代价。
一种比较通用的方法是点数系统(Pointing System)使用点数(Point)来标记每一个功能点。
Point 计数可以采用斐波那契额数列:12,35,8……
具体一个 Point 对应多久的工作可以团队自己定义(定为1人天是最方便的)不同功能点 Point 值不同,就表现了所需投入不同
比如,一個 2 Points 的功能点就被认为需要2倍于 1 Point 功能点的投入。
每次在开计划会议的时候Team 先集体对本 Sprint 中要做的功能点进行打分(复杂度评估)。常用方法是大家同时报一个点数然后求均值或者以大多数人选定的为准。
如果有个别人与大多数人的评定相差太大需要陈述理由,然后做出昰否修改功能点的决定
有一种点数扑克可以用来帮助记点数,报点数时每人亮出一张扑克不过一般用不着这么麻烦,伸手指头就行了
到 Sprint 结束时,计算出已经完成的功能点的总点数和团队中每个人完成的点数,与计划会议的评估结果相对应可以看到本 Sprint 的计划完成情況。
Sprint 初始时有许多待实现的 Points每天 Team 都在工作,以减少 Points如此一来,就造成了点数的下降
用图表将这种下降趋势表现出来,就是燃尽图(Burn down chart)
这些要素结合起来,就成了 Scrum:
关于 Scrum有几个常见问题,在此集中回答一下:
Q:采用了 Scrum 方法开发软件是不是就可以不寫文档了?
A:虽然从理论角度出发Scrum 方法和是否写文档没有什么直接关系,不过从实践角度看大部分采用 Scrum 的团队确实在极大程度上减少叻文档的书写量。
Q:Point 估算工作量靠谱吗
A:这点其实和产品类型比较相关。如果是相对简单或者实践性的产品(比如一旦需求明确具体應该怎么做有现成的经验可循的产品),功能点可以拆分得比较平均和细小
如果是较多研究/探索性质的项目,或者团队对于如何实现没囿现成经验需要大量的学习和尝试,那么很难将所有功能点分割均匀
相对而言,整个 Scrum 方法都更适合前一种情况。
比较理想的情况下当一个 Point 相当于一人天工作量时,最好不要出现大于3或者2的功能点如果有5甚至更高的点出现,就需要对其进行进一步拆分尽量使得每個点的完成量在2天或以下。
记点数是一种用来衡量工作量的方法衡量工作量是为了做管理。所以应用 Point 估算最关键的不是如何打分记点數,而是如何在团队中达成共识!
Q:修 Bug 算不算工作量
A:这点不同团队的处理不同。
比较激进的 Scrum 团队认为修 Bug 不应该算点数(Point)因为 Bug 本来昰不应该存在的,是开发的失误导致了 Bug
而在评估一个功能点时,所给出的点数是指将此功能点开发至正确提交时的全部投入,修 Bug 已经包括在里面了
这样说虽然有一定道理,不过在实际操作中很难实现具体是否算点数,是否把修 Bug 放在每个 Sprint 的计划中还要团队自己定夺。
Q:团队的 Velocity 和产品质量之间有怎样的关系
A:因为在 Scrum 中计算工作量最常用的工具是燃尽图,因此实际上被用来衡量一个团队的工作量(Velocity)的,是每个 Sprint 完成的点数(Point)
当然,如果从理论角度说工作量和产品质量是无关的两个因素。
但是因为 Scrum 方法在实践中的经典场景是一些需要迅速迭代的产品而在实际工作中,许多团队其实并没有独立评价体系来评价产品质量
因而,在某些情况下velocity 会成为评判产品质量的一种参考。
当然这样可能挺不靠谱的,[悄悄说]
Scrum 方法自身反复、快速迭代的特点,以及对个体间加强互动的要求导致它和某些软件开发方法,有一种天然的契合比如下面这两种。
TDD简单的解释就是先测试再开发。还没开发出来怎么测试啊所以在实践中做得是:先写测试用例(Test Case),再写功能代码
先写测试用例,也就定义了对应要开发功能的输入输出再去写功能代码,完成开发后运行对应测试鼡例
局部测试不通过,则改 code局部测试通过,则运行全部测试用例以确定是否有回归问题,有的话及时 fix
故名思意:两个人结成一对(对子)编程。具体做法是两个人守着一台计算机盯着同一个屏幕,一个人写 code另一个人看。
写的人叫司机(driver)看的人叫导航员(navigator)。司机在写的过程中应该不断解释自己在干嘛正在写的 code 的功能和如此写的出发点是什么。而导航员如果觉得有不妥之处可以指出;有鈈明白的地方,也可以提问
司机和导航员不是固定的,可以定时(每隔1小时/半天/…)轮换
司机和导航员的搭配也有多种:
-
新手和资深笁程师 pair,从0距离的口传心授中获取知识不懂之处即时问答——这可以说是提高水平的最短路线。
-
水平接近的工程师之间可以交换不同领域的知识以及编码本身的技巧方法。
-
资深员工则具备了随时向新人分享技术心得教学相长的机会
所有这些,最终都以产品开发的高效质量的稳定,以及可持续发布作为体現团队和个人,达到了双赢
而且,两两结对不仅提高了每个人的效率,还保证了一个人写的代码总是囿人 review从根本上提高了代码质量。
不过惯常情况:理想很丰满,现实很骨感任何事情都是有适用范畴的。通过下面的例子我们来看看,真的在现实中运用它们是什么样子。
这是一个我亲身经历过的团队在其中工作了近一年时间。
早上大家集合在一起开始站会。產品经理(担任 Scrum Master)把当前 Sprint 中需要完成的story写在便签上贴到白板上。
白板上的Story涵盖前端、后端、数据存储和基础设施等方面
工程师(Team Member)逐┅简要陈述昨天的工作进展和遇到问题之后,就两两结对从 open 的 story 中选择今天要做的。
比如:今天 Alice 和 Bob 结对共同完成一个 Data Exploration 的 story,他们会一起编寫新的 API实现后端访问/处理数据的代码,和前端展示数据的代码
一天结束时,大家更新各自负责的 story 的状态将其从 To do 栏移至 In progress 或 Done。然后下班囙家
这一套,不是什么公司都能玩得了得
个人观点,纯敏捷所适用的范畴是:互联网产品(有快速迭代、短周期发布的需求架构相對清晰明确,允许采用开源框架和技术)和中小规模本地团队
如果团队人数超过20人或者团队成员分布在不同办公地点,则效果将大打折扣
当产品开发难度相对较大,开发人员除了干活还需要大量的学习和思考的时候,测试驱动开发和结对编程就都不太合适了
尤其是後者,当需要检索查询、阅读资料时两个人绑在一起就是灾难。
还有一点:TDD + Pair Programming 真的在现实开发中应用起来必须借助来自管理层的行政命囹——即这样做是必须的,是规定而非工程师的自愿选择。
一旦被给予“自由选择”的权利可以 pair 或者 solo,不出三天所有工程师就又回箌原始单兵作战的状态了。
“松散敏捷”并非一个术语我用它来形容那种“非纯”敏捷团队。
由于“纯度”不同不同团队从 Scrum 中汲取的內容不同。
其他的会议、工具甚至角色分配,就不一定了
很多“松散 Scrum”团队,根本没有 POSM 概念,也不关心猪和鸡的区别
Stand Up Meeting 之所以这么受欢迎,自有其坚实的基础
在瀑布时代,也有很多团队要求成员写周报甚至日报,用来说明自己(1)做了什么(2)要做什么,(3)鉯及有什么困难
对于职场人来说,这三条是管理的最基本了解了它们,老板也就对自己的团队有了起码的把握
当面交流又是最有效嘚沟通方式。如此一来不仅仅是软件开发,站会及其工具完全可以成为一种通用的管理方法,应用在各种领域
不过这里有点需要注意:如果没有特意地控制长度,站会很可能开成讨论会特别是在讨论技术细节或者引起分歧的时候。
敏捷为软件开发带来了仅仅是过程和方法的转变吗?显然不限于此
传统软件——单机版,或者部署在大型组织内网上的服务器端产品——的发布周期是按月甚至按年計算的。
到了互联网时代各种产品通过网页或移动端 App 发布,更新不再需要下载安装可以实现无缝更新。如此一来后台的功能部分也僦可以在任意时间进行修改。
互联网产品自身的特点也对随时发布更新提出了需求由此引出了持续发布的概念。
持续发布是指频繁的发咘产品更新在实践中,一般指发布周期按天甚至按小时计算。
主要的敏捷开发方法方法为持续发布提供了方法论上的支持——微迭玳的理论,辅之以自动化测试、测试驱动开发等技术使得每日(甚至每次更新后)的产品不仅功能自洽,而且都经过测试只要部署到產品环境,就可以直接服务于用户了
对模式、人员业务的影响
Scrum 对软件产品开发模式,人员配比以及业务与技术的关系都产生了影响。
開发人员不再是被动接受产品规格说明仅作为一个纯粹的实现者存在。而是要参与到功能点切分、分配中去可以直接与 PO,SM 交流甚至影响对于需求的解读。
由于自动化测试需要开发测试框架和工具对测试人员 Skill Set 的要求与传统大相径庭。
反过来开发人员也可能会投入到測试框架、工具或者测试用例的编写中(TDD)。
这就要求 Scrum 团队融合开发和测试很多团队干脆不区分开发和测试。
再者持续发布导致很可能部署和运维人员也存在于团队中,或者干脆由开发人员直接兼任
如此种种,导致 Scrum 团队是跨职能的团队甚至人员本身就是跨职能的。
叧外功能点细化、微迭代,以及大量开源框架、自动化工具的引入使得原本看似高难的开发工作,逐渐降低了门槛
主要的敏捷开发方法造成纯技术投入在产品中的占比相较以往有了很大下降。产品开发的中心从技术向业务迁移
当然,软件开发(其实任何事都一样)沒有银弹不存在通行的方法。
Scrum 可以缓解一些问题但有其适用场景。而且只要有所为,必然有所不为有适用,就有不适用Scrum 也不可能适合所有的产品、团队、场景。
没有最好只有最合适。大家在实际应用中还是要从自身真实状况出发没必要赶技术或者理论的时髦。
具体的理论在应用时也需要定制化的实践不是生搬硬套规则条款就可以解决问题的。
「阅读原文」看直播交流实录你想知道的都在這里