2009和2010年,两年的夏天我都在Google实习,然而最后毕业的时候我却没有为Google工作。虽然我心里很清楚这里面的原因,可总有些人觉得不解,为什么居然有人不想为Google工作?如果你是这些人其中之一,那你可能想知道我在Google时的切身感受。
直到将近2015年新年的今天,我发现这篇文章仍然具有普遍的意义。面对Google的员工,我仍然是同样的感觉。他们很多人太拿自己的公司当回事了,自高自大,放弃自己的尊严来舔这个公司的屁股。这些人总觉得好像所有人都希望为Google工作,即使进不了Google,都想去Google“蹭饭”似的。如果一个人说“我很厉害”,我也许会尊敬他,可是如果他说“我为Google工作”,以此来显得厉害,我就鄙视他。我只尊敬那些尊敬他们自己的人。以自己的公司名声来抬高自己的人,是最被我瞧不起的,因为他们跟仗着人势的狗没什么区别。
进Google很难吗?
每当我告诉别人我在Google实习过,总有人说:“哇,你好厉害。Google很难进的!”我说:“一点也不难啊。”他就会说:“你一定是从MIT之类的牛校毕业的吧?”然后我就无语了,我不屑于跟这样的人说话。首先,进Google的门槛真的很低。说白了,Google只需要一些低级码农而已!世界上有很多比Google技术精深而且尊重个人的公司,所以Google并不是很多有志之士的首选。其次,我厉害并不是因为我从MIT或者其它什么牛校毕业,而是因为我自己的资质。这种资质不是读了MIT或者Stanford之类就可以得到的,所以其实我根本不把这些牛校当回事。相反,我看不起这些学校,觉得它们不但徒有虚名,而且相当浮躁。所以说这话的人原意是奉承,结果反倒贬低了我的个人价值,招致我的轻视。
能进Google确实是因为我很厉害,但其实比我弱很多的人也可以进Google,所以能进Google根本不能说明我的实力。你认为我到Google实习,我的导师们很高兴,很支持,觉得很荣耀吗?恰恰相反,他们觉得我贱卖了自己,我本来应该去更好的地方。当我回到学校,我发现自己成了师兄,老师们的嘲笑对象。有个在Google,微软研究院等地方都实习过的师兄说:“Google那种地方去一次就够了,你居然去了两次!”有新同学问道,从我们这毕业,将来能去Google工作吗?有个老教授笑笑说:“那个还不容易?Google招收任何可以做出他们题目的人!”其实正当我在Google实习的时候,有在微软研究院的同学来找我,很不解的样子,说:“你为什么不来微软研究院?Google根本不是搞研究的地方。”后来我才发现,微软对员工个人价值的尊重,明显好于Google。在微软工作,你至少不需要舔微软的屁股。
那么既然不是那么喜欢Google,我为什么还要去Google实习呢?其实原因很简单很世俗,我当时需要一些钱,而Google是最容易进去挣点钱的地方。我这人从来不担心所谓的“前途”或者“事业”,因为我知道自己能力有多么强大。我不觉得为任何公司工作是一种荣耀,我只是有时候拿我很小的一部分技术,出去换点吃的回来。看上去很市井小民吧?但这个世界就是如此,我只是跟它做交易。我就像一个雇佣杀手,专门搞定别人都搞不定的事情。得到这些技术的公司(包括Google,Coverity,Sourcegraph),其实都很是赚了一笔,因为我卖给他们的东西,比他们给我的工资,价值要高很多。如果没有我,他们可能永远也不会做出具有同样高品质的东西。我敢打赌!
好了,还是来看看我在Google的时候都发生了些什么吧。
受命于危难
先说说我的项目是怎么开始的吧。当我加入的时候,我的老板Steve Yegge的小组试图制造一个跨语言的“服务器”式的编程工具,叫做Grok,你可以把它想象成Eclipse,但是Grok的设计目标不只是像Eclipse那样检索和分析本机的某一种语言的代码,而是大规模的检索和分析Google的所有项目,所有语言,所有代码。这包括Google的“四大语言”:C++,Java,JavaScript,Python,一些工具性的语言:Sawzall,protobuf等,还有一些“build file”和所有第三方的库。Grok的初期设计目标是一个静态的代码索引服务,只要程序员点击任何一个变量或者函数名,就能“准确”的跳转到它定义的位置。动态的编辑功能稍后也在陆续加入。
这种检索不是像ctags, etags那种简单的正则表达式匹配,而是像Eclipse和Visual Studio那样的准确的“语义检索”,所以它必须真正的理解程序语言的语义。在Grok诞生以前,市面上和Google内部都没有一个工具能正确的支持所有“四大语言”,所以我不得不说,Steve的项目比起Google的其它跟编程语言相关的项目,是相当先进的。
虽然Grok的技术含量很高,但是Google的管理层对东西的评价并不是看技术含量的,而是看你有多少“影响力”(impact),说白了也就是有多少用户。Google当时本来就只有不到一万个程序员,一个“内部编程工具”能有多少“用户”呢?所以Grok比起像CodeSearch一类利用正则表达式来查询程序的“低端”项目来说,在管理层心目中并不占任何优势。而且由于其它项目界面好看些,用户多些,Grok随时有被取消的危险,这使得Steve心理压力很大。我就是在这个“危难关头”进入他们的小组的。我当然没蠢到会自己进入这样一个组,但是Steve在电话面试时把一切都说得很美好的样子。当时小组里只有三个人:Steve和另外两个组员。
不安全感,恐惧和疑惑
在整个实习的过程中,我都感觉到我所在小组成员的不安全感,这引起了他们的恐惧和疑惑。这种不好的心理状态持续了整个实习过程,使得我在别人的怀疑当中生活了三个月!我不知道如何安慰他们或者让他们相信我的能力,就像我不知道如何安慰一个没有安全感的女朋友。这种感觉,就像是一个女生不相信自己的魅力可以招来这么好的男朋友,所以各种怀疑,纠结,蛮缠。对于Google来说,就是不相信自己可以招到这么厉害的实习生。
当我开始的时候,Grok小组已经初步完成了Java和JavaScript的检索模块。但是他们的检索并不是从头设计的,而是从Eclipse(JDT)和JSCompiler里面分别“挖取”了对Java和JavaScript语义检索的部分,修改之后插入到项目里的。Eclipse的设计非常的不模块化,以至于项目进行了一年多,大家还在忙着解决它带来的各种bug。
最开头的时候Steve给了我两个选择:检索C++或者是Python。我觉得C++的设计太繁琐,所以就选择了看起来好一点的Python,Steve就让我去找一个好一点的开源的Python IDE,然后把里面的语义检索部分挖出来插入到项目里面。可是在看过十个左右的“Python IDE”之后,我发现它们没有一个能够正确的“跳转到定义”.分析其原因,是因为这些IDE基本上做的是正则表达式匹配,而完全不理解Python的语义。所以我对Steve说,我要自己从头写一个。但他反对这个提议,因为他觉得这是三个月的时间之内不可能完成的。不但是我不能,而且就算是一个小组的高级程序员也不可能完成。就算完成了,他也不想“维护”这些代码。所以他宁愿让我去拿一个不怎么样的开源项目,因为这样“维护”的工作就转嫁到开源项目身上去了。这也许就是Google支持开源运动的原因吧?
可是我很清楚的看到,这样一个语义检索,不过是一个抽象解释器(abstract interpreter)。写解释器是我最在行的,所以我告诉他这是我可以完成的,而且由于设计上的简洁,我的代码的维护代价会比使用一个开源项目小很多。他没有说话。我同时也在进行一些内部培训,看一些视频,折腾MapReduce一类的内部工具教程,就这样过了一个星期。我隐约的感觉到Steve的不快,因为他不怎么说话了,可是我也没有太在意,仍然傻乎乎的到处凑热闹。到了周五的时候,Steve下午很早就回家了。另一个组员还待在哪里,不时的叹气。我对她说:“Steve是不是不高兴了?我知道我说话有点太自信,可能打击到他了。”她好像打满的气球被开了一个洞:“他怎么会被你打击到?你知道他以前做的项目有多厉害吗?他是怕你做不出来。之前有一些intern设的目标太高,以至于到最后没有完成他们的项目。”于是她打开Eclipse,把JSCompiler的代码给我看。“你知道我们以前一个类似的项目JSCompiler,花了多少时间才完成吗?一个小组的人,四年的时间!”她打开其中一个文件,也就是处理符号表的那个模块,说:“看这一个文件就有9000多行代码。你三个月能写出这么多代码吗?”我翻了一下白眼,搞笑似地说:“啊--怎么可能有9000多行?这些人真的知道怎么写这种代码吗……”
后来具体的对话我忘记了,但是她确实给了我一些压力,再加上Steve那个闷声子,真是不好受。所以那个周末我没有出去玩,我下载了一个Jython,把它的parser文件(ANTLR)拿出来。然后自己设计了一个更简单的AST数据结构,把这个parser生成的AST转换成我的结构。然后就开始在上面写一个抽象解释器。由于Java的限制,我想出了一个更简洁的用Java实现解释器的方法,从而避免了使用繁琐的visitor pattern。一个周末之后,我做出了一个基本的原型。当然因为Python语言的复杂性,有很多细节的东西到后来才完全的实现。
等到星期一的时候,我告诉Steve我做了一个原型出来,而且因为我拿了Jython的parser,我们以后可以用这个理由把这代码merge回Jython,给他们提供功能,让他们帮我们维护代码,对两方都有好处。他居然一点也不高兴,把我叫到一个白板前面,板着脸说:“来,给我讲一下你打算怎么做。”我就画了一个 AST 的类关系图,在里面每个类插入一个叫interp的方法,然后指出这个东西就是一个抽象解释器。最后他豁然开朗了一样,说:“好。我相信你知道你在干什么了。就这样做吧。”
虽然貌似经过我自己的努力和坚持,从头做一个工程的计划被接纳了,但是这却不是说之后就没有压力了。这种感觉就像是“皇帝的新装”里的织布工一样。我扬言自己会做出精美绝伦的布料,皇帝的大臣们却看不见,所以他们就相当的小心。总是对我很敬畏的样子,有时会来问候一下,做得怎么样了。可是一旦扯到深入的话题,却又怕被看穿其实他们不懂很多东西。
在Google的整个夏天我都觉得跟其他人没有共同语言。我感兴趣的东西,他们一点都不了解。我觉得不以为然的一些东西,却被他们捧上了天。比如,有一次几个人在谈论一个Google的“牛人”,说他做了一个多么了不起的项目,很快就升为了Staff Software Engineer(“Staff”是比“Senior”高一级的职位,Steve就是个Staff)。我去看了一下这项目,发现不过就是JUnit的“C++ 版本”。JUnit这东西技术含量本来就是相当低的,做这样一个东西就能当“Staff”,那我岂不是轻而易举就可以成为“Principal”了?哈哈。我心里这样想,但是没有说出来。一个Staff就如此,谈到Google的两个创始人的时候,有些人就简直是黑白不分了。对他们的各种武断的甚至愚蠢的做法,居然都津津乐道。创始人在他们眼里俨然就跟皇帝一样,他们做什么都是对的。这种浮夸和互相吹捧之风,恐怕是在其公司也少见的。Google要求员工们保持一种“Googley”的态度,原来就是这样的态度,过度“正面”和“积极”,西方所崇尚的“个人主义”和“批判性思维”,我在Google还真的没有见到过。
另一些时候,我会遇到一些对某种语言或者技术有宗教情绪的人。有次一个工程师坐到我面前,像是在面试我一样,表情严肃正儿八经的开始自我介绍,后来我们就谈到C++,我说C++设计实在是太繁琐了,其实很多简单的语言效率并不比C++低,C++最近其实在向其它高级语言学一些东西……后来这人就不说话了。那天以后我就发现跟他打招呼他都不理了。后来我才发现,在Google是不可以指出某种语言,特别是C++的缺点的。C++在Google的势力之大,连Java都只能算二流货色。
最让我受不了的其实是Google的气氛。总体感觉就是过度“和谐”,没有人说真话,以至于你不知道什么好,什么不好。很多文档,视频,活动都挂着“GoogleConfidential”的标签。等你去看了,却发现相当幼稚,其实是众所皆知的东西,没有什么机密可言。可是大部分的实习生们却有一种受宠若惊的感觉,或者假装有这种感觉。每个星期五,都会有一个“TGIF”,两个创始人会像主持人一样组织一个大会。本来无可非议,但是总感觉气氛过于群情激昂了,有点像文化大革命时候念红宝书的感觉。好不容易大家聚在一起,总是在听新闻发布,不然就是谈工作。真正大家一起玩的party,却非常稀少。所以一些别的公司的人都在疑惑,Google的员工到底有没有下班的时间。
我就是这样度过在Google的每一天,以至于后来我都不怎么在饭桌上吃饭了。自己把饭端到靠墙的吧台去吃,或者坐在“冰激凌吧”跟里面的厨师聊天,省得遇到一些高谈阔论的人无语。我发现自己跟打扫卫生的大妈小妹们也谈得来,她们也喜欢跟我说话。后来我发现有这种感觉的不只是我,另外两个比较厉害的博士生也懒的在那边吃饭了。其中一个说,Google的人太傻了,他一个星期就把组里给自己三个月的项目做完了,因为这帮人完全不知道自己在干什么。
直到有一天,我才发现Steve为什么这么紧张。那天有另一个“分舵”的director来访。他给我们做了一个关于“创新”(innovation)的演讲。基本内容就是说,技术上的创新,如果吸引不到用户,那就不算什么创新,拉得到用户的东西才叫创新。
那天下午,这个director来到我们的办公室。表情严肃的“审问”Steve:“你说你每天有5000个用户。可是Google总共还不到10000个程序员。你是怎么算的?你把接受你的服务的那些下游项目的用户全都算进去了吧!”唉,想不到大名鼎鼎的Steve Yegge在这种皇帝的钦差大臣面前也只能唯唯诺诺。
我可以说,这个Python的东西,虽然不费我很多力气,但却是Google里很少有人可以做出来的。就算Python的创造者Guido van Rossum恐怕也玄,因为这需要比设计出Python这样的语言高深很多的专业知识,比如类型理论(type theory)和抽象解释(abstract interpretation)。所以实际上我的这个东西在很大程度上拯救了这个濒临灭亡的项目,因为一旦Grok支持所有的“Google语言”,就会有很多人注意到这个东西,从而会有“影响力”.这确实是后来发生的事,我走了之后,Grok开始通过API给很多项目提供服务,包括CodeSearch。
可是这种“上级领导”的压力居然也间接的传到了我身上,而且是以一种不尊重的方式。这种感觉就是,你做得再多再出色,你相对于Google的“大拿”们,什么都不算。这也许就是Google为什么雇佣Dennis Ritchie,Brian Kernighan,Ken Thompson,Rob Pike,Guido van Rossum等大牛吧。因为它就可以说:“看我们Google有这些顶尖牛人,相比之下你算个什么,要不断努力!”Steve不止一次的对我说:“你要为Google做出杰出的贡献啊!Google的东西总是最好的,你要做出Google一贯的品质来。你知道Python的创造Guido也在Google吗?我一定会在他面前给你美言几句。”这种语气,我好像在几十年前的中国听说过呢?“你要为祖国做出杰出的贡献!”他许以为我会受宠若惊,可是我心里却不是个滋味,因为在我心里,自己的地位一点也不比这些大牛低。“宠为下”的道理,你懂吧?
总之他们就是用这种奉承,利诱,竞争,加威胁的方式,想方设法让我多做事情。可是我心里想的是,Google老爹,您就给了那么点钱,您想买多少东西啊?本来这系统能做出来就不错了,一个组员却一直催着我写 test,她根本不明白,一个程序并不是写了测试就会是个好程序。这个程序经过我多次的大规模修改甚至推翻重来,即使一早写了测试,那些测试也会很快作废。这种大公司给人灌输的“test-driven”编程方式,在这种创造性的程序设计里是根本就是行不通的。要写出这样一个系统,必须全神贯注,深入到语言的本质。而去写测试,往往会打乱原来的思路,所以测试应该是最后完成之后才写的。当我最后完成这个系统,可以大规模的处理Python代码的时候,却听见从她的桌上传来一声沉闷的咆哮:“WRITE--THE--TESTS---”这真的非常的Googley!
最后我顺利完成了整个项目,还没少休息和玩耍。现在它仍然是世界上最精确的Python分析器,每天都会把Google所有的Python代码索引一遍。很多内部工具比如CodeSearch里面的Python文件上的链接,都是这东西做出来的。我所有的代码加起来才4000行。处理符号表的模块只有600行。我怎么也想不通为什么JSCompiler会有9000行来处理这么简单的东西,但是也许这就是为什么JSCompiler花费了四年时间。
所以你看到了,这就是我对Google的印象。那种文化大革命似的气氛和对个人价值的忽视,就是我(以及其他很多有志之士)至今不为Google工作的原因。Google是一个年轻的公司,所以比起IBM,微软之类成熟稳重的老牌公司,确实难免显得浮躁。也许多年以后等它成熟起来,懂得如何尊重个人价值之后,我们还有合作的机会。