In this article, I will show you how to find and hire great software developers. I’ll share my step-by-step hiring guide and will also give you access to the coding tests I’m conducting during the technical interviews.
The Software Developer Paradox
Today, Software Developers, Software Engineers, and Computer Scientists are in high demand. Almost every company is now hiring developers. In the US, Software Developer is the #1 Best Job, bumping healthcare. The unemployment rate is close to zero and supply seems to align with demand. So, hiring Software Developers should be a piece of cake, right?
Well… Not exactly. According to research, hiring good talent is the biggest problem startup companies are facing. Also, according to Manpower Group, Software Engineers have been at the top of the hardest to fill jobs.
That seems like a paradox, doesn’t it? However, if you dig deep into the causes of the paradox, you’ll notice that it actually makes sense. Justin Baker and Matt Yuell have published thorough analyses about the shortage of talent. The most profound reasons for the paradox are the following:
- High demand drives salaries higher. Employees are asking for more money, more days off, more perks, more benefits. Firms will pay 20% above market salary rates for quality talent.
- Lack of experience and education. Many so-called “software developers” have limited knowledge and narrow understanding of the field. Others lack formal education and rely on 6-week coding bootcamps. Good engineers are thinkers and problem-solvers, not coders.
- Companies have no idea what to ask for. Job boards are full of postings asking for “rock stars”, “gurus”, and “ninjas”. Job descriptions are filled with jargon requesting deep knowledge of the latest “cutting-edge”, “super cool”, “right out of the oven” tools and frameworks. Tools and frameworks are like fashion styles: they are outdated after 6 months.
- Some recruiters do a shitty job. This argument cannot be overstated. Recruiters are making cold-calls on LinkedIn or email without having any relevant understanding of the position. Most of them will not research the candidates either. Some of them will tell absolutely nothing about the position. They are rush to spam as many candidates as possible. Recruiting has become a numbers game. A more accurate definition of this practice would be “betting”, not “recruiting”.
I am not an HR person. I am an Engineer. During the past 6 years, I have been hiring developers for my own software agency and I have been helping my clients hire great talent, too.
Do you feel like you connect to these reasons? Don’t worry. Today, I will help you hire the right person for the right (software) job. Not only that, but I am going to share the step-by-step process to find and evaluate great talent. No bets. No prays. More important, I will give you a logical and safe guide to follow. Let’s get started.
Step 1 – Defining your Goals
Before even starting posting on job boards online, you need to clearly and honestly define your business goals and expectations. This is tough, especially if you are not happy with your current hiring process.
Grab a piece of paper and ask yourself the following questions:
- What is the problem you need to solve? The type of developer you need depends on the problem you want to solve. Are you developing a web app? A mobile app? A database? There are many areas of expertise among software engineers. If you are not sure about the business requirements, talk to your CTO or consult a professional.
- When do you expect the new employees to start working? You can’t expect to hire a person and have them rolling immediately. Most people need some time to adjust themselves, acclimate, and be fully productive. Additionally, they may need technical or business training, regardless of their expertise. Some of them may need to relocate. It usually takes me between 1 and 3 months to properly train a new employee.
- What is your budget for the interview tests? Setting aside a budget for the interview will buy you a lot of time and will help you make a safer decision. In my final interview round (see below), I’m asking the applicants to complete a 4-hour test. I value their time, so I compensate them, even if I do not end up hiring them.
- How long are you planning to keep the job posting live? It usually takes me 3 months to hire a good engineer. On one hand, the less time you spend, the less likely it is to find quality candidates. On the other hand, the more time you have a candidate waiting for your reply, the more likely it is for them to lose interest in your company. There should be a sweet spot. This is why I am proposing a coding test that will let you spot good candidates immediately.
It’s highly recommended to write down your answers, so you can refer to them later.
A very common pitfall is asking too much from a single person. Software developers are like doctors: you can’t expect the same doctor to be a heart surgeon, a physician, and an obstetrician at the same time! Similarly, you can’t expect a single developer to do machine learning, front-end development, back-end development, and system administration! If you really need a ton of skills, chances are you need to hire more people.
Stop searching for unicorns. One developer may have a broad knowledge of various areas, however, they can only master a limited and very specific set of skills (known as the “T-shaped” programmer).
You will never find a unicorn developer; because unicorns do not exist!
Step 2 – The Job Posting
The job posting is the first interaction your new employee will have with your company. So, make that interaction count. Remember:
You only have one chance to make a good first impression.
The structure of the ad should be simple and honest. An effective job ad should include the following information:
- Role. Clearly describe what the candidate will be doing when they join your company. Are they going to develop new cool projects from scratch? Are they going to maintain existing projects? Are they going to work on Fortune-500 contracts? Try to picture a nice and bright future to those who’ll work by your side.
- Requirements. What are the technical requirements of this position? This is where you specify the core skill set the ideal candidate should have. Keep it short and meaningful (remember, you can’t ask for too much).
- Salary & Perks. Most companies will avoid writing down the salary they offer. They believe they’ll be able to negotiate at lower rates. I disagree. Specifying the exact salary from the beginning will give you a tremendous advantage: only those who are willing to work for that money will show up! You don’t want to waste time interviewing someone only to find out you cannot afford them. Be honest and upright.
- Purpose. What is the company doing? Why your company exists? How will you help the candidate fulfill their dreams? If you are not Google, Apple, Amazon, or Microsoft, specify exactly what it means for someone to work for you.
One more thing: please, avoid writing about “ninjas” and “gurus”. You may impress a few freshmen, but you won’t impress the truly good guys.
The job ad requests the candidates to fill an online form. This is what I am asking for:
- Name & contact details
- Professional experience
- Source code samples (GitHub/GitLab/BitBucket profiles or equivalent)
I receive approximately 100 applications for a single software developer role. This is a good number for a small company and gives me a big enough pool of candidates.
Step 3 – Evaluating the Applications
If you’ve created an appealing job ad, while offering a decent salary, you’ll receive a lot of applications, too. Going through the applications takes time and you have to do it manually.
Here are the things you need to check on a CV:
- Experience with specific technologies and challenges. This one is simple. If you are searching for database programmers, you need someone who has done databases before. If you are searching for Machine Learning scientists, you need someone who has relevant Academic background and Research experience.
- Source code samples. Many developers either have open-source personal projects or can provide you with code samples from past work. Being able to evaluate their code before engaging in an interview is a huge plus. If you are not a programmer yourself, ask your current developers or CTO to help you with the evaluation of the source code. Keep in mind that a lot of developers do not have publicly available source code (e.g. because they are bound by past employers’ contracts).
- Current employment status and past work. Good engineers are already working for someone else. Get used to it and try to offer them better reasons to join your company. If you search for senior or mid-level developers, check what they did in their current and previous employers. If you are searching for junior devs, check their academic and personal projects.
- Frequency of change. Software developers have the luxury of leaving their current position in search of a better one. Changing employers every 1-3 years is common. However, I usually ignore those who change companies every 6 months. 6 months is just too little time to be of value to any employer. Chances are the candidate is either incompetent or not willing to commit for a reasonable time.
- Passion. I like seeing people who dive into different technologies and I love it when someone is genuinely enjoying coding. I know someone is passionate about coding when I see a lot of personal pet projects.
Things that do not matter on a CV:
- School, college, or university. Some companies tend to hire from prestigious schools only. Do not fall in that trap. Quality talent can be found anywhere in the world. Formal education is important for learning the fundamentals, but great developers are those who are constantly learning new things and improving themselves.
- GPA. Many educational institutions are offering outdated knowledge. The GPA is just a number assigned to a 22-year-old graduate. Moreover, you cannot compare GPAs from different academic institutions. Sure, a “formal” degree is guaranteeing that the candidates know at least the fundamentals, however, it’s telling nothing about their problem-solving abilities. After all, if Google is not caring about someone’s GPA, then why should you?
- Interests and hobbies. Not sure why there are still applicants who mention their hobbies on their CVs. Being a good developer has nothing to do with e.g. playing the guitar or kicking a soccer ball.
I am using LinkedIn, Indeed, and Facebook to accept applications. Candidates are asked to fill in some information in the respective online forms. The forms are then delivered to my Workable account, where I can quickly and easily go through them.
I immediately reject the candidates who try to “hack” the above process. There are a few people who see the job posting and, instead of filling the form, reach out to me personally to make an impression. This way, they are trying to be more appealing than those who will fill-in the requested forms.
If someone is trying to bypass the official application process, it means they are a terrible fit.
Step 4 – The Phone Interview
Out of 100 applications, I select approximately 30 candidates who seem good enough. I ask the candidates for a phone or online interview. I do not let a candidate wait more than 10 days before answering to their application. Having candidates wait for more than a week with no positive or negative reply would make them feel disappointed.
The dual purpose of the phone interview is to a) see if they are a good fit and b) check if they like what your company is doing.
For example, there are candidates who have a career plan in their mind and enjoy the Motion Technology industry. Since my company is doing Motion Technology, I appreciate some interest or passion for the related industries. Other candidates do not care about the industry at all. They tell me “I can work on anything” or “I’ll do anything you say”. I reject those candidates as they seem to have no motivation.
The phone interview should take no longer than 30 minutes.
Step 5 – The Short Technical Test
The next step is to invite the candidate to our office for a short live interview. Out of the 30 candidates who made it to the phone interview, only 10-15 will make it to the live interview.
The purpose of the interview is to test their basic technical competency and verify their communication skills as they work on the technical problem.
First, I am asking about their past projects and the technical problems they have faced in their career. This is an ice-breaker that gives me a lot of insights about the candidate. Several candidates are talking about tough problems that were solved by colleagues. Obviously, you want to hire a responsible person and not someone who’s taking someone else’s credits.
Then, I give them a simple and short programming test and I expect them to solve the problems while explaining their thought process.
All of the candidates are supposed to detect the bugs and solve the technical problems. If they cannot solve the problems, they are not experienced enough for me and their skills are below average.
Most candidates will not solve the problems in the best way possible. That’s OK, given the stress of an interview. This is why I ask them whether they could improve their code, whether they could use a better approach, or whether they could think of significant performance improvements. Good candidates give valid suggestions and make meaningful recommendations.
If someone solves the problems in the best way possible, it’s a sign of an exceptional candidate. You should keep an eye on that candidate 🙂
Even if you are not a technical person, you can download my test, along with my complete rating guide.
The test should take 15 – 30 minutes. The interview could take 1-2 hours in total.
If the candidate cannot come to our office, I’m using CoderPad to test them online.
Step 6 – The Extensive Technical Test [Optional]
Usually, 3-5 candidates have really good technical skills and can also communicate their thoughts effectively. These candidates will pass to the final round.
In the final round, I am giving them a bigger coding assignment. It is a project that will help me test the exact problem-solving skills I need in the required technology. For example, if I’m searching for Unity developers, I’ll give them a test in Unity/C#. If I’m searching for J2EE developers, I’ll give them a test in Java. The test is performed either on-site or at home.
The test is designed to check for best practices in terms of coding and documentation. I allow the candidates to ask me questions as they code. I never give coding hints, but I always elaborate if their question is valid.
Some candidates even provide additional materials without me asking for them (e.g. developer guides), which is a huge bonus. Also, I appreciate those who make the right assumptions in their code and I hate those who write “quick and dirty” code.
I deeply respect a candidate’s time, especially when they have come so far. So, this is always a paid test.
The extensive technical interview would take up to 4 hours.
Step 7 – The Final Decision
So… You’ve published the job posting, received the applications, and conducted the interviews. It’s finally time for the big decision.
If you are lucky enough, you may have more than one good fit. That’s a blessing. It’s harsh to reject a competent candidate, but it’s a great feeling when you have to select among great developers.
This is where the company culture comes into play.
Since you are confident with the technical skills of the candidate, you need to specify whether the candidate fits with the company culture. This is where your subjective criteria and gut feelings are involved. Is the candidate communicating their thoughts effectively? Do you enjoy your conversations? Is she/he an interesting person?
After all, you’ll be working with that guy for at least 40 hours per week. It’s important to have a nice and joyful day-to-day interaction.
Sadly, many companies value their gut feeling higher than the problem-solving skills and technical competency of the candidate. This is wrong. An incompetent employee will never (ever!) be a good culture fit.
A good culture fit will not save your ass when the servers are down. A skilled professional will do.
You’ve made it to the end of the article… Congratulations! Now, I would like to share the technical test I’m giving to the candidates. The technical test consists of a simple real-world problem the candidate is supposed to solve. Upon completing the test, you’ll know exactly how competent the candidate is. No matter if you are searching for junior, mid-level, or senior developers. I’ve got you covered. Download the test now.
This is what you’ll get:
- The description of the problem the candidate is requested to solve.
- The source code (in Java and C#) you’ll use for the test.
- A thorough evaluation guide, along with a “cheat sheet” to determine whether the candidate is a junior, mid, or senior level developer.