[Home] [Music] [Resume] [Blog] [Tools] [Quake]
The Software engineer interview process is a game. Each individual company's process will vary a bit, but overall the skills required for winning the game are pretty consistent throughout. I recently played the interview process game. At the end of it, I passed every interview I did and had 6 offers in hand (Google, Stripe, Lyft, Robinhood, Dropbox, Zoom). With these offers, I increased my total compensation by 70% from my previous job. I found a process of preparation that works, so I wanted to write down my thoughts on how to prepare to win the game of the Software Engineer Interview. The game is broken down into three main parts: 1. Optimizing Contact, 2. Crushing the Interview Performance, 3. Negotiating to the Moon.
I first want to clarify expectations. This process is a lot of work. I quit my job and prepared for 2 and a half weeks before my first onsite. I spent about a month of full-time effort on getting these offers. That's 4 weeks of 40hours/week, or 160 hours of preparation, research, communication, and actual interviewing. If you're unable to put forth all that time, you'll have to reduce the amount of work you take on to accommodate your schedule. Later, I'll touch on how to interview while optimizing your own time use.
I also have a good amount of experience coding. I've worked in the industry for over 3 years, but also I have a 4-year degree in CS. I've practiced algorithmic problems that are typical in interviews before. If you're not comfortable coding fluently, this process will be difficult. If you have troubles with Leetcode Easy problems, you'll require more preparation. I've done System Design in my job. I just went through the promotion process, so my behavioral questions were practiced and top of mind. You'll need to take time to prepare for behavioral, coding, and system design problems. I can set a guidance of where you'll need to be, but how much effort you'll spend depends on your starting point.
Now that I've laid out the work, what's the point? If you have a dream company, isn't it better to just specifically prepare for them and not waste all the time communicating, preparing, and interviewing with other companies? I say no, you should interview as much as you can.
The biggest argument is negotiation leverage. When all the interviews are done and the results are received, you'll have a bunch of offers to choose from. When you have all of your offers, the negotiation phase is dead simple and easy, and you'll get paid the absolute top allowed by the respective companies. Every company begins with an offer that can be pushed usually 20% higher with a bit of leverage.
The second argument is that the preparation mostly spills over to other companies. Some companies in my process I did not specifically prepare for, but in preparing for others, it gave me the practice and skills needed to pass their interviews as well. As you add on more companies, the process becomes easier and the preparation time scales logarithmically (You can think O(log(n)) with the number of companies you are interviewing with.
Another argument is that this will give you options so you can choose a job that most aligns with your interests. You may not know your favorite place to work now. After interviewing with many companies, you'll gain data on what you like and dislike about a job. You can use this to make an informed decision to join the best job possible for you.
Most of the interview process is not actual sitting down with an engineer and being graded on performance. Most of the actual interaction you'll have with companies while interviewing is scheduling, communicating, rescheduling, negotiating, updating, and pinging. Contact is one of the three important factors in the interview game. Contact determines success almost as much as the actual interview preparation. Contact can be broken down into 2 parts. The first part is discussing timelines of the interview process and general scheduling. The other part is understanding the specific company's interview process.
The first contact with a recruiter generally just gauges your fit for the role and interests. The first meeting will allow a recruiter to tell you about the opportunity and make sure you're a potential fit for the role. Only interview for what you're interested in. If you're a backend engineer, don't interview for front-end positions (unless that's what you want). Communicate well here so the recruiter can set you up on the right loop. Make sure you communicate what type of position you want and where. You don't want to go through a few weeks long interview process to get a SDE Test role in Virginia if you're looking for a Backend Engineer Role in Seattle. This is also a good time to gauge the company's competence from your point of view as well. If the recruiter doesn't understand the responsibilities of the role you're potentially interviewing for, then the company probably doesn't either.
This is a really good call to filter out companies on from your side. If the company doesn't pay well enough or doesn't have interesting problems/good development culture, you can stop the process here. I had a call with a Microsoft recruiter and ended the interview process with them once I realized they could not reach my desired compensation.
If you have timelines from other companies, now is a good time to tell the recruiter. The recruiter can help speed up the process so you can get interviewed in time to consider the company. When the recruiter asks, "Are you interviewing with any other companies?" this is not a trick question. They are judging how quick they need to move on their side. Be honest. Say, "Yes, I'm interviewing with many other companies. I expect to have my onsites done by X date and I want to make a decision on an offer on Y date." The recruiter's job is to help make this happen.
The recruiter will generally give you some reasons to join the company and why it's a good time to join. Write these down in your notes. Write down everything that could influence your decision in the future. You are going to be so busy that you'll forget almost everything that you don't write down.
The recruiter will usually give you an overview of the interview process as a whole. This is typically an Online Assessment (sometimes), a phone interview (sometimes skipped), an onsite, and then team matching (sometimes). Write down this process. Make sure you understand as much as possible at each step so you can properly prepare. For the OA (Online Assessment), how many questions is it? How much score to pass? What is good preparation material? These are all questions the recruiter can help answer.
The overall most important question to get answered out of this call is how long the timeline is for the interview process. Make sure you fit this timeline with the other companies that you're interviewing with, or you'll waste your time interviewing with a company that you'll never have a chance to consider.
You need to be organized. Use any system that allows you to keep track of every important thing said in every call with recruiters, as well as a calendar system. I had a folder for my interviewing, with subdirectories for each specific company. In those subdirectories, I had notes on recruiter calls with dates, interview notes, team matching notes, and offer notes. All of this data comes in handy when you need to make your final decision.
Subsequent contact with the recruiter is mostly review and deeper knowledge of timeline and process questions from the call. After passing the phone screen, you'll get a call for discussing onsite and what that looks like. Like the other call, write this down.
After the onsite, you'll get a call to let you know you're approved for hire. This call will discuss the process from here, which is typically team matching. Typically this call will be the first time you need to talk compensation numbers. I'll leave more information about this in the negotiation section.
Depending on the company, you may have a team matching step. These will be calls with hiring managers to discuss the teams and working culture. These are extremely important calls, so make sure to take notes. Take notes on what the team does and if it is interesting to you. Don't only take notes about what is said, but also about how the hiring manager acts. Here are some of the most valuable notes I took during a few of these calls (Each note is from a separate call):
These are not things the manager said. This is how I felt in those 30 minute video calls. I don't care how cool your team is, I am not working for a manager who is arrogant and doesn't let me talk. On the other hand, I can forgive some lacking software development processes if the manager is really nice and easy to talk to. Everything is a trade-off on a team, so take notes so you can properly evaluate later.
Come with a list of pertinent team questions. If you haven't worked on many different teams, it can be hard to know what you like about a team. Here are some questions I asked during these calls to get a sense for the team culture (most of these were suggested by my brother):
Hopefully with this information, you are ready to optimize contact during the interview process. The big takeaways are simple: Write everything down you can and be organized in your scheduling and note taking. The recruiter's job is to help you get an offer and join the company. Give them the data they need to help make that happen.
This is the section I believe most people tend to be concerned about. I will go over a general guidance on how to study to efficiently prepare for a specific company's interview process, and a general interview. After a couple weeks of focused preparation, you'll be ready to crush any interview. The steps for preparing for an interview are general preparation and individual research/ preparation.
One tip for that helps in all interviews: Be pleasant. Be smiling. Be in a good mood. Communicate well. Wish the interviewer a good day. Be interested in what they're saying. Software engineers like the idea of meritocracy, but there's another evaluation parameter that isn't considered enough. The people you're interviewing with need to want to work with you. You spend half of your waking hours with your co-workers. If you are an extremely fun and pleasant person to be around, you will get more help, hints, and be graded easier than if you're an asshole. Be a person that someone wants to be around and you'll have an easier time being hired. Every interviewer that you meet should leave the interview with a smile.
Every interview round will have some time for your questions at the end. Use this time well. Ask pertinent questions. Take good notes. You can use this information later for deciding which offer to take. Typical questions I ask are software development processes that affect the workers. I also ask general company policies like, "How easy is it to switch teams?". Use this time and take notes, because you can gain a lot of information on if a company is a good fit from talking to the engineers.
Preparation for interviews comes down to Leetcode, System Design, and Behavorial.
Almost every interview process will require you to be fluent in communication and coding. You should be able to fluently write code to solve a problem. Leetcode Easies should be quick for you. You should have a high batting average on completing a new-to-you Leetcode Medium in less than 45 minutes. I can not do most Leetcode Hards without a lot of time and usually some peeking at solutions.
One important aspect of practicing Leetcode for interviews is communication. It is not enough to solve the problem. You need to communicate effectively with the interview. When I practiced Leetcode, I would explain my thought process to my monitor before starting, and then babble a stream-of-consciousness while coding the actual solution. I do the same thing in interview situations. Many times I would begin down a bad path and the interviewer would course-correct my solution with a hint since I was communicating with them. This is essential for passing interviews. Many companies grade you on your communication ability, so practice it as well.
For preparing for Leetcode, choose the language you want to interview in. Do something that you're very comfortable in and that most companies will allow. I recommend Java or Python, but usually Javascript, C++, Go, and more are acceptable.
When attempting a problem, give it a solid effort before peeking at a solution. Try coming at the problem with different data structures and approaches. If you can't figure out a working solution, look at the "Tags". This will just be a general approach, such as "Greedy", or "Dynamic Programming". See if you can solve it just with this hint. If you're still stuck, take a look at a solution and fully understand it. Read through it and fully understand it. Then try to close it and implement it on your own without copying anything. Don't blindly type out the exact same solution. You're looking to internalize the thought-process and approach of the solution into your own ability. This will allow you to solve problems like this one in the future.
You'll know you're ready when you can complete new-to-you Mediums in about 30 minutes and even some Hards in less than an hour.
System design questions are typically asked to mid-level and more experienced engineers. These conversations are more open-ended but still very technical. There's plenty of material on how to prepare for these questions online. My favorite material was watching all the videos of this channel. https://www.youtube.com/c/SystemDesignInterview/videos
I watched the videos during lunch and I paused at certain points to consider how I would solve problems before the presenter's explanation.
Another good channel for some specific, very common problems is this channel https://www.youtube.com/c/GauravSensei
If you don't have previous system design experience, consider reading some books and doing some mock problems.
The SystemDesignInterview channel's videos can explain much better than I can about the process, so I will leave this section at that.
There will typically be one or more rounds of questions about experience and projects, which I lump into behavioral. Typical questions are going to dive into scope and complexity of projects, your experience mentoring, cross-team influence and communication, leadership, and more. What the interviewer wants out of this round is to verify you have the experience required for the level you're coming in at. If you're interviewing for a senior role, but you've never had to lead a project with cross-team collaboration, you'll probably not have the required experience to pass for senior.
To prepare for this round, the recruiter should give some guidance about the round. Write down specific projects and experiences that relate to typical questions and have those notes ready. Some typical themes you'll see are:
Behavioral rounds rely on your experience. Make sure to review your past experience and be ready with some data-driven examples for these rounds. They will either feel easy or impossible, since these rounds are not really something to prepare for beyond explaining past experience.
Once you know the companies you'll be interviewing for, you can look up more about the process to understand as much as you can. If you come prepared with knowledge of the process and typical questions, you can perform better. When researching companies, I used 3 resources:
With these resources, you can get a further insight to how the process might look. Sorting questions by company frequency and doing the most common 20 questions in the last year will prepare you surprisingly well for potential coding questions during the interviews. Look up typical System Design questions and practice some of those. Google around to see if anyone posts some more detailed experience of the interview process to know what you're going to go up against. Through my preparation, I was asked many questions which were similar to ones I had previously practiced. Since I learned the strategy for a similar question, I could extend that solution in the new scenario and pass the interview.
To perform well in the interview, it really comes down to research, preparation, and communication. Research the companies you'll be interviewing at. Practice their specific questions. Be or become fluent in programming Leetcode Mediums. Communicate well. Be a pleasant person. Take notes.
To summarize: We've gone through the interview process for multiple companies. We took good notes along the way. We know all about company culture, potential projects, tech stacks, and have a good amount of questions answered. We've gotten through most or all of our onsites and have a general feeling of how we did. Now the decisions are starting to come in. Typically a company will have a decision and will draft an offer afterwards, but sometimes they can come at the same time. Let's dive into navigating this part of the process.
I'll give a general motivation for negotiation that I don't see mentioned much. If you don't negotiate to the highest level possible, this will build resentment in doing your job. Imagine if you come in making less than everyone else for the same job. You'd most likely be much less motivated to do well. You need to be paid the absolute highest possible to you're motivated to do your best work.
If you need some other background on being motivated for negotiation in general, I recommend this blog post: https://www.kalzumeus.com/2012/01/23/salary-negotiation/ I recommend reading that entire post because it really puts a good frame of mind for the negotiation portion. The essential take-away is that a few minutes of uncomfortableness can mean the difference of many, many thousands of dollars. I used to shy away from negotiation, but now I find it fun and exciting. My favorite part of the interview process is the negotiation step.
Negotiation is very similar to the communication step. You'll be talking with a lot of recruiters. You'll be taking notes. You'll be scheduling meetings on the calendar. There's not much more to say on those specific skills. The difference is the end goal. At the end, you want all the information you need to make a decision.
One important overarching fact is that the recruiter is here to help you. The recruiter is only evaluated on getting you to start working at the company. They will do everything in their power to get you to sign. They have no incentives to offer you less than you're worth. A recruiter will take data about a candidate to a compensation team for them to craft an offer. If you can give that recruiter extremely good data on why you need to be paid the absolute maximum, then the recruiter can help you. A remaining important fact is you need to be extremely pleasant and excited. Recruiters who sense your excitement and enjoy talking with you will work harder to get you a good offer. If they believe that all they have to do is get you the absolute highest offer they can and you'll sign it, then they will do everything they can to make that happen. They are your friend in this negotiation process, so give them the (positive) data they need to help you.
Many times recruiters will ask you for a salary number that you're looking for. It helps to come to these conversations with a good amount of data. I highly recommend looking at potential companies and levels at https://www.levels.fyi/ Your goal is to top whatever the highest offers are for your company and level. Don't worry about compensation details that are from employees who are currently at the company. They are not relevant, because current employees will be paid less than outside hires, or internal employees will have RSUs that have appreciated to make their compensation unattainable for external hires. When recruiters ask you for a salary number, you should try to not give a concrete number. The reason for this is that the recruiter will come back with an offer for that concrete number and then there's no negotiation left. You don't want a concrete number. You want the absolute highest that anyone can possibly pay you. I got to the point where I had 6 offers and no concrete numbers. I kept saying, "I'm waiting for more data to be able to give a range of what I'm looking for." Eventually I had to force a recruiter to give me an offer.
If you get to the point where you have no concrete number and a lot of recruiters waiting for a number, you can try the following approach. Get the needed anchoring point. Out of all the companies you've interviewed at, you'll get a pretty good idea for a range of numbers. Say a vague range that is one step higher than you think you deserve. For example, if all the offers coming in cap out at around 300k, then say you're looking for mid-high 300's total compensation. You'll be surprised at what you can get.
Specifically how I got my first concrete numbers is I told a recruiter the following: "I have 6 offers, here are the company names. Everyone has expressed interest in negotiating based on other offers. My range is X+1 (where X was the highest for the level based on levels.fyi). I'm most excited for your company and it's all just about making the numbers work now. I'm very busy and I don't want to play the back-and-forth game of talking to all the recruiters and bringing offers around. I'm sure you don't want to play the game either. Even though I don't want to play, I will if I have to. I would appreciate if you come to me with the absolute highest you can do considering I have 6 offers from very good companies who are all looking to negotiate. If you can come in with an acceptable offer, I can make my decision quickly after that and I'll be excited to start on X date working at your company. If your offer is not good enough, I will have to play the negotiation game and we can work up to an acceptable number from there."
This ended up working and the recruiter came back with a top of the line offer. Every other conversation was now based off of that offer. One point to make is that that initial offer was essentially non-negotiable from there. They already came in at the highest, so I couldn't negotiate further. I'd recommend this strategy with a company that is not your first-pick of employer.
The main takeaways:
Negotiation is easier the more strong companies you've passed hiring for.
The recruiter is on your side to get you to accept an offer. Give them data that works towards getting you the highest offer possible.
Read up a bit on negotiation strategy. The linked blog has a good mindset for negotiation that will get you the most possible. A couple uncomfortable 5 minute conversations can be worth many thousands of dollars. Have these conversations to the best of your ability.
You want a good job that pays you the highest possible. There are three things you need to make this happen.
Be organized so you can interview at a lot of companies. This will give you many options to have a good job. Take notes so you can review later and find the company you'd most want to work for.
Prepare well and specifically for those companies. This will allow you to pass interviews to give you more opportunities and choices.
Now that you have many opportunities, leverage this to get paid the most possible. This will make the company you want to work for pay you the absolute highest they can.