Chapter1软件项目管理引言1.项目:是已计划的活动。作业:常规活动。探索:结果不定的活动。项目介于两者之间2.项目的特征:1)有明确的目标2)项目之间的活动具有相关性3)限定的周期4)有独特性5)资源成本的约束性6)项目的不确定性3.项目与常规活动的区别:1)项目是一次性的,常规活动是重复进行的2)项目是以目标为导向的,常规活动是通过效率和有效性体现的3)项目是通过项目经理及其团队工作完成的,而常规活动是职能式的线性管理4)项目存在大量的变更管理,而常规活动则基本保持连贯性的。4.软件项目的产品具有的特征:1)不可见性(–项目进展是不能立刻看到的)2)复杂性(–软件产品相对于其他工程制品更复杂)3)一致性(–需求与开发的一致)4)灵活性(–软件产品可以灵活地被改变)5.软件项目的分类:1)信息系统与嵌入式系统(a。信息系统是与组织的接口b。嵌入式系统是与机器的接口)2)目的与产品(a。目的驱动项目b。产品驱动项目)计算机操作系统主要是与组织的交互,所以它是嵌入式系统。6.产生一个新系统需要三个连续步骤:1)可行性研究(旨在判断一个预期项目是否值得开始——即存在有效的业务案例)2)判断一个预期的项目是否值得开始3)策划(为项目制定活动计划)4)项目实施(a。包括设计和实现b。设计和策划的区别)7.定义软件开发的典型顺序:1需求分析(需求引导的目的是发掘潜在的客户,他们的经理以及雇员对新系统在功能和性能上的需求)2构架设计(将需求映射到系统构件)3详细设计(将每个软件构件分解成可以单独进行编码和测试的软件单元)4编码和测试5集成6合格性测试7安装(将一个新系统进行工作的过程)8验收支持8.判断一个预期的项目是否值得开始:a。收集需求b。估计成本和收益c。本身可以作为一个项目来处理9.可行性的内容:a。开发成本不允许超越利润的价值b。系统特性不能降低到不能实现期望的利润c。交付日期不能拖延而导致不可接受的利润损失)10.项目管理包括:组织职责,质量管理,配置管理11.需求:功能需求:项目的最终产品主要用于提供功能需求质量需求:最终产品的质量资源需求:最终产品的资源耗费必须与业务案例相一致12.管理包括一下活动:计划:决定要做什么组织:进行安排人员:选择合适的人员指导:作出指示监督:检查进展控制:采取行动以清除项目的障碍革新:提出新的解决方案代表:与用户、开发者、供应商等沟通13.好的项目目的描述:详细,可度量,可达到,相关性,时间限制14.项目相关人员:项目组内部人员,在同一组织内但在该项目组外的人员或完全是在该组织以外的人员。15.项目与常规活动的区别主要在于项目的结果更具不一定性,项目成功的关键在于有明确目的,这需要公认的项目主管当局,为了让目的更有效,必须有测试目的是否已经满足的实用方法,无歧义的沟通非常重要!16.项目成功的关键因素是:要有明确的目的,然而,不同的项目相关人员可能有不同的目的,这表明需要一个普遍认可的项目主管当局。Chapter2步进式方法:项目的概括1.步进式方法只用在项目的策划阶段,不用于项目的监督和控制阶段。2.项目策划的主要原则是先做概要策划,然后在要执行活动时细化。3.步进式方法的主要步骤:选择项目,标识项目的范围和目的,标识项目的基础设施,分析项目的特征,标识项目的产品和活动,估计每个活动的工作量,标识活动的风险,分配资源,评审/发布计划,执行计划,进行较低层次的策划。4.项目经理应该知道有关项目的项目策划和控制标准,5.区分项目是产品驱动还是目的驱动。尽管目的总是存在并且必须考虑,但更多采用的是产品驱动。6.方法学:是指用在项目中的一组方法、7.产品是活动的结果8.活动网络图:为了从其他产品产生一个产品需要一个或多个活动来执行转换,标识了这些活动,就可创建一个活动网络图,表示必须执行的任务以及执行这些任务的次序。活动网络图总的活动可以标注上它们的耗费时间,这样就可以计算出该项目的整个工期。9.耗费时间和工作量之间的区别:工作量是指需要做的工作的总量。耗费时间是指从任务开始到任务结束需要的时间。单独的活动工作量估计用一个整体的有底向上的估计。10.策划项目包括:确立项目的目的,分析项目的特点,确立组成一个合适的组织及其标准、方法和工具集的基础设施,标识项目的产品以及需要生成这些产品的活动,把资源分配给活动,确立质量控制。Chapter3项目管理群与项目评价1.项目群:为了获得利益,用协同方式管理的一组项目,而这些项目不能进行独立的管理。2.项目群存在的方式:战略项目群,商业周期项目群,基础设施项目群,研究和开发项目群,创新的伙伴关系。3.收益管理:收益管理对案例没有实现预期收益进行补救的方法,它包括对业务变更所带来的预期收益的标识、优化和跟踪,以确保确实实现了收益。4.要确保实现了收益必须:定义从项目群中能够获得的预期收益,分析成本和收益之间的平衡关系,计划如何实现和度量收益,为成功的实现收益分配职责,监督收益的实现。5.收益有很多类型包括:强制性服从,服务质量,生产率,更有动力的劳动力,内部管理收益,风险缓解,经济,收入提高/增加,战略准备。6.收益可以:量化和估计:即实现了直接的财务收益量化但不能估价标识但不容易量化。7.评估项目价值的时候要考虑三个方面的因素:技术可行性,成本和收益平衡以及项目相关风险的等级。8.评价任何项目的经济效益的标准方法是进行成本效益分析9.成本分析包括:1)标识和估计所有执行该项目和运行该系统成本和效益。2)按公共的单位表示这些成本和效益。10.按项目生命周期总的出现阶段对成本进行分类:开发成本,安装成本,运行成本。11.比较项目的常见方法:净利润:项目的净利润是在项目的整个生命周期中总成本和总收入之差。简单的净利润不考虑现金流时限回收期:是达到收支平衡或偿还初始投入所花的时间。优点:计算简单,而且不会因小的预测误差而受影响。缺点:作为一种选择技术,它忽略了项目的总的可能的收益;事实上,它完全忽略了任何收益,只要项目取得收支平衡就可以投资回报率:提供了一种方法来比较净收益率与需要的投入。优点:简单容易的方法来(ROI)计算资金回收率,不不考虑现金流的时限。回报率与当前利润是相当吸引人的。缺点:它u考虑现金流或以复利计算利息的时限,因此,它很可能潜在的误导。ROI=(平均年利润/总投资)*100.净现值:是一种项目评价技术,它考虑了项目的收益率和要产生的现金流的时限。它是(NPV)通过从未来的现金流中减去一个百分比后得出的,这个百分比称之为贴现率。现值=第t年的值/(1+r)tr是贴现率,t是现金流在未来出现的年数。缺点:尽管它可以用于比较项目,但不可能从其他投资中得到的收益或借贷资本的成本进行直接比较内部回报率:作为可直接与利润比较的百分比回报,试图提供一种利润度量。IRR是一(IRR)个方便有用的项目价值的度量,它是一个百分比数,可以用来和其他项目的回报率或其他引用的利率进行直接比较12.项目相对有风险的情况下,常见的做法是使用更高的贴现率来计算NPV.Chapter4选择合适的项目方法1.生命周期需要哪些要素:1)控制系统,2)信息系统,3)通用工具,4)专用技术,5)硬件环境,6)安全性关键的系统,7)不准确的需求2.项目周期模型中,要求一次正确的是:瀑布式软件模型;最适用于需求不明确的情况是:软件原型开发;最适用于需求复杂的情况是:增量式开发在不确定性比较高的情况下,最好使用进化式方法,不确定性的一个例子是用户需求没有得到清楚的定义在需求相对明确但相当复杂的情况下,可能最好使用增量式方法。采用进化式或增量式方法,在最终期限到达时,即使不能交付当初承诺的所有功能,至少也能交付一些功能。3.选择技术将影响:1)开发人员的培训需求。2)要招聘的员工类型。3)开发环境。4)系统维护安排4.结构化方法由步骤集和在产生系统产品时要应用的规则集组成5.瀑布型模型:这是经典的系统开发模型,这个模型也被成为一次完成或者一次通过模型。当恰当的执行时,瀑布型能更准确的预测项目的完成时间。对于大型项目,要避免先前认为已经完成的任务的返工,如果重新打开已完成的活动,就会严重影响承诺的完成日期。6.V过程模型:这是瀑布型的细化,强调了与创建项目产品的活动匹配的必要的确认活动。它每一步都有匹配的确认活动,在发现缺陷的情况下,就要退回到相应的开发阶段,并在后续步骤中进行返工。7.螺旋模型:对项目的每个阶段考虑的越详细,项目取得的成功的概率就越大。这可描绘成一个循环或者螺旋。其中待实现的系统在每次螺旋时都得到了更详细的考两次。每次螺旋都一下一个迭代开始前的评价结束。8.软件原型开发:原型是已规划的系统的一个或多个方面的工作模型。用快速而又经济的方法来构建和测试原型以检验各种设想。原型可以分为:抛弃式原型或进化型。9.抛弃型原型:只用于检验某些想法,然后在真正开始开发可运行的系统时将其抛弃。原型可使用不同的软件环境来开发应用程序构造工具,而不用像开发最终系统那样使用过程编程语言,甚至可以在不同的硬件平台上开发。10.进化型原型:开发和修改原型直到它最终成为可运行的系统。在这种情况下必须仔细考虑用于开发软件的标准。11.采用原型开发的理由:在实践中学习,改进沟通,改进用户参与,验证规格说明的一致性和完整性,减少文档的需要,降低了维护的成本,特征约束,产生期望的结果,用户可能曲解原型的作用,可能缺乏项目标准,额外的费用,机器效率,与开发人员密切接近。12.原型开发通常只是模仿目标应用程序的某些方面:实验模型,模仿交互,部分工作模型(——纵向的,有些但不是所有的特征要彻底进行原型化。——横向的,所有的特征都要原型化,但不详细进行。13.哪些要进行原型化:人机界面(原型往往局限在操作人员交互操作的特点上)系统的功能性(这里系统内部运行的准确方式是不知道的)14.增量式交付:这种方法包括将应用程序分解为小的构件,然后按顺序实现和交付构件。需求可随时改变。优点:1)从早期增量得到的反馈来改进后面的阶段2)由于构件设计与其实现之间安定跨度较短,因此减少了需求变更的可能性。3)与用常规方法相比,用户在早期就能得到效益4)一些有用的构件的早期交付改进了现金流,因为早期就能得到一些投资回报5)较小型的子项目更易于控制和管理6)镀金(即对不需要的和事实上不使用的特征的要求)是不太重要的7)如果突然出现更多紧急的工作,那么项目可以临时放弃。8)开发人员增加了工作的成就感,定期的看到自己的劳动果实缺点:1)软件变更量,也就是说后面的增量可能要求修改早期的增量2)程序员在大型系统上工作,可能要比在一系列小型项目上工作有更高的效率3)对于驱动需求来讲,“概念上的完整性有时会遭到破坏”,因为除了可能隐含含糊的需求外,几乎没有什么动机来处理可伸缩性,可扩充性,可移植性或可重用性。还认为,大量分散的功能可能会导致没有公共的基础设施。15.增量式交付计划。每个要交付给用户的增量的特征和次序必须在开始时就策划好。增量计划的基本组成是:系统目的。开放的技术计划和增量式计划增量排序:有些步骤因物理依赖性而必须先做,而其他步骤可以是任何次序,可以使用价值成本比来建立增量开发的次序16.极限编程:在某些方面XP,可以看成是“超级程序员”描述他们对编码世界的想法。它属于一组类似的方法学,包括JimHighsmith的适应性软件开发和AlistairCockburn的水晶灯方法,这些方法统称为敏捷方法。17.交流问题的,项目规模越大,这个问题越严重,由于项目的完成时间很长,必须对项目初级阶段所产生的信息进行记录,以便于后面的阶段可以获得,这很容易导致信息的不完整或者过期,解决这个问题的一种方案是将交流正式化,结构化,另外一种方法是减少交流信息和信息保留的时间。18.可能极限的编程最根本的原则是结对编程,代码由一对开发者在一个工作站上开发,一个实际的录入代码,另一个观察和提出建议。结对编程提高了代码产量,并且这些代码有很好的结构,易于理解且相应的错误较少19.像XP这样的方法强调的是沟通以及排除影响开发生产率的人为障碍的重