一次演讲,和学弟学妹们分享软件开发中有关项目管理的知识。末尾有 PPT/GoogleDoc。
简单的自我介绍
略(可参考 PPT)
什么是项目
要弄清楚什么是「项目管理」,首先得明白什么是一个「项目」。
在 PMBOK(Project Management Body of Knowledge,项目管理知识体系指南)中,将「项目」定义为:项目是为创造独特的产品、服务或成果而进行的临时性工作。 这里是一个广义的项目概念,大到国家项目,小到个人 demo。
根据这个定义,我们可以了解到关于一个项目的一些基础特征,比如,项目的「临时性」指的是项目有明确的起点和终点,这个项目是唯一存在的,项目是创造产品、服务或成果的,项目带来改变的同时也消耗资源。
什么是项目管理
根据上文对于「项目」的定义,我们便能够回答什么是「项目管理」。
项目管理可以理解为为了实施一个特定目标,所实施的一系列针对项目要素的管理过程,包括过程、手段以及技术等。项目管理的目标是为了能够预测性的通过对时间、预算以及一定质量的控制去交付成果,所有这些和项目相关的组成构成了项目管理的范围。
“ 项目管理其实就是在限定的时间内,花费限定的成本,保证质量的完成规定范围的任务。
项目管理
项目管理三角形
「项目管理三角形」向我们展示了两面性。首先,项目管理必须通过对项目时间管理、质量层面的管理以及预算的控制来进行。然而,如果发生了一个影响进程的情况,使得我们无法再按照预计完成项目,那么,我们必须要对时间表、预算以及质量情况进行妥协。如果我们没有办法对这三项进行妥协,那我们唯一的选择就是对项目管理的范围进行妥协。
交付复杂的项目必须要确保所有需要交付的任务是正确的。这也是为什么「预测」这个词如此重要。我们尝试着去管理我们的项目交付在一个可以预测并且能够实现的范围内。当事情向无法控制的方向发展,我们只有对项目范围进行调整,事实上这是常常发生的。
作为一个杰出的项目经理,你必须通过一系列项目管理的技能、人员管理的技能以及商业敏锐度,预测性地推进项目进行。项目推进顺利与否常常取决于项目管理的复杂程度、项目管理方法论以及对项目团队的管理。
项目管理的四个步骤
- 确保正确理解项目目标
- 计划一个项目的时候,恰当把握项目需要的时间以及成本
- 正确管理项目以确保项目符合它的目标(成果、预算、时间表、质量)
- 一旦项目交付的成果符合所要求的质量,即可完成项目。 这四个基本步骤,也说明了项目管理的生命周期
项目的生命周期
角色
- OD(运营)
算项目的甲方,发起需求,编写运营、培训计划,上线后的跟踪,规划业务的未来方向
提交一份 MRD 讲述需求背景,可行性分析功能的诉求,说明『为什么要做』获得项目立项
- PD(产品经理)
PD 在阿里是个专门的职位,负责产品的形态及未来发展。负责产出 PRD(产品需求文档),转化 MRD 中的商业诉求为业务需求,详细阐述产品功能(交互流程,性能要求以及未来的规划)
- UED/UID(视觉、交互设计师)
交互设计师从人机交互的角度设计以人为本的系统,视觉设计师负责配色及样式,让使用者在使用产品时更加舒适。有时候这两个角色是同一个人完成,主要负责可见功能的设计,文案设计等。
- PM(项目经理)
项目管理的监督者和实施者。需要具备技术远见和权威。负责资源调配,进度跟踪以及风险控制。pm 很多时候是有责无权的,但是pm需要具备很多能力来达到管理的目的。比如:积累影响力,以技服人,画饼激励成员,通过影响领导,做出有利于管理的决策。pm来确定能不能做,如何做,合适完成
- RD/SD(研发工程师)
负责实际项目的开发
- QA(测试工程师)
测试用例编写,技术测试(接口测试,集成测试),业务测试,安全测试,性能测试
项目需求文档
- BRD 商业需求文档 Business Requirement Document
商业模式、盈利模式、资源投入、市场优势
- MRD 市场需求文档 Market Requirement Document
产品模式、业务模式、运营模式、市场模式等,明确客户及市场方向
- PRD 产品需求文档 Product Requirement Document
产品界面、产品流程、功能需求、测试需求、体验需求等,保证产品有效率有节奏的进行!关系到整个产品的发展方向
生命周期中的各个环节
需求评审
- 明确需求背景和目标
- 在接受一个项目需求之前,我们要养成问“为什么”的习惯,就是要了解需求方提出需求的真实目标。这次需求迭代是为何而做,是为了提升AB转化,亦或者是一个全新项目中,需要达到多少日活、周活等,总之需要整个项目组所有成员都必须要明确的东西。需求不明确,后续的所有环节都如无根之木、无源之水。
- 在接受一个项目需求之前,我们要养成问“为什么”的习惯,就是要了解需求方提出需求的真实目标。这次需求迭代是为何而做,是为了提升AB转化,亦或者是一个全新项目中,需要达到多少日活、周活等,总之需要整个项目组所有成员都必须要明确的东西。需求不明确,后续的所有环节都如无根之木、无源之水。
- 评判需求是否合理
- 一个合格的项目经理应该有能力评判需求方所提的需求是否合理,可以从需求目标是否合理、需求内容是否能够达到需求目标、是否有成本更低的方式可以达成需求目标等角度来需求的合理性。
- 一个合格的项目经理应该有能力评判需求方所提的需求是否合理,可以从需求目标是否合理、需求内容是否能够达到需求目标、是否有成本更低的方式可以达成需求目标等角度来需求的合理性。
- 明确需求内容
- 了解需求的具体内容,是保证需求顺利完成的前提,也是基本要求。
- 进行初步的需求拆解,确认技术是否能满足当前需求。
技术评审
项目边界及依赖梳理,关键功能实现细节设计,技术选型,系统架构图、时序图等等。技术方案可按照功能进行细分,并指派给项目成员去设计,各模块务必给出详细的功能设计及时间预估。
- 业务架构图
- 技术架构图
- 网络拓扑图
- 时序图
- 领域模型
- 降级方案
开发
略
项目总结
总结项⽬各阶段中暴露的问题
- 总结业务数据,项⽬的效果不仅是业务⽅需要关⼼的,相信每个项⽬成 员都希望看到⾃⼰产出的成果对于⽤户贡献的价值。
- 分析业务数据,如跳失率、点击率等,产⽣迭代优化需求。
- 倾听客户的声⾳,⽤于产品改进以及积累后续产品的经验。
“ 完成项目的过程是一个追求极致的过程。
一些工具推荐
几种开发模式(敏捷开发)
传统的瀑布式开发,也就是从需求到设计,从设计到编码,从编码到测试,从测试到提交大概这样的流程,要求每一个开发阶段都要做到最好。特别是前期阶段,设计的越完美,提交后的成本损失就越少。我现在从事的外包项目就是这样的流程。
迭代式开发,不要求每一个阶段的任务做的都是最完美的,而是明明知道还有很多不足的地方,却偏偏不去完善它,而是把主要功能先搭建起来为目的,以最短的时间,最少的损失先完成一个“不完美的成果物”直至提交。然后再通过客户或用户的反馈信息,在这个“不完美的成果物”上逐步进行完善。
螺旋模型很大程度上是一种风险驱动的方法体系,因为在每个阶段之前及经常发生的循环之前,都必须首先进行风险评估。
敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作; 按短迭代周期工作; 每次迭代交付一些成果;
关注业务优先级; 检查与调整。
敏捷开发短视频
核心
敏捷开发的核心是迭代开发(iterative development)。敏捷一定是采用迭代开发的方式。
那么什么是”迭代开发”呢?迭代的英文是 iterative,直译为”重复”,迭代开发其实就是”重复开发”。
对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次”大开发”;迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次”大开发”变成多次”小开发”,每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。
举例来说,SpaceX 公司想造一个大推力火箭,将人类送到火星。但是,它不是一开始就造大火箭,而是先造一个最简陋的小火箭 Falcon 1。结果,第一次发射就爆炸了,直到第四次发射,才成功进入轨道。然后,开发了中型火箭 Falcon 9,九年中发射了70次。最后,才开发 Falcon 重型火箭。如果 SpaceX 不采用迭代开发,它可能直到现在还无法上天。
迭代开发将一个大任务,分解成多次连续的开发,本质就是逐步改进。开发者先快速发布一个有效但不完美的最简版本,然后不断迭代。每一次迭代都包含规划、设计、编码、测试、评估五个步骤,不断改进产品,添加新功能。通过频繁的发布,以及跟踪对前一次迭代的反馈,最终接近较完善的产品形态。
精髓
迭代开发只是要求将开发分成多个迭代,并没有回答一个重要的问题:怎么划分迭代,哪个任务在这个迭代,哪个任务在下个迭代?这时,一般采用”增量开发”(incremental development)划分迭代。所谓”增量开发”,指的是软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。
举例来说,房产公司开发一个10栋楼的小区。如果采用增量开发的模式,该公司第一个迭代就是交付一号楼,第二个迭代交付二号楼……每个迭代都是完成一栋完整的楼。而不是第一个迭代挖好10栋楼的地基,第二个迭代建好每栋楼的骨架,第三个迭代架设屋顶……
增量开发加上迭代开发,才算真正的敏捷开发。
每一次迭代
敏捷开发的优势
敏捷开发的第一个好处,就是早期交付,从而大大降低成本。
还是以上一节的房产公司为例,如果按照传统的”瀑布开发模式”,先挖10栋楼的地基、再盖骨架、然后架设屋顶,每个阶段都等到前一个阶段完成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后才能回款。
敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后面每个月都会有现金流,资金压力就大大减轻了。
请想一想,哪一种情况损失比较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后面9栋楼?
对于软件项目来说,先有一个原型产品,了解市场的接受程度,往往是项目成功的关键。有一本书叫做《梦断代码》,副标题就是”20+个程序员,三年时间,4732个bug,100+万美元,最后失败的故事”,这就是没有采用敏捷开发的结果。相反的,Instagram 最初是一个地理位置打卡 App,后来发现用户不怎么在乎地理位置,更喜欢上传照片,就改做照片上传软件,结果成了独角兽。
由于敏捷开发可以不断试错,找出对业务最重要的功能,然后通过迭代,调整软件方向。相比传统方式,大大增加了产品成功的可能性。如果市场需求不确定,或者你对该领域不熟悉,那么敏捷开发几乎是唯一可行的应对方式。
“ 敏捷不是一种方法论,也不是开发软件的具体方法,更不是一个框架或一个过程。敏捷是一套价值观和原则。
有条件的同学可以直接访问 Google Doc:https://docs.google.com/presentation/d/1jsB-95rMG-GLgmOOTLUhXLmsGcun8tejB1ob2qS-qxE/edit?usp=sharing
或者看下面的 PPT:
软件开发中的项目迭代与管理.pptx