国家示范性软件学院系列教材
点击查看第二章
点击查看第三章
软件项目管理案例教程(第4版)
韩万江 姜立新 编著
机械工业出版社China Machine Press
第1章 软件项目管理概述
1.1 项目与软件项目
信息产业是目前发展较快的行业,也是对社会影响较大的行业之一,“软件”“项目”“软件项目”等概念已经越来越被大家所熟悉,并且普遍存在于我们生活或者社会的各个方面。软件行业是一个极具挑战性和创造性的行业,而软件项目管理也是一项具有挑战性的工作,同时也是保证项目成功的必要手段。
1.1.1 项目及其特征
人类社会和日常生活中有很多种活动,然而有的活动我们称之为项目,有的则不能称为项目。项目(project)就是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力;是以一套独特而相互联系的任务为前提,有效地利用资源,在一定时间内满足一系列特定目标的多项相关工作的总称。一般来说,日常运作和项目是两种主要的活动。它们虽然有共同点,例如,它们都需要由人来完成,均受到有限资源的限制,均需要计划、执行、控制,但是项目是组织层次上进行的具有时限性和唯一性的工作,也许需要一个人,也许涉及成千上万的人,也许需要100小时完成,也许要用10年完成,等等。“上班”“批量生产”“每天的卫生保洁”等属于日常运作,不是项目。项目与日常运作的不同是:项目是一次性的,日常运作是重复进行的;项目是以目标为导向的,日常运作是通过效率和有效性体现的;项目是通过项目经理及其团队工作完成的,日常运作是职能式的线性管理;项目存在大量的变更管理,日常运作基本保持持续的连贯性。下面介绍项目所具有的特征。
1)目标性。项目的目的在于得到特定的结果,即项目是面向目标的。其结果可能是一种产品,也可能是一种服务。目标贯穿于项目始终,一系列的项目计划和实施活动都是围绕这些目标进行的。例如,一个软件项目的最终目标可以是开发一个学生成绩管理系统。
2)相关性。项目的复杂性是固有的,一个项目有很多彼此相关的活动,例如,某些活动在其他活动完成之前不能启动,而另一些活动必须并行实施,如果这些活动相互之间不能协调地开展,就不能达到整个项目的目标。
3)临时性。项目的临时性是指项目有明确的起点和终点。临时性并不意味着项目的持续时间短,而是指项目要在一个限定的期间内完成,是一种临时性的任务。当项目的目标达到时,意味着项目任务完成。项目管理中的很大一部分精力是用来保证在预定时间内完成项目任务,为此而制定项目计划进度表,标识任务何时开始、何时结束。项目任务不同于批量生产。批量生产是相同的产品连续生产,取决于要求的生产量,当生产任务完成时,生产线停止运行,这种连续生产不是项目。
4)独特性。在一定程度上,项目与项目之间没有重复性,每个项目都有其独自的特点。每一个项目都是唯一的。如果一位工程师正在按照规范建造第50栋农场式的住宅,其独特性一定很低,它的基本部分与已经造好的第49栋是相同的,如果说其有特殊性,也只是在于其地基的土壤不同,使用了一个新的热水器,请了几位新木工,等等。然而,如果要为新一代计算机设计操作系统,则该工作必然会有很强的独特性,因为这个项目以前没有做过,可供参考的经验并不多。
5)资源约束性。每一项目都需要运用各种资源作为实施的保证,而资源是有限的,所以资源是项目成功实施的一个约束条件。
6)不确定性。一个项目开始前,应当在一定的假定和预算基础上制定一份计划,但是,在项目的具体实施中,外部因素和内部因素总是会发生一些变化,会存在一定的风险和很多不确定性因素,因此项目具有不确定性。
1.1.2 项目群与项目、项目与子项目的关系
项目群也称为大型项目(program),是通过协调来进行统一管理的一组相互联系的项目,它本身可能不是项目。许多大型项目通常包括持续运作的活动。一个大型项目可以理解为比项目高一级别的大项目,如“863计划”“星火计划”“登月计划”“阿波罗登月计划”等。以“863计划”为例,它的目标是赶超世界先进水平,集中资源重点投入,争取在我国部分有优势的高科技领域有所突破,为我国在21世纪的经济发展和国防安全创造条件。这样的目标是战略性的,很难具体化,但它可以通过一系列的具体项目去实施。子项目(subproject)是将项目分解成更小的单位,以便更好地控制项目。项目中的某一阶段可以是一个单独的项目,也可以是一个子项目,一个子项目可以转包给外部机构的一个单元。在实际工作中,子项目的划分是很灵活的,可以视项目的需要而定。可以按照阶段划分子项目,如一期项目、二期项目……也可以按照项目的组成部分划分子项目。
1.1.3 软件项目
软件是计算机系统中与硬件相互依存的部分,是包括程序、数据及其相关文档的完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文材料。软件项目除了具备项目的基本特征之外,还有如下特点。
1)软件是一种逻辑实体而非具体的物理实体,具有抽象性,这使得软件与其他的诸如硬件或者工程类项目有很多的不同之处。
2)软件的生产与硬件不同,开发过程中没有明显的制造过程,也不存在重复生产过程。
3)软件没有硬件的机械磨损和老化问题,然而,软件存在退化问题。在软件的生存期中,软件环境的变化导致软件的失效率提高。
4)软件的开发受到计算机系统的限制,对计算机系统有不同程度的依赖。
5)软件开发至今没有摆脱手工的开发模式,软件产品基本上是“定制的”,无法利用现有的软件组件组装成所需要的软件。
6)软件本身是复杂的,其复杂性来自应用领域实际问题的复杂性和应用软件技术的复杂性。
7)软件的成本相当高昂,软件开发需要投入大量资金和高强度的脑力劳动,因此成本比较高。
8)很多软件工作涉及社会的因素,例如,许多软件开发受到机构、体系和管理方式等方面的限制。
软件项目是一种特殊的项目,它创造的唯一产品或者服务是逻辑载体,没有具体的形状和尺寸,只有逻辑的规模和运行的效果。软件项目不同于其他项目,软件是一个新领域而且涉及的因素比较多,管理比较复杂。目前,软件项目的开发远远没有其他领域的项目规范,很多的理论还不适用于所有软件项目,经验在软件项目中仍起很大的作用。软件项目由相互作用的各个系统组成,系统包括彼此相互作用的部分。软件项目涉及的因素越多,彼此之间的相互作用就越大。另外,变更也是软件项目中常见的现象,如需求的变更、设计的变更、技术的变更、社会环境的变更等,这些均说明了软件项目管理的复杂性。项目的独特性和临时性决定项目是渐进明细的,软件项目更是如此,因为软件项目比其他项目有更大的独特性。“渐进明细”表明项目的定义会随着项目团队成员对项目、产品等的理解和认识的逐步加深而得到逐渐深入的描述。软件行业是一个极具挑战性和创造性的行业,软件开发是一项复杂的系统工程,牵涉各方面的因素。软件项目的特征包括需求的不确定性和开发过程中存在技术风险。在实际工作中,经常会出现各种各样的问题,甚至软件项目会面临失败。如何总结、分析失败的原因并得出有益的教训,是今后项目取得成功的关键。
1.1.4 软件项目组成要素
简单地说,项目就是在既定的资源和要求的约束下,为实现某种目的而相互联系的一次性工作任务。一个软件项目的要素包括软件开发的过程、软件开发的结果、软件开发赖以生存的资源及软件项目的特定委托人(或者说是客户,既是项目结果的需求者,也是项目实施的资金提供者)。
1.1.5 项目目标实现的制约因素
项目目标就是在一定时间、预算内完成项目范围内的事项,以使客户满意。一个成功的项目应该在项目允许的范围内满足成本、进度要求,并达到客户满意的产品质量。所以,项目目标的实现受4个因素制约:项目范围、成本、进度计划和客户满意度,如图11所示。项目范围是为使客户满意必须做的所有工作。成本是完成项目所需要的费用。进度计划安排每项任务的起止时间及所需的资源等,为项目描绘一个过程蓝图。客户满意度取决于所交付成果的质量,只有客户满意才可以更快地结束项目,否则会导致项目的拖延,从而增加额外的费用。
1.2 项目管理
项目普遍存在于人们的工作和生活中,如何管理这些项目是一项需要研究的任务。项目管理起源于美国,20世纪40~50年代主要应用于国防和军工项目,后来广泛应用于工商、金融、信息等产业及行政管理领域。目前,项目管理已经成为综合多门学科的新兴研究领域,其理论来自项目管理的工作实践。项目管理是指把各种系统、方法和人员结合在一起,在规定的时间、预算和质量目标范围内完成项目的各项工作。对于一个组织的管理而言,项目管理主要包括3个部分,即战略管理、运作管理、项目管理。
- 战略管理(strategy management)是从宏观上帮助企业明确和把握发展方向的管理。
- 运作管理(operation management)是对日常性、重复性工作的管理。
- 项目管理(project management)是对一次性、创新性工作的管理。
项目是企业的最小盈利单位,项目管理自然成为构筑企业利润的基石,从这种意义上说,项目管理是企业的核心竞争力所在。由于项目管理具有效率高、反应灵敏的优点,因此更多的企业希望采取项目式管理(management by project)的方式,及时响应用户需求,使管理更高效,从而提高企业的管理质量。
实施项目管理可以提高项目的效益。这里所指的效益是一个综合性指标,包括低风险、高产出等。因此,不难得出我们在实施项目管理时应该掌握的度,即引入项目管理所产生的效益减去项目管理的实施成本后必须大于未引入项目管理时的效益。由于项目管理的效益与项目管理的复杂度(项目管理的成本)并非线性相关,因此项目管理的复杂度必然存在一个最优值,这就是我们应该掌握的度,这个度被大家认可并且能够被准确地理解和实施。
1.2.1 项目管理背景
随着世界由工业时代进入信息时代,时空概念的根本改变加剧了项目的复杂性和可变性。项目涉及的范围和时间、空间跨度都在以空前的速度扩大。而随着行业竞争的加剧,项目只有在最少时间、最低成本的情况下完成才有意义。项目本身的复杂性和巨大风险及在分工合作中个人经验的不确定性,使个人经验已无法确保项目的成功或按时完成。
项目管理是20世纪50年代后期发展起来的一种计划管理方法,它一出现就引起广泛关注。1957年,美国杜邦公司把这种方法应用于设备维修,把维修停工时间由125小时锐减为78小时。1958年,美国人在北极星导弹设计中应用项目管理技术,把设计完成时间缩短了两年。由于项目管理在运作方式和管理思维模式上最大限度地利用了内外资源,从根本上改善了管理人员的工作程序,提高了效率,降低了风险,因此自20世纪60年代以来它被广泛运用于航空航天、国防、信息、建筑、能源、化工、制造、环保、交通运输、金融、营销、服务、法律等行业。它不仅适用于大公司,而且适用于小型企业。目前,在全球发达国家的政府部门和企业机构中,项目管理已成为运作的中心模式。
1.2.2 项目管理定义
项目管理是指一定的主体,为了实现其目标,利用各种有效的手段,对执行中的项目周期的各阶段工作进行计划、组织、协调、指挥、控制,以取得良好经济效益的各项活动的总和。通过项目各方干系人的合作,把各种资源应用于项目,以实现项目的目标,使项目干系人的需求得到不同程度的满足。因此,项目管理是一系列伴随着项目的进行而进行的管理行为,目的是确保项目能够达到期望结果。要想满足项目干系人的需求和期望,达到项目目标,需要在下面这些相互有冲突的要求之间寻求平衡:
1)范围、时间、成本和质量。
2)有不同需求和期望的项目干系人。
3)明确表示出来的要求(需求)和未明确表达的要求(期望)。
项目管理有时被描述为对连续性操作进行管理的组织方法。这种方法,更准确地说应该称为“由项目实施的管理”,它是将连续性操作的许多方面作为项目来对待,以便对其可以采用项目管理的方法。所以,对于一个通过项目实施管理的组织而言,其对项目管理的认识显然是非常重要的。项目管理是要求在项目活动中运用知识、技能、工具和技术,以便达到项目目标的活动。项目管理类似导弹发射的控制过程,需要一开始设定好目标,然后在飞行中锁定目标,同时不断调整导弹的方向,使之不能偏离正常的轨道,最终击中目标。软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对成本、人员、进度、质量、风险等进行分析和管理的活动。
1.2.3 软件项目管理的特征及重要性
软件项目管理是软件工程的重要组成部分,它能确保软件项目满足预算、成本等约束,提交高质量的软件产品。好的项目管理不能保证项目成功,但是不好的项目管理一定会造成项目失败,如软件可能会延迟,成本可能超支,或者项目无法满足客户的期望。
当前社会的特点是“变化”,而这种变化在信息产业中体现得尤为突出:技术创新速度越来越快,用户需求与市场不断变化,人员流动也大大加快。在这种环境下,企业需要应对的变化及由此带来的挑战大大增加,也给管理带来了很多问题和挑战。目前软件开发面临很多问题,例如:
1)在有限的时间、资金下,要满足不断增长的软件产品质量要求。
2)开发的环境日益复杂,代码共享日益困难,需跨越的平台增多。
3)程序的规模越来越大。
4)软件的重用性需求提高。
5)软件的维护越来越困难。
因此,软件项目管理显得更为重要。软件项目管理是在20世纪70年代中期由美国提出的,当时美国国防部专门研究了软件开发不能按时提交、预算超支和质量达不到用户要求的原因,结果发现70%的项目是由管理不善引起的,而非技术原因。于是,软件开发者开始逐渐重视软件开发中的各项管理问题。
软件项目管理和其他项目管理相比具有以下特殊性。
1)软件是纯知识产品,其开发进度和质量很难估计和度量,生产效率也难以预测和保证。与普通的项目不同,软件项目的交付成果事先看不见,并且难以度量,特别是很多应用软件项目已经不再是业务流程的电子化,而是同时涉及业务流程再造或业务创新。因此,在项目早期,客户很难描述清楚需要提交的软件产品,但这一点对软件项目的成败又是至关重要的。与此矛盾的是,公司一般安排市场销售人员负责谈判,其重点是迅速签约,而不是如何交付,甚至为了尽早签约而过度承诺,遇到模糊问题时也怕因为解释而节外生枝,所以避而不谈,而甲方为了保留回旋余地,也不愿意说得太清楚,更不愿意主动提出来(因为甲方还有最终验收的主动权)。等到项目经理一旦接手项目,所有这些没有说清楚的隐患和口头承诺都将暴露出来,并最终由项目经理承担。
2)项目周期长,复杂度高,变数多。软件项目的交付周期一般比较长,一些大型项目的周期可以达到2年以上。这样长的时间跨度内可能发生各种变化。软件系统的复杂性导致了开发过程中各种风险的难以预见和控制。从外部来看,商业环境、政策法规变化会对项目范围、需求造成重大影响。例如,作者曾经从事的金融项目临近上线时,国家推出了“利息税”政策,造成整个系统的大幅变更。从内部来看,组织结构、人事变动等对项目的影响更加直接。有时,伴随着新的领导到任,其思路的变化,甚至对项目的重视程度的变化,都可能直接影响项目的成败。
3)软件需要满足一群人的期望。软件项目提供的实际上是一种服务,服务质量不仅仅是最终交付的质量,更重要的是客户的体验。实际上,项目中的“客户”不是一个人,而是一群人。他们可能来自多个部门,并且对项目的关注点不同,在项目中的利益也不同。所以,当我们谈到满足“客户需求”时,实际的意思是满足一群想法和利益各不相同的人的需求。
所以,进行软件项目管理是必要的。软件项目管理的根本目的是让软件项目尤其是大型项目的生命周期能在管理者的控制之下,以预定成本按期、按质地完成软件项目,并且交付用户使用。而研究软件项目管理是为了从已有的成功或失败的案例中总结出能够指导今后开发的通用原则、方法,以避免重犯前人的错误。
实际上,软件项目管理的意义不仅仅如此,进行软件项目管理有利于将开发人员的个人开发能力转化成企业的开发能力,企业的软件开发能力越高,表明企业的软件生产越趋于成熟,企业越能够稳定发展,从而减小开发风险。
1.3 项目管理知识体系
以前,有人认为项目管理是一种“意外的职业”。因为常常是人们在项目中先承担了项目责任(可能从技术开发开始),然后随着项目经验的逐步丰富,最后顺理成章地当上项目经理。由此看来,管理一个项目的有关知识不是通过系统学习得来的,而是在实践中摸索出来的,然而在摸索的过程可能会导致严重损失。近年来,在减小项目管理意外性方面已经有了很大进步。很多企业的决策者日益认识到项目管理方法可以帮助他们在复杂的竞争环境中取得成功。为了减少项目管理的意外性,许多机构或者企业开始要求雇员系统地学习项目管理技术,努力成为经认证合格的项目管理人员。
项目管理专业人员资格(Project Management Professional,PMP)是美国项目管理学会(Project Management Institute,PMI)开发并负责组织实施的一种专业资格认证。PMP认证可以为个人的事业发展带来很多好处。该项认证已经获得世界上100多个国家的承认,可以说是目前全球认可程度很高的项目管理专业认证,也是项目管理资格的重要标志之一,具有国际权威性。在世界很多国家,特别是发达国家,PMP已经被认为是合格项目管理的标志之一。
项目管理知识体系(Project Management Body Of Knowledge,PMBOK)是由PMI组织开发的一套关于项目管理的知识体系。它是PMP考试的关键材料,为所有的项目管理提供了一个知识框架。
项目管理知识体系(PMBOK 2017)包括项目管理的10个知识领域、5个标准化过程组及49个模块。这10个知识领域分别是:项目集成管理(project integration management),项目范围管理(project scope management),项目进度管理(project schedule management),项目成本管理(project cost management),项目质量管理(project quality management),项目资源管理(project resource management),项目沟通管理(project communication management),项目风险管理(project risk management),项目采购管理(project procurement management),项目干系人管理(project stakeholder management)。10个知识领域包括的管理要素如图1-2所示。
1.3.1 项目管理的知识领域
项目管理的知识领域分布在项目进展过程中的各个阶段,它们的关系可以这样描述:
- 为了成功实现项目的目标,首先必须设定项目的工作和管理范围,即项目范围管理(what to do)。
- 为了正确实施项目,需要对项目的时间、质量、成本三大目标进行分解,即项目进度管理(when)、项目质量管理(how good)、项目成本管理(how much)。
- 在项目实施过程中,需要投入足够的人力、物力,即项目资源管理(people and motivation)、项目采购管理(partner)。
- 为了对项目团队人员进行管理,让大家目标一致地完成项目,需要沟通,即项目沟通管理和项目干系人(相关方)管理(understand and be understood)。
- 项目在实施过程中会遇到各种风险,所以要进行风险管理,即项目风险管理。
- 项目管理一定要协调各个方面,不能只顾局部的利益和细节,所以需要集成管理,即项目集成管理。
项目管理的知识领域具体描述如下。
1.项目集成管理
项目集成管理包括为识别、定义、组合、统一和协调各项目管理过程组的各个过程和活动而开展的过程与活动,如图1-3所示。项目集成管理贯穿于项目的全过程,在项目的整个生命周期内,协调管理其他各管理知识域,将项目管理的方方面面集成为一个有机整体,保证项目总目标的实现。项目集成管理的目标在于对项目中的不同组成元素进行正确、高效的协调,而不是对所有项目组成元素进行简单相加。
2.项目范围管理
项目范围是为了交付具有特定属性和功能的产品而必须完成的工作。项目范围管理包括确保项目做且只做所需的全部工作以成功完成项目的各个过程,如图1-4所示。范围管理主要定义项目需要完成的工作,确保项目包含且只包含所有需要完成的工作。范围管理定义可以控制项目包含什么内容和不包含什么内容。
3.项目进度管理
项目进度管理包括为管理项目按时完成所需的各个过程,如图1-5所示。按时提交项目是项目经理的较大挑战之一,时间是灵活性最小的控制元素,进度是导致项目冲突的最主要原因,尤其在项目的后期,所以项目管理者学习进度管理过程尤为重要。
4.项目成本管理
项目成本管理包括为使项目在批准的预算内完成而对成本进行规划、估算、预算、融资、筹资、管理和控制的各个过程,是在项目具体实施过程中为确保完成项目所花费的实际成本不超过预算而开展的管理活动,如图1-6所示。
5.项目质量管理
项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品的质量要求,以满足相关方的期望的各个过程,如图1-7所示。项目质量管理要求保证该项目能够兑现它关于满足各种需求的承诺,涵盖与决定质量工作的策略、目标和责任的管理功能有关的各种活动。
6.项目资源管理
项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程,如图1-8所示。
7.项目沟通管理
项目沟通管理包括为确保项目信息及时且恰当地规划、收集、生成、发布、存储、检索、管理、控制、监督和最终处置所需的各个过程,如图1-9所示。项目沟通管理确定项目人员的沟通需求和需要的信息,即确定谁需要什么信息、什么时候需要以及如何获取这些信息。
8.项目风险管理
项目风险管理包括规划风险管理、识别风险、实施风险分析、规划风险应对、实施风险应对和监督风险的各个过程,如图1-10所示。项目风险管理是决定采用什么方法和如何规划项目风险的活动,是指对项目风险从识别到分析乃至采取应对措施等一系列过程。它包括将积极因素所产生的影响最大化和使消极因素产生的影响最小化两方面内容。
9.项目采购管理
项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程,如图1-11所示。为了满足项目的需求,项目组织需要从外部获取某些产品,这就是采购。采购的意义是广义的,可能是采购物品,也可能是采购服务(如软件开发等),还包括收集有关产品的信息,进行择优选购。
10.项目干系人管理
项目干系人管理也称为项目相关方管理,包括用于开展下列工作的各个过程:识别影响或受项目影响的人员、团队或组织,分析相关方对项目的期望和影响,制定合适的管理策略来有效调动相关方参与项目决策和执行,如图1-12所示。
项目干系人管理主要通过沟通管理满足项目相关人员的需求和期望,同时解决问题。干系人管理还关注与相关方的持续沟通,以便了解相关方的需要和期望,解决实际发生的问题,管理利益冲突,促进相关方合理参与项目决策和活动。应该把相关方满意度作为一个关键的项目目标来进行管理。
1.3.2 标准化过程组
按照项目管理生命周期,项目管理知识体系分为5个标准化过程组,也称为项目管理生命周期的5个阶段,即启动过程组、计划过程组、执行过程组、控制过程组、收尾过程组(见图1-13)。每个标准化过程组由一个或多个过程组成。它们的关系定义如下。
1)启动过程组:主要确定一个项目或一个阶段可以开始了,并要求着手实行;定义和授权项目或者项目的某个阶段。
2)计划过程组:为完成项目所要达到的商业要求而进行的实际可行的工作计划的设计、维护,确保实现项目的既定商业目标。计划基准是后面跟踪和监控的基础。
3)执行过程组:根据制定的基准计划,协调人力和其他资源,执行项目管理计划或相关的子计划。执行过程存在两个方面的输入,一个是根据原来的基准来执行,另一个是根据监控中发现的变更来执行。主要变更必须在整体变更控制得到批准后才能够执行。
4)控制过程组:通过监督和检测过程确保项目达到目标,必要时采取一些修正措施。集成变更控制是一个重要的过程。
5)收尾过程组:取得项目或阶段的正式认可并且有序地结束该项目或阶段。向客户提交相关产品,发布相关的结束报告,更新组织过程资产并释放资源。
各个过程组通过其结果进行连接,一个过程组的结果或输出是另一个过程组的输入。其中,计划过程组、执行过程组和控制过程组是核心管理过程组。表1-1所示为PMBOK的5个标准化过程组、10个知识领域、49个模块之间的关系。
1.4 软件项目管理知识体系
1.4.1 软件过程定义
所谓过程,简单来说就是人们做事情的一种固有的方式。做任何事情都存在过程,小到日常生活中的琐事,大到工程项目。对于做一件事,有相关经验的人对完成这件事的过程很了解,会知道完成这件事需要经历几个步骤,每个步骤都完成什么事,需要什么样的资源和什么样的技术,等等,因而可以顺利地完成工作。没有经验的人对过程不了解,就会有无从着手的感觉。如图1-14所示,如果项目人员将关注点只放在最终产品上,不关注期间的开发过程,那么不同的开发队伍或者个人可能会采用不同的开发过程,结果是开发的产品质量是不同的,有的质量好,有的质量差,这完全依赖于个人的素质和能力。
反之,如图1-15所示,如果项目人员将项目的关注点放在项目的开发过程上,不管谁来做,也不管需求是什么,均采用统一的开发过程,即企业的关注点在过程,则经过同一企业过程开发的软件,其产品质量是一样的。可以通过不断提高过程的质量来提高产品的质量。这个过程是公司能力的体现,是不依赖于个人的。也就是说,产品的质量依赖于企业的过程能力,不依赖于个人能力。
软件过程不能简单地理解为软件产品的开发流程,因为我们要管理的并不只是软件产品开发的活动序列,而是软件开发的最佳实践。软件过程包括流程、技术、产品、活动间关系、角色、工具等,是软件开发过程中各方面因素的有机结合。因此,在软件过程管理中,首先要进行过程定义,将过程以一种合理的方式描述出来,并建立起企业内部的过程库,使过程成为企业内部可以重用的共享资源。对于过程,要不断地进行改进,以不断地改善和规范过程,从而帮助企业提高生产力。如果将一个软件生产类比为一个工厂的生产,那么生产线就是过程,产品按照生产线的规定过程进行生产。
软件开发的风险之所以大,是因为软件过程能力低,其中关键的问题在于软件开发组织不能很好地管理其软件过程,为此必须强调和加强软件开发过程的控制和管理。软件项目的开发过程主要有系统调研、需求分析、概要设计、详细设计、编码、测试、实施与维护等。不同软件项目的过程大体相同,但不同项目的每一个过程所包含的一系列具体的开发活动(子过程)千差万别,而且不同的项目组采用不同的开发技术,使用不同的技术路线,其开发过程的侧重点也不一样。因此,项目经理在软件项目开发前,需根据所开发的软件项目和项目组的实际情况,建立起一个稳定、可控的软件开发过程模型,并按照该过程来进行软件开发,这是项目成功的基本保证。
软件过程是极其复杂的过程。我们知道,软件是由需求驱动的,有了用户应用的实际需求才会引发开发一个软件产品。软件产品从需求的出现到最终产品的出现,要经历一个复杂的开发过程。软件产品在使用时要根据需求的变更进行不断的修改,这称为软件维护。我们把用于从事软件开发及维护的全部技术、方法、活动、工具,以及它们之间的相互变换统称为软件过程。由此可见,软件过程的外延非常大,包含的内容非常多。对于一个软件开发机构来说,做过一个软件项目,无论成功与否,都能够或多或少地从中总结出一些经验。做过的项目越多,其经验越丰富,特别是一个成功的开发项目,从中可以总结出一些完善的过程,我们称之为最佳实践(best practice)。最佳实践开始是存放在成功者的头脑中的,很难在机构内部共享和重复利用并发挥其应有的效能。长期以来,这些本应从属于机构的巨大的财富被人们所忽视,这无形中给机构带来了巨大的损失,当人员流动时,这种企业的财富也随之流失,并且使这种财富无法被其他的项目再利用。过程管理就是对最佳实践进行有效的积累,形成可重复的过程,使最佳实践可以在机构内部共享。过程管理的主要内容包括过程定义与过程改进。过程定义是对最佳实践加以总结,以形成一套稳定的、可重复的软件过程。过程改进是根据实践对过程中有偏差或不切合实际的地方进行优化的活动。通过实施过程管理,软件开发机构可以逐步提高其软件过程能力,从根本上提高软件生产能力。
1.4.2 过程管理在软件项目中的作用
前面介绍了过程在软件开发中的重要性。对于软件这种产品来讲,软件过程具有非常重要的意义。对于一件家具,其质量好主要有两方面的因素:一是用于生产这件家具的材料的质量要好,否则很难有好的家具;二是生产的加工工艺要好。早期的家具是以手工制造为主的,由于工匠的手艺不同,产品的质量参差不齐。随着技术的不断发展,材料方面得到了进一步的提高,同时在产品的加工上更多地引入了高技术含量的木工机械,所以产品的加工能力和质量的稳定性都得到了很大程度的提高。软件产品在生产上有一定的特殊性。首先,软件产品没有物理的存在实体,它完全是高度逻辑化的聚合体,所以在质量因素的构成上不存在材料质量的因素,因而,在生产过程中唯一影响产品质量的是产品的生产工艺。生产工艺在软件工程中的术语就是软件过程。软件过程管理对软件产业的发展非常重要。软件产业发展中的重要问题是要注重循序渐进地积累,不仅积累技术实践,更为重要的是积累我们所欠缺的管理实践,这样才能保证企业生产力持续发展,满足业务发展的需要。软件过程管理有助于软件组织对过程资产进行有效管理,使之可以重用于实际项目中,并结合从项目中获取的过程的实际应用结果来不断地改进过程。这样软件组织能够有能力改变自身的命运,将它从维系在一个或几个个体身上变成维系在企业内部的管理上。过程管理让软件组织直观感觉到的最明显的转变就是软件项目中的所有成员的位置可以替换。
1.4.3 过程管理与项目管理知识体系的关系
顾名思义,过程管理就是对过程进行管理,其目的是要让过程能够被共享、重用,并得到持续改进。在软件行业,要管理的是软件过程。过程管理与项目管理在软件组织中是两项重要的管理,项目管理用于保证项目的成功,而过程管理用于管理最佳实践。这两项管理并不是相互孤立的,而是有机地、紧密地相结合的。图1-16中展现的是过程管理和项目管理的基本关系。过程管理的成果即软件过程可以辅助项目管理的工作,在项目的计划阶段,项目计划的最佳参考是过去的类似项目中的实践经验,这些内容通过过程管理成为工作成果,这些成果对于一个项目的准确估算和合理计划非常有帮助。合理的计划是项目成功管理的基础。在项目计划的执行过程中,计划将根据实际情况不断地调整,直到项目结束时,项目计划才能真正稳定下来。这份计划及其变更历史是过程管理中的过程改进的最有价值的参考。在国外的成熟的软件组织内部,每个项目开发完成后必须提供“软件过程改进建议”文档,这是从软件开发项目的过程中提炼出来的对软件过程改进的建议。过程的改进注重从项目的实际经验中不断地将最佳实践提炼出来。
所有的软件过程构成了软件项目管理的过程体系,对应PMBOK的5个过程组、10个知识领域。大家最熟悉的过程组应该是执行过程组,如需求分析过程、设计过程、编码过程、测试过程等,如图1-17所示。计划过程组有范围计划、进度计划、成本计划、质量计划等,控制过程组与计划过程组是一一对应的,控制的对象就是执行过程。当然,软件项目管理同样有初始过程和结束过程。这样就形成了软件项目管理的过程体系。目前软件项目管理过程没有公认的体系标准,具体项目可以有适合自己的过程要求。
1.5 敏捷项目管理
1.5.1 软件项目面临的挑战
软件项目是一类特殊项目,它是脑力成果,而且依赖用户需求,具有不断变化的特征。软件开发具有唯一性,是一次性的,这些都决定了软件项目全部工程化有一定的难度。从系统角度看软件项目,传统软件开发面临很多挑战,如质量问题、测试问题、用户问题、进度问题、成本问题、团队的沟通问题等。因此,软件项目需要快速的开发过程,快速变化的环境要求快速的开发和快速的提交,这促进了敏捷模型的产生。敏捷软件开发(agile software development)是一个灵活的开发方法,用于在一个动态的环境中向干系人快速交付产品。其主要特点是关注持续地交付价值,通过迭代和快速的用户反馈管理不确定性和应对变更。
由于高新技术的出现及技术更迭越来越快,产品的生命周期日益缩短。企业要面对新的竞争环境,抓住市场机遇,迅速开发出用户所需要的产品,就必须实现敏捷反应。与此同时,业界不断探寻适合软件项目的开发模式,其中,敏捷软件开发模式越来越得到大家的关注和采用。
高度不确定的项目变化速度快,复杂性和风险也高。这些特点可能会给传统预测法带来问题。传统预测法旨在预先确定大部分需求,并通过变更请求过程控制变更。而敏捷方法的出现是为了在短时间内探讨可行性,根据评估和反馈快速调整。
1.5.2 敏捷思维
2001年年初,许多公司的软件团队陷入了不断增长的过程的泥潭,一批业界专家聚集在一起概括出一些可以让软件开发团队能快速工作、响应变化的价值观和原则,他们称自己为敏捷联盟。在随后的几个月中,他们发表了一份价值观声明,即《敏捷宣言》(The Agile Manifesto),涉及敏捷模型核心价值,内容如下。
- 个体和交互胜过过程和工具(individual and interaction over process and tool)。
- 可以工作的软件胜过面面俱到的文档(working software over comprehensive documentation)。
- 客户合作胜过合同谈判(customer collaboration over contract negotiation)。
- 响应变化胜过遵循计划(responding to change over following a plan)。
敏捷宣言代表了敏捷的核心价值。敏捷模型是敏捷组织提出的一个灵活快速开发方法,可以应对迅速变化的需求,是一种迭代、循序渐进的开发方法。所以,敏捷开发过程是慢慢改进的,而非一蹴而就的。敏捷模型的4个核心价值对应12个敏捷原则,具体如下所示。
1)最先要做的是通过尽早地、持续地交付有价值的软件来使客户满意。
2)即使到了开发的后期,也欢迎改变需求。敏捷过程利用适应变化来为客户创造竞争优势。
3)经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
4)在整个项目开发期间,业务人员和开发人员尽可能地在一起工作。
5)围绕被激励起来的个体组成团队来构建项目,给他们提供所需的环境与支持,并且信任他们能够完成工作。
6)在团队内部及团队之间,最有效果并且最有效率的传递信息的方式就是面对面的交流。
7)可以工作的软件是首要的进度度量标准。
8)敏捷过程提倡平稳的开发。发起人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
9)不断地关注优秀的技能和好的设计会增强敏捷的能力。
10)简单——使未完成的工作最大化的艺术,是根本的。
11)最好的架构、需求和设计出自于自组织的团队。
12)每隔一定的时间,团队会在如何才能更有效地工作方面进行反省,然后相应地调整自己的行为。
可以看到,第1个原则强调尽早持续提交有价值的软件,第2个原则强调适应需求变更,第3个原则强调短周期提交,第4个原则强调客户参与开发,其他以此类推。尽管这些原则源自软件行业,但已经扩展到许多其他行业。这种思维模式、价值观和原则定义了敏捷方法的组成部分。今天所使用的各种敏捷方法都植根于敏捷思维模式、价值观和原则,它们之间的关系如图1-18所示。
图1-18是在艾哈迈德·西德基启发下提出的模式,它将敏捷明确表述为一种思维模式,由《敏捷宣言》的价值观所界定,受《敏捷宣言》原则指导,并通过各种实践实现。总之,敏捷方法是一个囊括了各种框架和方法的术语,它指的是符合《敏捷宣言》价值观和原则的任何方法、技术、框架、手段或实践。敏捷思维主要体现在快速交付成果并获得早期反馈,同时强调以一种透明的方式工作。例如,在图1-19中,第一种方式是比较模糊的项目管理方式,而第二种方式则更加透明和具体。
敏捷软件开发是一种面临迅速变化的需求快速开发软件的能力,是对传统生存期模型的挑战,也是对复杂过程管理的挑战;是一种以人为核心的、迭代的、循序渐进的开发方法;是一种轻量级的软件开发方法。传统软件开发更倾向于不考虑项目后续需求的变化,在项目开始时预测用户需求,然后冻结需求,制定相应的开发计划,再按照计划执行。与之形成鲜明对比的是,敏捷软件开发通过不断的用户反馈动态调整需求,最终达成目标。这种自适应的特性使得敏捷开发的产品更符合实际需求,如图1-20所示。
随着云技术和敏捷思路的发展,云原生(cloud native)产生了。云原生是Matt Stine提出的一个概念,它是一个思想的集合,包括DevOps、持续交付(continuous delivery)、微服务(micro service)、敏捷基础设施(agile infrastructure)、康威定律(Conways law)等。云原生包含了一组应用的模式,用于帮助企业快速、持续、可靠、规模化地交付业务软件。云原生由微服务架构、DevOps和以容器为代表的敏捷基础架构组成。
1.6 本书的组织结构
软件项目管理不同于其他领域的项目管理,有很多的特殊性。软件工程远远没有建筑工程等领域规范化,经验在软件项目管理中起很重要的作用。
本书分为5篇,前4篇代表软件项目管理的4个阶段,即项目初始、项目计划、项目执行控制、项目结束,如图1-21所示。最后是“项目实践”篇。项目计划和项目执行控制是项目管理最重要的两项任务。在项目的前期,项目经理完成项目初始和项目计划阶段的工作,这个阶段的重点是明确项目的范围和需求,并据此计划项目的活动,进行项目的估算和资源分配、进度表的排定等。在项目计划完成后,整个项目团队按照计划的安排来完成各项工作。在工作进展的过程中,项目经理要通过多种途径来了解项目的实际进展情况,并检查与项目计划之间是否存在偏差。出现偏差意味着工作没有按照计划的预期来进行,这有可能对项目的最终结果产生重大影响,因此需要及时调整项目计划。调整计划要具体问题具体分析,先要找到问题发生的原因,然后给出相应的应对措施。在实际项目的进展过程中,计划工作与跟踪工作会交替进行,核心是围绕着最终的项目目标。
1.项目初始
项目初始是软件项目管理的第一个阶段,包括项目立项、招投标、合同(或者协议)的确定,明确软件要完成的主要功能,以及项目开发的阶段周期等。因此,“项目初始”篇又分两章,主要内容包括项目确立、生存期模型,如图1-22所示。
2.项目计划
项目计划是建立项目行动指南的基准,包括对软件项目的估算、风险分析、进度规划、团队人员的选择与配备、产品质量规划等,用于指导项目的进程发展。软件项目的预算可提供一个控制项目成本的尺度,为将来的评估提供参考,是项目进度安排的依据。最后形成的项目计划书将作为跟踪控制的依据。因此,“项目计划”篇依次讲述了范围计划、成本计划、进度计划、质量计划、配置管理计划、团队计划、风险计划、合同计划等,如图1-23所示。
3.项目执行控制
一旦建立了基准计划就必须按照计划执行,包括按计划执行项目和控制项目,以使项目在预算内按进度并使顾客满意地完成。在这个阶段,项目管理过程包括测量实际的进程,并与计划进程相比较,同时发现计划的不当之处。为了测量实际的进程,掌握实际上已经开始或结束的任务、已投入的资金等很重要。如果实际进程与计划进程的比较显示出项目落后于计划、超出预算或没有达到技术要求,就应该采取纠正措施,以使项目能恢复到正常轨道,或者更正计划的不合理之处。
因此,项目执行控制是对所有计划执行控制的过程。“项目执行控制”篇又分3章,主要内容包括集成计划执行控制、核心计划执行控制、辅助计划执行控制,如图1-24所示。
4.项目结束
项目管理的最后环节是项目的结束过程。项目的特征之一是它的一次性。项目结束期的主要工作是适时地做出项目终止的决策,确认项目实施的各项成果,进行项目的交接和清算等,同时对项目进行最后评审,并对项目进行总结。项目结束路线图如图1-25所示。
5.项目实践
为了配合课程的实践环节,本书要求学生针对“软件项目管理在线学习网站”(简称SPM)这个情景项目完成项目管理实践。将学生进行分组,每组5人,每组代表一个团队,并且每个团队有自己的名称,学生以团队形式完成这个情景项目的项目管理实践环节。
1.7 小结
本章讲述了软件项目管理的概念、特点、过程及其重要性。过程管理在软件项目管理中起重要作用,通过不断地优化和规范过程,可以帮助企业提高软件的生产能力。软件项目管理包括4个阶段:项目初始、项目计划、项目执行控制和项目结束。另外,本章阐述了项目管理知识体系(PMBOK),给出了软件项目管理的知识体系,同时介绍了敏捷项目管理概念。最后,本章给出了软件项目管理的路线图。
记住:对软件项目的理解越深刻,项目开发和管理的经验越多,就越能管理好项目。项目管理是渐进明细的过程,它是一门灵活性和实践性很强的学科,不可死记硬背,项目管理没有唯一的标准,只有最适合特定项目的管理方法。
1.8 练习题
一、填空题
1.敏捷模型包括 个核心价值,对应 个敏捷原则。
2.项目管理包括 、 、 、 、 5个过程组。
二、判断题
1.搬家属于项目。( )
2.项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的永久性的努力。( )
3.过程管理的目的是要让过程能够被共享、复用,并得到持续的改进。( )
4.项目具有临时性的特征。( )
5.日常运作存在大量的变更管理,而项目基本保持连贯性。( )
6.项目开发过程中可以无限制地使用资源。( )
7.相比传统开发的预测性过程,敏捷开发属于自适应过程。( )
三、选择题
1.下列选项中不是项目与日常运作的区别的是( )。
A.项目是以目标为导向的,日常运作是通过效率和有效性体现的
B.项目是通过项目经理及其团队工作完成的,而日常运作是职能式的线性管理
C.项目需要有专业知识的人来完成,而日常运作的完成无须特定专业知识
D.项目是一次性的,日常运作是重复进行的
2.以下都是日常运作和项目的共同之处,除了( )。
A.由人来做
B.受制于有限的资源
C.需要规划、执行和控制
D.都是重复性工作
3.下面选项中不是PMBOK的知识域的是( )。
A.招聘管理
B.质量管理
C.范围管理
D.风险管理
4.下列选项中属于项目的是( )。
A.上课
B.社区保安
C.野餐活动
D.每天的卫生保洁
5.下列选项中正确的是( )。
A.一个项目具有明确的目标而且周期不限
B.一个项目一旦确定就不会发生变更
C.每个项目都有自己的独特性
D.项目都是一次性地由项目经理独自完成
6.( )是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力。
A.过程
B.项目
C.项目群
D.组合
7.下面选项中不是《敏捷宣言》中的内容的是( )。
A.个体和交互胜过过程和工具
B.可以工作的软件胜过面面俱到的文档
C.敏捷开发过程是自适应的过程
D.响应变化胜过遵循计划
8.下列活动中不是项目的是( )。
A.野餐活动
B.集体婚礼
C.上课
D.开发操作系统
9.下列选项中不是项目特征的是( )。
A.项目具有明确的目标
B.项目具有限定的周期
C.项目可以重复进行
D.项目对资源成本具有约束性
四、问答题
1.项目管理知识体系(PMBOK)包括哪10个知识领域?
2.请简述项目管理的5个过程组及其关系。
3.项目的特征是什么?