昨天通过微信沙龙,分享到了一个案例,讲述的是从成功到失败的过程。
很多人可能疑惑,很多案例都是从失败到成功,这个怎么反了。很多成功背后都有其原因,可能很励志,但从失败中我们能够获取更多。毕竟我们的知识大多源于失败而非成功。
故事是这样的(括号中的是笔者的情绪表达 :)):
(在很久很久以前……)某公司成立了一个团队,开发一款全新的产品。产品的开发模式是产品需求获取和开发同步进行,团队构成为:项目经理带领开发和测试两个子团队,每个子团队各有一名Leader。产品经理在开始仅提出最基本需求,根据内部用户的反馈,不断改进需求。(哇噢,很酷!)。这就导致了持续发布的需求。开发流程选用了Scrum。(用到敏捷啦*_*)。开发测试同步进行,最早几个Sprint,采用纯手工测试,仅限功能测试。(噢~,会成功么?)。纯手工的问题立刻暴露:无法回归。(出现问题了吧~)。形式所迫,引入自动化测试。(还好,纠正的及时 :))。项目经理很权威,立刻决定实施自动化测试,同时保留部分新功能的手工测试。但问题依然存在,当开发人员不参与测试,测试相对于开发的滞后是必然的。这个gap无法逾越。
项目经理允许测试落后开发一个Sprint。(看来要违反敏捷中“完成”原则了。)测试工程师们经过努力,达到了这个标准,中国team表示很满意;但美国老大不满意,要求开发测试必须同步。(看来老大还是理解敏捷的。)于是制定强制要求,要求开发人员必须写单元测试,由此引入了TDD。(哇!原来这个神器是被老大逼迫使用的。)同时测试架设CI,并引入测试覆盖率统计工具,如果新功能的测试代码覆盖率低于阈值,则不允许checkin代码。(持续集成也有啦。手舞足蹈中~)。项目经理进一步要求,开发人员必须参与集成测试Case的编写,这一点其实并没有很好的执行,但靠着项目经理个人的权威和测试工程师的努力,产品就这样发布了。反馈非常不错,Bug很少,且没有任何致命的Bug。(耶~成功啦~,此处掌声如雷!)。总结经验,感觉产品的质量很高,能到达这个质量,与开发和测试同步进行有直接关系。所以此产品1.0发布之后的开发中,希望敏捷过程更加推进了一步。
成功发布了一个产品后,团队又接受了开发另外一个新产品的任务,类型与前者类似。团队将敏捷推进到了第二阶段:全功能团队,Scrum+pair programming+TDD。(此处可以有掌声!)(满眼都是羡慕的小星星,结对都用上啦!)。开发测试不分,前后端不分,所有工程师都一律结对编程。由于招聘时对测试人员的要求高,因此Coding技能并不比开发人员差。这时没有QA和Dev的差别了,两个人之间会自由交换角色。团队终于从半敏捷转为全敏捷!(其实前面已经很敏捷啦~)。
但是从这时起,一个负能量的变化却在暗流涌动:项目经理和测试Leader因升职或其他原因而调离团队,整个团队中没有人再关心质量。但是问题并没有立刻暴露,因为前一个项目中遗留的资产(Test frame work、Test case等)还能继续使用。还有一点就是美国团队引入了一位精力充沛的Architect,这位老兄每天20小时盯着项目,还会自己手动的去进行测试。(美国牛仔?)。他成了项目中唯一一个关心质量的人,不断的督促团队成员去写测试Case。到这个阶段,整个项目依赖着前一个项目的积累和Architect的个人英雄主义推行着。
依赖着这套貌似很酷的“敏捷”,项目坚持到了产品的发布,但大家都知道这个项目的质量是无法和前一个产品相比的。(我这时问了一个问题:团队中是否有敏捷教练或类似的角色?回答是没有。)故事还没有结束,原测试人员的顶头上司(测试部门经理)转变了职能,但团队中QA engineer的report line并没有改变。至此,团队内外,已经没有人关心质量了。之后持续了一段时间的结对编程,但是TDD已经被放弃了。(神器被首先抛弃了。)。CI虽然还在运行,但每次运行时执行的Test Case已经很久没有增加过新的,旧的则无人维护以致被关掉了。(测试通不过怎么办?不测试就行了呗 :))。之后所谓的敏捷团队,就是产品经理的Story,以及团队成员每天去完成这些Story。他们觉得已经“完成”了,就Checkin。整个团队陷入了噩梦的状态,如果产品经理不去确认,没有人知道这些程序是否能够运行起来。
最终的结果是,曾经开发新产品Bug不超过两位数的团队,现在沦落到一个新的功能完成后,都没有人去测试一下的状态。(呜呜呜~,大哭!)。
是什么导致了这样的结果?下面是笔者的一点感受:
- 前一个产品开发阶段的敏捷,是权威下的“敏捷”。之所以成功,不是形成了真正敏捷的自组织团队,而是在项目管理人员的个人权威之下,实施了真正的敏捷实践。当权威不再存在时,实践也就无法坚持下去了。
- 敏捷团队中没有敏捷教练/Scrum Master。许多人认为这个角色在国内的公司内是无法得到认同的,因为他既不开发也不测试,对产品没有贡献。而这个案例恰恰对此作了很好的注释。我们是关心一个人的成本被“浪费”?还是坐视一个团队的成本被浪费?之前的那个项目经理这个角色是否是“浪费”?(关于此点当时有所讨论,分享者认为项目经理与敏捷教练是不同的,项目经理的责任更多,而敏捷教练则很少。笔者认为这是一个误解,项目经理的责任,包括权利被整个团队继承和分担了,其中项目整体管理这个责任的一部分就放到了敏捷教练身上。同时,敏捷教练也承担了更多其他敏捷相关的责任。笔者个人认为:当团队成员都对敏捷有了极致的理解,敏捷文化高度盛行的时候,敏捷教练也就不需要了。也就是说,敏捷教练一定要做自己的掘墓人。)
敏捷教练的角色之所以重要,就是因为TA在引导大家遵循敏捷实践的原则和价值观,遵守敏捷的纪律,最终促使团队走向成功。
缺少了敏捷教练,就没有人关注团队中那些偏差和障碍,甚至当这些问题摆在面前时,大家也是熟视无睹。比如案例中:对TDD的抛弃、对“完成”定义的抛弃。 - 没有敏捷教练的角色,带来的另外一个弊端就是没有人宣扬和传输敏捷的价值观和文化,没有人对团队成员进行敏捷教育。从而使得团队只是一个权威下的“敏捷”团队,而非最终形成一个自组织的敏捷团队。
9/28日更新:
刚刚看完Ken Schwaber和Jeff Sutherland合著的《30天软件开发 告别瀑布拥抱敏捷》,其中在第8章——“在企业中应用Scrum”——中有这么一段话,对此类案例做了精辟的总结:我们已经见过太多例子,在企业内的其他人还没有真正懂得如何用新的方法思考和工作,转型还没有在企业内扎根时,发起人就由于晋升或离职离开了原来的岗位。当发起人高官离开之后,之前取得的进步将灰飞烟灭,而刚被淹埋却没有根除的旧文化又会卷土重来。之前取得的优势和持续改进的习惯也会随着时间的推移渐渐减弱。
欢迎大家板砖伺候!