【项目管理(一)】敏捷开发知识框架
敏捷开发是指一套软件开发方法,鼓励干系人之间持续合作并快速、频繁以小增量的方式交付有用的功能。敏捷方法种类繁多,其中最流行的包括Scrum、极限编程、精益软件开发、特性驱动开发以及看板方法。敏捷方法基于以前的迭代和增量式软件开发方法(最早见于Boehm 1988;Gilb 1988;Larman and Basili 2003)。
各种敏捷开发方法各有千秋,但是本质上都离不开适应性(有时称为“变化驱动”)方法,而非预测性(有时称为“计划驱动”)方法(Boehm and Turner 2004;IIBA 2009)。预测性方法视图在软件开始构建之前通过周密的策划和文档将项目的风险降到最低,比如瀑布开发就是预测性方法;项目经理和业务分析师要在开始构建之前就确保所有干系人都准确了解要交付什么产品,只有需求从一开始就得到充分理解,并且在项目期间能够相对稳定,这种方法才能可以很见效。敏捷方法等适应性方法旨在适应项目中发生的不可避免的变化,它们对需求高度不确定或波动的项目也很有效。
目录索引
(一)与传统的瀑布模型对比
在从完全固定的、预测性的项目到完全不确定、适应性的项目之间的范围中,关键区别在于从某个需求创建到基于这个需求的软件交付给客户所经过时间的长短。
-
敏捷开发 客人到餐馆来点菜(新项目) -
不确定客户想吃什么的时候,通常选好餐厅后会先看看餐厅的菜单(客户往往提不出具体的需求) -
根据图文菜单,客人点了个菜(根据原型和设计稿,基本确定了需求) -
后厨开始准备(项目启动) -
配菜、炒菜,先上了两盘,让客人尝了尝味道(先提供可用实例给客户用) -
客人说还不错,后厨继续准备后面的菜,陆续上菜(不断迭代,不断测试) -
上菜过程中,客人突然发现有个菜的味道太淡了,让后厨加了点盐又端上来了(敏捷的好处,可以不断测试和需求变更) -
又上了两盘,不够辣,又拿到后厨加了辣(敏捷的坏处,需求没有提前明确,反复迭代,增加了工作量) -
到最后两盘时,客人要求换两个菜,还好没炒(迭代的好处,随时接受需求变更) 客人吃完,很满意(基本满足了全部的要求) -
瀑布模型开发 -
客人到餐馆来点菜(新项目) -
不确定客户想吃什么的时候,通常选好餐厅后会先看看餐厅的菜单(客户往往提不出具体的需求) -
根据图文菜单,客人点了十个菜(根据原型和设计稿,基本确定了需求) -
后厨开始准备(项目启动) -
根据客人的下单配菜,炒菜(基本上不会主动去了解完整需求) -
半个小时了,菜还没上桌,客人饿极了(项目启动后很长一段时间客户什么都看不到) -
再过了二十分钟,十个菜都一起上来了(项目最终一次交付) -
客人说,有几个菜挺好的,但是有个菜味道淡了,有两个不够辣,还有两盘重复了想换掉(我是买单的,我要变需求) -
这时候大堂经理来了,说,“味道淡了可以加盐,不辣可以加辣,但是换菜不行,已经炒好的那两盘菜也是要算成本的”(瀑布的坏处,需求变更比较麻烦) -
于是,后厨只给客户加了盐,加了辣 -
客人吃完,不是很满意,下次不来了(没有满足需求)
(二)敏捷开发基本概念
1.角色
在敏捷项目中,客户与开发人员的紧密协作通常意味着不必像传统项目那样详细记录需求;业务分析师或其他需求负责人会在必要时候以必要的精确度进行沟通和记录(IIBA 2003)。
敏捷方法提倡创建最基础的文档,只要足以用于准确指导开发人员和测试人员的工作;除此(或者满足规模或标准所需的基本文档)之外的任何文档都是浪费;某些用户故事有少量细节,其中只有最具有风险或影响最大的功能才有更详细的说明,并且通常采用验收测试的形式。
3.Backlog和排优先级
敏捷项目中的产品Backlog包含团队采取行动的请求清单(IIBA 2003),产品Backlog通常用用户故事来填充,但也有些团队使用其他的需求、业务处理过程和待修正的缺陷来填充;每个项目应当只维护一个Backlog(Cohn 2010),因此,在Backlog中的缺陷需要与新用户故事一起排优先级;有些团队会将缺陷改写为新用户故事或者原有老用户故事的变种。Backlog可以使用故事卡片或者在工具中加以维护。
对Backlog排定优先级是一项持续的工作,需要从工作项中选择哪些进入随后的迭代以及哪些应当从Backlog中剔除;分配给待办项的优先级无需一成不变,只要适用于下个迭代即可(Leffingwell 2011);追溯Backlog项的业务需求有助于加速优先级的排定;不只是敏捷项目,所有项目都应对Backlog中剩余工作的优先级进行持续的管理。
4.确定时机
敏捷项目的需求工作类型与传统开发项目基本相同,一样需要从用户代表那里收集需求、分析需求、详略得当地记录需求并确认需求能够达到项目的业务目标。然后,在敏捷项目开始的时候,根本不会记录详细的需求;相反,在项目早期,高层需求通常以用户故事形式收集并填充到产品Backlog中,用于规划和排定优先级。
如下图所示,用户故事分配到特定的迭代中实现,每个故事的细节都在迭代中得以进一步澄清;需求在整个项目中进行小部分的开发,甚至持续到产品发布之前。然而,尽早了解非功能性需求也很重要,以便设计的系统架构能够达到关键的性能、易用性、可用性和其他质量目标。
5.史诗、用户故事和特性
用户故事是一段简要说明,用以阐明用户的需要并以此为起点进行沟通,进一步充实细节。
用户故事的大小要求能够在单一迭代中完全实现。
Mike Cohn(2010)如此定义史诗:“规模过大以至于无法在单一迭代中完全实现的用户故事。”将史诗拆分成更小的史诗,然后拆分成用户故事,这种方式通常称为故事分解(IIBA 2013)
特性是能够为用户提供价值的一系列系统能力。在敏捷项目环境中,特性可以包含单个用户故事、多个用户故事、单个史诗或者多个史诗。
以业务需求为目标,识别出最低层的故事,以便能够确定团队能够交付给客户并为其提供价值的最小功能集合,这个概念通常称为“最小适销特性”(minimum marketable feature,MMF)
在敏捷项目中开发需求时,不要纠结于到底称为“故事”和“史诗”,还是“特性”,要更专注于开发高质量的需求,指导开发人员将能力用于满足客户需要上。
在敏捷项目中,需求发生变化时,要做的最大调整是学会拒绝:“等等,这不在范围之内”或者“我们需要走正式流程来加入这个变更”,而不是说“好吧,我们来谈一谈这个变更”。这会鼓励客户协作,参与创建和变更用户故事,并且根据已有Backlog对每个变更请求排定优先级。与所有项目一样,为了减少变更带来的负面影响,敏捷项目团队也要对变更进行精心管理,但他们更期待甚至拥抱正在变化的事实。
要明白,虽然能够应对变化,但这并不意味着可以一味忽视未来并且只关注于眼前已知的信息;抬头向前看仍然很重要,要看得更远一些,虽然开发人员无法为未来所有可能的需求进行设计,但只要多看两眼未来,就能创造出一套更加可扩展和健壮的架构或设计,以便日后加入新的功能。
变更还包括从范围中移除待办项。待办项之所以要从迭代范围中移除,原因有多种,概括如下:
存在实现问题,使得某个待办项无法在当前时间窗口内完成;
产品负责人发现了问题或在测试中发现了问题,使得某个故事的实现不可接受;
高优先级待办项需要替换迭代规划中不那么重要的待办项;
下面这些建议可以帮助为转为敏捷方法:
确定你在团队中的角色。有些敏捷项目有专门的业务分析师,而另一些却由其他岗位的人员开展业务分析工作。要鼓励所有团队成员专注于项目目标,而不是他们各自的角色或者头衔(Gorman and Gottesdiener 2011);
充分理解用户故事、验收测试、Backlog排优先级以及为什么直到项目或版本结束后敏捷业务分析师才能“完成”工作。