《构建之法》第九章介绍了项目经理这个岗位以及其职责、功能所在。书中以早期的微软为例,从交流成本问题引入项目经理这个角色:很容易理解,如果一个团队中每两个人之间都有一条双向依赖和交流的途径的话,当团队人数增加时,这个途径的数量会呈平方增长,显然是不可持续的。查尔斯提出的将程序员分为两波、分别负责功能描述(MP)和功能实现(SP)的方法是不可行的,我认为原因在于,一是两个职位地位、工作压力相差都很大,导致没有人愿意去做压力更大的工作(SP),二是SP并不是只需要与MP交流,这与咱们的结对编程有些相像,核心计算组并不是只需要与我们UI组交流的,他们同样需要从老师助教甚至是用户那里得到具体的需求,虽然我们也很详尽地在对接方面解释了所谓的这些需求,还有就是我认为有些具体到实现方面的需求,MP是解释不清楚的,必须是由开发者与用户直接交流才能准确地获取需求信息的。
更进一步,譬如像需求分析、调研竞争性产品、改进团队流程这些事情都是程序员所不愿意去做的,事实上也不应该由他们做,而且他们也不一定能做好。一个叫贾伯的程序员提出了PM这一头衔,PM就是项目经理(Program Manager),一般来说PM需要负责除了开发和测试以外所有的事,他们给团队带来的新优势在于:(1)PM可以代表开发某个功能的小组与其他小组或者是用户打交道,可以降低交流成本;(2)相当于有专人负责开发测试之外的很多事务和项目进度的管理,让开发测试人员可以专注于本职工作。
职责越大,能力要求越高,对于一个合格的PM的要求,可以这样总结:(1)有很强的观察、理解和快速学习能力:PM需要有同理心,也就是要能从老板、客户、从团队成员以及其他利益相关人的话语里习得弦外之音,我认为这是关键但是大多数人都欠缺的一种能力,这样才能更好地做需求分析;PM还需要从用户的角度看一些问题,从而向开发人员一些改进建议,此外还要有分析失败总结经验的能力。(2)分析管理能力:项目中每天都会发生很多事情,PM首先需要判断哪些事情比较紧急需要立即处理,而哪里无关紧要可以先搁置一会儿,比如说网站崩了PM需要组织相关程序员去分析原因寻找最好的解决方法,尽量争取最少的损失,又例如有程序员离职,那PM就需要马上找人接手这个岗位,并且联系离职人员与新晋人员做好交接工作......在这些工作中PM始终要起到一个管理、一个桥梁的作用,所谓一个管理者,其作用是不可替代的,尽管他可能对技术很了解。(3)一定的专业能力:这里所谓的专业能力范围很广,要视PM的工作类型而定,比如说理解和表达、销售或者是精通Excel等等。
在一个项目中,PM的任务主要是:(1)带领团队形成一个长远的目标,并根据目标的可行性进行具体的设计,从而便于技术人员进行技术选型、架构设计等;(2)管理软件的具体功能的生命周期,软件包括其每项具体功能都是有生命周期的,需要有专业的管理才能保证项目的顺利进行。(3)创建并维护软件的规格说明书,让它成为开发测试人员的指导而非障碍;(4)收集用户反馈并预期用户的新需求,当存在多个需求时,PM还需要协调并决定其优先级;(5)管理好团队项目的时间进度,确保能够及时发布令用户满意的软件;(6)当项目遇到问题或出现缺陷时,PM要能带领并组织整个团队形成对解决方案的一致意见,并有效地进行实施;(7)在项目的进展过程中,实时地收集和管理数据,并对项目进程中的优缺点进行客观的分析和评估,推动项目成员持续改进,不断进步。(8)在整个项目的生命周期里管理管理风险,尽可能排除可能存在的风险并对不可避免的风险提前做出应对准备。
PM在软工团队里是一个领导者,需要有很高的责任和担当意识,要把所有的成员凝聚成一个团队,严格按照计划进行开发,遇到困难时PM要带头处理解决,每一个阶段都需要做出总结,也只有这样才能打造出一个优秀的团队,才能做出令用户满意的高质量的软件。