本文讲述了作者在两年的敏捷测试和开发工作中的经验和体会。从敏捷的实质,敏捷测试的方法和过程,到如何帮助传统团队转变为敏捷团队做了详细阐述。本文是系列的第一篇文章,着重讲述敏捷实质。
从游戏开始……
有个非常有意思的游戏能够帮助大家理解敏捷和传统开发的差异。游戏有两个角色,一个是“老板”,另一个是“员工”,在 2 分钟内,“员工”需要在“老板”的完全指挥下,即“向前一步,向后一步,停,向左一步,向右一步”,完成 60 步移动的任务。“员工”需要执行“老板”的每一个指令,不允许做出相违背的动作。“老板”则不参与行动,只发出指令指挥“员工”的活动。我们体验这个游戏时,当场 60% 的参与者成功完成了任务,大致估计出我们的工作效率是 50%*60%=30%。游戏后,参与者被问及对这种行为方式的感受时,无论是“员工”还是“老板”都表示非常不满。
接着,大家又做了另一组游戏。2 分钟内参与者被要求独立的、自主的完成 60 步移动任务,在这次游戏里,所有参与者任务相同,大家可以自行决定、并依据自己的判断随时调整其步伐方向,快慢。最后,我们发现所有参与者不但毫无折扣的按时完成了任务,因而工作效率也达到 100%*100%=100%,而且所有人对于这种新的工作方式更是产生了极大的兴趣。
以上两个游戏方式的对比就折射出传统开发(前者)与敏捷开发、测试活动方式的对比,其中优劣不言而喻。
而敏捷开发、敏捷测试又是怎样一个概念呢?他们是否能够帮助我们的团队突破束缚,在日益激烈的竞争环境里表现得更为出色呢 ? 请参考我的这个系列文章——“敏捷测试的最佳实践”。
敏捷的价值
首先我们解释一下什么是敏捷,在字典中我们得到解释,敏捷,即反应迅速、可以快速变化。如今敏捷开发已成为众所周知的时髦 IT 词汇,在这个领域里敏捷又被诠释为迭代的,快速应对需求变化,轻量级,并且简洁。
图 1. 面对客户业务复杂度问题提出敏捷的解决方案
IBM 重视敏捷开发,敏捷的软件开发策略之也被广泛推广开来。中国软件开发中心是 IBM 软件部部署敏捷开发方法的重点实验室之一。我们也是 IBM 中国软件开发中心最早使用敏捷方法的开发、测试的团队之一。这篇文章主旨为帮助那些愿意采用敏捷,和正在采用敏捷开发、测试的团队正确了解敏捷的实质。
笔者做敏捷项目已经近两年时间,对于敏捷的理解,认为最为关键的是需要注意两个方面,它们是“高度迭代”和“持续不断的客户反馈”。
- 高度迭代:迭代就是指产品的开发过程中,一个完整的开发活动周而复始的进行,产品的功能、性能、可用性在周期活动的叠加中不断得到更新和加强。甚至指在一个迭代周期内产品活动也具显著的周期性。同时,团队间、团队内部成员的高度协作及时帮助解决了各成员的依赖性问题,因此,也促进了各个成员工作的顺利开展,保障了产品活动稳定的持续性、周期性。以测试为例,传统开发模式下,测试人员可以因进入测试阶段的条件不完全满足而继续的等待。而在高度迭代的敏捷项目里,不同的是,我们希望测试人员能够尽可能的做能够做的工作,尽可能的早工作。“等待”在敏捷开发、敏捷测试范畴里已是一种错误概念了。
- 持续不断的客户反馈:指在产品开发任何时期,代表项目业务(Business)的利益干系人(Stakeholder)都要参与到产品的需求分析,设计,以及其他活动的决策制定中来。致力于在短时间内帮助团队实现将客户的需求转化为高质量的可消费产品,并转化成利润。
敏捷开发的商业价值
敏捷开发自 2001 年《敏捷宣言》(“AGILE MANIFESTO”)1的创生,经过多年的打磨和退火已经成为今天非常流行和有过许多成功案例的开发模式。正如前人所说,传统的东西就是用来打破的,传统的瀑布式开发模式必然逐渐退出历史舞台,敏捷开发、敏捷测试是在新环境里产生出来的打破传统的新开发模式。而敏捷也将会在将来,甚至现在转化成更适合现代化软件开发、测试团队的方法和实践。在本文的第一部分,我们以两个游戏类比了敏捷和传统开发的差异,这里为了进一步帮助大家对敏捷的价值有更清晰的理解,我们借鉴前人的研究结果:
图 2. 敏捷与传统开发的比较
首先敏捷开发过程比传统开发要为项目和产品带来更低的风险(RISK)。为什么呢?传统开发缺乏持续的客户反馈 , 产品一旦从需求阶段退出,整个开发团队近似封闭工作,团队虽努力去实现曾经认定的目标,但因月有阴晴圆缺,市场需求也瞬息万变(例如提出需求的客户已经退休)。这使得产品在数月后,数年后发布时已经失去了占领甚至进入市场的最佳契机。
而如果你还在考虑使用传统开发模式用现在乃至将来一、两年的时间来开发一个结构复杂,精益求精而又功能庞大的产品,那么你得好好做好失败的准备了。而正是因为出于对这种风险的考虑,越来越多的人认识到敏捷开发要比传统开发能够为企业带来更大的利润空间和更低的投资风险。
其次,利益干系人(Stakeholder)的频繁参,与使得团队在产品开发的各个环节遇到的种种问题得到了及时的解决。因此,我们认为敏捷开发拥着比传统开发更大的透明度(VISIBILITY)。作为老板,项目的负责人一定对这样的开发模式带来的可控性充满了向往。
团队或者产品的适应能力(ADAPTABILITY)也决定着其生命力,因为敏捷开发模式鼓励团队采纳新技术,欢迎变化,并能够快速应对之,使得产品和团队自身都有很强的适应力和生命力。而在传统模式里,当需求变更时,复杂的变更管理流程要求通过正式讨论、审批,也备以足够的文档和说明来支持每次“决策”。这不但带来了人力,物力的浪费,更重要的是它严重延长了企业投资到利益回报的周期。而只有拥有反应迅速的敏捷开发才能够帮助企业赢取市场,降低风险。
以上我们谈及了敏捷开发拥有的比传统开发能为企业带来更大的商业价值和提供企业更大的发展空间。而对于个人而言,笔者认为敏捷开发也提供给了个人更多的发展机会和提出了更高的要求。以下是笔者从个人角度做出的分析。
敏捷开发有益于个人发展
敏捷项目首先拥有一支支小规模但职能全面的团队,在这样一个普通的敏捷团队里,拥有具备不同职能的 7 名成员,1 名 UCD(User Centered Designer),1 名 Visual Designer,1 名测试人员(Tester), 1 名 Information Developer 和 3 名开发人员(Developer)。因此,每一支敏捷团队中的设计、开发、测试、美工、文档等等工作分属给了这个团队里不同的,唯一的人。每个人在团队里因而必须具有对其所涉及领域强的责任心和领导力。就测试而言,测试人员就是好比一辆跑车里的唯一的驾驶员,项目就好比这辆跑车,测试人员需要及时修正行驶方向的偏差,确保这辆车在正确的道路上稳步前行。如果,测试人员没有具备足够的责任心和领导力,只是人云亦云,恐怕这种测试要与不要没什么分别,敏捷项目的质量也更让人担忧,而敏捷也就失去了原有的意义。因此,作为唯一的测试人员,他(她)将拥有对测试的所有权,计划、设计并且执行所有的测试工作。而也因为拥有了更多的主人翁精神,积极的工作热情,测试人员勇敢的面对工作中的各种挑战,学习新的知识和努力培养自己的工作技能。敏捷无疑对个人发展产生了很大的推动作用。
敏捷团队中的每个人,需定时和团队的其他成员坐下来看看团队的整体进度,计划下一步工作,并一起探讨所遭遇问题的解决方案。也需适时的寻求团队中其他成员的帮助解决时下紧要的问题。通过频繁的合作与沟通,个人的协作能力、沟通能力也得到了较大的提高。下面我们具体就这两个方面进一步谈谈敏捷开发是如何帮助提高个人的协作能力和沟通能力的。
敏捷开发培养了个人的协作能力
与传统开发不同,敏捷开发更加侧重以人为本,发挥人的积极性,以此提高团队的工作效率。真正实现以结果为导向的职场守则。作为团队的一份子,无论是测试、开发人员,还是设计人员,他们都将为团队成败担当不可或缺的责任。团队是高度协作的团队,个人除了做好本职工作外,敏捷开发模式要求个人能够了解和争取更多的扩展性的工作,也能帮助团队其他成员解决他们的遇到的各种独特问题,以加快实现团队的统一目标,即在更少的时间里生产出能够推向市场的可靠产品。
这里再次提及高度协作,笔者认为高度的团队协作主要表现为以下特点:
- 团队成员积极分享经验,知识,自我培养所需技能和自我成长;
- 团队成员相互帮助,愿意成为他人后备队员,随时做好准备投入新的战斗,因而保障了团队的高昂士气和强大的生命力。
- 任何决策是团队共同的决策,工作是团队共同的工作,团队工作的最后成果因而也是来自团队中每个人的辛勤培养和贡献。而团队的失败更是整个团队的失败,绝不会是某个人的单方面的过失。这种荣辱与共,共生共息的信念将让团队的力量超过团队各个力量之和。同时,项目团队的工作效率在团队成员技能的提升和信念的巩固中不断提高
敏捷开发锻炼了个人沟通能力
我们把团队看做一个高度协作整体的同时,不可忽视的是团队内部仍存在的各种矛盾,对这些问题的听之任之将破坏团队的凝聚力、生产力。这中间反映出来的很多问题不是敏捷方式独有,但团队成员因为敏捷,学会了自己解决各种问题。而相应的沟通能力也随着问题的解决得到很大幅度的提高。
在过去的项目经验中,我们不难发现种种人与人之间矛盾的产生。而经典的矛盾论也让我们不得不的接受,矛盾是永远存在的,但这并没有什么可怕。而是一旦我们发现了矛盾的存在,就要迅速找到解决办法,这也是团队的相当重要的工作。尤其是在团队组建初期,团队开始采纳新开发模式时,锻炼团队解决如下矛盾的工作非常重要:
- 测试人员是质量的工程师,开发人员是产品的缔造者,在对质量标准的认同上常有不一致(当然,传统开发也会产生);
- UCD 的设计实时反应用户需要,但有时不能顾及代码的可实现性;
- 开发人员而却更喜欢用想当然的理解,和习惯的方式填写代码,甚至主观的抵制接受新设计思想和拒绝新类型缺陷的修复,因此与团队的整体目标、出发点产生分歧;
- 从整个项目组织结构看来,敏捷团队之间(一个项目通常有多个敏捷团队组成,各个团队有自己的侧重点)存在设计,开发的不一致性,这使得产品在整合阶段产生额外的成本。
正如前面所论述,矛盾总是有能够解决的途径,敏捷项目的组织中用管理方式去干预是一种直接、快速的方式,而今天敏捷方法论者们更加推崇的是鼓励团队内部进行很好的交流和沟通后自行解决。也正是通过不断加强团队间和团队内部的相互理解,不但矛盾得到很好的解决(解铃还须系铃人嘛),个人的交流和沟通技能也得到了进一步提高。
敏捷开发培养了个人的创新意识
创新能够为企业带来新发展契机,创造新价值,因此,创新对于企业还是个人而言都非常之重要。不断培养员工的创新能力、鼓励创新活动也是几乎所有企业的人才培养战略之一。而敏捷开发恰恰就是要打破传统的模式,形成全新的敏捷开发、敏捷测试方法、实践和过程,并鼓励团队采用新技术和技术创新。因此,团队的每个人需要能够创造性的工作,并乐于接受新事物,通过不断的改进、突破过时的做法,努力提高团队的工作效率,来适应产品的增量发展需要。
而也因为敏捷开发模式对于很多团队仍很陌生,在运用敏捷开发的过程中我们会遭遇许多新挑战、新困难。如何处理这些问题,解决方案本身就是无以借鉴的,自主创新才是唯一出路。
举个例子,敏捷项目初期,产品停留在原型论证和底层架构初步设计中,产品功能不多,复杂度较小,一般的手动测试就可以将质量保障做好。产品的中后期,因不断有新需求、新功能的加入,产品复杂度增大。团队倘若仍仅凭固有的手动测试方式来覆盖产品的各个功能、非功能点需求只恐怕是力不从心了。因此,考虑用自动化测试来提高团队工作效率是可取的方法之一。但是,当产品发展到中后期,也没有富余的资源可以被抽取出来做自动化测试了。即使现招聘新人,也因为新人对产品不了解,只怕自动化测试的效果也未如人愿。那我们是否应该在开发活动的初期就尝试自动化测试的设计、并自动化一部分功能测试呢?也未然,因为在产品开发初期,产品的功能和界面的变动会比较大,自动化测试收入产出比异常低。因此,何时、何地、如何设计、运用自动化测试来帮助降低人力成本,提高测试效率是需要我们大胆创新的。
敏捷方法的共同点
以上我们通过商业、个人发展两个方面讲述了敏捷开发的价值和意义。那什么才是敏捷开发呢?在业界又有那些方法是敏捷开发的具体实现呢?各种方法有什么共同点吗?通过下文对各类敏捷方法的共性分析,我们也将进一步了解敏捷的实质。
敏捷方法
业界流行的敏捷开发的方法有许多(要了解各类敏捷方法和分类请参阅本文参考资料中文献),我们需要根据项目大小,性质来选择合适自己的敏捷方法。比如说 XP(极限编程,eXtreme Programming)更加适合小型项目 3-5 人的团队。Scrum,DSDM (Dynamic Systems Development Methodology) 等更加适合大型团队的项目开发。而敏捷开发也不是一成不变放之四海皆准的准则,而是一个方法的最佳实践。各个团体和企业也不断定制着自己的最佳游戏规则。VersionOne 的敏捷开发的调研报告中很好的对比了各个方法被业界采纳的比例(见下图 3)。这个图表就是 2007 年对来自 71 个国家 1700 多人的调查结果的说明。
图 3. 流行的敏捷方法
除了图例中的方法外还有 Crystal, Lean Software Development, Feature Driven Development, Xbreed, RUP 等等。
敏捷方法的共性
虽然各种敏捷方法的名称、所需环境、适合的团队有很大差异,但是他们拥有相似、相同的以下几大特点:
无论是多么明智,多么正确的决定,也有可能在日后发生改变。因此,团队要能够充分理解我们的利益干系人(Stakeholder)和客户代表为什么经常提出新的需求和设计要求,一句话,就是心中有数“唯一不变的是变化”。团队更要信任 利益干系人(Stakeholder)做出的每次决定和需求的调整都是将产品开发推向更正确的发展方向,新变化将进一步降低风险,实现团队最大化利益,理解这是适应市场变化的必然行为。
而在接受变化的同时,我们应该积极的向 利益干系人(Stakeholder)和客户代表反映实现活动中暴露出来的可能的设计缺陷和错误。在实际工作中,团队成员应该用优先级制度来划分事情和目标先后顺序,在迭代周期内对于还没有最终决定的设计方案可以予以后来实现、测试,不用急于投入资源展开全面的开发、测试活动。这样一来,开发测试团队也会人员也将更加适应,真正拥抱变化。
- 客户的参与(With Customer Representative on site)
首先谁是客户(Customer),客户代表(Customer Representative) 呢?利益干系人(Stakeholder),或者我们可以理解为我们的客户(Customer),产品的最终使用者(End user),内部使用者(Insider),商业伙伴(Business Partner)。利益干系人(Stakeholder)作为团队中最了解业务(Business)的人物将帮助开发团队的快速达到目标和做出适时决策。开发团队拥有很好的技术但在业务(Business)方面他们需要 利益干系人(Stakeholder)的帮助。而通常在敏捷的开发项目中,团队中的任何一个人若需要帮助时,只要简单的邀请大家参加一个 15 分钟会议,或一封邮件、一个电话便可以解决。
但是,如果利益干系人(Stakeholder)各执一词怎么办呢?为解决这个问题,将 Product Owner 引入到讨论中来,作为 Product Owner 他可以作为是 利益干系人(Stakeholder)的代表,能够在分歧中做最后抉择。因此,通过这样的客户代表的参与,团队更好的了解了所做事情的价值和意义,其工作效率也因而得到很大提高。
利益干系人(Stakeholder)能够帮助团队中的每一个人更好,更快的完成了工作,他们的直接参与成为了敏捷开发、敏捷测试的重要前提。
- 较少的文档(With less documents)
敏捷开发更重视生产出可用的产品而不是详细文档。而时常有发觉文档又是无论敏捷还是传统开发、测试不可或缺的一部分。笔者认为,传统开发的文档在敏捷开发里仍有大用,只是原来十来页的内容精炼到现在的一页半页。
敏捷主义者相信文档不是最佳的沟通方式,他们鼓励通畅的交流和沟通,要求避免和减少陈词滥调和空头支票。尤其是复杂的文档说明只是增加了沟通成本,因而敏捷开发、测试的文档不需要长篇累读,需要的是简洁,清晰。任何一段清楚的文字,甚至一张图片,照片,一封记录着会议记录的邮件都是我们认可的敏捷文档。因为是无论是通过文字板书的文件还是其他的沟通方式和载体都是为了帮助团队进行更高效的交流和沟通。只有团队保持着沟通上、理解上的一致后才能够充分发挥出团队最佳战斗力。但凡这是帮助团队有效沟通的方式,敏捷开发是不会放弃的。
- 最大化的生产力(Maximize Productivity)
敏捷开发模式要最大化的提高团队的工作效率。无论是依靠剪除冗余的文档工作,还是提供民主的、通畅的沟通平台都是为了帮助团队能够集中有限的精力处理有意义的问题。据调查,通常人会在两个、多个任务并行的情况下产生出出最高工作效率。而敏捷也恰恰使用了各种方法得到团队的最大生产力。
敏捷开发的 Scrum 模式,要求在计划阶段,团队成员主动定制迭代周期的所有工作任务,因此,本身从团队开始迭代活动的那时起,已经在在多重工作的压力下紧张工作了。而在日常的迭代生产活动里,各个成员需要当众简单汇报当天的工作进度和承诺下一个 24 小时的工作计划。因此,通过增加敏捷人员的工作的透明度,无形之中,团队成员的生产力进一步得到提高。
- 测试驱动开发(Test Driven Development)
测试驱动开发,是让开发人员在编写功能代码之前,根据对需求的理解先设计和编写单元测试代码。先思考如何对将要实现的功能进行验证,再考虑功能的实现。然后迭代的增加新功能的单元测试和功能代码编写,直到完成全部功能的开发。
- 自动化冗余工作(Automate the redundant work)
将团队成员从冗余的劳动中解放出来,无论是自动化的测试还是自动化工具的开发只要能够节约成本都是敏捷开发、敏捷测试的目标。
敏捷团队是一支民主的团队,团队关系是平行的,每个团队成员能够平等的参与讨论,决策。传统开发的垂直的官僚机构在敏捷开发中已是过时的。
敏捷团队的决定权交有团队自己,决定是团队统一制定。无论是产品设计方案还是产品的功能实现都是的最佳结果。团队脱离了任何一个成员的工作都是不完整的,所以我们应当足够尊重其他成员的劳动果实和表达对其他成员的充分信任。尊重团队,尊重团队中的每一个成员都是敏捷开发的原则之一。
你敏捷了吗?
你敏捷了吗?经过上面的学习,我们应该已经了解了敏捷的实质,并且笔者认为如果您的团队已经表现出上述的特点,那么您的团队已经敏捷了。但是,往往很难做到如此理想的敏捷。而同时,我们需指出敏捷与否也并非我们的最终目标,我们的目标是能够通过学习敏捷的方法和最佳实践来开发可以适用于自身特点的方法和过程,帮助项目灵敏的适应市场变化,让我们变得敏捷起来。
因此,我们依然希望进一步帮助大家了解如何变得敏捷,而首先,还是让我们学习大师留给我们的一套基本准则帮助我们判断项目开发敏捷与否吧。通过按照此标准的衡量,我们将容易得出项目是否敏捷的结论,也能够因地制宜的找到问题所在,最终实现敏捷。
Scott W. Ambler 在其文章How Agile Are You?中指出了以下七条原则帮助大家来判断什么项目是敏捷的项目。
- 项目中有利益干系人(Stakeholder)的参与
- 团队拥有并且可随时执行的回归测试
- 关注产品自身而不是冗余的文档
- 项目开发拥有严格的源码管理、版本控制
- 开发能够积极面对和响应项目需求变化
- 团队作为整体直接担负项目责任
- 能够自动化重复性的活动
结束语
在敏捷测试最佳实践系列的第一篇文章中,您了解了敏捷实质,敏捷为我们带来的更多的业务价值的提升和一个更好的个人发展平台。对敏捷方法的共性分析中,我们了解了敏捷开发的关键特性,也了解了判别是否敏捷的方法和标准。
敏捷测试最佳实践系列的第二篇文章将基于笔者亲身经历的敏捷测试成功案例介绍敏捷测试的实践经验,使您对敏捷测试的结构和部署细节有更加清晰的认识。最后,本系列的第三篇文章将帮助您了解从传统测试转向敏捷测试所需具备的条件和方法,并分享笔者在敏捷测试的实践过程中遇到过的几类问题和解决这些问题的主要方法。
接下来,请我们继续关注敏捷测试最佳实践系列之二“敏捷测试的最佳实践”。