When engaging a software developer to develop a bespoke system, it is tempting to imagine that hiring inexperienced software developers is a smart move that saves money. Experience shows that this is not always the case.
A Bricks and Mortar Metaphor
Imagine you have a ten storey building to build, but due to budget constraints you want pay for each storey as it is completed and only build subsequent floors after the previous floor is built and occupied. You are taking a MVP approach to skyscraper building!
Putting the job to build the ground floor out to tender, you get two similar proposals, from two very different builders. Both proposals have the exact same floor layout, the fittings are identical, the light switches are in the same places. The main difference you can see is experience level of the builders. The first builder has built large buildings before, the second has never built anything over two stories, but they are really enthusiastic! They are also significantly cheaper. The decision is made to go with the second, inexperienced builder.
The builders do a great job on the ground floor. They finish on time and your tenants can move in - they love the building! You are so happy, you employ the same builders to build the second floor and again, everything goes smoothly, the space is sold and occupied and everyone is again happy. Things are looking good :-)
Time to build the third floor! So you call up the builders and start planning - they are super excited as they have have never built a building this tall before! The plan for the new floor goes for council approval and their engineer drops a bombshell: the building’s current structure cannot support another level. To continue building, new superstructures will have to be added throughout the building. The costs are so large that they far outweigh the savings that were made by going with the cheaper builder. In fact it is so expensive, and the end result will be rather ugly, that it’s tempting to rip down the building and start from scratch. Unfortunately, you have spent half your money. If this scenario sounds convoluted and somewhat unrealistic, I agree. But similar things happen in software development all the time.
The World of Software
Take two different software developers: one is experienced, the other is inexperienced. The experienced developer makes healthy use of design patterns, focuses on writing code in an intentional manner, low coupling, high cohesion, good automated test coverage, applying twelve factor ideas and dozens of other techniques. Basically, they follow best practice. The inexperienced developer knows how to get the job done and is unaware of the more sophisticated aspects of software development.
Imagine that these two developers are asked to develop the same piece of software, and both deliver a result that from a user experience point of view is identical: identical navigation, identical fields, identical fonts, identical business rules, even identical bugs. To the uninitiated, the two pieces of software are identical.
Judged from budgetary point of view, the software built by the inexperienced developer is the better result - it cost 30% less to build than the software from the experienced developer who commands a higher salary.
It’s only when you get further into the life of the software that you find that one codebase is clearly superior. The code written by the experienced developer is easy to read and understand. Changes made to one part of the system don’t break seemingly unrelated functionality. The bugs are easier to fix. Upgrades are easier to apply. When the app’s user base grows, the application is scalable. and new features are easier to build.
The code written by the inexperienced developer is spaghetti code that is confusing and hard to decipher. Small changes take much longer than you would like, large changes are impossible without significant refactoring. As the user base grows, the application proves to be difficult to scale and regular maintenance is fraught with danger and requires a huge amount of manual testing to verify functionality hasn’t been broken. Much like the three storey building metaphor, it might be better to throw everything away and start from scratch.
Inexperienced Clients use Inexperienced Developers
People not experienced with software development often have difficulty understanding the importance of code quality on the ability to actually get to the desired end goal. To make things worse, it is next to impossible for a non-coder to judge whether a developer’s work is of high quality, or low quality. Because of this, a lot of the time when people engage software developers, they are heavily influenced by price as that is something that they find easy to understand and compare. To make things worse, the early stages of software projects are the easiest, where rapid progress can be made. A project may go well with the inexperienced developer for the first half of the project, seemingly validating the choice, and giving confidence to continue with the project. It is not until further down the track, that the reality sets in - that most of the budget is gone and the software developed thus far is an unmaintainable mess that nobody wants to work on and takes ten times longer than it should to do anything, making the end goal unattainable.
My recommendation: If you are new to building software and are about to engage a software developer to build a complex software system, choose a skilled developer with demonstrable experience in building software of similar complexity. If you engage someone without experience, there is a real risk that they won’t be able to lay the foundations to reach the heights that you want to reach.