现代软件工程讲义 5 项目经理 Program Manager

在一个软件团队里, 不同的人有不同的投入, 我们在 猪,鸡和鹦鹉 的故事里已经说明了. 不同的人还要在团队中担负不同的任务, 我们也要讲一下.

开发人员 (大部分内容在:   现代软件工程讲义 2 工程师的能力评估和发展

项目经理   ( 这篇博客 )

测试人员  ( link )

 

 

0. PM

我碰到的不少大学同学都有一个想法 - 先做几年技术, 然后做管理; 也有一些同学说 - 我技术不行, 希望直接找到一个管理的工作, 就像PM 那样。

PM 的M 就是 manager, 但是 P有这几种: Product Manager, Project Manager, Program Manager, 在不同的行业和公司它们的作用不一样。 下面说说微软的PM - Program Manager:

1. 微软PM 的来历

大部分公司的项目经理叫 Project Manager, 微软的经理叫 Program Manager, 这有什么本质的区别么?

微软曾经也是一个创业公司, 两个创始人都是 dev, 招聘的新成员也大多是像他们一样的开发人员, 这其中就有一个叫 Charles Simonyi 的超级程序员 (当然还有像 Steve Ballmer 那样的超级销售人员, 这里按下不表)。

 

image

 

1974 年, Charles Simonyi 在Xerox PARC 开发了 WYSIWYG (所见即所得) 的字处理软件 Bravo, 成为 PARC 的 Alto 个人电脑的重要应用软件。 

作为参照:

    同一年, Steve Jobs 从印度回来, 加入Atari 公司打工, 因为其他员工不能忍受他的傲慢态度和卫生习惯, 他只好上夜班。

    同一年, Bill Gates 在哈佛大学读 2 年级, 第二年, 他看到了个人电脑的曙光 – MITS Altair 8800, 于是退学创立了 Microsoft.

 

1981 年, Charles 加入了微软公司, 领导 Word 和其他办公软件的开发。   很多开发人员聚集在一起, 怎么工作呢?  如果大伙做的是搬砖的体力劳动 (我很喜欢用搬砖的例子),  那么在一定限度内, 人员的增长和项目复杂度的增长是线性的关系; 程序开发就有些不同, Charles 发现项目管理的复杂度似乎是和人员数量的平方成正比。  一个团队里有 4 个成员, 就有 6 种双向依赖和交流的途径, 然后增加一位新成员, 就要增加 4条新的双向依赖交流的途径。 对于 N 个成员的团队来说交流的途径总数是 n * (n-1) /2, 这种 N 平方的增长意味着这样的交流对人类来说是不可持续的。

 

image

 

怎么办?  Charles 想到了一个办法 - 他提议把程序员分成 Master Programmer (MP) Slave Programmer (SP), MP 和其他成员交流, 了解需求, MP 只写抽象的伪代码, 或者对功能的描述; SP 根据MP 的文档, 实现具体的功能。 SP 只用和 MP 交流。  这样不就大大减少了交流的成本么?

这个想法在理论上是好的, 但是在实际上, 没有人想做 Slave Programmer, 刚加入团队的成员问 - 为什么我们不能当 Master Programmer?  这次改革最后不了了之。

 

但是, 随着软件复杂度的提高, 用户需求的多样化, 市场竞争的日益激烈, 光有程序员和销售人员是不够的。 我们需要专门人才来做下面的事:

怎么让软件变得可用 (usable), 有用 (useful)

销售人员把顾客的需求直接告诉开发人员, 但是开发人员往往听不懂。 我们需要专人来把市场/销售人员那一套 MBA 的套路翻译成程序员能懂的功能说明 (spec) 

一个产品团队要做很多事, 这些事往往是程序员不愿意花时间的:

  1. 和客户交谈, 组织用户调查, 发现用户需求
  2. 了解和比较竞争对手的产品
  3. 怎么改进团队的流程

谁都不愿意做, 谁都没有能力做好, 大家宁愿盯着屏幕写代码。  怎么办呢?  这时候有另一个聪明人出现了, 一个叫 Jabe Blumenthal 的程序员提出了 Program Manager (PM) 的头衔, 并成为了微软第一个 PM (1984年, Excel 团队)。 和不少早期微软公司员工类似, Jabe 从微软退休, 当中学老师, 做公益活动去了。 (链接

PM 做什么呢? 

2. PM做开发和测试之外的所有事情

有些同学说,我写的代码都不用测试, 我真想不到除了开发和测试之外,还有什么事情可做。  我们看看 微软公司有哪几类的PM:

  • 有做功能设计的PM; 有些需要很深的计算机科学各个分支的专业知识 (如 Visual Studio 各种语言,框架, TFS 的项目管理, SQL Server, Windows Server, Windows Azure, Bing Search 等团队的PM ); 
  • 有些需要对商业和客户很强的了解能力 (如 Office 应用软件的PM );
  • 有些需要广泛的经验和知识面, 商业拓展能力 (如 MSN 部门的 PM); 
  • 有些是驱动流程的PM, 例如推动几百人的团队完成一个版本的开发, 又如保证 Windows Phone 在几十个不同硬件上能发布;
  • 也有专门深入某一领域的 PM (如国际化/本地化 localization/globalization); 
  • 还有和研究人员合作, 琢磨前沿技术如何能进入主流产品,做技术转化的 PM。

 

Program Manager 和一些公司的 Project Manager 的区别:

 

Project Manager Program Manager

是团队的行政领导, 带领大家在项目中工作。

和大家平等工作, 推动团队完成软件的功能。

通常是团队和外界打交道的唯一代表 一个团队可以有很多PM
对项目的功能有最后的决定权 和其他团队成员一起形成决议
管事也管人 管事不管人
不一定做具体工作 一定做具体工作

 

在别的团队中, 也有产品经理的职位, 例如这个博客 (和书) http://iamsujie.com

问: 既然PM 这么厉害, 为什么不让他们领导开发人员和测试人员, 这样 PM 工作起来不就是更有利了么?

答: 首先, 我们认为好的产品设计是在平等讨论 (甚至争论) 的基础上产生和完善的, 如果讨论的一方同时又是另一方的老板, 则无法进行平等和无拘束的讨论。

其次, PM 的产品是 spec (规格说明书), PM 要凭自己的能力, 把用户的需求展现成 dev/test 能够了解, 能够执行的语言, 从而赢得同伴的信任和尊敬。 如果PM 同时又是其他人的老板, 则不必写太好的 spec, 用命令即可说服别人。 再次, PM 不一定是很好的行政经理, 硬把管理不同专业的 dev/test 的任务加到PM 头上, 反而会坏事。 关于这个问题, 这里也有一篇讨论.

 

问: PM 最大的, 最独特的贡献是什么?

答: 保持团队的平衡。

 

image

一个软件产品几乎做不到同时又多又快又省。 在别的领域也类似,  中国在大跃进期间提出了 多快好省 的要求。 最后只得到一个 “多” -  人多。 (参见 软件工程的估计

 

大部分优秀的团队可以做到两个:

多, 快, 但是不省

多, 省, 但是不快

快, 省, 但是不多

PM 要带领团队选择哪两个是最重要的, 哪一个是可以牺牲的。

 

还有许多不那么优秀的团队也许勉强可以做到一个:

多, 但是不快, 不省

省, 但是不多, 不快

快, 但是不省, 不多

 

当然还有一些团队一个目标也达不到, 中途作鸟兽散了。

 

问: 我们团队有几个程序牛人, 参加过 ACM 比赛什么的, 他们写的程序都不用测试, 为什么还要 PM? 如果PM 也来开发, 是不是项目进展更快?

答: 程序 和 软件有区别,  请看:  http://www.cnblogs.com/xinz/archive/2011/05/22/2053838.html

     其次,在下面的图中, 团队有很多划船的牛人, 还有一个拿着话筒的舵手. 如果这个舵手也开始划船, 后果会怎么样?

 

image

 

可能小船的速率会快一些, 但是小船的方向, 稳定性会出问题。 船快了一些, 但是划桨的队友很累, 船不稳, 而且最后到了一个计划外的地方,你愿意么? 

 

在软件行业发展的最初, 软件都是为维持机器本身的运作服务, 或是做科学计算, 这时候也许看不出 PM 的作用。随着产业的发展, 软件应用的深度和广度, 软件的复杂度, 软件团队的复杂度极大地提高了, 这时候我们需要一些人来起着沟通, 交换, 影响, 润滑, 讨价还价的作用 - 就像商业社会的金钱一样 – PM 就是这样的角色。 

 

问: PM 文化的盛行有副作用么?

答: 任何方法或文化都有优点和缺点,  PM 太多了以后,  由于大部分决定都是经过平等而反复的讨论协商折中的到的, 一个后果是 “design by committee”, 一些产品不能很快跟上市场变化, 在需要个人特色的方面, 如设计/UI, “committee”设计出来的东西大多中规中矩, 但是很多方面了无新意。

牛人主导的项目,往往有大起大落,在PM主导的产品中,“不犯大错”成了一个特点,微软的很多产品在长期的竞争中, 靠“不犯大错”,从第三版开始,赶上并超越对手。这也是一个了不起的能力。 [注8]

 

Scott Berkun 也谈到了一些副作用:  http://www.scottberkun.com/blog/2009/the-lost-cult-of-microsoft-program-managers/ 

3. PM 的能力要求和任务

成为一个团队的PM, 需要哪些能力呢?

学习能力: 在一个新领域中能很快上手

观察理解能力: 能理解用户, 站在用户的角度上考虑问题, 观察发现用户不善于表达的需求, 观察团队成员的言外之意, 老板/客户/利益相关人的弦外之音.

                      什么是同理心? 就是能够理解别人的处境, 心理, 动机的能力。 西谚有 – put yourself in other people's shoes, 正是此意。

分析管理能力: 每天项目中发生的事情千头万绪, 能够分析出重点, 找到优先级, 做决定…

一个项目和个人一样, 每天都会碰到各种问题:

    重要而紧急的         - 网站崩了!  

                                - 程序员二柱突然说他要离职! 

    重要而不紧急的      - 按照流量和内容的发展趋势,  三个月后, 目前的架构似乎撑不住, 但是现在还凑合… 

                                 - 程序员们都不写文档, 他们三个月前说等忙过之后会写的, 但是…

    不重要而紧急的      - 老板的老板问到了项目的进度!  要写一个PPT,请若干人征求意见

    不重要且不紧急的   - …

PM 如何处理这些事情呢?

 

销售能力:  能满怀激情地向用户兜售产品, 向团队兜售希望。 请看 Steve Ballmer 的销售能力展示.

交流能力, 处理冲突的能力: 其他角色碰到冲突一般会来找 PM. PM 也要鼓励团队成员保持斗志。

一定的专业能力: 写代码, 玩转Excel, PPT, Visio, 甘特图, 会PS, 有文字功力, 能写有人读的博客, 总得有几招绝活吧!

转换角色的能力:   一个PM 能玩转很多高技术的工具, 但是当工作需要, 她能突然把自己变成一个完全不懂技术的菜鸟用户,从用户的角度来看问题 …

自省的能力: 一个PM 做第一个项目的时候可以拍脑袋定工期, 拍胸脯打包票, 最后拍屁股走人  (谁没年轻过呢?)。 但是失败之后要有自省和自我改进的能力 (看这个例子)。

 

在生活中能不能锻炼PM 的能力呢?

  可以, 装修房子, 组织一个大型活动, 等等。 

在一个项目中, PM 的具体任务是什么呢?

带领团队形成团队的目标/远景, 把抽象的目标转化为可执行的, 具体的, 优美的设计。

管理软件的具体功能的生命周期 (需求/设想/设计/实现/测试/修改/发布/升级/迁移/淘汰)。

创建并维护软件的功能说明书 (specification), 让它成为开发/测试的及时准确的指导, 而不是障碍。

代表客户和用户的利益, 主动收集用户反馈, 预期用户新的需求。 协调并决定各种需求的优先级。

分析带领其他成员形成对缺陷/变更需求的一致意见, 并确保实施。

带领其他成员确保项目保持 功能/时间/资源 的合理平衡, 跟踪项目进展,  确保团队发布让客户满意的软件。

收集团队项目管理和软件工程的各种数据, 客观地分析项目实施过程中的优缺点, 推动项目成员持续改进, 从而提振士气。

 

成功的PM 如果得到团队成员的支持, 会是什么样?

成为项目流程的主人 - 驱动流程, 会议, Scrum, 进度

代表团队, 向上级/伙伴团队/客户/市场部门 报告项目进展

团队成员都乐意和你交流,  你赢得大家的尊重

你不用自己写一行代码,也同样可以积极地影响项目和产品

 

PM 如果得不到到团队成员的支持, 会是什么样?

在各种会议或流程中浪费大家的时间,  发一些大家不读的 “Status Mail”.

不能凝聚团队, 形成共识

对团队的状态不了解, 也不能有效和准确地向有关方面报告团队的情况, 获得支持,但偏偏还不断打扰团队成员,纠缠一些过时的问题。

对项目和产品造成负面的影响。

PM 还会和团队成员因为对投入的认识不同而产生误解, 参考 猪,鸡和鹦鹉,当队友期望你是“猪”的时候 , 你偏偏当个“鸡”;当队友期望你作为“鸡”而搞定某一事情 , 你却偏偏当个飞来飞去的”鹦鹉”!

 

4. PM 们的故事

讲了这么多条条框框, 我们还是讲几个故事吧:

 

A) 是不是所有的好功能都是由PM 主导, 一步一步根据用户需求,按照用户场景设计,然后可用性测试等等步骤之后得来的?

功能本天成,妙手偶得之——一个来自微软的故事。[注3]

约摸在1985年,微软的一个叫Steve Hazelrig的工程师正在写Mac Excel 版本的打印功能,那时候激光打印机很贵,而且离办公室也不近。他懒得经常跑到打印机那儿取打印纸,检查打印效果,就写了一个小程序,把要输出到打印机的图像显示在屏幕上,还有一个放大镜功能可以把局部放大以检查每个像素的位置及效果。这时一个PM路过看到了这个小工具,说,这么酷的东西,为啥不做成一个功能呢?

所以后来微软的编辑软件都有“打印预览”这一功能。然而,用户们并没有正式地要求这一功能。

 
B) PM 怎么说服聪明的同事
这个故事在 [注4, 注5] 中都提到了. 在Macintosh 研发的过程中, 由于计算能力的限制, 计算机的图形显示非常缓慢.  一位聪明的程序员展示了他的新算法, 能很快地画圆形和椭圆. 当他得意地展示给 Steve Jobs 看的时候,  (作为一个不懂编程技术的 PM,Steve 应该表示仰慕才对…) Steve 看了之后, 反问 - 你能继续改进, 让圆角的矩形框显示速度加快么?   程序员说: 这个太难了, 也没有必要.  椭圆不是挺好的么?  Stevel 为了说服同事, 建议两人到外面散步, 然后指出现实世界中的各种告示牌都是用 圆角的矩形框 来实现,走了一圈, 同事就被说服了。 过了几天, 圆角的矩形框也可以很快速地在屏幕上显示了。
 
C) PM 如何找到需求
一些人常说PM 负责提需求,  Dev 就管实现就好了,  那需求从哪里来呢?  <Social Network> 这部电影提到这样一个情节: Mark在忙着写早期的 "the facebook" 网站, 一个同学来打听他认得的某女生有没有男朋友,  Mark 听了, 赶紧把 "显示交友状态" 这一功能加到了网站上。 你说他是不是一个好的PM? 
 
D) PM 的分析能力和韧性
能把市场, 我方的优势和劣势, 创新的机会讲得头头是道, 也是一种能力。 在软件工程课上我们讲过 NABC 方法。  乔布斯在 NeXT 公司时那样也做过很有说服力的分析:
 
 
注意, 这么厉害的 PM, 分析的这么透彻, 但是 NeXT 的产品还是失败了. 
 
但是乔布斯没有气馁, 又投入了另一个公司的运作 – Pixar.  
 
 
 
你有这些能力么?
 
 
 

微软的PM 有独特的历史和价值, 正如 Steven Sinofsky 讲的: 一直被拷贝, 但很少成功复制… [注6]  [注8]。新的技术浪潮和商业模式给 IT 人士提供了一波又一波的机会,了解PM 的特点和要求,对要想进入这一领域的同学来说很有好处。

 

 
 


 

 

[注1: PM来源: http://www.joelonsoftware.com/items/2009/03/09.html]

[注2: PM 在微软的工作: http://blogs.msdn.com/b/jmeier/archive/2010/07/03/what-is-a-pm-at-microsoft.aspx ]

[注 3:  源自微软的[口述历史] ]

[注4:  Revolution in the Valley]

[注5: Steve Jobs, by Walter Isaacson]

[注6: Steven Sinofsky 关于PM @ Microsoft 的博客:  http://blogs.msdn.com/b/techtalk/archive/2005/12/16/504872.aspx ]

[注7: Scott Berkun 也曾是微软的PM, 他写了一本很好的PM 手册: Make Things Happen ]

[注8: Eric Brechner 最近也对微软的PM 发表了意见: http://blogs.msdn.com/b/eric_brechner/archive/2012/07/01/pm-secret-weapon-or-wasted-headcount.aspx ]

posted @ 2011-11-07 13:39  SoftwareTeacher  阅读(14881)  评论(5编辑  收藏  举报