CMM/CMMI被认为是一种最成熟、最有效地提高软件工程化水平的方法和标准,用来评估和改进过程,它是一个描述在软件开发过程中有待改进的关键因素的框架,描述了一个能用渐进方式进行改进的途径。它为软件过程改进提供一个基础,将软件开发从一个相对来说随意、不成熟的过程变成非常成熟的、有规律的、可管理的过程。
然而,CMM/CMMI也有一些与身俱来的缺点不容忽视。比如,CMM/CMMI的评估耗资不菲,一个CMM2级评估就可能达到数百万之巨,而且耗时很长,过程十分复杂,常常导致效果不太理想。不少企业的认证流于形式,评估完成后就只留下一大堆文档,而真正的软件开发过程却依然故我。而且,CMM/CMMI只告诉我们应该怎么做,而没有具体地告诉如何做。比如说,它要求必须改进需求管理,那么到底该如何做需求管理?CMM/CMMI没有提供答案。
还有最重要的一点是,不少软件企业陷入了一个误区,以为单单通过CMM/CMMI评估就可以解决软件质量不高的问题,而忽略了软件过程这一真正改善软件质量的环节。事实上,完全有可能出现这样的情况: 软件成熟度为CMM 1级或2级的企业开发出的软件是真正好用的,而有的企业即使通过了CMM 5级认证,也无法保证它交付好的软件。最糟糕的情形是,如果采用不好的软件过程,通过CMM/CMMI的成熟度级别越高,只会使软件企业生产差劲软件的过程变得更加有效率,而不是使企业开发出更好的软件。
Ivar Jacobson认为,好的软件过程首先一定是基于组件的,在此基础之上,还要符合迭代开发、用例驱动开发和以架构为中心的这三个最佳实践。
合理的软件过程是软件质量的基础
为什么会是这样呢,Ivar Jacobson举了一个非常形象的例子。这是一个农夫和他的奶牛的故事。在奶牛喝水的途中(称为“牛路”)有一片庄稼地,牛会吃掉很多庄稼。农夫看到这种情况后,意识到必须对奶牛喝水的过程进行改进,所以他就在这条道路上铺上了沥青。结果,农夫得到了一个好的“牛路”,牛走得更快了,但是并没有真正解决牛吃庄稼的问题。它应该有更好的方式,就是为牛喝水寻找一条全新的道路。
软件企业利用CMM框架进行软件质量控制的过程,就像是这个农夫为牛路铺沥青。对于软件企业来说,如果从一个错误的软件过程开始,即使你在这个上面再改进,得到的永远只是“牛路”。这里更应该考虑的是要选择一条更好的路,也就是从一开始时,就采用能够开发出好的软件的过程。然后在这个软件过程的基础上,对这个软件进行度量,改进这个软件的过程,也就是进行CMM/CMMI要求的改进。
Ivar Jacobson博士认为,从一个不良的软件过程出发,在此基础上进行改进,实际上会把软件开发变得更糟糕,因为你把软件开发过程固化了,使日后再想对它进行改造,变得更加困难。正确的方法是,先要有一个好的软件过程,这是不容易的,但是值得做的事情。Ivar Jacobson 说,“把一个好的软件过程变得可度量非常容易,但是把一个可度量的软件过程变成一个好的软件过程却很难”。也就是说,只有把一个好的软件过程,即能够开发出好的软件的过程变得可度量才是有益的。而把一个已经经过CMMI改进的、可度量的过程变成一个真正的能够开发出好软件的过程,这是几乎不可能的事情。
那么什么是一个好的软件过程?Ivar Jacobson建议从以下几个方面进行辨别: 第一,坏的过程关注文档上,而好的过程关注在可执行的程序或者系统上; 第二,坏的过程延误了揭露风险的时间,而好的过程一开始就把自己暴露在风险之下,并及时解决它; 第三,坏的过程在项目的最后才能够验证这个项目的质量,而好的过程其质量是每时每刻都能够得到验证的;第四,坏的过程有一个非常复杂的跟踪关系矩阵,从需求到代码需要一个非常复杂的矩阵,而好的过程,却是一个无缝链接; 第五,在面对变更时,坏的软件很脆弱,好的软件会很健壮。
Ivar Jacobson提醒软件开发人员要做聪明的农夫,首先得到一个正确的软件过程; 然后,再考虑去度量它、定义它。因为软件项目管理的本质不是能否描述并度量软件过程以及过程到底怎么样,而是首先关注软件,你是否能很好地开发出合格软件。重点是得到结果,通过软件过程得到这个结果,也就是交付的软件产品。
敏捷开发企图终结软件危机(但也是很难的,敏捷开发适合小团队,不适合需求清楚的大项目、军工项目、...)