编码规范是一个老生常谈的话题。几乎所有的开发者开入门的时候都接受过无数编码规范的大道理,每个人都能说出几条编码的规则以及使用规范化开发的好处。但是实际上,国内的从业人员自觉主动使用编码规范的其实并不多,所以业内也经常听到各种感慨,说外资公司的开发如何如何规范云云。
那么为什么外国公司热衷于此道,而国人却多知而不行呢?
实际上在加入这个团队之前更早些时候,我还当过老师,为学生无数次的讲解命名规范、编码格式的道理——但是实际上我自己写的时候,依然和其他国内同行一样自由散漫惯了。刚加入团队的时候,发现老外们正在用一个叫做StyleCop的插件检验语法(关于该插件的使用,有兴趣的朋友自己google吧)——这个插件很有意思,一旦不符合(极其严苛的)语法、命名规则,提交代码的时候会产生一大堆的警告信息。极端一点说,多一个空格,少一个换行,它都不依不饶地在警告列表中记上一笔,这是相当令人不舒服的一件事情,因为外籍同事会把你的代码看作是不合格的。
说一个小插曲。刚开始的时候不太习惯,就把所有的注释写了双份,一行英文,一行汉语。结果一个俄国同事怒气冲天的找我质问“这是什么”。我答曰“这是注释”。那伙计还不依不饶了“是什么意思?”,答曰“和上面那句英文一个意思”。然后就劈头盖脸“那我是不是要多加一行俄文注释,XXX再加一行瑞典文?所有注释都要一式四份吗?”。
规则就是规则,非常严苛、非常严谨、非常严肃,不容侵犯!
然后经过了一段时间的开发,我开始意识到,我找不到自己写的代码了——因为所有人写出来的代码看起来都很像。于是乎,编码规范一个最显而易见、众所周知的好处就凸现出来了:我可以轻易的看懂并且维护其他同事的代码,反之亦然。
然后又经过了一段开发,我开始意识到,我已经完全无法发现自己的代码了——这里“发现”一词和“找不到”的含义是明显不同的——如上所述,代码的结构关系会经常“重构”发生变化,比如把几个文件合并成一个接口的不同实现,诸如此类,由于有着完美易读的命名规则,其他人可以毫不费力地把我的类/静态库进行拆解和重新组合,我(其实是每一个人的)的代码已经完全融入了结构之中,或者说,成为了架构的一部分。
承上节所述,其实在编码规范这一个小事的背后,笼罩着精细化分工和工程化管理的巨影。
我很喜欢把中外开发比作是木匠做活。一个优秀的木匠可以做出精美的家具、楼阁、雕花装饰,自由发挥不受约束;而一个家具厂则不然,流水线严格按照切割多少厘米、抛光多少目、油漆打几遍、钉子用几颗!
前者比较接近于国内同行的开发习惯,而后者典型就是外国开发的金科玉律。
或许某些国人会自鸣得意,认为这是一种不错的方式,因为木匠手工活一般比家具厂做的东西要精美,而且市场上卖的也贵一些。但是作为一个产业而言,情况就完全不同了。家具厂对品质的保证来源于其流水线的每一个工序的管理,而木匠师傅对品质的保证仅仅来自于个人能力和自信!如果他们一起到某商用楼盘去承接办公桌椅的项目,结果可想而知!而实际上最糟糕的情况是,木匠师傅并不是每一个都拥有高超技艺的!
实际上有一个普遍的事实,在普通国人的心目中,能叫得上名号的IT技术英雄不少(还有不少华裔技术人才移民海外);但是与之相反地,却很少有国内从业人员能叫得出几个名号响亮的IT公司的名字。更有甚者,每当有人提起“X唐”、“X蝶”、“X友”,就有人说那是靠关系,提起“X为”就说是思科的抄袭者、过劳死的集中营,提起“X州数码”就说是玩票的——反正就是不肯承认国内有技术型的公司。
这些国内公司的技术人才很缺乏吗?显然不是!我知道一家武汉本土的公司,去年拉到了大单,号称今年大规模招募达到两千多人的开发团队。仅以人数而言,这个规格甚至已经超过了windows 7的核心团队。但是任何人都知道一千人的美国团队和两千人的中国团队具有怎么天差地别的战斗力(至于单个的美国人和中国人的战斗力,我打算在后面的篇幅“关于学习型团队”小节再来论述),即使是门外汉也能想象得到规范化在上千人以上的团队中意味着什么——或者反过来说,上千人的建筑公司去盖房子,却没有人把施工图纸当回事的时候将会发生什么?国内公司可以做大,但是难以做强的原因之一在于技术人员工程化的概念缺失,而工程化的基础在于每一个环节都遵循着严格的规范化——编码规范则是所有规范化要求中最底线的一环。
在国内技术圈子里,大都把能做出别人不能做的代码看作是牛B的体现,或者把看懂外国技术资料当做是提升自己的唯一手段。而这些在外国技术人员眼里恰恰是不值一提的事情:前者是精细化分工的表现,你的岗位技能专精到一个具体任务中做久了,自然就在这个领域牛B了;而后者是基本能力,看不懂英文资料还好意思混IT?(顺便一提,我目前的团队没有英美人士,母语也全都不是英文)
小结一下:正是观念上的不同,导致了国人轻视过程(编码规范)重视结果(做出牛B的代码),这样的理念直接导致了中国团队的难以实行过程控制(但是国内公司倒是热衷于拿CMMI、ISO等过程控制的认证,真是一个笑话)。继而,由于没有成熟的过程控制手段,软件产品的结果往往并不会达到预期目标(剽窃抄袭除外)。软件品质普遍不佳的结果,就是至今国内依然没有IT企业能够异军突起(神一样的腾讯可以除外)。而外国人的观念相当重视过程控制,CMM、ISO等过程控制认证就是源自他们自己对过程控制的要求而生的——编码规范虽然不是过程控制的全部,但是是实现过程控制的基础——经常听人说倭国和咖喱国的公司每个人敲出来的代码看起来就像一个模子刻出来,很多人觉得他们太没个性,很傻,但是现在我们的团队也在做同样的事情使我不得不重新考虑一个问题——规范化编程真的很傻,还是我们固步自封在当井底之蛙呢?