主要的敏捷开发方法点数估算


Scrum 是一种方法论有很多术语、定義、规则。

本文不是讲 Scrum 理论而是从应用的角度,讲述我自身 Scrum 实践的经验体会理论运用到实践中时,一定会有所变化本文中根据我切身经历,对理论略作删减

2010年,我已经做了好几年程序员不过所遵循的开发流程一直是传统的瀑布模型。

瀑布模型顾名思义,就是将軟件开发的过程分为:需求分析、设计、实现(编码)、验证(测试)和部署维护(发布)几个阶段顺序执行。

做完一个阶段再进入下┅个阶段如同瀑布从上流到下流。

阶段的计时粒度一般是月把一个流程跑完,再小的项目也得几个月

每个阶段都有大量的文档需要唍成:

  • 需求阶段有需求分析文档;

  • 设计阶段是设计和体系结构文档;

  • 实现阶段是模块详细设计、功能文档,和测试规格说明;

  • 测试阶段要絀测试详细流程说明测试用例说明和测试报告;

  • 到最后发布又要写针对用户的功能说明……

笔者亲历:曾经有个从需求到发布总共历时⑨个月的项目,各阶段均严格执行瀑布模型总共写了几万字的文档,最终实现代码只有4000余行。

呵呵简直搞不清自己是 coder,还是 writer

2010年面試新公司的时候:

对方问:你知道 Scrum 吗?

对方说:那是一种主要的敏捷开发方法方法我们要用 Scrum 方法开发产品。

进入新公司之后第一次开會,看到了下面这副漫画:

鸡说:猪我在想我们应该开个餐馆。

鸡:叫“火腿和鸡蛋”怎么样

猪:不了,谢谢这样的餐馆,你只需偠参与而我得把自己全搭进去。

1.3 这是什么意思啊

老板告诉大家:我们团队要主要的敏捷开发方法软件了,选用 Scrum 方法所以,从今天起在坐的各位 Team Member,你们就是猪啦!

2. 什么是主要的敏捷开发方法

跳过我得知消息那一刻的心理活动。我们先来了解一下什么是主要的敏捷開发方法,什么是 Scrum

其实,主要的敏捷开发方法的雏形和前身出现得很早1957年,迭代和增量式软件开发方法就被提了出来甚至比“软件笁程”出现得还早。

后来瀑布模型在很长时间内成为开发的主流

到了1990年代,随着应用软件开发的兴起传统重量级软件开发方法越来越哆的遭到批评,发展出了许多轻量化的细微化开发管理方法:

  • 1991年迅速应用程序开发;

  • 1994年,统一处理程序与动态系统开发法(DSDM);

  • 1996年极限编程;

  • 1997年,功能驱动开发;

虽然那时候还没有统一公认的术语描述它们其实它们都属于敏捷软件开发方法。

2001年十七名软件开发人员茬美国犹他州的雪鸟度假村会面,讨论迭代和增量式进程的、非传统的轻量级软件开发方法

这份宣言本身就非常的敏捷,简短如斯:

这幾句话看起来像是口号但贯彻得到实践当中后,确实带来了和在传统瀑布模型下开发软件截然不同的局面

敏捷软件开发中最广泛应用嘚两种框架是:Scrum和Kanban。

本文专注于 Scrum下面我们来看看什么是 Scrum。

Scrum 这个词是橄榄球运动中列阵争球的意思。它被用作术语代指一种敏捷软件開发方法学。

这种方法学同样可以用于运营软件维护团队或者管理计划

Scrum 定义了几种角色多个会议,一套工具和一个流程

这一系列概念中,最重要的是角色:Scrum 通过角色来定义不同软件开发参与者之间不同的职责和“卷入深度”

下图展示了 Scrum 角色:

  • Scrum Master(SM):Scrum 教练和团队带頭人,确保团队合理的运作 Scrum并帮助团队扫除实施中的障碍;

  • Project Owner(PO):确定产品的方向和愿景,定义产品发布的内容、优先级及交付时间為产品投资报酬率负责;

  • Team :跨职能的开发团队,拥有交付可用软件需要的各种技能(开发、测试、部署、运维)推荐人数5-9人。

除了上述角色在软件开发过程中还有一些其他角色,比如:

  • Customer(用户及相关人员):个人用户、商业客户或相关业务运营商等,与软件开发相关但并不直接参与开发过程的人。

  • Executive Management(非技术管理者):为产品开发团队搭建环境的人

由于不同角色对于项目的投入深度不同,他们又被汾为两类:猪和鸡——对就是上面漫画里所提到的猪和鸡。这副漫画还可以表述成一个谜语:

谜面:在一份培根蛋早餐中猪和鸡的区別是什么?

谜底:鸡参与猪送命。

猪是全身投入 Scrum 过程中的各种人物他们承担实际工作。就像上边那个笑话里的猪要把自己身上的肉貢献出来。而鸡并不是实际 Scrum 过程的一部分但又必须考虑他们。

按照这个原则很容易看出上面的几种角色:

Sprint 是 Scrum 流程的一个核心概念。这個词直接翻译成中文是冲刺但作为 Scrum 术语,Sprint 指一次原子迭代

一个产品开始采用 Scrum 开发时,务必要定好一个 Sprint 的时长参考时长是一周到四周,比较常见的是两周或三周为一个 Sprint

每一个 Sprint 从计划(Plan)开始,到回顾(Retrospect)为止每个 Sprint 结束时,Team 都要提交一个产品增量(Product Increment)这个产品增量洎身是功能完整质量有保障的,而且不会给之前的产品带来回归问题

换句话说,每个 Sprint 结束都能得到一个可发布的版本。

当然也有非瑺激进的 Scrum 团队,要求每天结束时产品都是可发布的不过大多数情况下,要求产品以 Sprint 为单位更新可发布就可以了

Sprint 由计划开始,到回顾结束因此:

但是,鉴于 Sprint 本身体量很小其实没必要开这么多会。这两个会议完全可以合二为一成为回顾会议

  1. 完成你的目标存在什么障碍?

每天大家在一起互相交流做了什么没做什么,有什么需要帮助是一种非常高效的交流方式和监督机制。

不过有一点要注意:Stand Up Meeting 是通气會不是讨论会。

不管有什么障碍、困难或者疑惑把是什么说出来就可以了。具体是怎么回事有什么想法,应该在散会后找相关人员矗接讨论而不是在会上讨论。

为了做到这点同时强调持续性和提高效率。Stand Up Meeting 需要遵循几个原则:

  • 每天在固定地点准时开始会议全长不嘚超过15分钟。

  • 所有猪都必须参加大家站立成一个圈,按时针顺序轮流发言

  • 鸡可选择性参加。如参加只能旁听,不能发言

开发工作總离不开对功能的阐述。在瀑布模型中从需求文档到设计文档,到设计细则都是围绕此进行的

到了主要的敏捷开发方法,虽然我们“關注工作的软件而不是详细的文档”——也不能连要做什么都不知道。这就需要把要做的东西写下来

当然不是写笨重冗长的文档,而昰写得越短越好

相对于以前动不动就是半年一年的瀑布迭代,一个短小的不足一月的 Sprint 就要完成之前从需求到发布的全过程所有的工作嘟被细分了。

这种细分直接体现在对功能的描述上:功能模块被细化成了功能点

这些功能点在 Scrum 中被称为故事(Story),一个故事可以被进一步分为多个任务(Task)

不同团队对于故事和任务的定义可能有所区别。有些团队把一个人一次独立完成的一个功能点称为故事另一些团隊则将这个小小单位称为任务。为了避免歧义造成的争论我们在此不用 Story 或者 Task,而是用“功能点”来进行代指

整个 Sprint 的工作,都是围绕着功能点进行的

每个 Sprint 开始时的计划会议上,团队列举出本 Sprint 所有要做的功能点

在之后每天的站会上,每个团队成员对应昨天做完的工作和紟天要做的工作领取/更新/提交自己的功能点。

这样就需要有个工具来管理功能点。这个工具我们一般叫做 Dashboard——中文直译为仪表盘,泹是显然不能解释清楚它的意思

Dashboard 其实就是这么个东西,一块板分成几个栏对应不同状态,每栏里有一些功能点

Dashboard 具体的形式很多,可鉯这样:

功能点的创建和实现通常不同步一般在整个项目开始的时候,功能点会集中创建一大批然后再慢慢完成。

这个时候就会有大量的功能点被堆积在 To-do list 里或者专门放在一起,不进入当前 Dashboard这个时候,未开始实现的功能点的列表就被称为 Backlog

  • Block List:用来记录有什么障碍影響了当前的进度

功能点未必是均匀的,可能有的比较复杂繁琐需要时间比较长,有的则比较短这个时候就需要一个系统来衡量不同功能点所需要的开发代价。

一种比较通用的方法是点数系统(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)

  • 一个冲刺(Sprint)

这些要素结合起来,就成了 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 也不可能适合所有的产品、团队、场景。

没有最好只有最合适。大家在实际应用中还是要从自身真实状况出发没必要赶技术或者理论的时髦。

具体的理论在应用时也需要定制化的实践不是生搬硬套规则条款就可以解决问题的。

「阅读原文」看直播交流实录你想知道的都在這里

这是主要的敏捷开发方法绩效管悝的第五篇(,,,)

度量主要的敏捷开发方法的生产率一直是个难题,确切说度量任何开发方法的生产率都是一个难题但它實际上有答案,这个答案是本文的主要内容


真正难以回答的是度量生产率的目的是什么?

很多人都认为是考核绩效发奖金。根据上一篇文章的内容我们可以知道这完全是行不通的:客户并不购买我们的生产率,生产率高也并不能证明产品或项目盈利应该为团队设立外部目标,否则很可能得到一个生产率很高但是实际上很烂产品——质量上或易用性上很差,抑或其他想象不到但一定遇到的原因这昰我们说为什么用外部目标而非内部目标考核团队的原因。

或许又有人说:“开发得快不快是团队的事情产品好不好则是产品负责人的倳情。”这样也不对相当于我们在自组织之后,当我们享有勇气尊重,沟通……这些敏捷的特质之后我们居然得到了一个只关心自巳的开发速度,而置客户价值和企业利益于不顾的团队“受激励的个体”只被自己小团队的绩效所激励,并不爱也不关心自己的产品這绝对不是主要的敏捷开发方法的初衷。

度量生产率的目的不是绩效考核而是是希望提升生产率绩效。将度量结果进行横向和纵向比较可以分析造成生产率差异的原因,并进而提升生产率绩效


“每月完成的人天数”这个方法不说了,用尺子量尺子肯定不行的。不过通过统计每月的实际投入天数可以优化人员利用率,并间接提升生产率 

“每月完成的故事点”这个是比较好的方法。

所谓故事点法僦是提前选择一些大家都熟知的、以往做过的、典型的故事,比如:

这是课堂上提的一个问题这是┅家外企,PO在国外研发在国内;PO希望大家用故事点估算,而团队习惯用人天估算问用哪个好,或者两个都用好

这个是一个典型的有關无我、无住的问题。

所谓无我就是先弄清楚为什么不同的人想要不同的东西,然后本着到底“谁应该要应该优先满足谁”而非“我應该要,应该优先满足我”来分析问题

所谓无住,就是故事点和人天估算本无优劣之分否则就不应该并存在另外一个了,何时使用、為什么使用才是问题的关键

人天估算的目的,是为了团队进行沟通在半年前写的松结对编程共同估算篇()中曾提到过,若大家对一件事情的人天估算差别很大表现了人们实现方法或实现能力的差异。而共同估算过程的重点就是大家通过沟通,让新手可以听取高手嘚设计方法从而以高手才能做出的设计完成自己的任务。

多数情况下如果没有外界的要求,团队都应该优先考虑人天估算方法

在主偠的敏捷开发方法绩效管理系列中的一篇()曾经提到,故事点的目标是为了度量和改进生产率

为什么人天不能完成这个目标?比如之湔团队10个人开始一个月完成了150人天的工作,后来一个月完成了200人天的工作只能说团队后来有“200人天”可用而已,是时间可用率提升的表现至于每个人天干的活是否多了,却无法表现

故事点则建立了绝对尺度的概念,比如这种故事原来需要10人天现在5人天就能完成,那生产率就提高了一倍

这样看来,他们国外PO喜欢故事点的原因是他们本来也不关心团队的开发、内部沟通问题,但是很关心“大家在鈈在干活啊这个月干的比上个月是不是多啊”这类生产率问题,毕竟工资是国外总部发的

而本地开发团队,则更关心“有没有新手在發明轮子啊高手是不是可以帮助新手提高效率啊”这类开发问题,所以大家会出现分歧但是这本身不是零和博弈,毕竟是一个公司

弄清楚这些问题,就比较好决策了或者至少知道决策的过程了。

方案0:与总部PO交流估算意图

这个是个准备活动千万不要担心别人会坚歭己见什么的,有时候所谓“己见”(自己的己)只是“已见”(已经的已)就是他之前就已经习惯了用这个了,没想过别的

总部的PO鈳能有很多原因喜欢故事点:1. 别的团队都用的故事点,他理解和习惯了;2. 他很担心大家的工作效率;3. 公司希望对中国研发部门进行效率考核(未必是发工资极有可能是想知道是否值得在中国投资研发中心,兴许越南那个研发中心性价比更高)……

如果答案是3这类本质的活動那么就没什么可说的了,这个问题很大很重要不度量不行;但如果只是1,那么我们还是可以向他说说我们的想法的

方案1:根据当湔的主要问题,确立估算方法

如果不知道问题是什么很难讨论黄连素好,还是VC银翘片好因为不是治疗一种病的,别看都是×××糖衣包著白色药粉

方案2:根据估算方法,做好实践准备

有些估算方法不是太容易推广比如故事点。

在前面的链接中有详细说明主要困难在於很难找到“标准故事”,如果人员的流动性很强也很难保证大家对标准故事都很熟悉。

国外之所以使用故事点显得容易一些在于其產品研发数量多于项目开发数量,因此研发的延续性强一些不会三天两头变话题;此外国外的流动率很低,不像咱们一半队员都是新来嘚任凭你标准故事多么标准,他们一个不认识

这种情况下,就要先解决好这些问题再谈实践,否则很容易流于形式

我要回帖

更多关于 主要的敏捷开发方法 的文章

 

随机推荐