How to Prepare
In my opinion, the short answer is surprisingly simple: go to Leetcode (currently the best website with practice interview problems), and solve 2-3 problems every day until you have about 200-400 problems solved. For software engineers, most interviews are coding interviews focusing on solving algorithmic problems, so solving a lot of practice problems in advance will give you a good chance at passing almost any interview.
The long answer is that this will still take a lot of time, and there are a lot of additional things to know. Let's cover these in detail.
As mentioned before, for software engineers, coding interviews usually take the majority of the interview process and are the most important. Because of this, it makes sense to devote most of your preparation time to coding interviews.
At the coding interviews, you are asked to solve and code algorithmic problems, so you need to learn to do just that. And probably the best way to learn to solve algorithmic problems is to practice solving them until you feel comfortable.
Currently, the best website to solve practice interview problems is Leetcode, so I would suggest you to go there and start solving 2-3 problems a day. By doing this, you will improve your problem-solving skills, and will also study real interview problems that may appear on your interviews. For most people, 200 to 400 solved problems on Leetcode should be enough.
While solving problems, you will also find out that you need to know a number of common algorithms and techniques. I would suggest to learn them in parallel to solving problems. We will extensively cover algorithms you need to know in the later sections.
There are a lot of extra details and tips for preparation to the coding interviews, like doing mock interviews (practice interviews with other people) or learning your programming language well. We will go over these in the coding interviews section, but for now, just remember that solving practice interview problems is absolutely essential and is something you should do almost every day of your preparation.
Along with the coding interviews, you should also prepare for the behavioural interviews, although it will take much less time. In fact, it's possible to do this in just a day or two, but you may want to do this in advance.
To prepare for the behavioural interviews, you should learn the interview format, understand what is expected of you, and prepare answers for a number of possible questions you may be asked. It's also a good idea to go over your resume and make sure that you really know everything written there.
We will go over this in more detail in the Behavioural Interviews section.
System design interviews is another important interview type that you should prepare for. Even if you may not get a separate system design round, you still may be asked some related questions at the coding interviews. And anyway, knowing more about real software systems will make you a more round and experienced engineer.
To prepare, you may find a list of possible system design interview questions (best if it has solutions), and try to solve them yourself first. It's an excellent way to practice, and you don't need to solve that much: studying just 10 to 20 problems should make a big difference.
Another good long term approach to get better at the system design is to pick up and read some books and articles on the software systems – the more you are exposed to the real world software designs, the more you will be comfortable working with them. Even reading for 30-60 minutes a day will be very helpful, but you need to start early and create a habit of reading consistently.
We will cover system design interviews in depth in the System Design Interviews section.
Another important aspect of preparing for the interviews is to prepare everything you need for applying to the companies: figure out where you want to apply and how (more on this in the Applying section), prepare your resume and LinkedIn profile, and get in touch with the recruiters.
This may seem simple and obvious, but you will find out that there are a lot of small details, and you need to start early to avoid doing everything at the last moment.
Here is a short summary of how you should prepare. In the rest of this website, we will cover these in more depth, and learn more about different aspects of the preparation.
The most important thing you should do is to solve 200-400 practice coding interview problems. Go to Leetcode, start solving 2-3 problems a day, and make it a habit. In parallel, you will also need to learn a number of common algorithms and techniques.
Prepare your resume and LinkedIn profile. Figure out where you want to apply, and get in touch with the recruiters – you want to start doing this early!
Start reading something on the system design – maybe just a little bit of some book or article every day – and make a habit of doing this consistently. Also, sometime in your preparation, you may want to spend some time solving practice system design problems.
Be aware of the behavioural interviews and questions you may be asked there. Create a list of possible questions and prepare answers for them, and go over every detail of your resume to make sure you really know it. You can do this sometime closer to the actual interviews.
- How to prepare for coding interviews?
- How to prepare for behavioural interviews?
- How to prepare for system design interviews?
- What else should you do?
- Which interview type you should prepare for most and why? What should you do?
If you want to try some more simple problems (with solutions!), read Simple Problems section. We will also cover Leetcode and coding problems in much more detail later.
Alternatively, you may watch some good software engineering talk (like How We've Scaled Dropbox) or read a good article (for example, How does HTTPS actually work?). The goal here is not to learn a lot right away, but to start getting into the habit of learning more about software engineering every day.