编者按:谷歌多年盘踞“全球最佳雇主榜”前几位并且曾经数次蝉联榜首,而它选拔聘用人才的标准也是出了名的高,其中相当出名的一条是“名校情结”——无论在哪个国家,谷歌都异常青睐毕业于顶尖学府的精英,并且会参考他们大学阶段的成绩单。
如果小编说,谷歌也曾经录用过一位没受过正规大学教育、连本科文凭都没有、基本全靠自学成才的草根码农,大家会不会觉得不可思议?但是,这事儿真的可以有——曾就职于谷歌、Square、DoubleHelix等公司的资深软件工程师及创业者大卫·比托(DavidByttow)日前撰文介绍了他从一介草根到被谷歌录用的经历,故事绝对励志!
文章摘要:
第一,鼓起勇气挑战很牛的事情,做着做着自己也就变牛了。
第二,与业界“大拿”为友,能改变解决问题和看待世界的方式。
第三,勤能补拙,在大量实践中弥补基础知识方面的差距。
第四,抹去简历中的教育背景,意外得到面试机会;做足准备,谷歌面试也能变得乐趣十足。事实证明,谷歌对优秀的人才并不完全拘泥于学历。
以下为文章全文:
发表《编码不息——如何成为软件工程师》(ABC:Always Be Coding–How to Land an Engineering Job)一文之后,很多人都来问我一个问题:我为何连大学学位都没有也能被谷歌录用为工程师?以下就是我的故事,不过大家的经历也是因人而异的。
其实,我当年非常非常想上大学。我选择申请加州大学洛杉矶分校(UCLA),但是很不幸,我在高中的平均绩点(GPA)只有可怜巴巴的2.45,所以我也就没法被大学录取了。然后,我在普渡大学盖莱默校区(PurdueUniversityCalumet)进修计算机课程,同时盼望自己有朝一日能顺利转学或者另谋出路。过了将近两个学期之后,出路来了——我得到了一个令人无法拒绝的录用通知。
第一步:假装自己很牛,直到真的变牛
上大学时,我曾经给印第安纳州格里菲斯市的一家小公司打工,工作内容是帮助本地公司建网站,时薪12美元。这份工作与我所梦想的未来职业相去甚远,但也不算太糟糕。
我埋头苦干、不说大话,把好几个项目做得超乎预期。这为我建立了很好的声誉,也让那家公司获利颇丰。与此同时,我还在并不充裕的业余时间里尝试游戏开发。后来我孤注一掷,请求公司管理层给我三个月时间和一点点钱来开发一款能在网上销售的游戏。我做出了漂亮的电子表格和丰富多彩的图表,向他们展示了共享软件模式的原理和游戏的光明“钱途”。当时我也不大清楚自己在做什么,但他们还是买了我的账,可能是因为我做的东西颜色很漂亮吧。
开发了两个多月之后,我在网上发布了一段演示,引起了加州初创企业CodeFire的注意,因为他们做的也是一模一样的太空射击游戏,类似于非3D的SubSpace。但引起关注未必就是好事——很不幸,他们向我发出了勒令停止通知函。于是我也只能回复曰:“没问题,我会到此为止——前提是你们得雇我开发你们的游戏。”他们回以一份录用通知,而我笑纳了它。
注意:这家公司持有这款游戏的原始版权,而我在离职前也按照规定提前三周通知了老东家。
第二步:与“大拿”交朋友
这或许是你能做的最重要的事情之一——找到你们行业中的大拿,让他们做你的导师,切记学无止境。在DoubleHelix工作时,我遇到的大拿是内森·亨特(NathanHunt),他是我见过的最聪明、最谦逊的牛人之一,而且他对我提出的所有问题都极具耐心,无论这些问题有多么初级。我成百上千次走进他的办公室,随意提出诸如“我如何才能把一个旋转矩阵顺利插入另一个?”之类的问题。多年之后,他比我晚一个月加入了谷歌。
我的每一位导师都在一定程度上改变了我解决问题或看待世界的方式,我在此就不一一赘述了。
第三步:弥补差距
我没有正式的计算机学位,因此我明白自己缺乏很多基本知识,例如我曾经用物理引擎解决一个动态编程问题,结果总也不成功。为了弥补这些差距,我实践过我所听闻或读到过的几乎所有最常见的数据结构和算法。你肯定能找到自己需要的信息,但是通过观察“知其然”与通过实践“知其所以然”之间存在着巨大的差距。
随着时间的推移,你需要做到以下事情:
1.精通C、C++、Objective-C、Java、PHP、Python或Ruby当中至少一门编程语言,熟练使用至少一种其他语言,并且熟悉Scala、Haskell或Lisp。
2.学习数据结构,实践大多数常用数据结构,了解它们的复杂性。
3.解决编程问题,多看多练多思考。
4.构建自己的已完成(未完成)项目作品集(例如编程框架、移动或Web应用、小游戏,等等)
第四步:找到自信
离开印第安纳六年后,我已经在多个平台上推出了大约6款游戏。我开始感到无聊,需要寻求新的挑战。我申请了谷歌的职位,觉得被谷歌雇佣能让我成为“真正的工程师”——对于我这个没有一纸文凭的人来说,这就是我为之奋斗已久的理想。但是,我一直没有收到谷歌的回音,而我对此并不感到惊讶。
一年之后,我重新提交了自己的简历,但是这一次索性把“教育背景”一栏整个儿去掉了。令人哭笑不得的是,一名招聘人员居然打来了电话并为我安排了一次技术方面的电话面试。我问她能否把电话面试安排在两周之后,她同意了。我需要那段时间——我分秒必争地临时抱佛脚,最大限度地向自己的脑袋里填装各种算法和数据结构,每天编程12到14个小时,解了数百道编程题目。我如痴如醉地投入其中,直到我对谷歌面试的恐惧感变成了自信和兴奋。
我依然记得在谷歌面试过程中遇到的每一个人,与他们打交道实在是一种乐趣。面试官们说起话来风趣幽默,而我相信他们一定看到了我的兴奋和对面试问题的期待。
以下是我遇到的一些面试题目:
1)给出一组二维点,计算出它们的skyline。此题很简单,解法有好几种,而我使用了一种叫做“最大堆”(maxheap)的常用数据结构。
2)设计微软的“画图”软件。这是我目前为止遇到过的最好玩的问题,我先是画出了界面和类图(classdiagram),然后重点讲了一个“颜料桶”功能。面试官当场让我实现这一功能,所幸我闭上眼睛也知道该如何实现宽度优先的迭代遍历——多谢TopCoder网站。
3)讲一讲你最看重的软件优点。这是一次“开放性”讨论面试,我讲到了各种测试以及它们发挥价值的时候(例如单元、整合、验收),还讲到了利于代码可维护性的一致风格,等等。这些内容能在《CodeComplete》和《EffectiveJava》等图书中找到。
我真的非常享受每一轮面试和解答各种题目的过程。如果我不是有备而来,情况肯定就会大不相同。面试之后,我自我感觉很好,但是我听说即便招聘委员会最终决定发放录用通知,也需要CEO拉里·佩奇亲自签字才有效。我很担心他一看到我在教育背景方面的不足,我就立马完蛋了。