单纯的过程改进真的能提高开发团队的交付能力吗?
今天中午和一位刚从客户那边做完敏捷咨询的同事聊天,这位同事和团队利用四个月的时间把客户的一个几十人的产品团队领进了敏捷的大门,教会了大伙怎么样进行敏捷需求分析,开展敏捷项目管理;手把手地和大伙一起用TDD的方法开发代码,编写测试,进行重构;用Cruise搭建起了持续集成平台,把原本零散滞后的编译集成过程自动化起来;甚至几个人特意为客户开发出了一套在他们开发平台上缺少的测试框架…… 短短的几个月下来,这个开发团队的交付能力产生了质的变化,而且更为关键的是,大家都看到开发团队是在延着一个正确的方向上走。
上个周末,我和在另位一家公司做tech lead的一位朋友也聊起了类似的话题。她所在的项目已经运行几年时间了,然而她却还在为测试力度不够、设计质量不高、持续集成效果不佳等问题而头疼。而且我在谈话中得知,她们公司中的其他项目也都有着类似的问题。由于在公司层面很少能得到什么实质的支持,tech lead们只好自发组织起来,互相交流,以期摸索出一些有用的东西来解决问题。
同样是开发团队,为什么一个团队仅仅用了四个月的时间就脱胎换骨,而另一个(其实是多个)却常年得不到实质的提高?
原因是有多方面的,但我今天想说的是,软件开发归根到底还是一种工程层面上的活动。再好的项目管理方法,再好的项目管理人员,再好的项目监管平台,如果没有工程层面上的重视和提高,都只能是白费。
上面例子中的后面一家公司在两年前开始开始实施CMMI,并且顺利通过了CMMI五级认证。公司给项目运作从头到脚建立了一套较为完整的管理体系,从需求过程管理到设计过程管理,从测试过程管理到开发过程管理,从资源管理到风险管理,无不涉及。项目经理们每周都要填写不少的文档,公司甚至还成立了专门的监管组织,专门负责以CMMI的标准来定期审核各项目的运作情况;在过程改进的同时,公司还在人员建设上下了功夫,陆续招入了一些有经验的项目经理。
然而,过程改进层面上的繁荣并不能掩盖开发团队工程能力的不足。随着公司的战略转型,大量经验欠缺但成本较低技术人员的流入更加剧了这一矛盾。开发人员没有写测试的意识和经验,项目的交付压力使得大家尽可能快地写代码,而没有足够测试覆盖率的代码只能是越堆积问题越大;很少有项目能顺利地进行自动化系统测试,缺少了自动化测试的帮助,测试人员只能隔段时间进行一次“人肉回归(manual regression testing)”,耗时耗力,而且很容易出错;大多数的团队都还没有正确地应用持续集成,少数已经应用了的通常也只限于进行自动化编译和打包,更不要提持续发布和版本管理了;项目人员在拥挤、空气混浊的环境中办公,很多项目根本没有一块独立的白板;很多开发人员从来没有用过重构工具,很少有人关注在工具层面上提升生产效率,甚至很少有人能熟练运用开发工具的快捷键,而只是一次次低效率地用鼠标去点击菜单……
说到这里,我没有任何贬低的意思,因为我也经历过类似的环境,也有过同样的困惑和迷茫。在经历了一个个的交付项目,一遍遍地重复上面的种种问题之后,我曾经对软件开发失去过信心。一直到加入ThoughtWorks,和身边的诸多高手共事以后,我才亲身体会到,软件项目归根到底还是一种工程层面上的活动,任何的社会性因素都不能够也不应该喧宾夺主。开发人员只有学会了正确地写单元测试,才能保证开发出来的代码在单位层面上是工作的,也才可以尽早地暴露潜在的问题;只有积累了大量好的测试,才能在系统演变的过程中持续获得回归回馈,否则时间越长,代码越难维护;开发人员只有学会怎样重构,才能不断改善系统的设计,让系统始终处于一个可工作、可调整的健康状态,而不是过早地病入膏肓,任何改动都可能会伤筋动骨;团队只有掌握了正确的自动化测试技能,才能开发出稳定、有效的系统测试,从而帮助测试人员分担测试负担,以便让测试人员把有限的精力投入到探索和创造上面;团队只有正确地认识、应用并且不断重构他们的持续集成过程,才能持续不断并且快速地获得系统质量的反馈,并且参照这些反馈来不断地改进和完善自己的开发过程……
然而非常可惜的是,很多的组织只注意到了开发过程的改进,用“大跃进”的思路,期望通过自上而下的管理手段来解决问题,而忽略了最为重要的工程层面的努力,其结果也就可想而知。软件开发不是工业生产,开发团队如果只是周期性地写写表格、做做汇报、分析一下交付风险,制定一些应对措施的话,其交付能力是不会有什么实质的提高的。
