我想强调几个问题。
一是要分清问题域与系统责任。系统责任是指所要开发的软件应该完成的功能,而问题域是包含所有相关的部分。例如你要开发一个程控机计费程序,程控机已经是现成,输出的数据格式也已经是固定的,你的程序仅仅需要从程控机中读取相应的信息,那么,"程控机"在你的系统里只是一个外部的东西,把它作为一个类也许是不必要的,仅仅需要一个类来完成读数据的操作。又如,你需要在一个已经存在的数据库上开发一些应用,数据库的格式已经固定,并且已经有一个后台程序在运行,你需要开发一个新的前台程序,这时,服务器程序对你来说是一个外部的东西。但是,象这种外部的内容必须在分析文档中有一些说明,作为系统的外在约束。
二是需求获取与需求分析的关系。
用什么方法来完成需求的获取,在很大程度上影响了需求分析的做法。
例如当初采用Use Case来表示用户需求,那么从各种序列图中选出相互交互的各个实体,是一个个类。
三是分析与设计过程的衔接。
分析过程的内容是用类的结构来表示目标系统,并不设计具体实现,如采用什么编程语言,在什么操作系统平台上运行等等。这些具体实现是在设计阶段来完成的。面向对象方法的优点是分析、设计、编码过程表示法统一,能比较好的衔接。但是,是把分析和设计阶段分开,采用瀑布式开发,还是采用其他方式,要看具体的情况。
对于需求潜在变化不大的项目,可以采用瀑布模型,有一个很明显的设计阶段,这样做的好处是有一份比较完整的分析文档,这样以后如果需要采用不同的编程语言、或者采用其他的平台时,便可以以这份分析文档作为开发的基础。
对于需求变化频繁的项目,可能采用少量分析->少量设计->少量编码->测试的方式更合适,而且随时可能要返回到前面某个一阶段去进行修改。但是这意味着可能没有一份完整的分析文档。
现在很多CASE工具并不区分分析和设计的阶段。但是,这并不意味着开发可以对分析和设计不加区分,CASE工具如同一支笔,如何用好还得还人。
3.设计过程
设计阶段的工作包括:
对分析模型必要的修改。可能需要对某些类结构进行一些修改,这些修改的原因可能是编程环境的要求,或者为了重用以前的某些工作。
定义界面部分、数据访问(数据库)部分。
由于目前很多编程语言都可以可视化地设计界面,所以界面部分工作往往留到了编码阶段来完成。于是设计阶段的工作量并不大。
4.编码
进入编码工作之后,可能会发现前面分析或设计阶段的某些错误,这时应返回到前面的阶段进行必要的修改。
5.测试
如前所述,即使是小项目,也应该严格地进行测试。
四、人员的安排
比较小的项目,往往是几个人来完成,这几个人基本上从头到尾参加开发。在这几个人中,有一位项目负责人,负责分析、设计和协调的工作。由于项目小,项目负责人也要参加编程,那么这人必须把时间合理运用,
经验告诉我几条原则:
1.协调几个人的工作比自己完成一段编码更重要.
由于协调上出了漏洞,可能导致很大的问题,所以项目负责人必须随时监控各开发人员的工作,包括内容是否与要求发生偏差,进度是否滞后等等。
只有在完成这些工作之后,项目负责人剩下的时间才能用于编程。
2.给每个开发人员明确的任务书.
不管是用面向对象或者其他方法开发,分析、设计模型只是从功能的角度来描述系统。但是,具体开发时每个开发人员必须非常明确自己的任务,这些任务应该采用明确的文档来表示。
3.让大家都大致熟悉设计模型.
让每个开发人员都清楚自己所做的工作在整个系统中处于什么地位,有时侯可能会发现设计模型中的漏洞,避免了各人的代码编写完毕之后又要修改的后果。