Four Steps to Google, Without a Degree

http://www.apkbus.com/android-2180-1.html

Since publishing ABC: Always Be Coding - How to Land an Engineering Job, many have asked how I got an engineering job at Google without a college degree. Here’s my story, your mileage may vary.

I had every intention of going to college. My college of choice was UCLA. Unfortunately, I had an embarrassingly low high school GPA (2.45) and so didn’t exactly have my pick of the university litter. Instead, I took computer science classes at Purdue Calumet, a satellite of Purdue University, with the intention of eventually transferring, or finding another way out. Nearly two semesters in, the latter happened in the form of an offer I couldn’t refuse.

Step #1: Fake it ‘til you make it. While in college, I worked for asmall company in Griffith, Indiana building websites for local businesses at $12/hour. The job wasn’t exactly what I had in mind when I imagined my future career, but it could have been worse.

I kept my head down, under-promised and over-delivered on several projects. This built a lot of credit. And the company made a hefty margin off of my hourly rate. Meanwhile, I was trying to create a game in my spare time, which I didn’t have much of. So, I went for a hail mary and asked management to give me three months to build my game on their dime and sell it online. I drew up fancy spreadsheets and colorful graphs showing them how the shareware model worked and how they were sure to turn a profit. I had little idea what I was doing yet somehow they bought into it, perhaps it was the pretty colors.

Two months into development, I released a demo online. A fledgling startup in California called CodeFire took notice as they were essentially making the same damn game, a top-down space shooter, similar to SubSpace except in 3D. Unfortunately, they communicated this to me in the form of a cease-and-desist letter. There was only one response I could give, “Sure, I’ll stop — if you hire me to work on yours instead.” They replied with an offer. And so I picked up and went.

Note: The company retained the rights to the original game. I gave three weeks notice and parted on good terms.

Step #2: Befriend a master. This is the probably one of the most important things you can do. Find someone that is a master at your craft, make them your mentor, and never stop learning. While working at Double Helix that master was Nathan Hunt, one of the smartest and most humble guys I had ever met. And he was extremely patient with all of my questions no matter how elementary. I must have walked into his office thousands of times to ask random questions like, “how can I smoothly interpolate from one rotation matrix to another?” or “how should I implement moving capsule-to-cylinder collision detection?” Years later, he would join Google one month after me.

Each of my mentors changed something about the way I approached problems or viewed the world. And there are only a small handful.

Step #3: Fill in the gaps. Because I didn’t have a formal CS degree, I knew I lacked a lot of fundamental knowledge. For example, I implemented a physics engine but never solved a dynamic programming problem. To fill these gaps, I implemented nearly all of the most common data structures and algorithms that I heard or read about. The information you need is out there in spades, but there’s a chasm between knowing how something works by observing it, and knowing why something works by building it.

Over time, do the following:

  1. Master at least one of C, C++, Objective-C, Java, PHP, Python or Ruby. Become fluent in at least one of the other languages and become familiar with Scala, Haskell or Lisp.
  2. Learn your data structures. Implement most of them. Understand their time complexities.
  3. Solve programming problems. Read this and solve many of these.
  4. Build your portfolio of (un)finished projects (e.g., programming frameworks, mobile or web apps, small games, and so on).

Step #4: Find confidence. Six years after leaving Indiana, I had shipped about six games across multiple platforms. I was getting bored and needed a new challenge. I applied to Google and felt that if I were hired, I’d be a “real engineer,” something I struggled with since I didn’t have that coveted piece of paper. But, I never heard back and I wasn’t surprised.

One year later, I resubmitted my resume. Except this time I took the “Education” section out of it altogether. Ironically, a recruiter called me and scheduled a technical phone-screen interview. I asked if we could schedule it for two weeks later and she agreed. I needed that time. I used it to cram as many algorithms and data structures into my head as humanly possible. I coded 12-14 hours a day and solved hundreds of problems. I was literally obsessed and wouldn’t stop until my fear of the Google interview turned into confidence and excitement.

I remember every single one of my interviews at Google and had a blast with all of them. The interviewers were fun to talk to, and I believe they could see that I was excited to be there and welcomed their problems.

Some of the problems given to me were:

1) Given a set of 2-dimensional points, compute a skyline. This was easy. I drew upon a common data structure known as a max heap. There are several solutions, here is a good one.

2) Design Microsoft Paint. This was by far the most fun problem. I started by drawing up interfaces and a class diagram. I made mention of a Paint Bucket and the interviewer asked me to implement it. Luckily, I knew how to implement an iterative, breadth-first traversal with my eyes closed thanks to TopCoder.

3) Describe your software virtues. This was an “open-ended” discussion interview. I talked about the types of testing and when they are valuable (e.g., unit, integration, acceptance). I talked about consistent style for maintainability of code. And so on. Things you would find in books like Code Complete or Effective Java.

I was genuinely enjoying each round of interviews and solving the problems thrown at me. Had I not prepared the way I did, I am certain things would be very different. After the interviews, I had a very good feeling. But, I had heard even if the hiring committees agreed to move forward with an offer, that Larry himself would have to sign off on it. I feared that as soon as he saw my lack of education, I was toast.

But that didn’t happen, and one day while I was eating sushi for lunch in Santa Clara, I got the call and enthusiastically accepted the offer. On that day, I knew for certain that I wasn’t ever going back to school.

Victorious warriors win first and then go to war, while defeated warriors go to war first and then seek to win.

Love or hate this article? Let me know @guitardave24.


After an amazing five years of learning and growing as an engineer, I no longer work at Google.


没有学位,他通过以下四步进入Google

自从发表了坚持编程( ABC: Always Be Coding - How to Land an Engineering Job)这篇文章,很多人问我在没有学历的情况下怎么获得在谷歌工作的机会的。你通向成功之路或许会和我的不一样,下面是我的故事。

我非常希望能上大学。我的理想大学是UCLA。很不幸,我高中的GPA低的令人尴尬,只有2.45。所以实际上,我并没有随便选择一家大学。我在  普渡大学盖莱默分校上的计算机科学课程,希望可以当交换生或者找到别的出路。差不多两个学期以后,后者发生了。我收到了一个不可拒绝的offer。

第一步:在你能做之前先装装样子。大学的时候,我在一家专门为本地企业建设网站小公司工作,时薪是12美金。在我的职业规划里,我从未想过做这样一份工作,但当时来看还不错。

我同时参与多个项目,身负重任,我选择埋头苦干,全力以赴。从这个过程中我获得了很多信任。同时,我尝试利用我不多的业余时间开发游戏。我去到一个天主教会,向那里的管理人员请求提供我少量的钱和三个月时间来开发这个游戏,然后在网上销售。我绘制了漂亮的报表和颜色丰富的图片,向他们展示共享软件模型(  shareware model)是怎么工作以及如何确切知道这会带来回报。实际上,我对于我将要做的东西还不是非常清楚,但是他们买了,也许是由于那些漂亮的颜色。

经过两个月的开发,我将Demo发布到网上。一个在加州刚刚起步的创业公司CodeFire发现我的Demo和他们的游戏如此相似,都是一个从上往下看的太空射击游戏,都和SubSpace非常相似,除了3D部分。不幸的是,他们通过勒令停止通知函与我交涉。我只能给他们一个回复“当然可以,只要你们聘请我工作,我就马上停止”。他们马上给我发了offer。然后我就收拾行装去了加州。

第二步:和大师交朋友。这可能是最重要的事情。在你的领域里找到一位大师,让他们成为你的导师,不停的向他们学习。当我在 Double Helix工作时,有一位大师叫  Nathan Hunt,他是我遇过最聪明的却又最谦卑的人。不管我问的问题如何的基础,他都极度耐心的一一解答。我至少上千次的走进他办公室,问一些诸如“我怎样才能平滑的将一个旋转矩阵插值到另外一个里面”,“我应该如何实现移动柱体的碰撞检测”的问题。几年以后,他晚我一个月加入了谷歌。

每一个导师都改变了我解决问题或者看待世界的方法,而这只有其中的一小部分。

第三步:填补不足。因为我没有一个正式的计算机学位,我清楚自己缺乏很多基础的理论知识。比如,我实现了一个物理引擎,但从未解决过动态规划的问题。为了填补这些空缺,我几乎实现了所有我见过或读过的数据结构与算法。这些虽然都已经有了,但是通过观察而知道其如何工作,与通过实现而知道其为什么可行有着巨大差别。

完成以下几点:

  1. 至少掌握其中一门语言: C, C++, Objective-C, Java, PHP, Python 或 Ruby。了解至少一门其他语言,熟悉Scala,Haskell或者Lisp。
  2. 学习数据结构(  data structures)。尝试实现其中的大部分。理解他们的时间复杂度(  time complexities)。
  3. 解决编程问题。阅读下面的文章(  Read this)和解决这里的大多数问题(  solve many of these)。
  4. 为你的项目建立主页。(比如,编程框架,移动应用,网页应用,小游戏等)

第四步:找到自信。在离开印第安纳州6年以后,我已经通过多个平台发布了超过6个游戏。我渐渐觉得无聊,需要新的挑战。我申请了谷歌的职位,由于我没有学历,我想着如果我被聘请了,我就能成为梦寐已久的一名真正的工程师了。但是,我从未收到回信,对于这一点我感到一点都不意外。

一年以后,我再次提交了我的简历。而这一次,我把“教育”这一部分删除了。讽刺的是,这次一位招聘官给我打电话和我预约了一个电话技术面试。我咨询是否可以预约在两个星期以后,他同意了。我需要这一部分时间。我利用这段时间,尽最大努力将尽可能多的算法和数据结构塞到我的脑子里。我每天编码12-14个小时,解决了几百道编程题。我慢慢沉迷进去了,直到我对谷歌面试的害怕变成了自信和兴奋。

我记得住在谷歌的每一次面试,每一次与他们的交锋。面试官都很健谈,我相信他们都看得出来我非常兴奋的迎接他们的问题。

我遇到的一些面试题如下:

  1. 给定一组2维点,计算出他们的轮廓线。这非常简单,我采用了一种非常通用的数据结构叫做最大堆。这道题有很多解决方法,这里有一个非常好的。( good one
  2. 设计微软的画笔。这是目前为止最有趣的问题。我从画接口和类图开始,我提到了画笔桶(Paint Bucket),面试官让我实现它。幸运的是,多亏TopCoder,我闭着眼睛都知道如何实现一个迭代的,广度优先遍历的桶。
  3. 描述你的软件的长处。这是一道开放的讨论面试题。我说到了测试的类型和他们的重要性(单元测试,集成测试,验收测试)。我又说到了代码风格的一致性和可维护性等等。这些东西你可以在  Code Complete和  Effective Java找到。

我真正的享受每一轮面试和每一个扔给我的问题。如果我没有那样认真的准备,我现在肯定不是这个样子。面试完了以后,我感觉非常好。但是,我听说即使招聘委员组同意了给offer,拉里本人仍有权利否决。我担心一旦他看到我没有学历以后,我就完蛋了。

不过,这并没有发生,有一天我在Santa Clara吃着寿司午餐,我接到了电话,我非常热情的接受了Offer。那一天,我清楚的知道我不用再回到学校里去了。

胜利的战士先胜了再去战场,而失败的战士先上战场再去求胜。

经过5年学习和成长,我现在已经不再为谷歌干活了。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值