What should I expect in a Software Engineer interview at Google and how should I prepare?

I teach interview training classes at Google and I've done over 180 interviews here. I strongly believe that the more candidates know about what to  expect, the better it is for the candidates and for Google: it helps remove the "noise" of nervousness and lets us get at candidates' abilities.

Generally you should be prepared to:

 – write lots of code
 – that demonstrates that you can apply algorithmic knowledge to solve
 – problems that may or may not be well-defined

In addition, especially if you're more senior, you should expect to be asked some high-level design questions that will attempt to get at your knowledge of how to scale applications, your sense of what's hard about some arbitrary large-scale problem and/or how to suss out the hard parts. These don't necessarily presume experience in exactly these areas but what they're trying to get at is: can you break things down and choose problems to attack systematically.

The basic thing I'm looking for when I'm interviewing is not a bag of buzzwords the candidate uses or the experience that's on their resume or their self-described "biggest weakness" — what I want to know is: does the candidate know how computers work, and can they use that knowledge to write code or design systems to solve problems well. Maybe sometimes a candidate doesn't know the "perfect" data structure for a problem, but if he or she can build up that data structure from first principles, that is extremely valuable. Or, maybe the candidate has a wealth of experience but can quickly see what's relevant and discard that which isn't.

As I mentioned above, you'll be writing lots of code on a whiteboard. You'll probably be nervous. Coding on a whiteboard is unnatural and a specific skill that's orthogonal to day-to-day software engineer tasks, so I recommend practicing it. Again, it's about eliminating the "noise" of writing too big or too small or getting your hands messy from erasing with them or whatever so that the interviewer can see the signal of how you're solving the problem.

Get together with some friends, Google "Google Interview Questions," and ask each other questions. Get used to not only coding on the whiteboard, but thinking on the whiteboard — draw pictures, pseudocode, etc. — anything that can give your interviewer an idea of what you're thinking. This will let him or her give you hints, maybe nudge you if you're on the right (or wrong) track, and just give them data, which is way more valuable than silence, even if you've got a crystalline vision in your head — if the interviewer doesn't know that, it doesn't help you. And the more you practice the more natural the interview itself will feel.

One note: if you've heard a particular question before, just tell the interviewer. You'll get points for honesty, the interviewer may have you solve it anyway, and you won't run the risk of getting called out for not mentioning it.

There are lots of great resources out there. Gayle's book is great. Also see:
Steve Yegge's excellent advice: http://steve-yegge.blogspot.com/…

MIT's course: http://courses.csail.mit.edu/iap…

The last thing I would say, and it's hard to implement, is have fun. Sometimes you'll get a question and an interviewer that just "click" with you: run with that! Hopefully some of the questions you get asked will just be neat and you'll enjoy solving them. Look forward to that, even if you get a question or interviewer that you don't "click" with. In the course of 90 minutes during my interviews here I went from thinking "oh my god I'm the biggest moran in the world what am I doing here" to "oh wow I didn't know I could have this much fun with a whiteboard and another nerd!"

One Reply to “What should I expect in a Software Engineer interview at Google and how should I prepare?”

  1. Please note that the topics I am mentioning below are written considering many product based companies. The interview process at several companies is comparable ( if not tougher ) to that of Google. Hence whatever is written here is a broad framework of the topics that are required to be known.

    Also before you begin to read the below mentioned "formidable" list of topics, I would suggest that you read the following two links:-
    ABC: Always Be Coding
    Four Steps to Google, Without a Degree

    Now moving on to the technical topics to be covered:-

    Programming Languages:

    No specific programming language is required interviewing for a technical position with these companies, but familiarity with a prominent language is generally a prerequisite for success. Not only should you be familiar
    with the syntax of a language like Java, Python, C#, C/C++, or Ruby, you should be familiar with some of the languages’ nuances, such as how memory management works, or the most commonly used collections or libraries, etc.

    Data Structures:

    Most of the work that is done in these companies involves storing and providing access to data in efficient ways. This necessitates a very strong background in data structures. Understanding of the inner workings of common data structures and ability to compare and contrast their usage in various applications is expected. You will be expected to know the runtimes for common operations as well as how they use memory.

    Algorithms:

    Your interview with these companies will not be focused on rote memorization of algorithms; however, having a good understanding of the most common algorithms will likely make solving some of the questions they ask a lot easier. Consider reviewing traversals, divide and conquer, and any other common algorithms you feel might be worth brushing up on. For example, it might be good to know how and when to use a breadth-first search versus a depth-first search, and what the tradeoffs are. Knowing the runtimes, theoretical limitations, and basic implementation strategies of different classes of algorithms is more important than memorizing the specific details of any given algorithm.

    Coding

    Expect to be asked to write syntactically correct code—no pseudo code. If you feel a bit rusty coding without an IDE or coding in a specific language, it’s probably a good idea to dust off the cobwebs and get comfortable coding with a pen and paper. The most important thing a Software Development Engineer does at these companies is write scalable, robust, and well-tested code. These are the main criteria by which your code will be evaluated, so make sure that you check for edge cases and validate that no bad input can slip through. A few missed commas or typos here and there aren't that big of a deal, but the goal is to write code that’s as close to production ready as possible. This is your chance to show off your coding ability. Also make sure that your code is highly efficient and optimized. They expect their code to be highly reusable and be clutter free of obsolete lines of code. Everytime you write a bunch of code, keep asking yourself this question – "How can I make this code simpler?"

    Object-Oriented Design

    Good design is paramount to extensible, bug free, long-lived code. It’s possible to solve any given software problem in an almost limitless number of ways, but when software needs to be extensible and maintainable, good software design is critical to success. Using Object-oriented design best practices is one way to  build lasting software.
    You should have a working knowledge of a few common and useful design patterns as well as know how to write software in an object-oriented way, with appropriate use of inheritance and aggregation. You probably won’t be asked to describe the details of how specific design patterns work, but expect to have to defend your design choices.

    Databases

    Most of the software that these companies write is backed by a data store, somewhere. Many of the challenges they face arise when figuring out how to most efficiently retrieve or store data for future use. Many of these companies have been at the forefront of the relational/non-relational DB movement.
    The more you know about how relational (SQL) and non-relational (NoSQL) databases work and what tradeoffs exist between them, the better prepared you will be. However, any particular level of expertise is generally not assumed.

    Operating Systems

    You won’t need to know how to build your own operating system from scratch, but you should be familiar with some OS topics that can affect code performance, such as: memory management, processes, threads, synchronization, paging, and multithreading.

    Internet Topics

    These companies do a lot of business online, and hence expect their engineers to be familiar with at least the basics of how the internet works. You might want to brush up on how browsers work at a high level, from DNS lookups and
    TCP/IP, to socket connections. A solid understanding of the fundamentals of how the web works is a requirement.

    In addition to these, some solid project work ( atleast one on each topic ) and other co-curricular achievements would be a huge plus in your resume.
    As far as finding the right opportunities is concerned, I would recommend the reading the book written by Gayle Laakmann McDowell – 'Cracking the Coding Interview' as they are the best source to understand how the recruitment program at these companies work and how to make it work in your favor along with several practice problems that are of a similar difficulty level of which that they ask in such companies.

    Also, one thing that you might have noticed after reading the two articles is that these companies respect impact. So, once you have understood and mastered the above said topics, pick up a field that you love and try to create a software that make other people's lives a little better.

    All the best.

Leave a Reply

Your email address will not be published. Required fields are marked *