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 a small 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:
- 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.
- Learn your data structures. Implement most of them. Understand their time complexities.
- Solve programming problems. Read this and solve many of these.
- 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.
All images used in this post belong to their respective owners.