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 small consulting firm, like RocketEdge.com, or (2) a consulting firm based in lower-wage countries or you can (3) try to find the remote developers yourself.
In all cases, referrals from the people you trust are the best sources.
Upwork / Toptal
I personally do NOT recommend using these services because of
- poor quality of work you get on average
- the amount of overhead you have to spend on managing the developer and Upwork / Toptal
- and the fact that most software is to be run for months, if not for years, and then you need to have a long-term working relationship with the architect / developer which is not something Toptal / Upwork is designed for.
Most people at Upwork or Toptal work for these firms as a side job meaning after their full time role is finished and would not have enough time every day, so you cannot use them for any production product.
In general, the rates at Upwork (5 – 100 USD) are significantly lower than at Toptal (50-120 USD).
Toptal’s admission process includes various coding exercises (used by other headhunters, too) which however do not take into account properly the candidate’s soft skills, creativity, English skills (your developer may not understand you at all, or you ask him to do A and not B and he implements B and not A!), communication skills and project management skills and even with Toptal a demanding client is usually not satisfied – you won’t find the top league of developers at either Upwork or Toptal. Just the self-proclaimed title “top” for Toptal should be a warning at the very least. 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.
I worked for Toptal for a number of years as a developer and after having brought the firm over 300k USD in commissions have left for a fundamental disagreement over the quality of the work and the treatment of their clients by other Toptal developers which were by no means isolated cases.
In addition, the disagreement confirmed various forums’ posts about Toptal’s lack of any legally required internal processes and about their misleading of the clients.
The disagreement also revealed that Toptal is, to the best of my knowledge, operating illegally, at least in Switzerland – it should have been registered as an employment agency but is apparently not. And the clients of not-registered employment agency are liable to fines of up to about 40,000 USD. If Toptal missed this in one country, they most likely missed it everywhere. One can see from these small things the attention to detail Toptal professes. Finally, this leads to their most likely tax evasions – freelancing companies are from tax point of view employers and are thus liable to social security payments in some countries and you may find yourself embroiled in the tax evasion law suits.
You certainly do not want to hire Toptal if you would be liable to fines of up to 40k USD and if you would spend tens of hours checking with your lawyers if you are not liable for tax evasion or frauds.
While the costs at Upwork or Toptal are lower than the costs of a small consulting firm, you have no guarantee of anything and may spend hundreds of hours haggling with Toptal about the quality of work or maintenance, with your project being rewritten each time from scratch by a new developer.
Successful Freelancer’s Typical Development Stages
Successful freelancers usually proceed through these development stages:
The freelancing agencies typically take a 20% salary cut. Once your skills reach certain level, you no longer feel the need for their services and their rate cuts and decide to open your own shop.
What to look for
- Hire for judgment – while you may not always know all the details your developer will decide upon, her judgment principles remain constant over all her other decisions
- Look for potential – if somebody has never left her home country, maybe she is no willing to take reasonable risks?
- 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
- A person’s nationality and geographic location is a rough indicator of his/her values, life style and judgment – some nationalities are more results oriented than others, if you live in some remote area, you spend more time on fixing your internet connections etc. than the work itself
- Hiring a freelancer who is not a freelancer full-time usually never works due to the requirements of his/her regular employment and you usually end up begging up for her time
- 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. Remember, hiring a developer is usually for a long term – any software needs to be supported for a year or more and one bad hire can cost you too much in wasted resources
- 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, for a week long project, more than 50% all remote arrangements fail and for a project longer than 1 month more than 75% 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