UML软件工程组织

敏捷和CMM
2006-04-12

 关于敏捷和CMM,以及怎样在CMMI的框架下有效的引入敏捷的开发,是我所一直关注的话题,最近在网上闲逛,看到ThoughtWorks总经理郭晓在软博会上的演讲,觉得讲得不错,现转载如下(转载于网易科技):

 实际上我们软件产业要发展就要创新,在当前这种形势下,具体讲我们怎么样创新和融合,我觉得胡主任的报告做了一个非常好的报告和研究。我觉得是值得大家借鉴的。

 下面大家都知道,我们对于软件产业的发展过程中,软件的质量等等问题是非常重要的。下面我们有请国际上一个著名的公司叫思特沃克ThoughtWorks软件公司,它在软件开发方面是一流,也有好多新的方法。有请思特沃克软件技术西安有限公司总经理郭晓。

 郭晓:大家好,我是来自思特沃克的郭晓,我今天主要的演讲题目是敏捷开发的成功应用以及对中国软件产业的影响。

 首先我先简单介绍一下思特沃克公司,我在这个公司工作了已经大概6、7年了。这是一家跨国的软件公司,总部设在芝加哥,是93年成立的。总在英国、加拿大、澳大利亚、印度、中国都有分公司。我们使用最先进的技术物系比如敏捷式的管理方法、SOA 等)来更快更好的交付技术解决方案。

 我们同时也做技术咨询和管理咨询,我们没有一个固定的行业,客户都将ThoughtWorks掌握的技术知识。

 在过去从60、70年代到现在,软件的应用规模越来越大,过去几十年当中出现了几十次核心浪潮,比如在70年代中期,有HLL、烟筒式的方法,90年代出现的是规则引擎等方法,在最近几年这种波浪式的发展情况又到了一个高峰的时刻。要提到敏捷式管理方法,就要提到CMM,它对开发的过程不断的改进,很多公司通过改进确实得到了很大的提高,在西方,对CMM的最主要的意见是它的成本太高。改动起来很困难,还有一个就是CMM的创始人最早在美国军方工作,后面被我们合并后,要在软件工程学的基础上进行。很多印度公司会最快取得CMM认证,取得越早的公司已经开始改变方法,从烟筒式的方法转到CMM方法里。

 最近几年来,CMM已经成为一项逐渐的主流开发技术。大概80%的财富500强企业已经开始使用,有60%的企业全部都是使用这个技术。比如我们公司十几年来做了上百个项目,所有的软件项目都是用这个方法来做的。我们的客户包括比较大的,包括英国石油、微软、IBM、壳牌石油等等,这些小的有几个人,大的一两百人,我们都用这个技术。

 来自分析师的声音:使用敏捷式方法要求IT和业务方面的参与者紧密沟通,更快的交付业务需求从而更快的获取效益。降低改的成本,提高系统的灵活性,降低投资的风险。

 敏捷式开发能在质量上有很大的提高,比如整体的缺失率降低13%,核心成本降低62%,开发时间降低69%。这些数据是建立在很多我们公司包括其他公司使用的开发案例基础上的。

 下面我简单把一些相关的案例稍微介绍一下,比如美国一家比较大的保险公司,有一个项目需要做。当时印度有一家公司非常有名,他们使用CMM,他们觉得做出估测这个项目大概两百万美元,最后这个项目是公司用敏捷式方法做出来的。一共花了8个月时间,整个项目成本一共是110万美元。印度这家公司很奇怪,又派了另外一批人来,结果他们做确实需要200万美元需要12个月时间。所以他们也开始逐渐使用敏捷式的开发应用方法。

 这是一个施工管理的应用,一共有125行的Java为的程序,另外是戴尔电脑内部也开发有一个IT项目,很多是和第三方一起做。几年之后,他们基本上把所有的公司都赶出去了,只有我们一家在做。从这个方面来讲,我们的敏捷式的开发方法远远比其他公司好得多。

 另外我们有一个案例研究。五客户有1370个营业网点,他爱把全部的店铺系统都更换一下,而且他的时间非常紧,因为在前期他请了一个非常大的很有名的软件咨询公司帮助做了一个项目,花了两年的时间,最后还有8个月产品要上市了,因为我们在美国做了很多这方面的工作,结果在8个月时间里,一个两百人的团队就把这个工作完成了。而且到现在为止,在最近一两年,有大概一百人是我们的员工,有一百是他们的内部员工。在他们IT部门里已经开始完全使用敏捷式的开发方法。整体做出来的效果非常好。

 下面我简单介绍一下敏捷式开发的原理。提到敏捷式的开发,大概在60年代的时候,软件开发是有计划性的,基本是写出来,谁也不知道什么时候能交付,大概在60年代的时候,在美国召开一次会议上头一次提出来,软件工程学的概念,传统工程学通常是把项目分成三步或者四步,先把需求确立起来,进行设计构建。应用到软件里是开始先由分析人员对需求进行分析,然后设计,架构师把整体的东西设计出来,再确定下来交给编程的团队,编程的团队把需求文章拿过来,照着这个再弄出来。所有的这些东西是由不同的人在不同的时间完成的。

 这种开发计划性非常强,因为你知道什么人在什么时候做什么事情。但是它会带来很多问题,主要是软件开发和传统的建筑工程学有很多不同的地方,最主要的是客户需求是不断变化的。首先是商业软件,市场本身是在不断变化,客户需求也在不断变化,客户不知道自己需要什么,过两天市场一变,他的需求也变了。客户本身他脑子里并不是很清楚他自己需要什么,他只有自己最后真正看到这个软件了,才有这个想法,这个东西是我确实需要的,但是使用起来,发现不是这样的,我想用另外一个方式,这就给工程学带来了很大的困难。

 从工程学来讲,不管需求也好、构建也好,在开始的时候改动设计非常容易,但是你如果在投入生产的时候,再进行改动,成本是非常高的。所以工程学里一个核心的概念,变化是最可怕的一件事情,从设计角度也好、分析的角度也好,不管怎么,不要变化,这样就使成本增加。

 如果我们把需求确定下来以后,按照需求一步步做,设计、开发、测试、部署,任何客户提出任何需求,我都不管他。这种方法,作为一个综合客户来说,最后拿到东西,发现其实这是一年以前或者本年以前的东西,他的满意度可想而知。

 如果他满意了,又要花半年或者一年时间,重新对这个设计分析,还是这个结果,客户得到的永远是他半年或者一年以前想到的东西。

 敏捷式开发最核心的东西是它对变化采取的是适应性的态度,不是排斥性的。我们作为开发方法来讲,不应该避免它的变化,而应该想到使变化成为轻而易举的事情。敏捷式的开发针对一小部分进行设计测试,对每一个循环时间非常短,软件从小到大,从很小的一点到不断的增加扩大,而且增长的过程中是对软件不断修改的过程,修改不是可怕的事情,而是必须做的一件事情。

 客户可以对哪些功能开发给予优先,开发的程度可以根据市场来调整,他说这些东西不想要了,可以调整。

 从另外一个角度,开发商有需求分析、设计、编辑代码测试等等,最后交给客户,敏捷式开发在初期也会做高层的需求分析,或者架构设计,这个设计非常粗略,非常高层,针对一小部分高层设计开发,每一次一旦得到的可以发布的软件,一步步做下去,最后达到客户满意为止。最大的是客户不用等到做完的时候,而是在每一个环节都可以让客户来测试使用。软件开发的过程控制起来完全在客户手里,由他决定开发的方向往哪里走。因为他是一个软件开发的关键人。

 从软件投入使用的角度讲,产品上市的时间是非常重要的。尤其是竞争非常强的行业里,你如果一个产品提前上市的话,对一个产品的作用是不可忽略的。从架构来讲,它对体系架构的应征可以极大的减少风险。

 迭代式开发也并不是没有尝试过,但是修改成分太高。我们现在可以进行迭代式开发有很多原因,最主要是我们有修改的代码OO技术,瘦身式的管理JIT带来的新概念,可以通过快速的反馈来提高质量。通过设计和编程可以使编程对设计形成反馈。

 在开发的过程中,修改成本的降低是核心的。你可以任何时候对系统做任何的修改。敏捷式是不排除设计的,只不过设计不是由架构师单独想出来的,而是这些设计非常简单,而是在开发过程中,每一次开发都要进行设计,设计开发不断循环,技术从简单到复杂,最后逐渐形成一个完整的过程。这个过程不是非常容易演示,有很多技术需要支持这种设备的改进。最重要是测试、开发、重购和自动化。测试扮演着非常重要的角色,最简单说,对任何一个功能,开发过程中,作为一个程序员,既要写出测试程序,也要写出功能程序,他写出这个测试程序,先怎么样测试,然后这个时候再写功能程序。很简单一点,他确实减少了很多的浪费,因为写的过程中,对需求的考虑通常会使程序员写出很多没有必要的东西,因为这些测试是可以不断的重复执行的。这些功能程序是不断增加的。最后到你系统开发快结束的时候,你可以很随便的运一下所有的测试程序。这就使得我们现在提到这个概念就是重购的概念。重购是通过技术修改进行设计,它不是说想把三层的架构改成四层的,而是小范围的改动,使得程序保持灵活性和非常干净的基础上,第一它使你的细节设计提高,第二使你的大幅度改动变成轻而易举的事情,使设计是在不断的改进过程中也成为可能。

 敏捷开发还有一个很大的特点就是它是以人为本,而不是以方法为本的。我们的软件开发是脑力劳动,而不是简单的工作。如果你设计出一套方法来,不管什么方法,让每个人去适应的方法,最后开发效应反而不如你组建一个具有进取心的团队,这个团队通常情况下是先选择一方法,细节也一样,在开发过程中,不断对方法反思,直到达到这个团队的最高开发效应为止。

 敏捷开发项目结束的时候和开始的时候方法已经不一样了,这个方法是团队使用的方法,而且方法的改进不是一个项目经理或者管理人员的事情,而是所有人的工作。

 敏捷开发我再做一次定义,敏捷开发不是一个单一的方法,包括编程等。这些方法的开发创始人他们在一起开了一个重要的会议,提出了敏捷开发的概念,敏捷开发,只要你的方法跟它相似的开发哲学,这些开发哲学叫做敏捷式开发原理。

 第一就是个人和交互要远远比流程和工具重要,第二能工作的软件超越应尽的义务。

 通过在中国开展业务差不多四、五个月时间,我们发现中国市场有它自己的特点。很多不同的软件在使用,而且它们的生命周期通常很短。一些定制软件很少有第二、第三个版本以上的。最主要的原因是因为它的维护成本太高。所以与其对这个
软件维护,还不如买一个新的软件。

 你如果采用敏捷式开发,你的产品上市时间可以达到提高,第二客户满意度得到提高。很多公司不会抱怨,我确实告诉你这么做的,你也不会做的这么差。如果一个软件的交付不是真正的成功,而是一个客户满意是真正的成功。

 刚才上午很多的报告中,都说现在中国软件市场发展速度非常快,整个经济发展非常迅猛,随之而来的机会比较多。而且历史包袱很少,这有一个好处,在西方几十年来犯了一些错误,得到的一些经验可以在中国实施。如果说中国能把握这个机会,在开发方法或者其他方面采用了最先进的技术,而不是根据它以前做的,很可能使得中国企业本身在全球范围内竞争。

 如果说,要真正赶上最新一轮的创新浪潮有几个重要的标志,一个是要赶上最新的CMM的转向敏捷开发,印度已经开始这方面的工作。从体系架构角度讲,除了一些先进的架构理念,还有一些架构模式等等,还有开源代码的应用,不仅仅是操作系统,包括数据库、应用服务器、各种开发工具等等有很多的开源工具。我们公司也做很多的开源代码,我们公司是做定制软件的,在这个基础上我们有一些核心的东西。

 我们公司在软件开发的过程中,不管是技术上还是开发理念上,一些很多技术人员写了很多这方面的书,包括分析模式等等。很多公司对我们的评价主要是从技术上,创新是我们公司的一个最核心的理念。结合机会和挑战,我们这个时候,把我们从西方学到的经验带到中国来,希望能够真正和中国软件企业一起成长。


版权所有:UML软件工程组织