Google Software Engineer Interview questions
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:-
Now moving on to the technical topics to be covered:-
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.
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.
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.
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?"
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.
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.
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.
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 - '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.