最近菊厂有2个话题引发了内部热烈的讨论:
- 怎么衡量好代码?
- 推行各项代码指标有助于提高产品质量吗?
很多专家抨击单纯为了代码达标做的各种行政管理措施,不但无益于提高代码质量,有时甚至带来负面影响。有些团队为了使代码通过各类检查和工具扫描,强行把圈复杂度高的函数拆分为数个圈复杂度小的函数,表面是通过了检查,其实整个程序的逻辑反而不够简单清晰了。有的团队为了把复杂的swith
语句自动降低复杂度(用数组来做跳转),开发了相应的代码转换工具,甚至还申报了“最佳实践”。
也有专家认为,推行各项指标的人,仅仅是为了推行指标,指标达成了工作就完成了。最终产品的质量并不是推行指标的人负责。所以为了推行指标,不惜牺牲产品的质量。
而对产品负责的人,在综合平衡工期、成本、质量之后,通常要做一些取舍。遵循规范和指标并不是必须的选择。所有的人力应该投入到构筑产品的竞争力,以及获取利润。
其实这样的争论是没有结果的,双方的利益不一样,最终落脚点肯定不一样。谷歌作为世界最成功的互联网公司之一,从它管理研发人员的一些做法可以窥见端倪。
杀鸡用牛刀
《纽约时报》注意到 ,2004年有3万多员工的微软的创新居然比不过不到两千人的Google。《纽约时报》认为微软的差距在于它的开发模式没有Google的效率高。当时微软3万多员工中专职从事研究的有700多名研究员,基本上都是博士,遗憾的是这700多人的研究和微软的开发相脱节。
谷歌研究和开发不分家,研究人员即要对创意、技术负责,也要对产品负责,所有研究员都亲临一线编码。
Google不仅喜欢招博士(和通过博士资格考试但尚未毕业的博士生),而且特别偏爱名牌大学和考试成绩优异的学生。
一个本科生能做的事情,谷歌会倾向于选择找个一个硕士生来做,这样一定能做得比同类公司要好。谷歌不仅工程师偏向于用博士,而且产品经理也是用斯坦福大学的博士。一些名牌大学(比如:哈佛大学)的MBA面试谷歌的产品经理岗位也很难,因为他们的竞争者不是商学院的MBA,而是计算机专业的博士。谷歌这么用人的好处有2点:
- 工科背景出身的产品经理和工程师沟通没有隔阂
- 经过严格工程训练的工程师富有创造力,产品经理也一样需要创造力
杀鸡用牛刀的不见得全是好处,也有不好的地方:
- 人力成本高
- 人员的流动相对比较大,毕竟都是顶尖的人才,是各个公司HR的香饽饽
- 不是所有的工作都有挑战性,牛人也不愿长期从事琐碎没有成长性的工作,怎么样更好发挥人才的作用也是个难题
什么才是真正的生产力
看了谷歌的做法之后,我们来思考一个问题:什么才是一个公司真正的生产力?一个公司的竞争力很大程度取决于生产力。在软件开发这件事情上,优秀的软件工程师才是真正的生产力。一个优秀的工程师的效率可能是一个普通工程师的十几倍到几十倍,甚至上百倍,但是公司只需要支付数倍于普通工程师的钱。
菊厂以前流传的一个说法:干5个人的活,拿3个人的钱。菊厂并不是纯软件公司,软件工程师的管理、绩效考核和互联网公司还是有不小的差距。仍然倾向于用传统的管理手段来约束软件工程师。殊不知各种一刀切的数值化指标管理手段,并不会带来生产力的提升,反而伤害了培养优秀软件工程师的土壤。
编码规范有多大价值
姑且认为编码规范还是有价值的,价值有多大?怎么样才能带来更大的价值?谷歌在工程傻姑娘,要求近乎苛刻。一段代码多了一个空格或者一行代码超过了80个字符,都不允许提交。一个程序里的变量名起得不符合规范,更是不能通过评审。
其实这些细节问题不妨分2方面来看:
- 一些确定性的问题,强制用规范、工具来解决
- 非确定的问题还是得靠人,这也是代码检视的关键所在
一些手段可以轻易的骗过规范检查工具,但是骗不了经验丰富的工程师。如果着眼于提高质产品量,不管是用指标化的规范,还是靠人来把关,只要能抓住老鼠就是好猫。编码规范要发挥出真正的价值,代码检视是不可或缺的。
那问题来了,代码检视要怎么做呢?