I was job hunting recently and went through 50+ interviews and have received 5 great offers. 3 of them are from unicorns in India. Having been gone through the phase of job search in this competitive market, I wanted to share all the experiences and knowledge I've gained through these interviews. I'm sure my experiences are very helpful to many people who are trying to find their first job or switch to their dream company.
Before we start I want to clarify that this is not a quick tips article to get a job. Cracking interviews is difficult and you need hard work and months of preparation for getting a job in this competitive market. That's the truth.
In this article I want to help you understand what is expected from you during a Backend Software Developer job interview & help you create a plan for yourself in your preparations.
Here's what is covered in this article:
- Current Software Developer Job Market
- Different Interview Rounds You Need To Prepare For
- How Can You Prepare For Online Coding / Machine Coding Round
- How Can You Prepare For Problem Solving Round
- How Can You Prepare For System Design Round
- How Can You Prepare For Hiring Manger Round
- How Can You Prepare For Culture Fit Round
- Why Is It Important To Switch Your Job
- Make An Informed Decision Once You Get Multiple Offers
- Struggles Everyone Goes Through During Job Search
- Resources For Interview Preparation
Right now Software is taking over the world and there's a huge demand for good developers across different domains within the industry. It is currently one of the trending job markets & will stay so for the next couple of decades (at least!).
Even though there's a great number of people moving into tech these days, it's still very difficult to find & hire good software developers. So if you keep yourself skilled and updated with new technologies coming up, you'll always be in demand.
According to the US Bureau of Labor Statistics (BLS), demand for software developers is projected to grow by 22% by 2029. To put that figure in perspective, the average projected growth rate across all occupations is about 4%. And skilled software developers earn higher than average salary & get lot of great opportunities throughout their career.
So if you have been thinking about changing your job, this is the right market and the right time.
You can either be a Backend Developer or a Frontend Developer or a Fullstack Developer. All of them have got equal opportunities for growth in terms of skills, salary etc.
I've been a Backend developer throughout my career. So I'll be talking about the interview process, preparations, tips etc mainly for cracking a Backend developer role. But most of it applies to pretty much all the 3 roles.
- Online Coding / Machine coding
- Problem Solving (Algorithms & Data structures)
- High Level Design / Low Level Design
- Hiring Manager / Culture Fit
The way you are evaluated in each round again depends on the role you've applied for and your experience level.
For example if you're interviewing for a Junior developer role, more priority is given to the online / machine coding round, problem solving & LLD rounds. Even though some design knowledge is expected in HLD & LLD rounds, they are not considered very important for a junior developer. Whereas all the rounds + your leadership skills are considered important if you're applying for a more senior role.
Now let's discuss in detail what you can expect in each round & how you can prepare for them.
Many companies want to check your coding skills before they take your candidature ahead. Basically they want to know whether you can code for a given problem or not. In this round you'll be given a timed test on online platforms like HackerRank where you're expected to write code for a given number of questions. More details on how to prepare for this round are discussed in the next section.
Nowadays machine coding round is gaining popularity in which companies want to see your coding skills for a real world application. In this round you'll be given a set of requirements & you're expected to design & write the code within 1.5 - 2 hours.
You don't need to use any database to store & retrieve the data. Just storing in memory is sufficient for this round.
The main factors your code is evaluated on are:
- working solution (number of requirements completed)
- Code Modularity
- OOP Principles
- Design Patterns
- Separation of Concerns
- Concurrency Handling etc
A working solution is very important in this round. Even if your code is well structured and following all the OOP & SOLID principles you will most probably get rejected if you don't have a working solution. So focus on completing the requirements (flows) first. But also keep in mind about all the other factors.
The best way to approach this round is to spend 5-10 minutes to think about the entities, classes, inheritance, compositions that might be needed. Also spend some time on how you would structure your code.
Coming up with a working solution is easy. But a working solution which follows all the above mentioned factors is difficult. The best way to prepare of this round is to practice (with timer) for standard problems like:
- parking lot
- pub - sub queuing system
- logging system
- database management system
- cab booking system etc
Design patterns like Singleton pattern, Adapter pattern, Strategy pattern are most commonly used & good to know about for this round. Also concurrency is another important factor considered. Whether your code will handle concurrent requests without any inconsistencies.
Sometimes interviewers give a lot of requirements which are impossible to complete in the given limited time. This is expected and you should not panic. Just focus on completing the requirements one by one.
Once you complete your solution there will be a discussion for around 30 minutes to go through your code. Interviewers can ask more questions on how different parts of the code can be improved. So if you know you could have written something better, this is the right time to discuss them.
Most companies love to ask Algorithms & Data Structures questions to asses your problem solving abilities. This is not the ideal way to check if a candidate is good but this is the best tool we have right now in the industry.
Most people prepare for this round for a month or two before sending out job applications. Popular platforms to practice for this round are: LeetCode, HackerRank, CodeChef, CodeWars, SPOJ, CodingGame, CoderByte etc. I personally use LeetCode and love the quality of the questions & the forum discussions. Just pick one platform & stick with it.
You should mainly practices questions for below topics:
- Linked Lists
- Back Tracking
- Two pointer
- Prefix / Suffix sum
- Bit Manipulation
- Dynamic Programming etc
Some people get very discouraged during practice for this round. Mainly because they're not able to figure out solutions even after solving a good number of questions.
The best way to practice for this round is to keep a target of 2-3 questions for every single day. Spend around 15 - 30 mins on each question. If you can figure out the most optimal solution that's awesome! But if can't then try to really understand the solution. After a certain time you'll start seeing patterns and you can apply the same patterns to other similar questions. That's when you know you're on the right track.
I have 6+ years of experience at the time of writing this article. Even though I'm not recently graduated & never use most of these concepts in my day to day job, I'm still expected to come up with the most optimal solution in this round.
During my recent job search one thing I noticed is that the difficulty level of the questions asked was lower at my level than for a fresher. I know some of my peers who have 2-3 years of total experience and are asked more complex questions in this round. But again you never know. You should expect the worst & prepare for all the possible topics despite your experience level.
System designing is an important skill for any software developer. As you gain more experience in your career you're expected to design complex systems which are robust, fault tolerant, distributed & highly scalable.
Due to the lack of experience in building a large scale system a lot of engineers struggle with this round. Remember that system design rounds are open ended & there's no one right way to building a system. The interview can go in any direction based on the discussion and the areas that the interviewer wants you to cover. You may have different conversations with different interviewers for the same question.
An example question looks like:
Build a chat service like WhatsApp.
Of course you cannot possibly build a complex system like WhatsApp in just 1 hour which top engineers at WhatsApp took years to design, build & scale. The main focus of this round is to see how you can scope the requirements & design your solution (both at high level & at low level ) for the limited requirements at hand. Many interviewers deliberately keep the problem statement open ended.
- Ask a lot of questions to clarify requirements & set the scope for the discussion.
- Keep both functional & non functional requirements in mind while thinking about a solution.
- Functional requirements are the use cases that the interviewer wants you to design a system for.
- Non functional requirements are consistency, data durability, scalability etc.
System design is typically divided into two rounds:
- Low Level Design (LLD)
- High Level Design (HLD)
This round mainly checks your ability to architect & design high level components for the given requirements.
For example given a problem statement like
Design a chat service like WhatsApp, you need to come up with the different micro services you will need, pub-sub mechanism (if needed), queues, databases, caching etc. The interviewer will ask questions on how data would flow through different micro services in the design, fault tolerance, retry mechanism etc. You can also expect questions around non functional requirements like scalability, data consistency, concurrency etc.
Building a distributed scalable system is hard. You need to think about different scenarios while coming up with an architecture.
Popular questions to prepare for:
- Designing a URL Shortening service like TinyURL
- Design a chat services like WhatsApp
- Design social media websites like Twitter, Facebook, Instagram etc.
- Design cab booking service like Uber
- Design an API rate limiter
- Key Characteristics of Distributed Systems
- Load Balancing
- Data Partitioning
- Redundancy and Replication
- SQL vs. NoSQL
- CAP Theorem
- Consistent Hashing
- Long-Polling vs WebSockets vs Server-Sent Events
Like any other round, you should prepare for HLD round as well. Here's the course that was most useful to me & one the best courses out there to prepare for this round: Grokking the System Design Interview
This round mainly focuses on your ability to design low level components of your HLD. Given a problem statement you should come up with a design with different entities, classes & attributes, inheritance, composition, design patterns, databases, tables & schema etc.
You cannot possibly cover all of these in one interview round. The interviewer may be interested in any one depending on how the discussion goes.
Popular questions to prepare for:
- Design a parking lot
- Design a movie booking system
- Design a car rental system
- Design a database management system
- Design a system like StackOverflow
- Use case diagram
- Class diagram
- Database design
- Sequence diagram
- Activity diagram
- Separation of concerns
- OOP principles
- SOLID principles etc
The course the helped me the most in preparing for this interview is: Grokking the Object Oriented Design Interview
Hiring manager round is generally not that difficult but definitely one of the important ones. Most probably you'll get to meet your future manager in this round. But that's not the case in all the companies. Some companies make any manger take this round & then decide which team you will join at a later point.
This round mainly focuses on knowing about your attitude, previous projects, challenges, strengths & weaknesses, flexibility with learning new technologies & how well you work with their team etc.
In some companies the hiring managers are very technical & may want to discuss the details of your projects to understand if you really know what you've put on your resume. So knowing your current & previous projects in and out is a must. Questions on your projects can be asked in any of the rounds. So be prepared.
If you have questions about the company, projects, employee growth etc this is the right time to ask those. Asking good & genuine question will definitely impress interviewers. So take out some time & prepare a list of good questions to ask during your job interviews.
If all the previous rounds have gone well, this one would just be a formality. Just don't be arrogant with your answers & you should be good.
I have close to 7 years of experience & I'm going to start working in my 4th company starting next month (May 2021). In the initial phase of your career it's important to experiment & work in different companies and domains. I highly recommend changing jobs once in every 2-3 years for the first 10 years of your career.
The main benefits of doing this are:
You will not leave behind the market standard in terms of compensation. The industry is growing very rapidly and the chances are you will leave behind if you are staying in the same company for way too long. For instance the salary that a starting level engineer gets has increased by 100% in the last 5-7 years (at least in India).
You will get to work on different products and thus different domains. Having experience in different domains will definitely help you become a better Software Developer in the long run.
It's not easy to find a new job or switch your job. There is so much of competition these days especially for developer roles & with remote work gaining popularity more people are competing across different locations for a given job.
But hey! You don't have to worry.
If you can chalk out a plan for yourself & prepare hard for a couple of months you can crack even the most difficult interviews. I'm not a very smart person. But I did plan well & was focused for the 2-3 months before I started applying for job interviews. As a result I've been able to crack 5 companies (so far!) & all of them are great ones which I once thought would be impossible to get into.
Also remember that even after months of diligent hard work and preparation you're going to struggle and burnout during the job search phase. There will be a lot of rejection you need to go though before you can crack a couple of them.
So don't lose motivation and don't be disheartened and give up!
Half way through my job search I was so frustrated & hated getting up and giving interviews everyday because I wasn't getting any offers even after doing well in interviews. At one point I thought I will not get even a single offer!
This is normal. Everyone goes through this feeling. Be strong and believe in yourself. Thing will happen eventually.
I know what it feels like after getting a job offer after months of hard work & countless rejections. You feel like you want to quit the job search and join the one company you've got an offer from. Do not make this mistake. Be very focused and get as many offers as possible.
Once you get multiple offers talk to people on LinkedIn who're working in those companies. Even though you can ask questions about the company and the role during your interview process, you'll get a better picture about the company, culture, work load, growth etc when you talk to a current employee on LinkedIn. Send connection requests and talk to people. Get all of your questions clarified before making a decision to join any company.
Hers's a list of free & paid courses that helped me during my job search:
- Tech Dummies Narendra L
- System Design by Gaurav Sen
- Low Level Design | The Code Mate
- Grokking the System Design Interview
- Grokking the Object Oriented Design Interview
- The Standout Developer
- Educative Unlimited (Access to 165+ courses on educative.io)
The article was originally published on my blog. You can find it here.