XP的分析设计比起RUP会少很多,因为每一次迭代的粒度不太大,每个阶段的分析与设计相对简单一些,并且在迭代的过程中可以逐步改进。隐喻是极限编程方法学中的重要概念。但隐喻比较晦涩,它表示什么意思?在项目中如何应用?这值得我们深入探讨。
最近阅读了《代码大全》其中的一章“隐喻”,对隐喻在项目管理中的应用有了一定体会:它能够促进分析人员、设计人员、开发人员之间的沟通与对项目业务的理解。
一、项目规模决定规划
首先,软件工程是从建筑领域引申进来的,“设计模式”便是起源于建筑大师亚历山大所写的《建筑的永恒之道》一书。我们可以把一个开发项目比喻成建造房子。很明显,建造摩天大厦和建造一层楼的准备工作是截然不同的。建造摩天大厦需要前期经过非常仔细的规划,比如成本核算、时间核算、设计模型、设计图纸等。
因为如果前期不规划好,我们不可能建到一半推倒重建,它的成本太高了。这就是我们软件工程里面“瀑布模型”的由来。其实这和软件开发项目是一一对应的,项目也要经过类似的成本时间估算、分析模型、设计模型这些过程。而建造一层楼就不同了,因为它涉及的成本更低,前期所做的规划肯定简单一些。但不管如何,必要的成本核算、时间核算、设计模型、设计图纸等前期规划还是需要的。那么再更进一步,如果想建一个狗窝,我们会去做仔细的规划吗?我想不会。在项目开发中,我们同样必须根据项目的规模大小,去衡量我们所需要做的前期规划的详细程度。
其次,无论建造什么房子—摩天大厦也好,一栋楼房也好,在前期核算、设计等准备工作完成以后,必须先打地基,只有扎实的地基,才能支撑起整栋房子。程序开发也同样如此。在编码构建阶段开始的时候,我们必须在CVS上先搭建好整个开发环境,确定整个系统的代码目录结构,确定接口、类、方法、参数的名称以及它们之间的交互关系。如果采用UML统一建模语言来描述,设计阶段必须产生包关系图、类关系图这两种制品。我们在编码初始阶段必须根据这两种制品产生相应的代码骨架,为接下来的构建打下坚实的基础。我们以前开发的时候就吃过这样的亏,在设计阶段和编码初始阶段,没有定义好这些程序架构,先由各程序员自行定义,后来重新定义的时候要耗费大量的人力物力进行代码迁移。因此无论是建房子还是程序开发,打地基都是相当重要的。
再次,建造房子的时候,经过前面所说的核算、设计、打地基,接下来会一层一层地建造房子,建造每一层之前我们可能会进一步细化、优化这一层的设计蓝图。这个过程就类似于软件开发过程的迭代开发,先集中精力对若干个特征或功能点进行详细设计和代码构建。这次开发完成以后,再过渡到另外的若干个功能点,形成一次一次的迭代。
二、迭代粒度的奥秘
从上面可以看到,迭代对软件开发来讲是非常重要的,其实程序算法中的“分治法”也是这个道理。毫无疑问,RUP(Rational Unified Process,统一软件开发过程)和XP(eXtreme Programming,极限编程)都是强调迭代的,但为什么XP更轻量级、更加不注重详细的分析与设计,而RUP更加重量级,需要各种文档和详细的分析设计呢?同样是建造一栋摩天大厦,在RUP开发方法学里面,它是从一次建造一层楼的粒度来进行迭代开发的,因此每一次迭代仍然需要相对详细的分析与设计。而XP的方法则不同。它会以一套房子或者以一个房间的粒度去建造整栋摩天大厦,每一次迭代开发的功能点不会太多,因此所需要做的前期规划自然要少得多。软件大师Robert C.Martin在他的《敏捷软件开发—原则、模式与实践》中提到,XP