1 软件项目管理2 软件项目管理概述 • 软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对成本、人员、进度、质量、风险等进行分析和管理的活动。 • 软件项目的特征 – 软件产品的不可见性 – 项目的高度不确定性 – 软件过程的多变化性 – 软件人员的高流动性 •降低复杂性和控制变化是软件项目管理的关键问题。开发过程和产品不是实体,看不见摸不着难以预见问题的出现,预计和实际容易存在较大的偏差,过去的经验不适用软件开发的每个环节都在动态变化,且客户需求也在不断变化软件核心技术人员各家都在争抢,流动性大复杂且变化3 软件项目管理的“4P” • 人员(People) – 软件开发由人完成,所以软件项目管理必须重视开发人员的选择、组织、分工和管理。 • 产品(Product) – 满足客户需求的产品为软件项目的目标,产品的问题集中在软件需求的不确定和规格说明的不确定,所以软件项目管理必须重视软件需求分析和需求变更。4 软件项目管理的“4P” • 过程(Process) – 从概念的提出到软件产品的形成。 – 在过程管理中,需要以文档的形式定义整个软件开发的活动,所采用的技术方法,各个阶段的里程碑,各种工程制品。 – 软件过程需要不断地反馈和度量实现持续的改进 • 项目(Project) – 软件项目管理集中在项目的规划,实施和监控。5 软件项目管理的“4P”6 项目管理与过程管理的关系项目管理和过程管理密切相关,过程管理辅助项目管理7 软件项目管理活动 • 项目启动阶段 – 确定项目范围、组建项目团队、建立项目环境 • 项目规划阶段 – 确定项目活动、预算项目成本、制定进度计划 • 项目实施阶段 – 监控项目执行、管理项目风险、控制项目变更 • 项目收尾阶段 – 客户验收项目、安装培训软件、总结项目经验8 内容提纲9 人员在软件开发中的重要性 • 人员是软件开发最重要的资源 – 人员的选择、分配和组织很大程度上影响软件项目的效率、进度、过程管理和产品质量 – 软件开发依赖于开发人员的认知能力和沟通技能10 了解程序员和程序经理 • 工作在第一线的软件开发人员是程序员和程序经理,他们决定着软件的命运。良好的程序员队伍和出色的管理是软件项目成功的必要条件。 – 早期的程序员全能,软硬件精通。 – 如今软件行业被炒得热火朝天,造成了更多原本不是程序员的人看过几本“速成”、“二十一天通” 等书籍也加入了这个行业。 – 现在国内号称有上百万程序员,这支大军鱼龙混杂。11 了解程序员和程序经理 • 真正的程序员都有如下秉性:一、诚实 – 勤奋的程序员在调试无穷多的程序Bug时,已经深深地接受了“诚实”的教育。不诚实的人,他肯定不想做、也做不好程序员。二、简单——实用主义 – 程序员的基本工作就是把复杂的问题转化为计算机能处理的简单的程序。如果一个问题复杂到连程序员自己都不能理解,他就无法编出程序让更笨的计算机来处理。 – 也有不少做计算机“学问”的人颠倒行事。本来几句话、几行程序就能说明白的事,非得要抬高到理论创新的程度,写成玄乎的文章,这是不可取的。12 了解程序员和程序经理 • 三、爱憎分明 – 程序员大都喜欢技术挑战,不喜欢搞测试与维护。高水平的程序员喜欢与高水平的程序员一起工作。程序员大都厌恶拉帮结派、耍政治手腕。不信,数一数你认识的程序员,有几个是党派人士? • 四、工作单调但不乏味 – 有人问编程大师:“程序设计的真正含义是什么?” – 大师回答说:“饿了的时候就吃,困的时候就睡,只要时机恰当就进行程序设计。” – 其实程序员的生活和工作已融为一体,尽管单调却不乏味,还能独享孤独。13 了解程序员和程序经理 • 程序经理是指一支程序员队伍的领导者,不管他的职务是开发组长,项目经理,还是部门经理 – 不是能大喊大叫并且干劲十足,就能成为一名程序经理。 – 微软公司在选择经理人员时,总是把他们的技术知识和运用技术去赚钱的能力放在首位。14 了解程序员和程序经理 • 好的程序经理应该具备以下几个条件: • 一、技术水平是程序员队伍中的最高级别 – 每个程序员骨子里头都有一股傲气,如果你不能技压群雄,他们就不会听你指挥。一个技术水平较差的人被任命为程序经理真是个悲剧,表面上有人对他点头哈腰,背后却被人鄙视。 • 二、能做最多且最难的工作 – 程序经理编程要快且好。别人要干一天的活,他半天就能做完,这样才会有精力去搞管理。程序经理应负责系统分析、系统设计这类最难的开发工作,并指导不同水平的程序员把各自的工作做好。如果人手不够,程序经理要能同时干几个人的活。15 了解程序员和程序经理 • 三、有人格魅力 – 管理的重点应是“以身作则”、“公正待人”。如果程序经理在上班时趴在桌上睡觉,其他程序员也会这样干。如果程序经理发现有两个程序员趴在机器旁睡觉,不能只对其中一个大声吼叫:“你一编程就想睡觉,看看人家,在睡觉时都想着编程。” – 如果管理者没有人格魅力,就没有人信服你,团队就不会有凝聚力,乌合之众不可能开发出优秀的软件。 • 结论:一个有活力的软件公司的各级经理都不会这样感叹,“因为我啥也不会干,所以只好当领导。”16 错误观念 • “编程我不会,做个项目还不easy?派个人去搞系统分析,回头再叫几个程序员把需求译成程序,不就OK了吗? “ – 要让软件项目失败很容易,只要符合下列条件之一即可:(1)项目经理对软件一无所知;(2)技术负责人对编程不感兴趣;(3)真正编写代码的程序员是临时雇用的。 – 如果上述三个条件同时具备,就请放心失败好了。17 软件项目组的人员结构 • 典型的软件开发人员组织形式 – 民主式、主程序员式、技术管理式,层次式18 民主式组织结构 • 项目小组成员完全平等,名义上的组长与其他成员没有任何区别。 • 大家享有充分的民主,项目工作由全体讨论协商决定,并根据每个人的能力和经验进行适当分配。 • 优点 – 同等的项目参与权激发大家的创造力,有利于攻克技术难关 – 特别适合于规模小、能力强、习惯于共同工作的软件开发组 • 缺点 – 缺乏明确的权威领导,很难解决意见分歧 – 无法适用于大规模开发的情形。19 主程序员式组织结构 • 以主程序员为核心(不平等承担问题) – 主程序员既是项目管理者也是技术负责人,全面负责 – 团队其他人员的职能进行专业化分工,支持 • 优点 – 成员之间采取简单的交流沟通模式 • 缺点 – 很难找到技术和管理才能兼备的主程序员主程序员负责软件体系结构和关键部分的详细设计,指导其他程序员完成其他部分的详细设计和编程工作不编程,参与研究设计方案,详细了解所有代码,设计测试方案和分析测试结果,和其他团队进行交流,在主程序员不在的时候领导小组工作完成与项目有关的事务性工作,维护项目资料,文档,代码和数据20 技术管理式组织结构 • 技术与管理工作进行分离 – 技术负责人负责技术决策,参与全部代码的审查工作 – 管理负责人负责非技术性事务的管理决策,并对小组的业绩进行评价。 • 在这种组织结构中,明确划分技术负责人和管理负责人的管理权限是十分重要的,容易出现职责不清的现象21 问题31 • 要求几个学生完成的课程软件项目,合适的人员的组织形式是什么? – 民主式 – 简化的主程序员式22 大型软件系统的层次式组织结构 • 问题: – 如果有200人,怎么组织这些人开发大型的软件系统? • 方法1:200人组成一个团队,一拥而上的开发方法。23 大型软件系统的层次式组织结构 • 绝大多数大型系统的经验显示出,一拥而上的开发方法是高成本的、速度缓慢的、不充分的,开发出的是无法在概念上进行集成的产品 • 存在问题: 1、200人的团队不是理想的团队,因为通常团队的共识是不超过10个人,而团队规模增大,以至于至少需要两层的管理,或者说大约5名管理人员。另外,它需要额外的空间、文秘和机器操作方面的支持。24 大型软件系统的层次式组织结构 • 存在问题: 2. 系统开发人员越多,需要协作沟通的人员的数量就越多,而需要协作沟通的人员的数量影响着开发成本,因为成本的主要组成部分是相互的沟通和交流,以及更正沟通不当所引起的不良结果。 – 结论:暗示系统应该由尽可能少的人员来开发。25 大型软件系统的层次式组织结构 • 是否可以得出这样的结论? – 方法2:如果一个200人的项目中,有10个最能干和最有开发经验的项目经理 – 那么开除剩下的190名程序员,让项目经理来编程开发。 – 考虑OS/360项目。在顶峰时,有超过1000人在为它工作——程序员、文档编制人员、操作人员、职员、秘书、管理人员、支持小组等等。从1963年到1966年,设计、编码和文档工作花费了大约5000人年。26 大型软件系统的层次式组织结构 • 验证方法2是否正确 – 小型、精干队伍是必要的,但对于真正意义上的大型系统,它太慢了。 • 设想OS/360的工作由一个小型、精干的团队来解决。譬如10人队伍,比一般的编程人员在编程和文档方面的生产率高7倍。 • 假定OS/360原有开发人员是一些平庸的编程人员(这与实际的情况相差很远)。 • 同样,假设另一个生产率的改进因子提高了7倍,因为较小的队伍所需较少的沟通和交流。那么,5000/ (10×7×7)= 10,他们需要10年来完成5000人年的工作。27 大型软件系统的层次式组织结构 – 一个产品在最初设计的10年后才出现,还有人会对它感兴趣吗?早已过时。 • 结论: – 多人组成团队一拥而上和少数人组成团队都不适合开发一个大型软件系统。 • Mills建议大型项目的每一个部分由一个团队解决,但是该队伍以类似外科手术的方式组建,而并非一拥而上。 • 即很少的人员被包含在设计和开发中,其他许多人来进行工作的支持 • P41:图3.528 案例:微软公司的软件开发组织 • 微软开发团队的特点 – 小型的、多元化的项目组织 – 相互依赖的角色与共同分享的职责 – 具备专深的技术水平和业务技能 – 具有强烈的产品意识,关注最终发布的软件产品 – 清晰的目标和远景 – 人人参与设计 – 项目组成员在同一地点办公 – 对于规模较大的项目,采取类似小型项目组的运作模式29 团队成功的关键 • 明确的目标与共同的承诺 – 项目目标与客户需求相一致 – 共同认同项目的前景和目标 • 清晰的分工与紧密的协作 – 清晰地定义项目成员的角色和分工 – 充分认识团队合作的重要性 • 融洽的关系与通畅的沟通 – 共同营造和谐、宽松、团结、互爱的工作环境 – 具有高效的沟通渠道和开放坦诚的沟通氛围 • 高昂的士气与高效的工作 • 一个有凝聚力的团队是一组紧密团结的人,其整体力量大于个体力量的总和30 案例:微软公司的软件开发团队角色划分这六种类型的角色地位是对等的,每个角色完成特定的功能31 案例:微软公司的软件开发组织32 案例:微软公司的软件开发组织33 案例:微软公司的软件开发组织34 案例:微软公司的软件开发组织35 案例:微软公司的软件开发组织36 案例:微软公司的软件开发组织37 案例:微软公司对员工的要求 • 个人素质 – 聪明 – 有自我发展能力 – 足够自信 – 有很强的工作驱动能力,知道如何开展工作 – 沉着与镇定 – 有创新精神 • 对待产品和技术 – 热爱技术,热心解决问题 – 针对变化和创新,有良好的适应和管理能力38 案例:微软公司对员工的要求 • 注重客户的反馈 – 所有员工都要以客户为中心开展工作 – 员工代表公司的形象 • 团队合作 – 有团队精神 – 具备良好的交流沟通能力 – 善于与人相处 • 问题32:你认为如何培养这些素质?39 人员的选择40 内容提纲41 项目沟通管理 • 项目沟通的重要性: – 统计表明,项目失败的有一部分主要原因是项目内部或者外部沟通不畅造成的 – 沟通不畅造成误解和遗漏,导致软件开发错误和拖延 • 项目沟通管理是对项目实施过程中的各种形式和各种内容的沟通行为进行管理的过程。 – 即:对传递项目信息的内容、方法和过程等方面进行