本文为出门问问&Ticwear CTO雷欣博士从Coding、开发环境以及团队合作等角度切入,分享谷歌的工程师文化、以及他和他的团队是如何在中国打造公司的工程师文化。
一、什么是谷歌的工程师文化
在加入谷歌之前,我曾在微软和斯坦福研究所工作过。这两个地方其实是非常不一样的,微软是一种传统软件的开发模式,而斯坦福研究所是一个研究所,主要工作更偏向研究方向,更看重创新等能力,反而对代码质量等的要求不是特别高。
到了谷歌之后,我印象最深的是,谷歌对代码质量的要求和追求到了一种近乎狂热的程度,主要体现在几个方面:
-
Coding Style。谷歌内部有一套非常长的Coding Style Guide For Every Language。其中C++是谷歌的主要语言,包括其他语言如Java、Python等,不管什么语言,谷歌都有一个很长的Style Guide。
-
Readability。在谷歌,当你要想写程序的时候,要先拿到所谓的Readability。假如你的代码质量不过关,没有通过Readability考核的话,那你的代码可能就没法Check In到代码库里面。
-
Unit Test。谷歌有非常完善的Unit Test机制,也有十分强烈的Unit Test文化。大家都知道,写软件其实跟搭积木很像,如果下层基础不扎实的话,那整个软件框架其实是很危险的。在谷歌,差不多每做一次代码改动都会有一个Unit Test,虽然这会让开发变慢,但它也意味着高质量和可靠性。
-
Code Review。谷歌很重视Code Review,基本上谷歌所有代码都会保证至少有两个以上的人对它Review后,才会让你Check In。
-
LGTM(Look Good To Me)。***,你的代码写完之后,你需要得到这样一个“LGTM”,就是“Look Good To Me”,得到这样一个Prove后,你才能把这个代码提交上去。
高效的开发环境
1、强大稳定的Base库
除了对代码质量的高要求,谷歌的开发环境也相当强大,非常高效。在谷歌,成千上百万的代码用的其实都是同一个代码库,大家共享一套强大稳定的Base库。
这点是我以前在微软的时候没有看到的,在微软,我们可能是每个小组都有自己的代码库,而且每个小组都有自己不同的代码规范和风格,因此,当更换团队或跨组工作的时候,不同小组之间的不同标准就会造成一些困难。
但在整个谷歌,所有的代码规范都是统一的,因此可以这样想,假如把代码质量看作一个函数,描述成一个高斯分布的话,那谷歌的总体代码是高斯分布的Balance,方差是非常小的,整体质量是非常高的。
2、代码构建工具Blaze
代码的话,谷歌有一个构建工具叫Blaze,这是一个好东西。我们写代码的人可能都知道Makefile,但这个工具的话,我记得以前经常会花更多的时间在调这个Makefile,而不是写代码上。
但谷歌的Blaze就让事情变得简单了,它可以让我们集中精力在代码上,进行快速并行编译,并且效率非常高。
实际上,很多前谷歌人从谷歌出去后,想到的***件事都是怎么重现谷歌的这个框架,怎么能够重新搭建这些东西,让写代码变得更加容易。
其实,很多公司都有类似的工具,比如Facebook有Buck,Twitter有Pants,国内有个更加山寨的Blade,实际上这些东西都是想要达成Blaze的机制。
谷歌还有其他很多好东西,譬如Protocol Buffer,就是一种数据交换的格式;Stubby,谷歌后台系统基于HTTP的RPC机制;还有Map Reduce、Big Table、GTest、 GFlags、 GLog等等。总的来讲,这些东西能让让开发更高效。
3、敏捷的开发团队
谷歌的开发团队一般都是比较小、比较敏捷的。以前谷歌的CEO Eric Schmidt说过这样的话,“Google有影响力的项目都是2个人的小团队开发出来的,如搜索、广告、Gmail”。
一位在腾讯的前谷歌人也说过这样一句话,“3-5个人做不好的事情,30-50人做的更烂”。我是比较倾向于认同这句话的,假如一个项目在初始阶段,没有靠那么两三个人把框架搭得非常好的话,你再招更多的人只会是添乱,增加沟通、交流的成本。
一个很小的、2-3人的小团队有什么好处呢?你能实现快速开发、快速上线、快速迭代,然后再去推进这个产品的改进。
4、一切自动化,数据驱动
谷歌还有一个特点是一切自动化,数据驱动。我们以前在谷歌是做语音识别的,语音识别中其实有很多东西是需要人手动去参与、调解的,比如一些参数类的东西。当时,我们组里面就有人提出要做这么一件事情——当时谷歌有40、50种语言的识别系统,那我们做这样一套系统,我按一个键,它过一段时间就能把所有的、每一种语言的语音识别系统全都训练出来,然后全部自动推上线,中间过程中不需要任何人的参与。当时就有人提出了这样的想法,这就有点将工程做到***、做到***的理念,这是非常重要的。
二、如何达到谷歌的代码质量
那我们怎么在一个小的Start Up中间达到谷歌的代码质量呢?我有一些建议:
1、坚持原则
一定要坚持原则,坚持Unit Test和Code Review。
Start Up的步伐、步调是非常快的,各方面的竞争也很激烈,可能你不快的话就会落后。在这种情况下的话,很多产品经理面对各方面的压力,可能会“我只需要这个产品快速出来,我根本不Care你里面是怎么做的,你的代码质量、代码风格,Whatever,我不Care。”
但实际上,我觉得这样是不太好的,因为,从公司的长远角度来讲,你把基础框架搭好之后,对以后的发展、稳定都会有很大的帮助。因此,在很大程度上,要坚持Unit Test、建立Code Review的机制,定要保证你的代码是有一定质量的。
2、拥抱开源
第二点是要拥抱开源。实际上,谷歌是一个非常大气的公司,它已经把很多很好、很酷的内部的东西都开源出来了,我们要做的话,就是需要把这些东西积攒在一起,然后搭建一套更适合于创业公司的开发环境。
3、鼓励更新、快速迭代
很多时候,我们会面临一个问题,代码的***个版本出来之后,那我以后是在这个基础上修改呢,还是在一定阶段把它推翻了重来呢?
谷歌的话,它内部基本上都认为,没有什么代码是能活过超过2、3年的,所以,会对代码进行推陈出新。实际上,在代码的推陈出新之间,会把以前没有考虑到的东西会做得更好,也会锻炼新人,然后学到更多东西。
三、我们怎么做产品
同谷歌一样,我们推崇“快速上线、持续迭代”,认为“天下武功,唯快不破”,所以我们一般都是以2-3个人为一个小团队去集中攻坚一些比较难的问题,寻求快速的突破。
每周,我们都会进行产品的迭代,像我们最近做的智能手表操作系统Ticwear,每周的话我们基本上都是,周一到周三开发,提出Bugs和Features,然后周四进行内部测试和粉丝内测,然后周五就马上公测。
维持这样一个很快的节奏,实际上是非常累的,但是在这个过程中,你实际上锻炼了团队,你的产品也可以更快的满足用户的需求。
四、打造一支谷歌工程师文化的团队
1、招什么样的人
***是要通才(Generalist)而非专才(Specialist),这个是非常重要的,通常来讲,一个创业公司跟一个大公司的差别在于,创业公司的资源是非常有限的,每个人可能要做很多不同的事情,所以,对我们创业公司来说,一般想招的是通才(Generalist),而不是专才(Specialist)。大公司的话,因为它资源非常多,人也非常多,所以他更希望某一个人进来之后,能老老实实做一件事、做一个螺丝钉,把这个事情做得最深、最透,但是我们小公司的话,更多地希望员工能有更多的Coverage。
第二是一定要有分析和解决问题的能力。
第三就是执行力,小公司之所以能够在某些程度上做得比大公司更好,靠得其实并不完全是Idea,因为Idea是很容易被抄袭的,实际上拼得是执行力,假如你执行的不够好的话,那你就没有任何机会。
第四是要有一定的交流能力,就是说,虽然我们非常鼓励员工能有强大的单兵作战能力,但我们同时也希望在2、3个人这样的小团队中,他们能有非常高效的交流、沟通,去推进一些项目。
2、面试流程
其实我们的面试流程基本上都是Follow谷歌的那一套,都是Phone Screen 再加上3轮Onsite Coding Interview,每一轮Coding Interview都是必须要在白板上写代码,其中就包括系统设计、算法、编码等。算法会多一点,可能会有几个,还有就是编码,我们希望说,一个算法,你想出来了,也能通过你写的代码呈现出来,理论上,你的代码写完之后,我放在编辑器里面,它没有错误,能够编译、能够跑通,这是我们的要求。
3、培训
那人招进来之后,我们怎么去培训他们呢?当然会有一些基本的Coding Style的培训,然后我们会找一些导师,给他们设计一些比较独立的Starter Project,让他们能慢慢融入这个团队。同时,我们也会有一些Codelabs,在某些专题方面,教教大家怎么用我们搭建的一些模型。
平时,我们还会有各种各样的活动,比较大一点的有问问讲堂,我们会请一些比较知名的专家、学者来给我们分享一些技术、业界的***的进展。同时,我们内部也会有一些技术分享,还会搞一些Hackathon,做一些Self Review、Peer Review,让大家更好地融入这个团队。
4、在中国招人留人的困难
我实际上回来才一年多一点,就发现在中国招人和留人有很多困难。
-
Risk Taking。我发现,其实很大一部分中国年轻人承担风险的能力、Risk Taking的能力,相对美国来讲是比较低的。我们在招人的时候,经常会碰到,有些人会说,“我爸妈认为大公司好,觉得BAT好”,或者说要有北京户口,这样的情况,这些我在美国的创业公司是很少见到的,所以这个也是我们比较头疼的。
-
Temptation。即使我们好不容易招到人了,那么怎么去留住他们也是我们比较头疼的地方。因为我们的要求比较高,所以我们招到的人、特别是后端的人才,素质都还是比较高的,那么,特别是在现在这个创业环境特别好的情况下,他们就会面对很多各种各样的诱惑,譬如说,我们公司至少有3个工程师走了,其中有2个到了别的公司当Director,另外一个到别的公司做CTO,他们都只是一般工程师啊。
所以这种情况下,你招人、到底要招什么样的人、完全招那些***的人是不是***的一种方式,也是值得我们去思考的一个问题。