Creating software is a difficult, time consuming, labour intensive process.
And it doesn’t matter how many tools, frameworks, patterns or processes you have, it will continue to be the case. In fact, throwing more of those into the development process will only make it harder and longer.
Requirements will change. Always. Without question. Because both the customer and developer cannot know what is best until they have something to use and test.
Changing requirements means refactoring. And refactoring means regression testing, to ensure something that previously worked still works.
Testing is needed to ensure what we create works as expected, and that takes time and careful consideration. Automated or manual – it doesn’t matter. Testing takes as much time (or more) as development. In fact, it’s actually more difficult than development because testers need to think of the things that programmers (and architects) didn’t.
The software needs to be secured against hacking and accidental “leaking” of data. And that’s a whole extra “non-functional” layer of development (similar to writing automated tests). What does that mean? There’s a huge amount of time, effort and code required to secure a software system that doesn’t actually contribute to the functionality of the problem being solved.
Usability needs to be considered. That is, considering if the software is “friendly” and usable by the customer. Hint: it’s probably not. This also needs testing. And often a few re-designs. Which in turn means refactoring, and more tests.
There’s also the fast changing pace of software technology. It is increasingly harder for software developers to keep up with changes in languages, tools, platforms and frameworks. This may mean 3rd-party software used to “assist” in building the software could be obsolete before the project is even complete. It can also lead to “analysis paralysis”, where there are so many options to choose from the developer can’t make a decision.
This churn of technology, often driven by a changing security landscape as well as cycles of so-called “best practice”, also leads to a continual need to maintain and update the software, again requiring more testing.
What can we do about it?
Nothing. At this time, in April 2019, I don’t see a solution to simplifying the process or decreasing development time. In fact, I believe the situation is going to worsen before it gets better.
The one thing we can do is acknowledge the situation.
Software development takes a lot of time and effort.
Revision is necessary.
Testing is necessary.
Non-functional code is necessary.
This is the reality, whether you want to believe it or not. So let’s accept it, estimate and quote for it, and educate our customers to the consequences of ignoring it.