1 前言

  我们知道,谷歌公司在选拔聘用人才的标准是出了名的高,并且有着极强的“名校情结”,但是谷歌也曾经录用过一位没受过正规大学教育、连本科文凭都没有、基本全靠自学成才的草根码农,他就是大卫•比托(DavidByttow)。

  大家一定对大卫·比托(DavidByttow)的故事很感兴趣,想知道一位连大学学士学位也没有的人是如何能被谷歌录用为工程师的吧?现在就让我们带着疑问听听他的故事吧!

2 正文

  其实,我当年非常非常想上大学。我选择申请加州大学洛杉矶分校(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 个小时,解了数百道编程题目。我如痴如醉地投入其中,直到我对谷歌面试的恐惧感变成了自信和兴奋。

  我依然记得在谷歌面试过程中遇到的每一个人,与他们打交道实在是一种乐趣。面试官们说起话来风趣幽默,而我相信他们一定看到了我的兴奋和对面试问题的期待。

以下是我遇到的一些面试题目:

  • 给出一组二维点,计算出它们的 skyline。此题很简单,解法有好几种,而我使用了一种叫做“最大堆”(maxheap)的常用数据结构。
  • 设计微软的“画图”软件。这是我目前为止遇到过的最好玩的问题,我先是画出了界面和类图(classdiagram),然后重点讲了一个“颜料桶”功能。面试官当场让我实现这一功能,所幸我闭上眼睛也知道该如何实现宽度优先的迭代遍历,多谢 TopCoder 网站。
  • 讲一讲你最看重的软件优点。这是一次“开放性”讨论面试,我讲到了各种测试以及它们发挥价值的时候(例如单元、整合、验收),还讲到了利于代码可维护性的一致风格,等等。这些内容能在《CodeComplete》和《EffectiveJava》等图书中找到。

我真的非常享受每一轮面试和解答各种题目的过程。如果我不是有备而来,情况肯定就会大不相同。面试之后,我自我感觉很好,但是我听说即便招聘委员会最终决定发放录用通知,也需要 CEO 拉里·佩奇亲自签字才有效。我很担心他一看到我在教育背景方面的不足,我就立马完蛋了。

但是,这样的悲剧终究没有发生,一天中午,我在圣克拉拉市(SantaClara)吃寿司时接到了电话,然后欣喜若狂地接受了录用通知。从那天起,我终于可以确信我再也不用回学校念书了。

正如孙子曰:“是故胜兵先胜而后求战,败兵先战而后求胜。”


转载声明:本文转自网站“DevStore”,他出身草根,却是谷歌资深工程师。

他出身草根,却是 Google 资深工程师相关推荐

  1. 来自Google资深工程师的API设计最佳实践

    来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...

  2. Google 资深工程师苏勇:算法面试6大数据结构必考知识点!

    在互联网行业的算法面试中经常会被考到数据结构的知识,它与算法相辅相成,没有扎实的数据结构基础,学好算法几乎不太可能. 这里精心整理了 Google 资深工程师的学习笔记和解题技巧,总结出6大数据结构必 ...

  3. 12日学习计划-《Google资深工程师讲解GO语言》

    4月24日 <Google资深工程师讲解GO语言> 预计结束时间:5月12日

  4. Google资深工程师讲述谷歌如何思考测试

    以下为作者观点: 测试一直是编程的一部分.事实上,当你第一次编写计算机程序时,几乎肯定会抛出一些样本数据,看看它的表现是否符合你的预期.自21世纪初以来,为了应对现代软件系统的规模和复杂性,软件行业的 ...

  5. 《Google资深工程师深度讲解Go语言》学习笔记

    第1章 Go语言简单介绍 深度理解Go语言面向接口,函数式编程,错误处理,测试,并行计算等元素 Go语言的设计初衷 1.针对其他语言的痛点进行设计:2.并加入并发编程:3.为大数据.微服务.并发而生的 ...

  6. Go语言 Google资深工程师深度讲解

    1.扩充已有包:为结构定义的方法必须放在同一个包内,但是可以是不同的文件. 定义别名: type S struct { B//类型B } 使用组合 type A struct { B C } 2.常用 ...

  7. Google资深工程师深度讲解Go语言11-http及其他标准库

  8. 赞!Google 资深软件工程师 LeetCode 刷题笔记首次公开

    有人说写代码就像我们平时开车,仅凭经验你就可以将车开走:但当有一天,这辆车出问题跑不起来的时候,你不懂汽车的运行机制,你要怎么排除和解决问题?所以拥有扎实的数据结构和算法,才能开好编程这辆车. 作为程 ...

  9. Google 资深软件工程师 LeetCode 刷题笔记首次公开

    BAT 等国内的一线名企,在招聘工程师的过程中,对算法和数据结构都会重点考察.但算法易学难精,我的很多粉丝技术能力不错,但面试时总败在算法这一关,拿不到好 Offer.但说实话,数据结构和算法花点时间 ...

最新文章

  1. 【转】造成segment fault,产生core dump的可能原因
  2. 习题:编程求圆周长、圆面积、圆球体积、设圆半径r=1.5。要求:用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数后2位...
  3. TCP/IP学习笔记(九)TCP报文段首部格式
  4. java网络编程实例_关于java网络编程的实例代码
  5. Java技术:SpringBoot集成FreeMarker生成word文件
  6. mtk android手机 代码问题,MTK用户必备 Android手机也能系统恢复
  7. D* Lite(D star lite) 算法 python
  8. 正向代理和反向代理有和区别
  9. 脚本文件不变色_LoadRunner脚本开发
  10. WPE下载 WPE 各版本下载
  11. 文件夹复制命令 linux,linux拷贝文件夹命令
  12. 黑莓手机刷机经验一点
  13. 徐思201771010132《面向对象程序设计(java)》第十周学习总结
  14. RNA 二级结构预测方法
  15. micropython(3):使用thonny ide 开发,并控制 LED 设备
  16. 对微软在隐私策略上的让步,EFF表示欢迎
  17. [WebRTC导读] VideoRender 视频渲染类
  18. 如何用 VS Code remote 插件编辑远程 linux 服务器上的文件
  19. C++无法输出txt文件全部内容以及输出出现乱码的解决方法
  20. 【转】systemd环境变量的小坑

热门文章

  1. MapReduce--实现手机流量分析
  2. python工作任务流flow实时框架:prefect
  3. stm32解锁电调、电机速度控制
  4. Word2vec原理+实战学习笔记(二)
  5. 软件测试基础:邮箱注册功能测试的测试点
  6. 详解IP地址与子网掩码
  7. matlab求解多自由度振动系统,【2017年整理】1-《机械振动基础》大作业,基于matlab的多自由度振动.doc...
  8. 公网IP与内网穿透的使用场景和区别
  9. 编译原理第一章-编译原理概述
  10. Airsim接口文档