一直以来,我对软件开发方法学方面的知识都非常感兴趣,也一直在看一些这方面的书籍。最近主要在看的有两本书,《应用MDA》和《测试驱动开发》。
大致读来,我个人的感觉是,这是两本书各自所关注的开发方法似乎截然相反。《测试驱动开发》众所周知,是一本讲述XP的基础原则之一,测试优先,的书籍。它关注的是XP的方法学,即抛开纸上谈兵的设计,而回归代码本身,因为代码就是最好的设计。而《应用MDA》则强调模型驱动的方法学,认为我们应当关注于模型的设计,而将代码的生成留给代码生成器去完成。虽然《应用MDA》的作者说,MDA和XP之间没有矛盾,因为MDA中的模型已经不止是设计工件了,同时它也成为了开发工件。但我仍认为,至少在未来相当长的一段时间内,MDA和XP仍会是两种对立的开发方法,除非有非常出色的MDA工具出现。
《应用MDA》为我们描述了一个非常美好的未来:使用形式化(我不大理解形式化这个词的确切含义,不知道对应的英文是什么?)的建模语言建立精确的设计模型,然后由代码生成器来生成具体的程序代码。这种由精确的设计模型产生的代码甚至不需要我们做任何的手工修改。想象一下这该多么美好呀,我们只需要产生一个设计模型,然后,如果我们需要.NET平台的代码,我们就使用为.NET平台定制的代码生成器,如果需要Java代码,就用Java代码生成器,以此类推,从此再也没有了移植的烦恼,我们的设计就真正的与平台无关了。
但是这个美好的未来真的就只属于未来,我们需要等待。首先需要等待一个能够建立足够精确的模型的形式化建模语言的出现,现在看来UML2.0还是不够,我们得等3.0甚至4.0。其次我们需要等待代码生成器的产生。目前有的一些代码生成器,在设计和代码的同步上存在较多的问题,未来的代码生成器,理想上是生成完全无须手工改动的代码,即使不能实现这一理想,也应当解决现有的问题。所有的这些等待可能会很漫长吧?
而《测试驱动开发》用活生生的例子为我们描述了一个立即就能使用的开发方法,XP。从这本书的例子我们就能够看出一个典型的XP过程的大致轮廓来,拿到需求不做任何的分析和建模就开始写测试代码,为了使测试通过,开始写程序代码,测试通过之后重构得到干净的代码,然后迭代上面的步骤,最终一个模块完成时,确实得到了一个非常好的设计。
我一直比较推崇XP方法,并且在项目中实际使用这个方法开发。我想对于国内大部分的软件公司,XP方法都是适合的,因为国内公司通常遇到的项目总是时间紧、人手少的。但是在实际的使用中我也遇到了一些问题,最主要的是对于比较大的项目,由于没有一个总体上的设计,使得新加入的开发人员很难从整体上对整个项目有一个清晰的认识,这样他们往往容易过分地陷入到细节之中,从而需要花费更多的培训成本。我们现在的作法是,在大项目的phase之间,根据系统现有的体系结构补充一些设计文档。我喜欢Martin Fowler在《UML Distilled》中说的一句话:Teams should grow their own processes, using published processes as advice rather than as standards to follow.
如果说XP是属于现代的开发方法,那么MDA可能就像董方卓是属于未来的球员一样,是属于未来的开发方法。我们也应当一颗红心,两手准备,既要抓住现在,又要盯住未来(不要说我贪心呀J)。