高级软件工程(2)软件项目的成功和失败软件开发的困惑为什么我们不能开发出高质量的软件?为什么人类无法定义它、解释它,深刻地了解它?为什么一些天才的科学家穷其一生的精力也不能把这些迷惑归纳成一种科学工程学科或行业标准?软件工程方法不堪一击,人们无法使用它们。软件项目失败原因客户需求不确定最终产品的设计和特色只有在过程中才能变得清晰,而不是开始时很难制定准确的计划估计不够,低估时间和成本来自营销、客户和管理者的压力沟通失败是项目失败的最大的威胁软件过程不可见软件开发的探索技术CASE,UMLOO过程控制ISO9001,ISO9000-3,ISO15504,ISO12207CMM,TickIT以上措施并没有真正解决软件危机“质量是制造出来的,不是检验出来”,在制造业适用,在软件行业作用并不大(软件过程不可见)项目失败率还是很高软件项目失败深层次原因对软件的误解是问题的根源。现有的方法是由那些有良好愿望但忘记了软件中的“软”的那些聪明人所创建的。他们假定开发软件就象造桥。方法不正确。没有人打算失败,具有讽刺意味的是为使失败最小化而创建的方法是失败的。开发人员士气不高,没有创造性。管理人员、开发人员能力不够。只重过程,不重人。没有良好的沟通。项目管理概述软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对成本、人员、进度、质量、风险等进行分析和管理的活动。软件项目管理的根本目的是为了让软件项目,尤其是大型项目的整个软件生命周期(从分析、设计、编码到测试、维护全过程)都能在管理者的控制之下,以预定成本,按期、按质的完成软件,然后交付用户使用。这种管理在技术工作开始之前就应开始,在软件从概念到实现的过程中继续进行,当软件工程过程最后结束时才终止。项目管理分九个知识领域,分别是成本管理、质量管理、时间管理、范围管理、人力资源管理、沟通管理、风险管理、采购管理和整体管理。其中时间,质量和成本管理构成了三角形项目管理包括5种基本活动启动:相关人员提出对项目的要求,项目开始。计划:计划涉及详细规定出要取得的结果;产生这些结果所需要的活动和任务;决定时间表和估计所需的资源,例如人力和资金。组织:组织规定了项目的组织和角色、责任的定义。在计划活动中,角色被映射成确定的工作。控制:控制确定正在进行的活动何时偏离了计划。收尾:终止是结束项目。项目生命期和阶段划分项目可以分成几个阶段项目概念:关于项目的想法开始出现,通常伴随着成本效益分析和技术可行性研究。项目定义:包括以下活动问题定义:客户和项目经理按照功能,限制条件和交付产品定义系统的规模。客户和项目经理也在协议标准和目标日期上达成一致。初始的软件项目管理计划(SPMP):项目经理提供对项目总的看法、项目结果的描述、工作分解结构、角色和责任、项目时间表、所需资源的预算和怎样定义和处理风险的描述。初始的软件体系结构:它关注于软件体系结构,特别是把系统分解成子系统。项目协议定义:在项目协议文档中,用户和项目经理对作为基线的系统规模和交付日期正式达成一致。项目开始:项目经理设置了项目的基础设施,雇用参与者,把他们组成团队,并总结项目。项目开始包括以下活动基础设施设立:项目经理必需为项目的基础设施制定需求。这些需求描述了项目参与者之间的交流渠道,比如公告牌、网站和会议管理程序等。技能定义:项目经理定义开发者的技能和兴趣,并在技能矩阵中记录它。团队集合:项目经理分配团队参与者,定义团队功能且选择团队领导。项目经理也为团队成员定义所需的额外培训和课程。最后,项目经理为团队分配工作包。项目总结:项目经理,团队领导和客户正式开始启动项目。项目稳定状态:团队领导要负责跟踪团队状态和在团队会议上提出问题。包括以下活动项目规模定义控制:团队领导和项目经理每周将项目状况和SPMP中计划的时间表进行比较。团队领导负责收集状况信息和向项目经理报告情况。风险管理:项目经理和团队领导定义、分析、设定风险的优先级,并准备对意外事故的计划。项目重计划:当项目偏离了时间表或发生意外事故,项目经理需要修改时间表,并且重新分配资源来。项目终止:提交项目结果并收集项目历史。主要活动有交付:由客户验收测试和系统安装2个子活动组成。客户验收测试:软件系统由客户按照项目协议中制定的验收准则进行评价。安装:系统被配置在目标环境中,并且交付文档。安装可能包括用户培训和实施阶段。事后分析:项目经理和团队领导收集项目历史资料以获得经验。定义工作分解结构项目计划的基本假设是项目结果不能在一个大型活动中被完成,我们必须用各个击破的方法来把工作分解成更小的、更容易做的小块。因此,在项目计划中一个主要的任务是把整个工作包分解成更小的任务。这包括2件事:定义合适的任务和定义任务间的依赖关系。任务和活动任务是一项已经定义得很好的工作,该工作可分配给一个项目参与者或分配给一个团队。任务是管理有关项目工作的最小的单元。任务包括对任务和持续时间的描述,还包括分配给所扮演角色的参与者。任务名分配的角色描述任务输入任务输出数据库子系统需求的引出系统设计师从子系统团队引出关于所需存储量的需求,定义永久对象团队联络数据库API,永久对象分析模型数据库子系统设计子系统设计设计数据库子系统,推荐商业产品子系统API数据库子系统设计数据库子系统实现实现者实现数据库子系统子系统实现数据库子系统编码数据库子系统检查实现者处理数据库子系统的编码检查子系统源代码发现的缺陷表数据库子系统测试计划测试者为数据库子系统建立测试套件子系统源代码测试和测试计划数据库子系统测试测试者对数据库子系统执行测试套件子系统测试计划测试结果,缺陷表工作产品,工作包和角色工作包描述了要生产的工作产品,要完成工作所需要的资源,所希望的持续时间,输入之间的相互依赖,也详细说明了验收规则和相关的个体或组织的单元的名字。工作包是重要的管理产物,我们把它们分配给参与者去做。在任务定义之后可以定义工作包。任何交付给用户的工作产品叫交付品,例如用户手册。工作分解结构在一个项目中,全体任务的层次描述叫工作分解结构(WBS)。工作分解结构是一个要做工作的非常简单的模型。注意:工作分解结构不表示活动的顺序。项目范围阶段工作单元任务简单的ATM的功能工作分解结构的例子用例工作分解结构鉴别1实现鉴别用例1.1开发用户界面表(登陆,改变PIN)1.2实现服务器的鉴别协议开发内部帐户设立1.3开发内部帐户设立提款2开发提款用例2.1开发用户界面表(选择帐户,设定金额)2.2实现和服务器的通信2.3开发核对提款的商业逻辑2.4开发现金出口的界面存入支票3开发存入支票用例3.1开发用户界面表(声明支票,插入支票)3.2实现和服务器的通信3.3开发记录存入的商业逻辑3.4开发现标签打印机的界面进度安排软件开发项目的进度安排有两种方式:(1)系统最终交付日期已经确定,软件开发部门必须在规定期限内完成;(2)系统最终交付日期只确定了大致的年限,最後交付日期由软件开发部门确定。进度安排的方法可以把用于一般开发项目的进度安排的技术和工具应用于软件项目。为监控软件项目的进度计划和工作的实际进展情况,为表现各项任务之间进度的相互依赖关系,需要采用图示的方法。甘特图也叫做线条图或横道图。它是以横线来表示每项活动的起止时间。甘特图的优点是简单、明了、直观,易于编制,因此到目前为止仍然是小型项目中常用的工具。即使在大型工程项目中,它也是高级管理层了解全局、基层安排进度时有用的工具。在甘特图上,可以看出各项活动的开始和终了时间。在绘制各项活动的起止时间时,也考虑它们的先后顺序。但各项活动上间的关系却没有表示出来,同时也没有指出影响项目寿命周期的关键所在。因此,对于复杂的项目来说,甘特图就显得不足以适应。甘特图是做项目进度计划方法的重要方法,其他方法有:关键日期表:这是最简单的一种进度计划表,它只列出一些关键活动和进行的日期。关键路线法计划评审技术(ProgramEvaluationandReviewTechnique,简称PERT)。Gantt图能很形象地描绘任务分解情况,以及每个子任务(作业)的开始时间和结束时间,因此是进度计划和进度管理的有力工具。它具有直观简明和容易掌握、容易绘制的优点。Gantt图的3个主要缺点:(1)不能显式地描绘各项作业彼此间的依赖关系;(2)进度计划的关键部分不明确,难于判定哪些部分应当是主攻和主控的对象;(3)计划中有潜力的部分及潜力的大小不明确,往往造成潜力的浪费。任务通过暂时的依赖关系联系起来。例如建屋顶的任务不能在建墙任务结束前开始。任务及其依赖关系的集合叫任务模型或者网络图。技能矩阵技能矩阵是在项目中关于要完成任务的人的技能、知识和兴趣的一张简单表。技能矩阵的一行表示来自工作分解结构的工作单元——任务、活动和项目功能。一列表示项目参与者。矩阵中的一项为任务,定义了特定参与者的技能和知识层次。我们把3种项目区分开:主要技能、次要技能和兴趣。主要技能使一个人能胜任领导一个工作单元。次要技能使一个人能参与任务。兴趣表示在任务中一个人感兴趣但不具备该技能。2.2.6组织组织由组织单元及其交互组成。最小组织单元是一个参与者(也叫个人或成员)。一组参与者能组成部门、处或小组。呈现组织结构组织的表现及其信息结构通常叫组织图。软件项目管理计划软件项目管理计划(SPMP)中的文件在项目总结大会之前创建,并且当任务完成和步骤更新的时候被更新,这种更新将贯穿整个项目。SPMP的使用者包括管理者和开发者。SPMP有五部分。1.介绍1.1项目概况1.2项目交付品1.3文档的演化1.4参考书1.5定义和缩写表2.项目组织2.1过程模型2.2组织结构2.3组织边界和接口2.4项目责任3.管理过程3.1管理目标和优先级3.2假设,依赖和限制3.3风险管理3.4监督和控制机制4.技术过程4.1方法,工具和技术4.2软件文档4.3项目支持功能5.工作元素,日程表和预算软件项目管理计划(SPMP)2.3项目管理活动在项目定义期间,项目经理的主要活动是定义组织结构和定义工作产品、任务、时间表和角色。团队领导在项目定义阶段的最后时刻参加项目,他们的主要工作是在稳定状态下监督和管理团队。2.3.1计划项目定义问题、确定初始任务模型和组织结构、评估所需的资源,如人员和资金。这一阶段要完成以下的工作:1.问题陈述:记述了当前情况、要支持的功能和系统要使用的环境,也要定义客户希望的产品、交付日期和一套验收标准,可能也指定了开发环境中的限制,例如要用的编程语言。问题陈述是由项目经理和客户经过迭代活动开发的。2.顶层设计:顶层设计描述了系统的软件体系结构,应由软件结构师完成。软件结构师定义主要的子系统及其服务,但还不定义子系统的界面。3.软件项目管理计划(SPMP):描述了项目的所有管理方面,特别是工作分解结构、日程表、组织、工作包和预算。为一个项目定义工作分解结构(WBS),有不同的方法。最常用的方法是基于软件过程的功能分解。2.3.2组织项目雇用参与者、确定技能、为参与者分配角色和责任并组织指导与项目总结有关的会议。1.设立交流设施2.定义技能:软件工程开发项目需要具有应用领域技能、交流技巧、技术能力、质量能力和管理能力。项目经理要用技能矩阵,为每个任务按合适的技能关系定义人员。3.分配管理角色:分配团队领导等管理角色。团队领导要有交流的能力,要作为更高层管理者和开发者之间的联络者有上通下达以取得协调的能力;有时团队领导必须具有命令开发者完成紧迫任务的决定权。4.分配技术角色:技术角色最好和管理角色分开。5.处理技能缺乏:当技能不足时,项目经理应该做出培训计划安排。这包括专门培训和工作中展开的培训。6.选择团队规模三个成员。四个成员。五个或六个成员。这是规模理想的软件开发团队。七个成员。八个和更