第五节 交付使用的方式

以上四方面的工作也都是按照自顶向下的思想分阶段实现的。例如,硬件的配置可以按照版本的需要分批到货,先购置为研制程序所必需的部分设备,然后再购置为前两三个版本所需要的培训人员和进行数据转换所需要的设备,全部使用起来所要的设备可以晚一些到货。当然,这必须从各方面全面考虑,但是,根据需要,分阶段配置常常可以减少积压和浪费。

每一个版本的调试完成,都不只是程序编写的问题,同时也包括其他几方面的进度要求。例如,到某一个阶段时,操作人员培训到一定的阶段,就可以让操作人员来表演;到某一个工作阶段,某个重要数据文件应该开始录入,何时录完,等等。

按照自顶向下的方法实现系统,使系统联调和试运行的工作随着项目的进展而同时逐步地进行和完成,因而比较从容页且有把握。

到系统基本完成的时候,项目负责人就应该开始考虑新旧系统的交替问题,即如何交付使用。

交付使用有多种方式。图 17.1 显示了四种不同的交付使用的方式,它们各有自己的特点,各可以在一定的范围内和条件下使用。

直接方式(或称立即方式)是最简单易行的。规定好交换的时刻,在这一时刻,旧系统停止工作,新系统开始工作。这种方式最为简便。但是,一旦新系统发生问题就会给工作造成巨大损失,对于一些工作有连续性,有大量积累数据的系统,或者十分重要的关键部门,显然是不宜采用的。只有如电话交换台这样的没有数据积累问题的系统才能采用。

直接方式

平行方式

逐步方式

导航方式

图 17.1 不同的交付使用方式

平行方式则考虑了安全问题,让新旧系统并行工作一段时间,以便检查应修改新系统,避免造成工作的损失。但是,在并行期间,不仅需要双份的人力物力进行工作,还要有附加的工作人员对两个系统的运行情况进行核对与检查。对于许多系统来说,这样沉重的负担是承受不了的。

为了避免并行的巨大开支,可以把系统的交付使用分阶段进行,这就是逐步方式。在这种方式下,不是同时对整个系统进行更换,而是首先把系统的一部分换成新的,经过一段运行确定稳定下来之后,再把另一部分更换下来,这样逐步把整个系统换成新系统。在每一部分更换时可以根据该部分的特点,在这一局部范围之内,采用直接方式或平行方式。这就避免了大量的重复和浪费。同时,也使工作人员能够集中力量注视着更新的部分,从而有把握使系统平稳地转到新的工作状态去。这种方式的主要问题在于,当系统中某一部分已经换成新的,而另外各部分还是旧的,它们之间能否很好地协同工作?接口是否一致?如果有问题,还要采取某种临时措施,包括编写一些临时用的程序,以便协调各部分的工作。这样,又出现了新的问题与新的负担。

另一种可能采取的方式是在新系统未开始工作时,先处理少量业务,作为对新系统的功能进行检查的手段。例如,记帐的工作中每周抽一天用新系统工作,以后再逐步增加。又如,库存管理工作,首先把库存中金属制品部分的管理业务担负起来,以后再逐步扩大到其他物资,等等。这种方式称为导航方式。它的实质是在正式运行之前,先进行一段规模适中的试验运行。总之,交付使用的各种方式各有特点也各有要注意的问题,信息系统研

制项目的负责人员应该考虑并组织交付使用的工作。

实施方案中规定了系统的总体结构和各模块的设计要求。这些都是对全局而言的,事实上,各模块是不可能同时开始研制,一起完成的。首先,我们不可能有那么多的程序员,大的系统可能上百个模块,一般很难找到上百个程序员同时编写。其次,即使我们有足够的程序员,由于模块的规模一般都控制在一两个月的工作量范围内,当所有程序员完成他们所担负的任务之后,就都处于无事可做的状态之中。而此时,系统的负责人则忙于验收和联调,解决由于一下子全面铺开而必然产生的接口调整问题。因此,人力需要大起大落,工作的质量、各部门的正确衔接都得不到保证。不管我们事先设想得多么周到,在各部门之间总还会出现许多需要临时调整的问题,全面铺开使我们无法从容地处理这些问题。总之,全面铺开在实际上不可能,对研制工作也有许多不利之处。因此需要把模块分成若干批,分期实现。

那么,怎样分批呢?什么样的模块先实现,什么样的模块后实现呢?按照一般的想法,常常是抓住几个最基层的模块,先编制出打印报表、屏幕录入、屏幕显示等可见的功能,然后再把它们用一个主程序联接起来。这种自底向上的方法是不好的。首先,各模块之间连接的接口并没有事先调整好, 很可能出现对不上的情况,如果出现了这种情况,已经调好的模块就要修改, 甚至重写。当进行更高一层的连接时,又可能发生这种情况,这时的修改不仅会影响到直接有关的模块,而且还会影响到这些模块所调用的更下一级的模块。这样就会造成多次返工,不但浪费人力物力,而且无法保证完工时间。这种自底向上的办法是不可取的。正确的方法是自顶向下。

  1. 首先保证系统结构和接口的正确性。再去考虑模块内部功能的完善。所谓结构和接口,实质上就是模块之间的调用关系和数据(即参数)传递的问题。为了保证这些数据准确无误,我们要求:先实现上层模块;后实现下层模块。当然这不是对结构图中全体模块来说,而是对每一对上下联接的模块来说的。说得更确切一点,对于结构图中每一条上下连接的线段来说,

    它上端的模块和下端的模块,或者是同一批实现,或者是上端先于下端实现。

这样,除了少数上下同批实现的情况之外,总是上层的模块要早一些调试完成。在调试上层模块的时候,下层模块是一个虚的实体,称为“存根”,即只用几条简单的语句写成一个子程序。其对外部分——名称及参数已经写成,并符合上层模块的调用要求,即口径完全一致。但其内部处理至多有一句象征性的语句,在屏幕上或打印机上显示一个信息,以表明调用成功。到以后实现该模块时,就以这个“存根”为外壳填充具体内容,这样,我们就有把握保证口径的完全一致,而专心调试其内部功能。

  1. 首先选择使用最频繁、最主要的典型业务加以实现,以便和使用者及时交换意见,进行必要的调整和修改,这是对上一点的补充。强调第一点,

    并不等于对整个系统来说都是先实现上层模块。因为上层模块一般都是只执行控制功能,具体工作都是由下层模块做的。如果我们向用户表演的内容中没有一点实际的操作,用户是不会满意的。所以,在实际工作中,首先选择一项最迫切需要的典型业务,由它所涉及的最基层模块向上取,一直取得最顶层的模块,构成我们第一批实现的模块,我们把这称为第一个版本。

  2. 把涉及同一个数据存储(文件或数据库)的模块集中在同一批中,

    即集中在同一个版本中。按数据存储的重要性排序,先实现最重要者的有关模块,再实现次重要者的有关模块。这样随着模块的完成,各数据存储也就逐个建立起来了。

这样,我们每一批实现的模块并不多,系统研制的负责人可以集中力量解决这几个模块所涉及的有限几处接口问题,认真验收每一个模块的功能。程序员也可以分阶段地逐个接受任务,研制各个具体模块。整个工作就可以有计划、有步骤地进行,不但在规定时间内可以有切实完成的把握,而且每一个阶段可以向使用者提供可以看得见用得上的工作成果。这样,无论是使用者还是研制人员本身,都可以建立起取得研制工作成功的信心。这对于项目的顺利进行是至关重要的。