Finding an expert in any field is a challenge.
An academic degree in any discipline, or even a professorship at a university, may reflect that a given person knows how to play the system, but is certainly not a guarantee of true competence.
In my view, the true competence is a combination of
- courage and ability to take risks
- ability to come up with creative solutions
- personal processes in place – how organized his/her work is, his/her time and energy management, how he/she keeps ahead of the developments in his/her field etc.
- ability to effectively work with other people
While the education and experience factors are always mentioned, the other factors are frequently ignored, though, in my view, they are the key determinants of personal and professional success.
Medical errors are the third leading cause of death in the US.
Complexity of advanced distributed software systems is very similar to the complexity of human body. There are so many interconnected components exhibiting occasional failures, and unlike human body, the components themselves are continuously being updated, or even replaced with other components, sometimes not very well documented, and virtually always not 100% bug-free. In addition, the entire computing world’s key technologies completely change every few years, unlike medicine, and to keep up with the state of the art is difficult.
The situation is very similar to finding a good attorney or any knowledge worker where 99% of them are proficient enough for basic assignments but are not capable to address any non-textbook case properly.
Thus, when looking for a software developer, you may find yourself out of luck locally (or maybe not even sure whom to contact) and may consider a remote developer.
Are you looking for a World-Class Dev Lead / Architect or a Regular Developer?
Your team should certainly have a Dev Lead and then a few regular developers.
The price of a top software developer is equal globally since to stay on the top of the game, you have to spend enormous amount of resources and you pay for expertise. Depending on the duration of the project, the usual daily rate is 1500 USD and more. While this may sound enormous, the savings this person can incur in avoiding wrong choices of technologies leading to increased operations costs usually pay for the person.
If you are looking for a regular developer, then the lower wage countries, such as India, may be the ideal target. A very generous monthly salary for a full-time Ruby developer there is about 2000 USD. You will not get a world-class developer, but depending on the home culture of the developer (some cultures are more results oriented than the others), a reliable person who can learn.
Remote Developer Options
You may consider (1) a consulting firm based in lower-wage countries or you can (2) try to find the remote developers yourself.
In both cases, referrals from the people you trust are the best sources.
If you decide to find the talent yourself, there are number web sites, such as Upwork or Toptal (I have worked for Toptal for a number of years as a developer) who offer access to very diverse talent pool with very varied hourly rates and expertise. In general, the rates at Upwork are significantly lower than at Toptal. Toptal admission process includes various coding exercises which however do not take into account properly the candidate’s soft skills and even with Toptal a demanding client may not be always satisfied. Always look for the small print – for example, with Toptal it’s virtually impossible to transition a developer from a project with them to your full time employment which makes it not suitable for a Dev Lead role.
What to look for
- Look for reviews from other clients
- Look for relevant professional certifications – it’s one of the best ways to find a person getting things done
- Prefer a freelancer who sells some product – a book / software / course – it’s a good indicator of proficiency
- A person’s communication style is a reflection of the person – just by exchanging a few emails with open-ended questions you can easily assess a person
- Hiring a freelancer who is not a freelancer full-time usually never works due to the requirements of his/her regular employment
- Before hiring or as a part of the trial, give the candidate a 6 hour mock project to see his/her attention to detail, code quality and communication style
- Ask about his/her development setup – what tools he/she uses and what development processes are in place.
For example, if their favorite IDE for Python development is “vi”, then the developer is most likely not very proficient. Indeed, in one of the projects we had such a developer and his judgment’s failures cost the firm tens of thousands of USD.
- If the project requires more than 5 hours a week, do not hire for an hourly rate, but a weekly rate
- Do not micro-manage but have weekly status calls
- Always demand over-communication
- Be careful about imposters
- The best way to identify them is to ask them a question you know the answer to.
Ask some professional developer you trust to interview the person and drill down the person’s reasoning to the bottom if their answer makes sense. For example, ask what is better to use for time series persistence – MySQL or AWS S3? If they break down the reasons by category, follow each of them into the details. If they say that S3 performance is better than MySQL’s one, ask what performance etc. You are not looking for the details but for obvious flaws, judgment and ability to handle stress.
- Watch out for the ability to handle unknown / uncomfortable situations under stress.
When facing a complex unknown situation, instead of analyzing the nature of the problem and addressing it, some people focus on an irrelevant or even artificially created problem and propose a stereotype solution just to do something.
For example, when asked to solve a problem of a crashing application, a developer suggested to replace all Lists with Arrays since in theory they consume less memory (though memory allocation was not certainly the core of the issue). In the same way, some people prefer creating meaningless tests which would always succeed.
- Watch out for the ability to prioritize and put the potential issues into perspective.
In software development, one can achieve identical results in a wide variety of ways and no code is ever perfect. The developer’s maturity is then measured how he prioritizes the open issues. Does he choose the most critical task to focus on or rather spends his time on rewriting code with no real benefit?
- Watch out for the ability to listen and work with other people.
Mutual respect in the team is a prerequisite for reaching peak performance of your team. You should not hire a person who comes and says all is wrong and the only right way is supposedly this. Rather, look for a person who asks for the reasons why the situation is as it is and asks for the team members’ views about his/her proposal and put the impact of the proposed change into the right proportions.
Thus, give the prospective developer a sample code and ask him for a review with a team member.
I remember a developer who came, without asking for any background attached to a git commit a link to an irrelevant StackOverflow article in order to show how allegedly good he is. Naturally, that person’s own code was not perfect either with completely missing exception handling, etc.
- Try to place the candidate on the Dunning-Kruger Effect Curve – people who fire recommendations based upon very little or no information do not tend to be experts
- The best way to identify them is to ask them a question you know the answer to.
- Ask questions about favorite movies / TV series – they are great since people usually like the movies they identify with
- Ask questions about the last 5 books read – they are useful since they show their life priorities
- Sense of Humor is a measure of intelligence and self-confidence and the only way how to survive in high-stress environments
- Be extremely demanding – in my experience, more than half of all remote arrangements fail due to insufficient initial vetting with the client being unhappy about the speed of delivery, or quality of the product or both