敏捷项目管理实战之质量管理

简介:本文以笔者的项目管理实践为基础,介绍基于经验过程控制(Empirical Process Control)模型、缺陷预防以及敏捷价值观的敏捷质量管理思想及其实践。希望通过本文为广大项目管理人员提供质量管理的一些思路和经验分享。

  经验过程控制

  经验过程控制是一种问题驱动的轻型过程控制模型。在进一步介绍经验过程控制之前,我们先看一个日常生活中应用经验过程控制的一个例子:在菜肴的烹饪过程中,人们往往先观察菜肴的颜色,或者用筷子检查其软硬度来判断菜肴是否已经煮熟。若不够熟,则继续煮。待到菜肴快熟时,我们开始放盐、味精之类的调料。然后尝尝菜肴的咸淡是否适中,若太淡了则继续加盐,直到我们满意为止。经过这样一个过程,烹饪者满意的一道菜肴才能完成。

  上述例子正好体现了经验过程控制的三大支柱——透明性(Transparency)、检查(Inspection)、适应(Adaption)。透明性指影响最终产出结果的因素对于过程控制者来说可观察或者使其可观察。“透明性”在上述例子中表现为:菜肴煮熟程度是影响菜肴质量的一个因素,而这个因素可以通过菜肴的颜色或其硬度反映出来。检查指对影响最终产出的因素进行观察和评价的动作。上述例子中提到的观察菜肴的颜色、尝尝菜肴的咸淡就是“检查”。适应指检查过程中发现不可接受的结果、偏差时所采取的矫正动作。上述例子提及的在发现菜肴味道偏淡的情况下采取的继续加盐的动作就是“适应”。

  从经验过程控制的三大支柱我们可以看到其问题驱动的性质。问题驱动是指在过程实施时所进行的活动是基于有哪些因素影响了最终产出的结果,而不是像一些传统的过程控制实施者是从一些预定义的活动集合中“剪裁”一些活动。从一个活动集合中剪裁出一些活动,这本身就要求剪裁者对这个活动集合中的每个活动足够了解,从而能够选择适合自己的活动。这个剪裁的过程使得这些传统的过程控制实施起来相对困难,而经验过程控制因为省却了“剪裁”的过程而使得其实施相对容易。

  基于经验过程控制的质量管理其实施的基本思路是先通过经验或者对质量问题进行根因分析(Root Cause Analysis)发现影响质量的因素,再采取措施使这些因素成为可观察的因素(对应经验过程的“透明性”)。然后,在项目实施过程中对这些因素进行检查(对应经验过程控制的“检查”)。检查过程中发现不可接受的结果或者偏差时及时采取措施进行矫正以防止缺陷的引入或者缺陷流入下一道工序中(对应经验过程控制的“适应”),从而保证了最终产出的质量。

  缺陷预防

  《孙子兵法·谋攻》中提到“百战百胜非善之善者,不战而屈人兵,善之善者”。每次打仗都取胜不是战争的最高境界,战争的最高境界是不费兵卒而取得胜利。同样,在软件开发过程中,找出所有缺陷并将其一一去除不是质量管理的最高境界。质量管理的最高境界是将缺陷扼杀在摇篮之中——缺陷预防。经验过程控制三大支柱所体现的其问题驱动的特性说明了它可以帮助我们去实施缺陷预防。基于经验过程控制的缺陷预防是通过使缺陷来源成为可观察的因素,然后在软件开发过程中对这些因素进行检查,发现不可接受的偏差时及时采取措施进行矫正,从而避免了缺陷的引入。比如,当我们发现开发人员对需求理解的错误、不全面是缺陷的一个重要来源时,我们就可以应用经验过程控制的思想,先采取措施使开发人员对需求的理解成为可观察的因素。然后对其进行检查,若发现有需求理解上的偏差,则进行矫正,从而避免了因需求理解偏差而引入缺陷。

  诚然,软件测试的目的是发现缺陷。也正因此大多数公司和个人也就把测试人员定位成缺陷的发现者。然而,测试毕竟是一种事后控制型的质量管理手段,这不是上上策。能否往测试人员这个角色的职责的定义中增加一个缺陷预防的职能呢?笔者曾经在所带团队中引导测试人员往缺陷预防方面发展,在这方面多做贡献,而不是仅仅把自己定位为缺陷的发现者。在开发测试一体化团队中,测试人员同开发人员一起参与需求分析、评审。项目经理可以通过一些奖励措施鼓励测试人员多去发现需求本身的错误以及开发人员对需求理解的偏差,从而避免了需求相关的缺陷。另一方面,测试人员往往习惯于从发现缺陷中获得成就感。在引导测试人员在缺陷预防上多做贡献的过程中,项目经理需要引导测试人员使其认识到预防缺陷比发现缺陷更加能够体现一个人的能力和价值。

  需求澄清

  需求规格说明书本身的错误、不明确是软件缺陷的一个重要来源。因此,消除需求本身的问题是缺陷预防的一个重要内容。笔者在所带的项目中是通过开展需求澄清活动来消除需求本身的问题的。在开发团队内部进行需求规格说明书评审之后,评审意见被汇总成一个列表,这个列表可以是一个 Excel 表格,我们称之为需求问题确认列表。然后,我们邀请客户过来和开发团队一起对问题列表中的每个问题进行讨论。团队成员负责提出和解释问题确认列表中的问题,客户代表则负责解答和澄清团队成员提出的问题。客户对于问题的回复我们会记录到问题确认列表的“回复”一栏。需求澄清活动往往是以头脑风暴会议的形式展开的,而不仅仅是一个一问一答的过程。对于客户当场给的问题回复,团队成员可能因为通过自己的分析认为客户的回复是错误或者不合理的而当场对客户代表的回复提出质疑。客户代表往往也因此对其回复进行重新思考从而给出与会人员一致认同的回复。

  《敏捷宣言》中提到“客户协作胜过合同谈判”,需求澄清活动的基本前提就是客户代表的参与。因此它是符合敏捷开发的价值观的。

表 1. 需求澄清活动

  需求宣讲

  团队成员对需求理解的偏差也是软件缺陷的一个重要来源。我们可以应用经验过程控制的思想对这种因需求理解偏差而引入的缺陷进行预防。其基本思路是先使团队成员对需求的理解成为可观察的因素,然后对这个因素进行检查。检查过程中发现不可接受的偏差时及时采取措施进行纠正,从而避免了缺陷的引入。笔者通过在团队内开展需求宣讲活动来具体实施这个缺陷预防。

  需求宣讲是在开发人员开始编码、测试人员开始设计测试用例前,由全体团队成员参与的一个头脑风暴会议。在这个会议上,开发人员随机选取一个 Story,然后口头表述其对所选择的 Story 的理解。通过这个讲解,开发人员对需求理解就成为了一个可以观察的因素。当其他与会人从需求讲解人的讲解中发现其对需求理解上的偏差时,可以及时指出进行纠正。其他与会人员也可对其讲解提出疑问和质疑。当讲解人的回复无法得到团队成员的一致认同时,则进行讨论,最终达到对需求理解的一致。而对于讨论无法达成一致认识的问题,可以记录入需求问题确认列表会后再进行确认。

  当然,当开发人员被要求讲述其对需求的理解时,可能会说他其实已经理解了需求只是不知道如何表述。且不论这句话是否属实,项目经理应当引导团队成员意识到:在敏捷开发团队中,个人对需求是如何理解的,理解的对与错,深与浅不是其一个人的事情,而是整个团队的事情,因为它影响了这个团队最终交付的软件的质量!从另外一个角度来讲,当一个人能清晰得表述一件事物时,才说明其对这件事物是真正理解的。

  虽然需求评审和需求澄清这两个活动也能一定程度上反映活动参与者对需求的理解,但是它们更多的是用于发现需求本身的问题。而需求宣讲则是专门用于检验活动参与者对需求的理解正确性和全面性。

表 2. 需求宣讲活动

设计会话(Design Session)与简单设计(Simple Design)

  设计阶段所引入的缺陷不仅包括设计本身的缺陷还包括了因编码人员对设计方案理解的错误和偏差而引入的缺陷。极限编程所强调的是简单设计虽然一定程度上降低了设计本身缺陷的概率,并且也有助于降低设计方案理解偏差而引入缺陷的可能性。但是,从经验过程控制和缺陷预防的角度来看,我们仍然需要将编码人员对设计方案的理解这一影响质量的因素成为可观察的因素,并对其进行检查。

  笔者在所带的项目中开展设计会话活动。在设计会话中,通常由设计人员借助白板讲解设计方案,其他人员对讲解的内容有疑问和异议时可以提出集体讨论。主讲的设计人员也可以针对其讲解提出一些问题让其他参与人回答,以确定参与人是否真正理解设计方案。设计会话结束后,白板上的内容可以先保留一段时间,以方便事后再查看。有条件的团队也可将其拍照存档。设计会话中所讨论的设计方案可以事后由编码人员写入 Story 文档。由于相关人员事先都参与过设计会话,在 Story 文档评审时对其中的设计部分多少也许自己的认识和意见,这有助于发现对设计方案理解的偏差。

  设计会话体现了《敏捷宣言》中提到的“个人与交互胜过过程与工具”这一价值观,避免了仅仅通过设计规格说明沟通设计方案导致的沟通效率低下、设计方案理解偏差的问题,充分发挥了人与人直接沟通的优势。

表 3. 设计会话

  单元测试评审

  单元测试是软件开发中被普遍接受的优秀实践,也是影响软件质量的一个重要方面。有效的、充分的单元测试能够提高代码质量,从而有效避免了返工。但是如何保证单元测试得到有效的执行呢?按照经验过程控制的思想,我们可以先使单元测试成为一个可观察的因素,然后对其进行检查。检查过程中发现偏差时及时进行纠正从而保证单元测试得到有效的执行。

  定义单元测试的产出物可以使单元测试活动成为可观察的因素。对单元测试产出物进行评审可以发现单元测试所覆盖的测试用例是否真正执行通过以及测试用例覆盖是否充分。若单元测试评审过程中发现有测试用例未通过的或者遗漏的,则及时反馈给开发人员进行纠正,从而避免了缺陷进入下一道工序——Story 测试。

  笔者曾经在一个基于 SOA(Service Oriented Architecture)的项目中将单元测试过程中系统所产生的接口日志文件定义为单元测试产出物。在这个项目中,开发人员会将单元测试过程中每个测试用例执行时系统所产生的接口日志文件按所覆盖的测试用例的名称进行命名提交到配置库上,然后知会其他项目组成员进行评审。由于这个单元测试产出物能够反映系统所要实现的功能,评审人员可以通过分析产出物判断每个测试用例是否真正执通过以及测试用例是否覆盖充分。评审者把评审过程中发现的测试用例未通过或者未覆盖等问题会整理成评审意见提交到配置库上,并知会开发人员进行处理。

表 4. 单元测试评审活动

  面对面代码复审

  在比较常见的轻型代码复审过程中,开发人员提交代码到配置库上,然后代码复审人员从配置库上获取相应代码并借助一些代码复审工具将复审结果形成意见提交给代码作者进行处理,并跟踪复审意见的处理结果。代码复审人员往往只在复审过程中有疑问的情况下才找代码作者进行确认。这种轻型的代码复审复审表面上执行起来比较容易,成本也比较低。但是它和《敏捷宣言》中提到的“个人与交互胜过过程与工具”这一价值观是相违背的。因为它缺乏有效的人与人间的交互。这种缺乏人员间交互的方式也导致了评审结果最终呈现给代码作者的往往是问题。这一方面使得代码作者只是被动得发现问题和解决问题。被动得发现和解决问题往往导致当事人对问题及其解决方法印象不深刻从而极易导致相同或者类似问题重复得出现。虽然我们可以将复审过程中典型的问题形成检查表由开发人员在代码提交前对检查表中的项目进行自检,但是这个检查表往往也是在重复的问题被重复得发现后才形成的。另一方面,这种代码复审往往给代码作者一种“挑刺”的感觉,而作者自认为代码中比较优雅的部分往往也被人忽略了,因为那不是问题因此复审人员也不会将其指出。这容易导致开发人员对代码复审的本能性排斥心理,因为人总是倾向于被他人肯定,而不是总是被人指出问题。

  笔者在所带的项目中开展面对面代码复审。面对面代码复审活动中,代码作者通过电脑显示器或者投影仪向其他参与人展示其代码并逐行对其代码进行讲解。其他参与人则对其讲解进行分析判断,并将其分析判断的结果提出同其他复审人员进行讨论。复审人员发现比较优雅的代码时可以及时指出来,并对代码作者给予肯定。因此,面对面代码复审某种程度上也是编程经验和优秀实践的一个交流形式。另外,对于经过讨论后确认的问题则记入代码复审意见表由复审人员跟踪其处理结果。代码作者对其代码讲解的过程某种程度上说也是其本人对其代码进行回顾和再思考的过程。因此,代码讲解过程中,讲解人往往会自己发现代码中的问题,从而对发现的问题有深刻的印象,这有助于避免同样或者类似的问题再次产生。另一方面,由于代码中的问题会当众暴露出来,对代码往往有种敝帚自珍心理的开发人员在代码复审前会小小谨慎地去检查代码,从而避免“当众出丑”。因此,面对面的代码复审某种程度上也是一种缺陷预防的措施。

表 5. 面对面代码复审活动

  Story演示与转测试控制

  《左传·庄公十年》提到“夫战,勇气也!一鼓作气,再而衰,叁而竭”。返工不仅增加了成本,阻碍了进度,还影响了士气降低了质量。返工往往是由于某道工序缺乏它的入口条件控制。比如,Story 转测试这道工序如果没有控制其入口条件,则很容易由于事先未评估被转测的 Story 质量导致在测试时仍然有大量的缺陷存在。这就意味着在第一次转测试后,开发人员需要修复大量的缺陷,并且开发人员在修复缺陷的过程中往往又引入了新的缺陷,进而导致了对于同一个 Story 需要进行多次修复缺陷和多次转测试的工序才能使这个 Story 满足质量要求。

  因此,对 Story 转测试这道工序进行入口控制可以有效避免返工现象。任何一个 Story 在其转测试前,我们要首先评估其质量是否满足一定的要求才决定其能否转测试。

  笔者在所带项目中通常以 Story 演示作为 Story 的转测试控制。Story 演示要求开发人员在 Story 转测试前召集该 Story 的测试人员及其他相关人员对该 Story 的各个验收测试用例的执行情况进行展示。其他参与演示的人员则根据展示的结果分析各个验收测试用例是否真正通过,进而评价所演示的 Story 的质量水平并决定所演示的 Story 能否转测。

  Story 演示过程发现的问题以及疑问可以记录入 Story 演示记录。Story 演示记录样例见表 6。

表 6. Story 演示活动

表 7. Story 演示记录样例

  结论

  经验过程控制模型为敏捷质量管理提供了一个简单易行的理论指导。缺陷预防是质量管理的一个重要思想,而经验过程控制模型可以帮助我们具体实施缺陷预防。另外,敏捷宣言所体现的敏捷价值观也为质量管理提供了思想指导。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-20 06:10:17

敏捷项目管理实战之质量管理的相关文章

《挖掘管理价值:企业软件项目管理实战》一1.5 敏捷软件项目管理

1.5 敏捷软件项目管理 挖掘管理价值:企业软件项目管理实战计算机进入互联网时代后,软件得到了前所未有的普及.人们对软件开发适应度的要求逐渐提高,传统的开发模式面对快速变换的需求显得力不从心.近20年来,很多学者和专家在研究软件的敏捷开发模式,其中Scrum开发.极限编程.迭代开发都是某种形式的敏捷开发方法. 1.5.1 敏捷开发概念 敏捷的英文是Agile,其原意是快速和灵巧地做出反应或动作.经过多年的敏捷实践和探索,在2001年美国雪鸟会议上,敏捷开发概念被真正地提出来,同时发表了<敏捷宣言

《挖掘管理价值:企业软件项目管理实战》一导读

前 言 挖掘管理价值:企业软件项目管理实战 我自2000年开始从事软件开发工作,至今已经有12个年头.刚开始进入公司的时候,我还是一个程序员,每天跟在师傅后面完成代码片段的开发.除了要完成日常的工作任务以外,我还要不停地学习新的技术.语言和工具.在经历了几年的热情之后,面对干涩枯燥的代码,我开始感到迷茫和厌倦,我问自己:"我的出路在哪里?以后做什么?写程序能写到几岁?" 所幸的是,公司的规模在不断发展中,业务量越来越大.现有的开发资源已经明显不足,人员进行了扩编,于是我顺理成章地当上了

【8月9日直播回顾】研发协同RDC敏捷项目管理实践

一份对敏捷项目管理的研究显示,在收益.质量.及周期三方面都分别得到了10%到20%的改善,而在成本方面则减少了54%. 敏捷到底是什么?和传统的协作方式有什么区别?敏捷项目协作和研发如何实行?本期我们邀请到了阿里云研发协同RDC项目域的产品专家方奕东老师给我们答疑解惑. 立即观看直播回放 方奕东(光脉),阿里巴巴产品专家,阿里云研发协同RDC项目域的产品经理,负责阿里云研发协同RDC的项目和项目集.需求.任务.缺陷和迭代管理等产品功能设计工作,也是阿里百年技术课堂最受欢迎的项目管理域的讲师. 方

《挖掘管理价值:企业软件项目管理实战》一2.2 项目确立过程

2.2 项目确立过程 挖掘管理价值:企业软件项目管理实战 软件开发项目的确立有的时候是必然发生的,如用户需求或对现有系统的升级和更新:有的时候是偶然发生的,如市场商机或业务部门突然提出一个需求或者是系统突然出现了故障.不管是何种情况,软件开发都不可能一蹴而就,总需要一个或长或短的过程.因此在开始软件项目之前,通常需要一个立项的过程. 2.2.1 立项目的 立项的目的是为了确定软件开发的目的和范围,评估项目的投入.回报.合理性和可操作性,同时得到上层的批准和预算. 通常而言,立项要解决以下问题.

Team Fundation Server的敏捷项目管理

问题描述 本人急需一名能熟练使用TFS(TeamFundationServer)工具进行敏捷项目管理的工程师,能够利用TFS的敏捷项目特性进行全程的使用,并最终提供报表分析.还请各位大牛有此功力者及时联系我,必有重谢. 解决方案 解决方案二:自己顶一个,有哪位大牛帮忙推荐一下人才,项目紧急解决方案三:TFS这东西,有点重,我之前用,现在还是用回vss了.它有个好处就是方便作产品支线管理,但使用的越深,要过的坑也会越多

《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程

2.4 软件设计过程 挖掘管理价值:企业软件项目管理实战 软件设计是根据需求的内容,运用计算机理论.技术和工具将其合理地.有机地.具体地转化为功能,并演示其实现的方法.过程和结果.设计人员在理解了用户的需求之后,首先在自己的脑海中会有一个大致的概念和思路,然后考虑如何去实现这些功能,当然这需要一定的专业知识和实践经验.这里就不阐述软件或数据库设计的理论知识了,而重点介绍如何将设计人员脑子里对软件的设计和理解反映到文字.图形和流程上,使得用户可以了解计算机是如何实现他们的需求的.我们用图 2-9

《挖掘管理价值:企业软件项目管理实战》一2.3 需求分析过程

2.3 需求分析过程 挖掘管理价值:企业软件项目管理实战 需求是软件的重要部分,好比是发动机离开了汽油不能运行一样.没有需求就没有软件存在的价值,没有需求就不可能让计算机完成人所需要做的事情.可以说需求是软件的基石或土壤,就算是一样的需求,因为对其不同的理解和解释,也会开发出迥异的软件.这就好比,相同的种子在不同的气候和种植方法下,长出来的果实也是有差异的. 2.3.1 需求的特点 普遍的需求都会符合以下的特点,有些比较明显,有些则比较模糊. 目的性.有明显的要求,希望得到什么,不是模棱两可的.

《挖掘管理价值:企业软件项目管理实战》一第 2 章 流程式生产软件——过程管理

第 2 章 流程式生产软件--过程管理 挖掘管理价值:企业软件项目管理实战 做事需要章法,管理需要流程.软件开发生命周期理论定义了软件开发普遍的过程,软件项目管理工作之一就是以此为基础,对软件开发的过程进行细致的管理. 本章重点 建立项目流程.为了标准化软件开发的过程,企业应该根据自己的管理要求建立项目管理流程. 项目确立过程.要开始一个软件项目,就必须先对项目的合理性进行恰当的论证和评估. 需求分析过程.软件的内容和功能来源于需求的收集和分析,应该根据需求的重要性来设定开发的优先级. 软件设计

《挖掘管理价值:企业软件项目管理实战》一1.1 什么是软件项目管理

1.1 什么是软件项目管理 挖掘管理价值:企业软件项目管理实战软件开发是构建软件本身以及系统中一部分或全部产品的开发过程,是一个包括设计.开发.测试.实施.维护的系统过程.软件项目管理是针对某个特定的软件开发项目进行管理的过程,其主要目的有以下6种. 收集用户需求.收集和分析需求,使其可以利用计算机技术来实现. 安排和分配资源.包括人力资源和物资资源,使其投入软件开发活动,实现需求目标. 管理和控制项目进度.使其能够在预定的时间内完成或阶段性地完成任务. 控制质量.实现软件功能,使其能够达到设计