PHP程序员学习笔记|如何学习PHP

个人总结的PHP学习方法


我和 Google 的故事

2017-6-26 0phpcom 程序人生


我和 Google 的故事(2015 修订版)

(王垠 yinwang.org 版权所有,未经许可,请勿转载)

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 的气氛。总体感觉就是过度“和谐”,没有人说真话,以至于你不知道什么好,什么不好。很多文档,视频,活动都挂着“Google Confidential”的标签。等你去看了,却发现相当幼稚,其实是众所皆知的东西,没有什么机密可言。可是大部分的实习生们却有一种受宠若惊的感觉,或者假装有这种感觉。每个星期五,都会有一个“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,微软之类成熟稳重的老牌公司,确实难免显得浮躁。也许多年以后等它成熟起来,懂得如何尊重个人价值之后,我们还有合作的机会。

参考资料

如果你想从另一个角度看看 Google 的问题,可以参考一下 James Whittaker 的博文《Why I left Google》。这个 James 当时是 Google 的一个 director,是 Steve 的老板。我从来没跟他仔细说过话,所以我不能对他做出任何评价。这个文章仅供参考。
« php利用自带的ZipArchive类压缩文件 | 清华梦的粉碎-王垠»
发表评论:


站点统计
  • 建站日期: 2015-2-10 18:22
  • 运行时间: 3334 天
  • 日志总数: 221 篇
  • 置顶日志: 0 篇
  • 草稿数目: 15 篇
  • 待审文章: 0 篇
  • 页面数量: 0 个
  • 评论数量: 53 条
  • 微语数量: 5 条
  • 微语评论: 0 条
  • 友链数量: 1 个
  • 加密文章: 1 篇
  • 分类总量: 10 个
  • 父分类数: 10 个
  • 子分类数: 0 个
  • 用户数量: 1 人
  • 管理员数: 1 人
  • 驻站作者: 0 位
  • 标签数量: 11 个
  • 附件总量: 223 件
  • 最后发表: 2021-5-8 16:17



订阅Rss