[现代软件工程 讲义 ]
我们前文讲了怎样衡量软件工程师的能力, 工程师如何成长, 如何证明自己的成长, 等等. 这些都是在一个独立的, 不受外界干扰的空间中做出来的判断。 我们假设一个有能力的工程师, 到了另一个团队, 仍然是一个有能力的工程师。
如何衡量个人在团队中的绩效?
如果一个工程师能够成长,他/她就应该在团队中发挥较大的作用。但是一个团队中的每一个人都有各自的努力和作用, 如何衡量个人在团队中的绩效呢? 我们看看别的行业的例子:
• 一群人把一堆砖头从A地搬到B地。
• 一个剧组排演话剧 (有导演, 有主角, 有配角, 有舞美设计, 有灯光师, 角色能随意替换么?)
• 一群画家集体创作 “百里长江图” (你画一个局部, 我画一个局部, 如何构成一部好作品?)
• 一群医生/护士轮流值夜班 (有人值班一个晚上抢救了几个病人, 失败了几次;也有人值班时没人来求医, 谁好?)
• 一群老师教课 (有人讲得难, 有人讲得容易, 有不同的课程, 谁最有效率?)
• 一群编辑在出版社里出书 (有人碰到好题目, 有人碰到不靠谱的作者,有人的书叫好,有人的书叫座, 有人的书冷门但是有热情, 谁是好编辑?)
• 一群学生做软件工程项目
这篇博客讲的是从管理者的角度出发如何管理一群人的绩效。 一群人在一起做事, 事成之后, 就有排座次, 论功劳的问题 - 在有些团队里, 事成之前就为功劳的事吵翻了
软件团队如何做人员的绩效管理? 这个问题较难回答, 因为所有人的工作被集成在一个软件产品中, 互相依赖, 产品功能被用户赞扬或批评, 都不能简单地完全对应于某一个人的工作。 有些功能看起来好, 有人会说 - 因为这个很容易… 有些功能用户不喜欢, 当事人会说 -
“换别人来做, 可能还不如我呢.” 或者,
“这是底层的问题”, 或者
“PM 根本就没设计好” 或者
“测试人员没有好好测!” 当然, 还有 –
“用户太蠢了"。。。
在软件工程这门课中, 几个学生组成一个小组, 干活多的人和干活少的人都得到一样的 “团队成绩”, 这似乎不利于调动积极性。 为了解决这个问题, 我给每个团队一些浮动的分数 - 相当于基本工资之外的奖金, 大家决定怎么分这个“团队贡献”的奖金。
有人会说,根据工作量来算就好了!这会出问题 - 以前我写过:
今天一个做技术推广的朋友说他的老板非常重视“量的管理”,“质” 则次之。
这使我想起偶尔看到一本书中的一段回忆文字,虽然不是 IT 行业,但是有异曲同工之妙:
“。。。他是多年在联合国工作的资深外交人员,对议事规则相当熟悉,不断要求上台发言。... 他在代表团内始终是副代表代理常任代表,而他的待遇则依照在联合国内发言时间的多寡做决定。 …他每天游走于联合国大厦各会议室间,进门后即登记发言,随即静听先登记各代表发言内容,他不需准备,轮到他时即席演说,最少三十分钟,随即到次一会议室照样发言,…第二天将有关速记纪录中他的发言辑录起来,月底向祖国报销,根据发言数量由政府核发薪资。
十月二十五日下午,大会中他将这项技术发挥尽致,多次依照议事规则相关条文要求发言,每次发言必长,引起与会代表极度反感。”
另外在软件行业, 如何衡量工作量这本身就是一个大问题.
根据每人代码量, 每天统计进度? 有大牛报告 - 今天我重构了原来的代码, 删掉了原来的2000 行多余的程序, 那我今天的贡献是负的两千?!注释, 空行算么? 如果算的话, 移山公司的果冻同学就高兴了, 他每天快乐地写注释, 边写边说 - 今年旅游的机票钱有了!根据目标码大小? 那我们不能用库函数了? …
有人建议按照角色来定位, 例如有猪, 鸡和鹦鹉等, 问题是大多数鹦鹉都说自己是鸡, 剩下的觉得自己是猪, 而且分量很重!
有人建议根据工作时间来衡量, 这规定一宣布, 大家都开始比谁走得晚, 另外, 我周末的时候一直在想工作上的事, 这算工作时间么?
在统计技术支持人员的绩效时, 有些公司主要考虑他们接到用户电话后处理问题的时间长短。这时有聪明的员工往往拿起电话后, 说: "你好!” 然后马上挂断电话。 顾客们虽然摸不着头脑, 但是技术人员的 "与顾客通话时间" 则大大降低。 这样的 “好” 绩效, 最后对公司有利么?
看来似乎所有的衡量方法都有致命的空子可以钻。 在 <人件> 这本书中, “衡量劳动生产率” 和 “UFO” 是放在同一个小标题下的. 然而, “任何一种衡量方法都比完全不量要好” - 书中说。
这次《现代软件工程》上课的几个团队都有自己的点子:
第一组(seven): 我们可以按照以上的9级来分,但是对于我们而言,大家在很大程度上都是同一级的劳动者....所以我们可以更加细分同一级的排名,比如将整个任务分为等量的小任务,每个人负责其中的一个,而最终大家的排名可以通过完成这样任务的个数来决定。关于如何评价是否完成“任务”,可以通过功能性、是否准时来评价;而且当整个工程完结的时候,我们可以做一个review,包括功能、性能和代码的评价,然后大家之间讨论互评。
第二组(霸王):
对于浮动分数,可以通过每个职位对于团队的贡献来添加。队友之间根据各自的贡献给出排序,最后汇总得分。
第三组 (铷铯):
一群学生做软工项目 (PM, Dev, Test), PM:0.3(n*30)分, DEV: 0.5(n*30)分 test:0.2(n*30)分
第四组 (take it & go):
在团队合作中每个成员的贡献度不仅仅取决于他的工作量,而且还取决于这份工作对团队的意义有多大。我认为贡献度的计算应遵循如下公式:
贡献度 = 工作量 × 工作的影响力 × 工作的不可替代性
这个等式给我们的评测提供了一个方向。与直接估计贡献度相比,分别估计三个分量显得更可操作,准确性也更高。
//评点: 如果大家都想做 “不可替代的工作”, 怎么办?
第五组(banana):
关于管理体系,可以天花乱坠的说很多,但实际和理论会差的很远,我们并不能完全按照一个专业团队去执行。
大四是一个美好休闲的时光,很难要求大家训练有素地执行进度,我们只能尽可能友情提示大家一起干一些事,但我觉得做完整个工程应该没有问题。
我个人觉得第五组的同学最适合去垄断性国企。
当然, 在这片神奇的土地上, 还有这样的事情: (从 /trawor截屏而来)
我以前听说过第一个网站, 但是没用过。 我想象有两个团队:
第一个团队说: 我们花了几个月的时间, 几易其稿, 搜集大量用户反馈, 做成这样。。。
第二个团队说: 我们一个星期就搞定了, 主要用了 IE “view source” 这一功能。
如何衡量两个团队成员的劳动生产率呢? 或者这已经超越了劳动生产率的范畴, 到了知识产权, 职业道德的领域?
一帮学生临时组成一个团队, 用什么方法评比并没有重大的影响, 大不了在期末成绩上少一两分。 但是软件公司的团队就不同了, 不合理的绩效考核不但影响各人的收入, 而且会影响人员的士气, 流动, 后续的合作和产品质量,不能不慎重。
比资历?
软件行业的竞争有”赢者通吃”的规律, 一个快要被市场淘汰的产品不能说: 我们是最先进入这一市场的, 我理应继续占有足够份额! 软件团队人员也不能说, 我来的早, 所以我的报酬就应该多!
大锅饭?所有人都评 “优”, 大家平分钱, 好么? 优秀的人会离开, 最后会剩下平庸的人在过平均主义 - 也许整个团队都被淘汰了。 同一团队的成员报酬能差别多大? 我们看看职业篮球的一个例子:
1997-98 赛季, 迈克尔·乔丹挣了八千万美元。 和他同一个队的队友 Joe Kleine 当年挣了27万美元。 两者相差将近300倍! 如果两人挣钱平均分, 谁会离开? 球队因此变强还是变弱?
比效率?
我们也知道软件开发人员的效率有很大的差别, 一流的程序员的效率是普通程序员的10倍; 有些效率的差别还有正负之分。 一个心不在焉的程序员可以一天写 2000 行代码, 然后别的开发/测试人员要花很多时间来修复其中的缺陷, 这些同事本来的任务就被耽误了; 同时, 一个非常用心的程序员发现可以重用以前的稳定模块, 他花很多时间重构和测试, 最后只修改了500行代码, 代码的缺陷特别少, 这样无形中节约了别的同事的大量时间。
背靠背评比?根据所有其他人的评价来决定自己的绩效? 这样会发生小团体抱团, 以及劣币驱逐良币的现象。 做游戏的工程师一定听说过 "Valve" 这个公司,他们的员工手册很有意思,大家不妨看看。根据手册的描述, 他们的员工100% 的时间都可以自由支配, 做什么项目,在哪里工作, 等, 都可以由员工来决定。 但是在绩效评估上, 他们用了队友评估这一机制,得出下列四个值:
技术等级/技术能力; 劳动生产力/结果; 对团队的贡献 (做一些工具让大家的工作更容易,帮助招人); 对产品的贡献 (除了本职工作外, 还有什么可以帮助产品的: 找bug,预测用户的反馈,推广...)
比不犯错误?软件项目的进展不是一帆风顺的, 总有问题发生, 出现了问题, 就一定会记在相关人员的帐上,以便总结提高。 但是一定会作为绩效评估的依据? 那倒不一定。
如果成员的行为只影响自己, 或者是探索式的行动,则不是坏事。 例如有些成员自行探索最新的技术, 但是最后决定不采用此技术。 如果团队成员的行为影响整个团队 (例如 build break 导致daily build 失败), 则要注意。 在一个里程碑中可以统计谁导致这样的错误最多。 对这样的人可以采取 <移山之道> 中提到的 build master 方法处理。
如何区别对待?
团队中总有几个人的资历, 成绩, 口碑差不多, 这时要怎么分出一二三呢? 微软公司流传着“lifeboat drill” [救生艇练习] 的办法 - 如果大家在海上遇险, 一帮人挤在救生艇上, 眼看就要沉没, 必须扔一个人下海其他人才能得救, 你选谁呢? 或者是你要开始一个新的项目, 只能带走一个人, 你会带谁呢? 这当然拷问大家的直觉, 但直觉往往是对的。
在玩过这些游戏之后, 一个一维数组就产生了, 这时候就可以区别对待, 分三段, 来一个好/中/差。 或者想GE 等公司那样, 给最好的 20% 某些待遇; 中间的 70% 某个待遇; 最后的 10% 某个明显不同的待遇。
当然这种一维数组总是有一些问题, 因为人的能力, 具体工作项目完成情况, 在一定时间内的贡献是相互影响但是又是相互独立的. 如果二十人的团队, 大家的确做得差不多, 什么人去当那两个 10%呢? 这是折磨很多经理的难题。在统计意义上, 一个几百人的大公司总有一小部分人不适合职位要求, 让排名最后的 10% 惊醒一下很好。 但是公司里往往层层把10% 的指标下放, 最后到了基层团队. 尽管两个团队的贡献和管理水平有很大差别, 这两个团队的经理都必须得选出10% 的成员来作为 [最差的成员]。 差的团队, 这些人不缺; 好的团队, 它的经理陷入了一个困境 - 他/她必须把表现挺不错的团队成员归到 10% 里。
为了更客观地反映员工绩效的不同的因素, 有些公司实施过二维的评价体系:
完成任务维度:主要由团队成员和直接经理商量年度目标, 直接经理有较多的自由度决定 好/中/差. 例如大部分成员都可以得到 “好”这一评价。
团队贡献维度:还是严格根据人员百分比, 评出团队中最好的20%, 中间的70%, 和最需要改进的 10%.
在理想条件下, 把任务做得很好, 当然贡献会在最上面的 20%; 做的最差的, 贡献应该是最低的 10%. 但是在实践中要复杂得多, 有些人因为任务相对简单, 完成的很好, 但是对整个集体的贡献一般, 这种人可以得到 [好, 70%] 的位置。 有些人敢于做很难的事情, 结果未必令人满意, 但是对团队很重要, [中, 20%] 应该是一个合适的评价。
还用篮球做一个例子, 假设NBA的球星 科比·布莱恩特 到中国某俱乐部打球, 他由于种种原因, 没有打出自己顶峰时的水平, 低于自己和俱乐部的期望, 但是和俱乐部所有球员相比还是高人一筹, 他应该得 [差, 20%] 的评价. 与此同时, 一个刚入队的球员, 大部分时间打替补, 时有超水平表现, 他的评价应该是 [好, 10%]. 与此同时, 在科比到来之前能拿 [好, 20%] 的球员, 则有些要拿 [好, 70%], 因为科比占用了一个 20% 的位置, 但是自己的球队因此变强, 成绩变好, 总的奖金数大大增加, 也许自己到手的报酬比以前还要高。
当领导给员工评价时, 员工的绩效可以从两个维度去评价, 就更好办一些了. 当然, 相应的流程和文字工作要做得更多 - 如果员工是公司最宝贵的财产, 多花一些流程和文字又算得了什么呢?
[11月更新] 看到某著名互联网公司的一个二维评价体系, 纵坐标是业绩, 横坐标是价值观:
网络的解释如下, 话糙理不糙:
刚入门的员工, 业绩和价值观都在培养阶段, 那就就是一条狗,就像大街上乱跑的中华田园犬。 如果干了很久还没有业绩和价值观, 那就要赶人。
如果价值观不断提高, 但业绩平平, 则是听话的小白兔,或者哈巴狗。 可以给机会, 但是机会不多了。
如果业绩很好, 但价值观不太对路 (不太听话?), 则是一条野狗。 要坚决清除, 不然功高震主...
如果业绩和价值观都取得双丰收, 那就是明星员工了, 可以用藏獒来命名!
其他的同事则属于勤勤恳恳的牧羊犬.
各个公司在实践中会有很多不同的做法, 那么你们团队是怎么衡量绩效, 决定工资, 奖金的?