There is a lot of software out there which is developed in an unprofessional way.
Here are my rules on how to hire and recognise a professional software developer:
The TL;DR; version. A professional software developer is like a black box: you make the order and he gives you a piece of good software. Whenever you change the order, he already expected it so he’s quick to give you a new product without complaining. He keeps the annoying details to himself and delights you with new features.
A professional software developer:
- Has a suite of unit tests which covers all of his code and provides certainty that the code works, and those tests run instantly. Those tests keep his code clean, so if you decide to give the project to someone else, that person can pick it up instantly.
- A professional software developer makes use of his unit tests to vastly reduce the number of manual testers needed for his team. Manual testing is hard, error-prone and expensive. He is annoyed when a bug passes through his unit tests and makes sure it doesn’t happen next time.
- A professional software developer always keeps a decoupled architecture. The User Interface is decoupled from core logic so he is always able to change the UI with almost no architectural changes. He is also able to change the database storage mechanism, from a txt file to a sql file, without major architectural changes. App architecture should not depend upon storage mechanisms, frameworks or UI.
- Keeps the code on his main branch in an always-shippable state. He works on a separate branch and only merges that code when the feature is ready. Thus he can always show his work.
- He is accountable and responsible. A professional software developer makes all the technical decisions himself and only informs clients of what they need to know feature-wise. He does not relegate technical decisions to managers or clients and then complains when they make the wrong decisions.
- He provides optimal software and accurate estimates. He tries to make the best product for you.
- Is well informed and keeps up to date with the technology stack he is working with.
- Does not hold religious beliefs about languages or frameworks. His knowledge covers at least a few truly different languages/ platforms.