系统分析与设计
上QQ阅读APP看书,第一时间看更新

1.6 系统开发与项目管理

一般来说,开发不同类型的信息系统,可能会涉及不同的参与者、不同的业务环境和技术环境。但是,开发一个信息系统的“过程”是一致的,即无论任何组织或公司部门,开发一个完整的系统项目总会经历“目标、计划、分析、设计、实现、维护”这样的过程或步骤,这就是系统开发的生存周期。

1.6.1 系统开发生存周期

信息系统的开发需经历系统项目启动、业务需求分析、详细技术设计、系统实现与维护4个过程,分别称作系统开发生存周期的启动阶段、分析阶段、设计阶段、实现与维护阶段。在整个生存周期中,需要完成各种不同的但相互关联的活动,这些活动涉及3个方面:用于计划、组织和规划项目的项目规划活动;用于理解定义和解决业务问题的分析设计活动;为业务用户编程、测试并安装新系统的实施活动。

1. 启动阶段

系统启动阶段的主要任务是确立系统的目标与计划。由于信息系统项目通常会很复杂,需要投入大量的人力、物力与财力,如果没有明确的系统目标与计划,系统开发的后续阶段是不可能进行的。

启动阶段的主要目标是确定新系统的作用域并做出项目规划。这个阶段主要涉及5个活动,如图1.3所示:定义问题域、制定项目的进度表、确认项目的可行性、安排项目人员和启动项目。

图1.3 启动阶段活动

启动阶段最重要的活动是准确地定义业务问题和所需解决方案的范围。更加明确系统的主要用途、清楚系统必须解决的业务问题,这些都是非常重要的。为了确保目标的顺利完成,制订完整的项目计划也是必不可少的。在完成本阶段相关活动后,经过高层管理人员审查并通过项目总计划后,启动系统开发项目。

2. 分析阶段

系统分析阶段的主要任务是进行系统业务需求分析。系统分析的目的是为项目团队提供对开发项目的问题和需求更全面的理解。根据系统启动阶段定义的系统目标,进一步研究和分析项目范围内业务领域,以便对系统在内容上做更深入的理解。

分析阶段最本质工作是发现、理解并归结出系统的业务过程。这一阶段主要包括以下6个活动,如图1.4所示:收集信息、定义系统需求、建立需求发现的原型、划分需求的优先级、产生并评价可选方案、与管理人员一起审查并推荐方案。

图1.4 分析阶段活动

分析阶段的目标是了解并详细阐述用户的需求,因而收集信息便是分析阶段的最基础工作。在这一活动中,分析人员应尽可能多地接触用户以获得对问题域的更多了解。通过对业务工作过程的观察、对用户的访问与调查,以及相关文件、业务规则和工作职责的阅读,分析人员检查、分析获取的信息并将其结构化,以全面了解对构建系统的需求。这一活动被称为确定系统需求,采用的主要技术手段是以绘制图表为主的需求建模。分析阶段的产物是产生开发系统的业务需求、业务处理预期和优先级的报告。

3. 设计阶段

系统设计的第一个任务是探索并考量不同的技术设计方案。随着现代信息技术的不断发展,系统设计技术出现了越来越多的选择,大多数公司可能会在购买一个好的方案或构造一个定制方案之间做出选择。

当选定某个技术方案,系统设计阶段的第二个任务是开发实现最终方案所需的技术蓝图和规格说明。这些技术蓝图和规格说明将被用来实现信息系统所需的数据库、程序、用户界面和网络等。

设计阶段必须完成以下7个主要活动:设计和集成网络、设计应用结构、设计用户界面、设计系统界面、设计和集成数据库、设计细节的原型化、设计和集成系统控制(图1.5)。也就是说,设计阶段需要完成高级设计(如:为软件程序、数据库、用户界面和操作环境的体系结构设计)以及相对的低级设计(如:需要制定详细的算法和程序开发所需的数据结构等)。

图1.5 设计阶段活动

图1.6 实现维护阶段活动

设计阶段主要用于设计系统和程序,这些设计活动是互相紧密联系的,而且大部分活动一般都具有实质性的重叠与交互。验证是检验设计方案优劣的重要手段。一个重要的验证方法是创建系统的部分工作原型,以确信它在具体应用环境下所具有正确性和可行性。通常,设计人员通过建立新系统的原型来测试和检验可选方案的设计策略。

系统控制考虑的是有效地控制每个子系统,以确保数据库和应用程序的完整性。随着全球经济高度竞争与发展,企业技术与安全的风险也同时加大,任何构建系统都必须考虑有适当的机制以保护系统的信息和资产。这些控制机制应该在系统设计过程中体现,而不是在建成之后再集成到新的系统中。

4. 实现与维护阶段

系统实现阶段的主要任务是构造出新的信息系统,并将其投入运行。实现阶段由4个主要的活动组成,如图1.6所示:构造软件部件、检验和测试、培训用户和制作文档、安装系统。

实现阶段是对新系统进行编程和安装测试的阶段。软件构造可以通过各种技术实现,除了使用常规的计算机语言来编写程序外,基于开发工具和构件的软件构造技术越来越被广泛使用。

系统整体测试成功的唯一标志是确保其正常工作并满足用户的需求和预期,也就是说,只有用户理解并能恰当地使用系统时,这个系统才是成功的。实现阶段的一个重要活动是培训新系统的用户,以使该系统发挥最大的作用。

新系统的安装与运行是系统实现阶段的最终目标,这会涉及系统与数据库或相应构件在整个组织内的集成与配置。同时,新系统的安装与运行并不代表系统构建的结束,支持整个新系统的有效使用,即系统的维护过程也是系统开发生存周期的重要组成部分。系统维护的主要目标是保证系统安装后能有效地运行。维护过程主要包括维护系统、加强系统和支持用户这3个活动。

针对业务需求和用户需求随时会发生变化,维护系统的关键任务就是修复错误(如众所周知的系统补丁)和应需求变化而进行系统调整。通常,安排一个系统支持小组负责维护系统。

由于业务环境的改变,所以开发系统的增强功能或升级版本也是正常的现象。维护阶段的另一主要活动是对系统用户提供帮助,通常由专业技术人员提供快速的问答,以帮助他们提高工作效率。培训新用户和维护系统目前的文档是这一活动的基本工作。

1.6.2 系统开发方法论

系统开发方法为完成系统开发生存周期中的每一步提供详细的指导,它包括具体的模型、工具和技术。模型是现实世界的某些重要方面的表示。模型是现实的抽象,可以帮助人们快速、深刻地理解系统内部结构。

系统开发中的工具是帮助生成项目中所需模型或其他构件的软件支持。这些工具可以是创建图表的简单绘图程序,也可以是存储了相关项目信息的数据库应用程序,或是项目管理软件工具。所有这些工具都是为帮助系统开发人员而专门设计的。

技术是系统开发中使用的一组方法,这组方法可以帮助分析人员完成系统开发活动或任务。它通常为创建模型提供逐步指导,或者为从系统用户处收集信息提供更一般的建议。例如,常见的数据建模技术、软件测试技术、用户面谈技术和关系数据库设计技术等在系统开发中经常用到。

方法包括一组用来完成系统开发生存周期每一阶段活动的技术。这些活动包括完成各种模型及其他文档和交付资料。与其他行业一样,系统开发人员使用软件工具来帮助他们完成这些活动。方法中各构件之间的关系如图1.7所示。

图1.7 方法中构件之间关系

系统开发方法有很多种,如下面将要介绍的结构化方法、原型法、面向对象方法、敏捷开发方法等。所有这些开发方法都依据系统开发生存周期来管理项目,这些方法加上模型、技术和工具就构成了系统开发方法学。系统开发方法学为严格完成系统开发生存周期中的每一步提供指导。下面简要地介绍一下这些方法。

1. 结构化系统开发

结构化系统开发法诞生于20世纪70年代,由结构化分析、结构化设计和结构化编程3种技术组成,有时也把这3种技术称为结构化系统分析设计方法(Structured Systems Analysis And Design Method,SSADM)。该方法被认为是系统开发方法摆脱传统模式,实现新突破的标志。

结构化系统开发的基本思想是在分析与设计阶段自顶向下,逐层分解。把分析与设计看作是按一定的逻辑联系逐层分解的求解过程,从而能有效地将一个复杂的、难以描述和处理的抽象系统逐步分解成若干层次的子系统,直到能被有效定义和处理的具体模块,由此,形成了开发系统的概念模型。

在系统实现阶段,则是自底向上,通过模块链接形成完整的信息系统。开发过程严格地按照系统分析、系统设计、系统实现的流程去实现。

(1)结构化方法的工具

在结构化方法中,所使用的工具有很多。主要有如下几种。

①业务流程图:业务流程图是为了描述系统运行步骤及各项业务运转顺序的工具。图1.8给出了业务流程图的主要元素。

图1.8 业务流程图元素

②数据流图(Data Flow Diagram,DFD):用以描述逻辑模型的图形工具,表示数据在系统内的变化,是用来刻画数据流及其转换的信息系统建模技术。图1.9给出了数据流程图的主要元素。

图1.9 数据流程图元素

③实体-关系图(Entity-Relationship,ER):将现实中的事物抽象为数据对象、属性和关系,是一种表示数据对象及其关系的图形语言。

④数据字典(Data-Dictionary,DD):是对所有与系统相关的数据元素的一个有组织的列表,其主要作用在于描述DFD中的数据流和数据存储。

(2)结构化方法优缺点

结构化方法的突出优点是强调系统开发过程的整体性和全局性,强调在整体优化的前提下考虑具体的分析设计问题,即自顶向下的观点。另一个强调的观点是严格地区分开发各阶段,强调一步一步地严格进行系统分析和设计,每一步工作都及时地总结,发现问题及时反馈和纠正,避免了开发过程的混乱状态,是一种目前被广泛采用的系统开发方法。

随着时间的推移,结构化开发方法也逐渐暴露出了很多不足,具体表现在:①系统开发周期长;②开发出的系统总体结构与用户的业务运作过程存在的差异大;③系统的可维护性和稳定性较差。

结构化方法是一种严格的理想主义开发法,它要求在用户需求分析阶段中必须完整准确地描述用户的各种需求。然而,在开发前期用户常常对系统仅有一个模糊的想法,很难明确确定和表达对系统的全面要求;或者由于用户的经营方式、管理模式发生变化,都将使得用户提出对系统的修改意见,而这种用户需求的变化(即使是微小变化)都可能导致整个系统的巨大改变。因此,结构化开发方法通常适合在系统需求比较稳定的情况下使用。

2. 原型法

原型法(Prototyping Approach,PA)产生于20世纪80年代。它是在第四代程序设计语言和各种辅助系统开发工具产生的基础上,提出的一种新的开发方法。原型法的基本思想是:采用最经济的方法,尽快设计出一个可以实际运行的系统原型。所谓原型,是指一个用于实验的、结构简单但已具备系统的基本功能的应用系统。系统设计人员不是在间接地完善概念性的信息系统,而是与用户合作,直接在运行中不断修改一个尚不够成熟的系统原型,通过反复试验、评价与修改,最终开发出符合用户要求的管理信息系统。原型法的开发过程是在分析、设计、编程、运行、评价的多次循环与不断演进中进行的。图1.10表述了原型法主要包括的4个步骤。

图1.10 原型法的主要步骤

(1)原型法实施的4个步骤

①确定系统的基本需求。在分析人员和用户的紧密配合下,快速确定软件系统的基本要求。快速分析的关键是要注意选取分析和描述的内容,围绕使用原型的目标,集中力量,确定局部的需求说明,从而尽快开始构造原型。

②开发初始原型系统。在快速分析的基础上,根据基本规格说明,尽快实现一个可运行的系统。忽略系统在某些细节上的要求,例如,安全性、健壮性、异常处理等。

③使用原型,系统确认用户需求。用户要在开发人员的指导下测试原型,在试用的过程中考核评价原型的特性,分析其运行结果是否满足规格说明的要求,以及规格说明的描述是否满足用户的愿望。纠正与用户在交互中的误解和分析中的错误,增补新的要求,并为满足环境变化或用户的新设想而引起的系统需求的变动提出全面的修改意见。

④修改和改进原型。对实际系统的亲身经验能产生对系统的真实理解,用户总会发现系统中存在的问题。让用户确定什么时候更改是必需的,并控制总开发时间。

(2)原型法的优缺点

与结构化方法相比,原型法具有如下优点:由于系统开发人员和用户的交流密切,提高了用户参与的主动性;系统开发周期短;能更好地适应需求的变化并减少误解;能有效地提高最终系统的质量,特别是用户接受性,为保证将系统提供给用户使用奠定了基础。

原型法的主要缺陷表现在以下几个方面。

①系统分析和功能设计贯穿于整个开发过程中,使得系统的总体结构变得不明确。

②为了使用户能尽快熟悉原型,开发人员常常选取某个简单、独立的子系统作为原型进行开发。原型选取的不确定性可能降低系统开发速度。

③对原型进行分析设计时,仍然沿袭结构化方法自顶向下、模块化的设计思想。数据和功能相互分离的缺陷在原型法中依然存在,不利于软件构件的重用。

④开发过程中不断引入用户需求的变化,造成了系统开发的不确定性。用户的需求常常是不全面和不明确的,如果不断地用新的需求否定旧的需求,则系统开发总停留在重构一个新原型的阶段。

3. 面向对象方法

面向对象方法的基本思想是直接地针对整体的对象去开发。在面向对象的分析、设计和实现的各个阶段,都是基于对象的建模操作,不存在概念上的转换问题,是目前最主要的系统开发方法之一。

(1)面向对象的开发

面向对象开发方法一般经历5个阶段:分析、设计、实现、测试和维护。

对象分析(Object-Oriented Analysis,OOA)阶段:分析问题的性质和问题的求解。首先是建立问题域的对象模型,模型描述了现实世界中的类与对象,以及它们之间的联系,表示了目标系统的静态数据结构,然后根据需要建立动态模型,通常用状态图来描绘对象的交互式动态模型,用数据流图建立功能模型。

对象设计(Object-Oriented Design,OOD)阶段:整理问题。把分析阶段得到的需求转变成符合成本和质量要求的抽象的系统实现方案的过程。面向对象设计可分系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的类、关联、接口形式及实现服务的算法。

编程实现(Object-Oriented Programming,OOP)阶段:把设计的结果翻译成某种面向对象程序语言所书写的程序。面向对象程序设计语言非常适合用于来实现面向对象设计的结果。事实上,具有方便的可视化开发环境和丰富的类库的面向对象程序设计语言是实现面向对象设计的较好选择。

系统测试(Object-Oriented Testing,OOT)阶段:在测试中运用面向对象技术,对软件系统进行的测试。

系统维护(Object-Oriented Maintenance,OOM)阶段:将测试后的新系统投入运行,并针对系统或用户需求的变化进行纠错或改进。

(2)面向对象的分类

20世纪80年代后期以来,先后出现了很多种面向对象开发方法,其中比较典型的有以下几种。

OMT/Rumbaugh。OMT(Object Modeling Technique,对象建模技术)方法最早是由Loomis、Shan和Rumbaugh在1987年提出的,曾扩展应用于关系数据库设计。Jim Rumbaugh在1991年正式把OMT应用于面向对象的分析和设计。OMT覆盖了分析、设计和实现3个阶段,它包括一组相互关联的概念:类、对象、继承、原类、链、聚合、操作、事件、场景等。OMT方法包含分析、系统设计、对象设计和实现4个步骤,它定义了3种模型(对象模型、动态模型和功能模型),这些模型贯穿于每个步骤,在每个步骤中被不断地精化和扩充。

OOD/Booch。OOD(Object Oriented Design)方法由Grady Booch研究提出。OOD主要包括下述概念:类、对象、使用、实例化、继承、元类、消息和机制等。其中,使用及实例化是类之间的静态关系,而动态对象之间仅有消息传递的连接。Booch方法在面向对象的设计中主要强调多次重复和开发者的创造性。该方法本身是一组启发性的过程式建议。

RDD/Wirfs-Brock。RDD(Responsibility-Driven Design)方法是Wirfs-Brock在1990年提出的。这是一个按照类、责任及合作关系对应用进行建模的方法。RDD方法主要包含:类、继承、责任、合作、合同、子系统。每个类都有不同的责任或角色及动作。合作是为完成责任而需要与之通信的对象集合。责任进一步精化并被分组为合同。合同又进一步按操作精化为协议。子系统是为简化设计而引入的,是一组类和低级子系统,也包含由子系统中的类及子系统支持的合同。

OOAD/Coad-Yourdon。OOAD(Object-Oriented Analysis and Design)方法是由Peter Coad和Edward Yourdon在1991年提出的。这是一种逐步进阶的面向对象建模方法。在OOA中,分析模型用来描述系统的功能,主要包括以下概念:类、对象、属性、服务、消息、主题、一般/特殊结构、全局/部份结构、实例连接和消息连接等。其中,主题是指一组特定的类与对象。OOA使用了基本的结构化原则,并把它们同面向对象的观点结合起来。

OOSE/Jacobson。OOSE(Object-Oriented Software Engineering)是Ivar Jacobson在1992年提出的一种使用用例驱动的面向对象开发方法。OOSE主要包括下列概念:类、对象、继承、通信、激励、操作、参与者、使用用例和对象模块等。用例模型是导出其他所有模型的中心模型。通过确定系统外部的事务如何与系统实现交互,用例模型描述了系统的完整功能。

VMT/IBM。VMT(Visual Modeling Technique)方法是IBM公司于1996年公布的。VMT方法结合了OMT、OOSE、RDD等方法的优点,并且结合了可视化编程和原型技术。VMT方法选择OMT方法作为整个方法的框架,并在表示上也采用了OMT方法的表示。VMT方法用RDD方法中的CRC(Class-Responsihility-Collahoration)卡片来定义各个对象的责任及对象间的合作关系。此外,VMT方法引入了OOSE方法中的使用用例概念,用以描述用户与系统之间的相互作用,确定系统为用户提供的服务,从而得到准确的需求模型。VMT方法的开发过程分为3个阶段:分析、设计和实现,分别用来建立分析模型、系统和对象设计及系统实现。

(3)面向对象开发方法优缺点

面向对象的开发方法种类很多,且各有优势,归纳起来有这些优势:能够直接地刻画客观世界的模型,易于处理复杂问题;由于采用的继承和多态等面向对象技术,为软件复用和扩充创造了有利条件,使得开发出来的系统易于理解和维护;由于从需求分析到实现阶段都使用相同的面向对象概念,因此可实现开发过程中各阶段的“无缝连接”。

尽管如此,但由于面向对象方法采用的是自底向上的设计方法,因此在设计底层的对象和实体时存在着一定的盲目性。另外,面向对象方法是一种以数据驱动而非功能驱动的分析法,对于系统的整体行为缺少必要的分析,系统的总体结构性较差。

4. 敏捷开发方法

无论在任何系统的开发中,需求分析都具有特别重要的地位。当今的系统外部环境正在追求全球性、快速化,实际上很难找出一个完全的稳定的系统需求。也就是说,一个基于完全的需求描述,然后进行设计、构造,最后再进行测试的软件开发过程是不适合快速系统开发的。

快速系统开发就是为迅速制造可用软件而设计的。一般来说,它们是迭代过程,其描述、设计、开发和测试是交织在一起的。系统软件的开发和部署不是一次完成的,而是以一系列增量的形式完成的,每一个增量都包括新的系统功能。快速系统开发具有下列一些基本的特性。

①描述、设计和实现过程是并发的。没有详细的系统描述,设计文档得到了最少化,或者是由实现系统所采用的编程环境所自动生成。用户需求文档只定义最重要的系统特性。

②系统通过一系列增量开发出来。最终用户和其他系统信息持有者都参与了每个增量的定义和评估。他们提出对软件的变更建议及对系统后一个增量应该实现的新需求的提议。

③系统用户界面通常是采用交互式开发系统开发的。这些开发系统允许通过绘图和在界面上摆放图标的方式迅速完成界面的设计。

敏捷方法是一种专注于增量式描述、设计和系统实现的迭代式开发方法,其中有用户直接参与到开发过程中。同时,开发负担的降低使得快速系统开发成为可能。

(1)敏捷方法

在20世纪80年代和90年代的前期,人们认为开发出好的信息系统的方法是:仔细的项目规划,形式化质量保证,采用CASE工具所支持的分析和设计方法,经历严格的、有控的软件开发过程。这些观点主要来自于系统工程领域中关注大型的、长生命期的,且由大量单体程序所构成的信息系统的开发人员。

然而,当这个重量级的、基于计划的开发方法应用于小型或者是中等规模业务系统时,开发费用在软件开发过程中所占的比例起了决定性的作用。更多的时间花在了系统应该如何开发而不是程序的开发和测试上。

20世纪90年代提出了新的敏捷开发方法。敏捷方法允许开发团队将主要精力集中在软件本身,而不是在设计和编制文档上。敏捷方法普遍地依赖于迭代方法来完成系统软件描述、开发和移交,主要用于支持业务应用的开发。

(2)敏捷建模原则

敏捷开发方法一般都建立在增量式开发和移交的概念上,但每种方法达到这个目标的过程是不同的。尽管如此,我们也发现它们有很多共同点,一些共同的基本原则的总结如下。

①客户参与:客户应该在开发过程中始终紧密参与其中。他们的作用是提供和排序新系统的需求并评估系统的反复。

②增量式移交:系统以增量的方式进行开发,客户指定在每个增最中将要包含的需求。

③团队工作:系统工作人员与客户、其他参与人员一起建模,团队成员应该保持自己的工作风格,开发团队的技术应该得到承认和发扬,同时鼓励集体所有权并将模型公开化。

④接受变更:预计系统需求的变更,并设计系统使之适应这些变更。

⑤保持简单性:致力于所开发的软件和开发过程的简单性。只要可能,就积极地去降低系统中的复杂性。

每种方法都会有自己的局限性。敏捷方法最适合开发小型或中等规模的业务系统和个人计算机产品,不适合大型系统开发的。开发大型系统的团队会分散于各地,或者是会与硬件和软件系统有复杂的交互,而敏捷团队要求尽可能地集中办公。敏捷方法也不适合开发要求极高的一类系统,这类系统要求对系统需求进行详细分析,只有这样才能做到对系统安全性和信息安全性的保证。

(3)极限编程

极限编程(Extreme Progrumming,XP)是流行最广的一种敏捷方法,由Beck(Beck,2000)在20世纪90年代中期提出的。该方法因推行公认的最好的经验(如迭代式开发),以及客户参与到一个“极限”水平而得名。

在极限编程中,所有的需求都表示为脚本(或客户情节),脚本是要直接被实现的一系列任务。程序员两两结对工作,在写代码之前完成对每个任务的测试的描述。在新的代码加入到系统中时,所有的测试必须被成功执行。图1.11说明了XP过程产生待开发系统的一个增量。

图1.11 极限编程的版本循环

极限编程包含多个经验,其核心价值如下所述。

①通过频繁发布系统的版本来支持增量式开发,其间所采用的需求描述方法是基于客户情节或脚本的,这样的情节或脚本可以成为过程规划的根据。

②客户被全天雇佣到开发团队来参与系统项目。客户代表参与开发,并负责定义系统的接受测试。

③开发人员结对编程,检查彼此的工作,并提供支持以圆满完成任务。集体对系统开发具有所有权,参与系统的所有方面的工作,享有系统代码,不存在技术孤岛现象。

④测试优先的开发思想:在功能本身实现之前,采用一个自动单元测试框架来书写此新功能的测试。连续集成的开发策略:任务一完成,就将它集成到大系统中。在每次这样的集成后,必须通过系统中所有的单元测试。

⑤通过持续的再分解来改善代码质量,并使用不预期系统将来的变更的简单设计,来支持简洁性的维护。

极限编程将增量式开发推向极至。新的软件版本每天之中要构造好多次,移交给客户的增量大约是每两周一次。当程序员创建出新的版本,他/她必须运行所有现存的自动化测试及对新功能的测试。只有当所有测试都成功执行之后,软件的新版本才是可接受的。

1.6.3 团队合作与管理

随着计算机应用的飞速发展,系统开发规模和开发队伍日益庞大,系统开发不再像过去那样是由个别开发人员即可解决的事情,因此,有必要将软件项目管理引入到系统开发活动中,从而有效地保证软件项目能够按照预定的成本、进度、质量要求顺利完成。事实证明,系统项目管理有利于将系统开发人员的个人开发能力转化成企业的开发能力,并使企业的开发能力不断提高和成熟。

项目管理是在指定时间内用最少的费用开发可接受的系统的管理过程。每个信息系统的开发都代表了一个目标,为了实现这个目标,开发过程中需要完成一些任务,内容包括确定范围、计划、人员安排、组织、指导和控制等。对于任何一个系统来说,项目活动的复杂性常常会引起系统进展与预算的变化,因此,有效的项目管理是必需的。

1. 项目管理生存周期

项目管理是一个跨生存周期的活动。系统项目的生存周期包括启动、规划、实施和收尾4个阶段。其中,在项目启动阶段,项目管理者需要与客户一起定义系统的范围,组建项目的开发团队,并建立项目的基础设施。

在项目规划阶段,项目管理者对于项目的资源、成本和进度进行合理估算,制订软件开发计划。项目实施是指按照计划执行和控制项目,即项目管理者执行项目计划,及时发现和纠正实际情况与计划的偏差。在项目收尾阶段,项目团队完成项目产品的交付,并进行经验教训等项目总结。

2. 项目管理基本要素

按照美国项目管理协会(Project Management Institnte,PMI)给出的定义,项目管理(Project Management,PM)是在项目活动中应用一系列知识、技能、工具和技术,以满足或超过项目相关人员对项目的要求和期望。其中,项目管理涉及9个不同的知识领域如下所述。

项目规划管理:定义和控制需要包含在系统中的功能及项目组需要做的工作的范围。

项目时间管理:建立所有项目任务的详细进度表,然后根据确定的里程碑监控项目进程。

项目成本管理:计算初始的成本、收益,以及之后的项目更新和进程监控的支出费用。

项目质量管理:为确保质量建立一个总的计划,包括项目的每一个阶段的质量控制活动。

项目人力资源管理:项目组成员的创建、补充、雇佣等管理,也包括成员培训等相关活动,以激励和团结小组成员,确保工作活力。

项目通信管理:确定系统相关人员和项目组之间的主要通信,建立所有的通信机制和进度表。

项目风险管理:确定和检查整个项目所有潜在的失败风险,并制订减少这些风险的计划。

项目获取管理:制订提案请求、评价投标、签订合同和监控供应商服务性能。

项目集成管理:集成所有其他领域知识,使系统成为一个无缝连接的整体。

在信息系统开发过程中,项目规划、项目活动及项目团队的人员管理显得尤为重要。

(1)规划与方法

项目规划阶段由需要进行项目组织的各种活动组成,包括确定项目活动、制订项目的进度表、确认项目的可行性、项目成本预算、为项目安排人员等。这些活动都是项目管理的主要活动。一般情况下,项目规划阶段通常配备2~3个有丰富经验的系统分析员,其中一人出任项目经理,其他系统分析员是具有很强分析技能,以及有管理和控制项目经历的、富有经验的开发人员。这些项目组成人员常常首先成为核心组领导,然后在他们周围建立项目小组。规划阶段成功结束时,系统已明确各种开发活动并分配好所需资源,制订出了系统开发进度表,并做好了各项成本预算。

需要注意的是,在项目规划阶段,不可能安排好整个项目的每一个任务,因为在项目的早期不可能了解太多的所需任务。为了做好项目成本的预算,预估项目时间就变得十分重要。制定项目进度表是计划阶段最难但也是最重要的事。项目进度表的制订可以分为下列两个主要步骤:第一步是制订工作分解结构;第二步是建立PERT/甘特图。

①制订工作分解结构。所谓工作分解结构(Work Breakdown Structure,WBS)是完成项目所需的各个任务的列表,它在计划和执行项目中尤显重要,因为它是制订项目进度表、确定进度标志和管理成本的基础。图1.12所示为某项目规划阶段的一个工作分解结构实例。

工作分解结构用来划分一个项目的任务、活动和阶段,是评估和安排一个项目任务的方法。项目管理要求在每个周期阶段都应有一个WBS,WBS确定了活动的层次,表明了每个活动可进一步分解成的可独自完成的任务。一般来说,分析、设计和实施阶段的WBS对问题的定义更加重要。显然,项目规划阶段的WBS就是对整个项目进行进度的安排。

图1.12 某项目规划阶段的工作分解结构

②制做PERT/甘特图。PERT(Project Evaluation and Review Technique,项目评估与评审技术)发展于20世纪50年代后期,是一种图形化的网络模型,描述一个项目中任务之间的关系。图1.13显示了一个PERT图的例子。PERT图主要用来在任务被调度之前弄清项目任务之间的依赖关系。图中的方框代表项目任务,可以通过调整方框中的内容反映各种项目属性(如进度和实际的开始和结束时间),用箭头指示一个任务依赖于另一个任务的开始或完成。

图1.13 某开发项目部分PERT图

甘特图最早由Henry L Gantt在1917年提出,是最常用的项目调度和进展评估工具。甘特图是一种简单的水平条形图,它以一个日历为基准描述项目任务。一个条形代表一个项目任务,水平轴是时间线,代表日程天数。顺着时间移动,甘特图可以很好地用于监控项目进展情况。图1.14所示了一个项目开发阶段的甘特图。

图1.14 某项目开发阶段甘特图

甘特图的优点是可以清楚地显示重叠任务,即可以同时执行的任务。图中的条形还可以加阴影,以清楚地指示任务完成的百分比和项目进展情况,快速地识别出图中哪项任务提前于进度或者滞后于进度。在进行项目管理时,甘特图和PERT图可以同时使用,当需要交流进度时甘特图非常便利,当需要研究任务之间的关系时,使用PERT图则显得十分有效。

(2)活动与职能

项目管理中最主要的管理任务即执行相关的活动,从整个项目管理生存周期来看,项目管理主要涉及以下8项活动:协商范围、确定任务、人员安排、组织、调度、指导、控制和项目总结。

①协商范围:项目范围定义了项目的边界。项目经理必须确定对项目范围的预期和约束条件,以便计划活动、估计费用或管理预期结果。

②确定任务:计划并确定完成项目所需的任务。依据管理者对项目目标的理解及对实现目标所使用的方法学的理解,给出项目的工作分解结构(WBS)。

③估算工期:完成项目所需的每个任务必须被估算。任务工期是一个随机变量,其值取决于团队规模、用户数量、用户可用性、用户态度、业务系统的复杂性、信息技术架构、团队人员的经验、对其他项目投入的时间及其他项目的经验。这些都是估算的问题,其中有些问题可以使用项目建模工具来解决。

④调度任务:在给定所有任务的工期估算之后,项目经理负责调度所有的任务活动。项目进度表应在理解了所需的任务、任务持续时间和任务前提条件的情况下制定。项目的进度不仅取决于任务工期,而且取决于任务之间的依赖关系。

⑤分配资源:只有单一的“项目任务进度表”是不够的,还需要把资源分配到任务中去,这些资源包括人、服务、工具和设备、供应和材料、经费等。依据给定调配资源后的进度表,项目管理工具可以生成一个项目的多个视图,例如,日历图、甘特图、PERT图、资源和资源调配报告、预算报告等,项目经理依据这些来指导完成项目任务。

⑥指导团队:项目一旦开始,项目经理就要指导团队的活动。每个项目经理都必须展示人员管理能力,以协调、协商、激励、忠告、赞赏和奖励团队成员。

⑦监控进展:监控项目进展是项目经理最困难也是最重要的职能。计划好的执行过程常常会出现问题或发生延误,项目经理必须监视和报告项目的进展,包括目标、进度和费用,并且在需要时还要做出合适的调整。

⑧评估项目:项目经理应对最终的项目产品进行评审:是否满足用户预期?是否符合进度要求?是否在预算范围之内?通过评审总结,从项目团队成员(包括客户)中获取有关的项目经验,旨在改进组织的项目管理水平和过程管理水平,并对系统开发过程的持续改进制订计划。

所有上述活动职能的顺利完成都依赖于项目经理、团队和其他管理人员之间的顺畅交流。

3. 项目团队的管理

项目管理的实质是通过计划项目,然后检测项目,并控制项目执行的过程。其中,项目经理定义和执行项目管理任务,项目的成败与项目经理的技术和能力,以及以项目经理为中心的项目团队有直接的关系。

一般来说,一个成功的项目一定包含一些不可或缺的因素:清晰的需求定义、大量的参与用户、上层管理的支持、完整的计划准备、务实的进度表及确定的里程碑,这些都是项目经理的工作职责。从团队的角度来看,项目经理需要内外都负责任。

在团队内部,项目经理是项目团队和所有活动的指导者和控制者。项目经理通过建立团队结构完成项目活动,如招募和培训团队成员、安排团队成员任务、协调团队成员和其团队之间的活动等。在团队外部,项目经理是项目的焦点或主要联系人,负责团队对外的推广与交流,如报告项目的状态和进展、与所需系统的需求人员(使用系统的人)建立良好的工作关系、与客户(项目赞助者)或其他系统相关人员建立良好的工作关系。

很显然,项目经理个人不可能完成包括这些职责的所有任务,需要其他的团队成员协助完成,其中项目经理要负主要的职责。由此也可以看出,管理好项目团队是项目成功的必要保障。

事实上,一个新的开发团队从组建、磨合到成熟的发展是有规律可循的,其中明确团队目标、准确定位成员角色、良好的队友沟通及出色的团队领导是团队合作成功的关键因素。