软件工程——第二部分管理软件项目第二部分管理软件项目这一部分主要考虑计划、组织、监控和控制软件项目所需要的管理技术。将获得下列问题的回答:*在一个软件项目中为什么必须管理人员、问题和过程?*什么是软件度量?如何使用它们管理软件项目和软件过程?*一个软件项目组如何对工作量、成本和项目时间进行可靠的估算?*采用什么技术去正式地评估影响项目成功的风险?第二部分管理软件项目*一个软件项目管理者如何选择软件工程工作任务集?*如何创建一个项目进度计划?*如何定义质量使其能够被控制?*什么是软件质量保证?*为什么正式的技术复审那么重要?*在计算机软件开发之中及它被交付给客户之后如何进行变化管理?第三章项目管理:概念要点浏览概念:在建造基于计算机的系统和产品时“管理”仍然是一个非常必要的活动。项目管理涉及人员、过程和当软件从初始的概念演化为可运行的实现的过程中发生的事件的计划、监控和控制。人员:每个人均在某种范围内“管理”,但是,管理活动的范围根据参与管理的人员而变化。软件工程师管理他的日常活动,计划、监控和控制技术任务。项目管理者计划、监控、和控制软件工程师队伍的工作。高级管理者协调业务和软件专业人员间的接口。第三章项目管理:概念为什么重要:建造计算机软件是一项复杂的任务,特别当它涉及很多人员在一个相当长的时期内共同工作时。步骤:理解4P――人员(People)、产品(Product)、过程(Process)和项目(Project)。人员必须被组织以有效地完成软件工作;必须和客户通信以了解产品范围和需求;适合于人员和产品的过程必须被选择;项目必须被通过估算工作量和完成工作任务的日程而计划:定义工作产品、建立质量检查点、以及建立监控和控制该计划所定义的工作的机制。第三章项目管理:概念产品:当管理活动开始,必须建立项目计划。该计划定义将被进行的过程和任务,将完成工作的人员,以及评估风险、控制变化和评估质量的机制。保障措施:在你按时并按预算交付高质量产品之前,你永远不能完全肯定项目计划是正确的。然而,项目管理者正确地完成工作,如果他鼓励软件人员一起工作以形成一支有效的队伍,并将他们的注意力聚焦到客户需要和产品质量上。第三章项目管理:概念MeilerPage-Jones给出了一段被许多软件工程顾问响应的陈述:我拜访了很多商业公司,好的和不好的,我又观察了很多数据处理的管理者,好的和不好的。常常地,我恐惧地看到这些管理者徒劳地与恶梦般的项目斗争,在根本不可能完成的最后期限下苦苦挣扎,或是交付了使其用户极为不满的系统,而后又继续花费大量的维护时间。Page-Jones所描述的正是源于一系列管理和技术问题而产生的症状。一致的问题:项目管理太弱。将探讨进行有效的软件项目管理的关键概念。本章主要给出了基本的软件项目管理的概念和原则。第4章阐述了过程和项目度量,这是进行有效的管理决策的基础。第5章讨论了用于估算成本和资源需求并建立有效的项目计划的技术。第6章给出了进行有效的风险监控、缓解和管理的管理活动。第7章讨论了定义项目任务并建立一个可操作的项目进度计划所需的活动。第8章和第9章探讨了在项目开发过程中保证质量及在应用的整个生命期中控制变化所需的技术。3.1管理的范围有效的项目管理集中于四个P上:人员(people)、产品(product)、过程(process)和项目(project)。其顺序不是任意的。任何管理者如果忘记了软件工程是人的智力密集的劳动,他就永远不可能在项目管理上得到成功;任何管理者如果在项目开发早期没有鼓励全面的客户通信,他有可能为错误的问题建造一个不错的解决方案。对过程不在意的管理者可能冒把有效的技术方法和工具插入到真空中的风险。没有一个可靠的项目计划就开始工作的管理者将危及产品的成功。3.1管理的范围3.1.1人员“人的因素”是如此重要,以致于软件工程研究所专门开发了一个人员管理能力成熟度模型(PM-CMM),旨在“增强软件组织承担日益复杂的应用的能力,通过帮助吸引、培养、鼓励、部署和留住改善其软件开发能力所需的人才”3.1.1人员人员管理成熟度模型为软件人员定义了以下的关键实践区域:招募、选择、业绩管理、培训、报酬、业发展、组织和工作设计、以及团队精神/企业文化培养。在人员管理上达到较高成熟度的组织更有可能实现有效的软件工程实践。PM-CMM与软件能力成熟度模型(第2章)相配合,后者指导组织创建一个成熟的软件过程。3.1.2产品(1)在进行项目计划之前,应该首先建立产品目的和范围,考虑可选的解决方案,标识技术和管理的约束。没有这些信息,就不可能进行合理的(准确的)成本估算;有效的风险评估;适当的项目任务划分;或是可管理的项目进度安排,其中给出了意义明确的项目进展的标志。3.1.2产品(2)软件开发者和客户必须一起定义产品的目的和范围。在很多情况下,这项活动是作为系统工程或业务过程工程的一部分开始的,持续到作为软件需求分析的第一步。目的是标识出该产品的总体目标(从客户的角度),而不考虑这些目标如何实现。范围标识出与产品相关的主要数据、功能和行为,更为重要的是,它以量化的方式约束了这些特性。3.1.2产品(3)一旦了解了产品的目的和范围,就要开始考虑备选的解决方案了。虽然这一步并不讨论细节,但它使得管理者和实践者可以选择一条“最好的”途径,该选择是根据产品交付的期限、预算的限制、可用的人员、技术接口及各种其它因素所形成的约束。3.1.3过程软件过程提供了一个框架,在该框架下可以建立一个软件开发的全面计划。少量的框架活动可应用于所有软件项目,不考虑其规模和复杂性。若干不同的任务集合――每一个集合都由任务、里程碑、工作产品以及质量保证点组成――使得框架活动能被修改以适应于不同软件项目的特征和项目组的需求。最后是庇护性活动――如软件质量保证、软件配置管理、和测度――它们覆盖了过程模型。庇护性活动独立于任何一个框架活动,且贯穿于整个过程。3.1.4项目进行计划好的和控制的软件项目的一个主要理由是――这是唯一知道的管理复杂性的方式。1998年,产业数据表明26%的软件项目彻底失败,而46%的项目经历了成本和进度超出预算。为了避免项目失败,软件项目的管理者和建造产品的工程师必须避免一些常见的警告信号,了解关键的导致好的项目管理的成功因素,并开发计划、监控和控制项目的常识性方法。3.2人员(1)在IEEE发表的一项研究中,三个大型的技术公司的主管工程的副总裁被问到一个成功软件项目中最重要的因素是什么。他们的回答如下:第一位:我想如果必须在我们的环境中挑出一项最重要的因素,我必须承认它不是我们所用的工具,而是人。3.2人员(2)第二位:一个项目成功的最重要的因素是有聪明的人......我想不出其它的因素......你为一个项目所做的最重要的事情是选择人员......软件开发组织的成功与其招募优秀人才的能力密切相关。第三位:我在管理上唯一的准则是保证我有优秀的人员――真正优秀的人员――同时我也培养优秀的人员――我提供培养优秀人员的良好环境。3.2人员(3)这是对软件工程过程中人的重要性的强有力的证明。不过,我们所有的人,从高级工程副总裁到低级的开发人员,常常认为人员是不成问题的。管理者表态说人员是主要的,但他们的行为有时与说话不符。本节我们讨论参加软件过程的人员,以及如何组织他们实现有效的软件工程的方式。3.2.1项目参与者参与软件过程(及每一个软件项目)的人员可以分为以下五类:1.高级管理者:负责定义业务问题,这些问题往往对项目产生很大影响。2.项目(技术)管理者:必须计划、激励、组织和控制软件开发人员。3.开发人员:负责开发一个产品或应用所需的专门技术。4.客户:负责说明待开发软件的需求。3.2.1项目参与者5.最终用户:一旦软件发布成为产品,最终用户是直接与软件进行交互的人。每一个软件项目都有上述的人员参与。为了达到有效,项目组的组织必须最大限度地发挥每个人的技术和能力。这是项目负责人的任务。3.2.2项目负责人(1)项目管理是集中于人的活动,因此,胜任的开发人员常常是拙劣的项目负责人。他们完全不具备管理人应有的技能。如Edgemon所说:“很不幸而且是很经常地,似乎人们碰巧落在项目管理者的位置上,也就意外地成为了项目管理者”。在一本关于技术领导能力的优秀论著中,JerryWeinberg提出了领导能力的MOI模型:3.2.2项目负责人(2)激励(Motivation):鼓励技术人员发挥其最大能力的一种能力。组织(Organization):建模已有的过程的一种能力,以使得最初的概念能够转换成最终的产品。想法(Ideas)或创新(Innovation):鼓励人们去创造并感到有创造性的一种能力,即使他们其实必须在为特定软件产品或应用建立的约束下进行工作。3.2.2项目负责人(3)Weinberg提出:成功的项目负责人应采用一种解决问题的管理风格,即,软件项目经理应该集中于理解待解决的问题,管理新想法的交流,同时,让项目组的每一个人知道质量很重要,不能妥协。关于一个有效的项目经理应该具有什么特点的另一个观点则强调了以下四个关键品质:3.2.2项目负责人(4)解决问题:一个有效的软件项目经理应该能够准确地诊断出技术的和管理的问题;系统地计划解决方案;适当地激励其它开发人员实现解决方案;把从以前的项目中学到的经验应用到新的环境下;如果最初的解决方案没有结果,能够灵活地改变方向。管理者的特性:一个好的项目经理必须掌管整个项目。他在必要时必须有信心进行控制,必须保证让优秀的技术人员能够按照他们的本性行事。3.2.2项目负责人(5)成就:为了提高项目组的生产率,项目经理必须奖励具有主动性和作出成绩的人。并通过自己的行为表明控制下的冒险不会受到惩罚。影响和队伍建设:一个有效的项目经理必须能够“读懂”人;他必须能够理解语言的和非语言的信号,并对发出这些信号的人的要求作出反应。项目经理必须在高压力的环境下保持可控状态。3.2.3软件项目组(1)软件开发的人员组织结构几乎与开发软件的组织一样多。不管怎么说,组织结构不能轻易改变。关心组织改变所产生的实际的及政策上的后果并不是软件项目管理者的责任范围。但是,在一个新的软件项目中直接涉及到的人员的组织则是项目管理者的权限。QUOTE:并非每个小组都是开发队伍,并非每个开发队伍都是有效的。3.2.3软件项目组(2)下面给出若干可选方案,为一个项目分配人力资源,该项目需要n个人工作k年:1.n个人被分配到m个不同的功能任务,相对而言几乎没有合作的情况发生;协调是软件管理者的责任,而他可能同时还有六个其它项目要管。2.n个人被分配到m个不同的功能任务(mn),这样要建立非正式的“小组”;需指定专门的小组负责人;小组之间的协调由软件管理者负责。3.2.3软件项目组(3)3.n个人被分成t个小组;每一个小组分配一个或多个功能任务;每一个小组有一个特定的结构,该结构是为同一个项目的所有小组定义的;协调由小组和软件项目管理者共同控制。虽然对于上述的每一种方法都可以找到其优点和缺点,但越来越多的证据表明正式的小组组织(第3种方法)是生产率最高的。3.2.3软件项目组(4)“最好的”小组结构是取决于组织的管理风格、组里的人员数目及他们的技术水平、和整个问题的困难程度。Mantei提出了三种一般的小组组织方式:民主分权式(DemocraticDecentralized,DD):这种软件工程小组没有固定的负责人。“任务协调者是短期指定的,之后就由其它协调不同任务的人取代”。问题和解决方法的确定是由小组讨论决策的。小组成员间的通信是水平的。3.2.3软件项目组(5)控制分权式(ControlledDecentralized,CD):这种软件工程小组有一个固定的负责人,他协调特定的任务及负责子任务的二级负责人。问题解决仍是一个群体活动,但解决方案的