How to Prep for Software Engineer Interviews
Software Engineering interviews are tough. In this blog post, I'll give you an attack plan for how to prep so you stand out from other candidates and land the role of your dreams!
I am not affiliated with any of the products I recommend in this post. Opinions reflected within this post are solely my own.
Software engineer interviews are usually the stuff of nightmares for most software engineers, whether junior or senior. If standing at a whiteboard, solving hard problems in front of multiple interviewers doesn't make you sweat, good for you! But for the rest of us mere mortals, the interview process is grueling and anxiety-ridden.
While the types of interview questions and the recruiting process vary between different companies, luckily there are some common steps you can take to prepare no matter your level of seniority (junior, senior, staff, principal, etc.)
In this post, I'll give you an attack plan for how to prepare for Software Engineer interviews so you can get an offer for the role of your dreams!
Step 0: Make your resume shine
Before starting your interview prep, I'd recommend spending some time to update your resume. The point of your resume is to engage recruiters and show them how awesome you are. You want them to be able to quickly determine if you're the person for the role they have in mind and the best way to do that is by having a clear and powerful resume.
Resume tips and tricks is a topic for another post, but some quick advice:
Don't put your address at the top of the page. That just takes up space in your header and recruiters don't need to know that info. However, it may be a good idea to list a general region, like "Bay Area", "SF", "Seattle", etc.
Do put a standard email address (so not, email@example.com 😁).
Try to put some high-level categories of skills above the work experience. Things like languages you've worked with and platforms you've used (AWS, anyone?) are useful for recruiters to know.
In the Work Experience, focus on what you achieved, rather than what you did. There is a difference. What you did is nowhere near as powerful as what you achieved, and if you can back that up with metrics, then you're a superstar. Something like "Generated $10M in quarterly cost savings by designing and implementing <blah>" is very strong.
Step 1: Do some technical prep
Depending on your level of seniority, there are two main types of questions you will have to answer:
The good news if you are junior engineer (normally level 3 or level 4 in a lot of companies) is that System Design questions are normally not part of the interview process because they can be quite complicated and require intuition into various design alternatives, which make them more suitable for senior engineers with some experience. I'll describe Coding/Algorithms questions a bit more in this post, but I'll briefly touch on System Design.
The best way to prep for coding/algorithms questions is to practice implementing full solutions to coding questions. A great source of interview questions is Leetcode. LeetCode is a fantastic interview prep tool for a few reasons:
The questions are tagged by data structure type (like arrays, hash tables, trees, etc.) and/or by solution techniques (greedy, dynamic programming, graph search, etc.).
The questions are rated with 3 difficulty levels: Easy, Medium, Hard (but take these with a grain of salt).
You can solve the questions with the embedded LeetCode text editor, which will run your code through some test cases.
Many of the questions have solution articles that show alternative implementations and their Big Os (algorithmic complexity). If you want access to all solutions, you will need to get LeetCode Premium (more on that later).
LeetCode has curated common questions that are asked at companies like Apple, Facebook, and Google (their company list is way larger than that and is continually growing). While the exact questions may not be recycled within the companies, LeetCode does a pretty good job of presenting a representative sampling of the types of questions and data structures each company likes to test on.
So with this vast resource, how are you supposed to use it to maximum benefit? Easy: solve every question!
Jk, ain't nobody got time for that 🤣! However, the more questions you solve, the more confidence you will gain and the more experience you will have in solving variations of problems. Many companies like to vary up problems that are originally from LeetCode, so by solving more LeetCode questions, you increase the likelihood that you may be asked a very similar question in your own technical interviews.
LeetCode questions within a certain category, like Trees, can also build upon each other which helps you to grow your algorithmic muscles for that topic.
Note on LeetCode Premium: LeetCode Premium works on a subscription model that is either monthly or annual. At $35/month, it can seem a bit pricy, but I feel LeetCode Premium is absolutely worth it! The primary benefit is access to every solution article on LeetCode. In addition, the company-specific interview questions are curated pretty well. There are additional benefits to LeetCode Premium (such as video solutions and interview simulation), but I found just simply having access to all solutions and curated company interview questions was incredibly useful. I was able to move a lot faster through my interview prep by searching for similar types of questions and preparing on the most common topics in most companies.
What should you aim for with LeetCode?
A general rule of thumb is to be able to solve 2 Medium LeetCode questions in 30 min. Most coding interviews will be around 45 min, so interviewers try to ask a couple Medium-difficulty questions, while providing 15 min for introductions and for questions at the end.
Sometimes, a coding interview will ask 1 LeetCode Hard question (or a custom question you may have never seen before because it's specific to the company), especially if the interview is during your onsite rounds. Interviewers tend not to jump to LeetCode Hard questions during a technical phone screen because it doesn't provide as much signal as two questions (they get to see your questioning and problem-solving skills twice as opposed to once).
Make sure that as you are solving LeetCode questions you are also analyzing your solutions to determine Big O (or, algorithmic complexity). You will absolutely be asked to describe the Big O of your solutions in interviews.
System Design questions are normally not asked of junior engineers and rarely if ever for new grads. These types of questions are unlike coding/algorithms questions because they are normally not as simple as coming up with one of a few implementations to just code. Instead, you are asked questions like "Design the Facebook News Feed".
If you just read that and thought, "WHAT?! HE HAS GOT TO BE KIDDING", that question is not a joke. System Design questions require that you think both at the forest level and at the tree level. You need to be able to describe all the components that will have to be built and be able to zoom into very specific implementation details if asked by your interviewer. For example, your interviewer may ask you something as specific as "How is hashing implemented in this particular library, since you want to use the library as part of your solution? Is that hashing technique the best for this question and why?"
System Design questions are fine-tuned to probe at how much experience an engineer has and the level of technical complexity that he/she can handle and systematically decompose. Unlike coding/algorithms interviews, this type of interview will likely result in a completely filled whiteboard of diagrams and not as much code.
If you'd like to prepare for these kinds of interviews, I'd recommend the Grokking the System Design Interview class on Educative.
Step 2: Research Companies
This step will likely be somewhat in parallel to the step above (since certain companies may have specific interview question types they like to use), but I'm calling this step out in its own section because it's a very important part of the interview process. The best roles for you are the ones that will have alignment between your personal and professional goals and what the company would like to achieve.
"Seems obvious," you say. Not so fast. I'll explain.
You may want to have a good work-life balance, while making a certain amount of money and learning a particular skill. If a company you're researching only has open roles in areas that do not include the skill you'd like to build, or if the work-life balance is not great at the company, but the pay is good, you're gonna have to weigh these factors. Is it worth even interviewing at that company? Your time is valuable. By doing some research beforehand, you can simplify your interviewing experience, reduce stress, and focus on the companies that matter the most to you.
Researching company culture is hard, but there are some great sources to learn from.
First, and most importantly, your friends and network! If you have friends at the companies you're interested in, ask them how they like their role, what stuff they love about their company, and what stuff they dislike.
Second, there are some websites that are geared toward providing you with a sense of what it would be like to work at particular companies. Two great websites you should be aware of:
Glassdoor: Hyper-focused on company culture and interview style, with reviews written by current employees.
Levels.fyi: Primarily focused on compensation bands, like "L3 median salary for Software Engineer at Google in the Bay Area".
Why do you want to work at <company name>?
You may not know exactly what you'd like to work on, but you should definitely have a sense of what sorts of projects you like, as well as what you would like to try next.
So do some research on the company if you don't already know it well. Learn about its main products, where it wants to grow, and especially areas where you believe you can contribute. Creating a narrative about how you see yourself working at that company will create that natural alignment I talked about earlier between your goals and the company's goals. And that will really shine through during interviews with recruiters and with engineers when they see your passion.
Step 3: Practice actually interviewing
If you are a bit nervous about doing interviews, a really good way to prep is to do sample interviews. You've got all this knowledge, but you should get some experience strutting your stuff before you get to the actual interviews because that will increase your confidence.
There are a couple ways to prep. You can make use of online services like Pramp or LeetCode Premium's Interview Simulations feature. Or, you can try interviewing with your peers or a mentor. That's a really good way to practice with a fellow human that you trust and can encourage you!
How you do the sample interviews is up to you. Prior to Covid, it was pretty common for people to practice on whiteboards because that was how you would be interviewed in onsite rounds at companies. Once companies started switching to entirely virtual interviewing loops, preparing on a whiteboard became less relevant because all technical interviews were administered through online services that had collaborative text editors with syntax highlighting. So if you wanted to simulate an entirely virtual interview, one way you could do it is by having a friend call you and use a Google Doc to ask you a coding question.
That being said, I think it's still good to practice writing code on a whiteboard. Writing out your code by hand will force you to really know a language well and analyze your code carefully. The whiteboard doesn't have any syntax highlighting!
Step 4: Take a breather
The interview process is brutal. You're gonna be doing technical prep, reaching out to recruiters (and probably your friends who can give you referrals too 😄), researching companies, and of course, interviewing. It's really important to take care of your mental and physical health so you can perform your very best, and also just to be happy.
Success comes from knowing that you did your best to become the best that you are capable of becoming.
I promise you that if you do the prep above and you believe in yourself, the sky's the limit! You got this!