Software Deterioration

I recently downloaded a software tool to help me complete a task but upon executing it, it failed to run. Initially I thought it was due to the poor internet connection. I fixed the network but it still won’t run. No error messages, nothing. After a few minutes of trying different things I realised that the software won’t run because a library it relied on was no longer supported by the operating system I was using. Software deterioration is the phrase used to describe this type of situation.

Another name for it is software erosion and this can potentially happen to any kind of software and without your consent. In reality software doesn’t deteriorate but why is it that over time and with no modification made to the code, software slowly starts to drop in performance or get buggy or simply not run? The nature of software lends itself to deterioration. Here are some of the causes of software deterioration.

The figure above shows how software erodes over time. At the start of typical software development there tends to be a high failure rate. As development goes on failure and bugs reduce. The software starts to stabilise. Point 1 represents a major OS update which causes a spike in bugs (which developers fix). Over a short time this evens out but a change in a major library that is relied upon causes failures to spike again at point 2. As development progresses this pattern continues. One can easily see how software can deteriorate into total failure if there is no team maintaining it. Deterioration can also occur with no changes made to the code. The green dotted line shows that even if the software is being maintained it continues to deteriorate slowly over time.

Causes of Software Deterioration

Changes in the underlaying environment: Changes made to the environment in which software is executed increases the probability of having issues. An example is, updates to the operating system may cause a significant change in the environment that it breaks software that worked in previous versions.

Changes in dependencies: Software development involves the use of existing libraries. Libraries abstract complex work and make development faster. The use of libraries also creates a chain of dependencies. Once in a while one library or the other will either make a significant change or fail to keep up with recent updates. Both scenarios may affect any software that depends on it.

Regular software development: Modern software development leans towards an iterative approach. If not managed properly, regular changes introduced into a codebase may render other aspects unusable. In other words, bugs get introduced and are not noticed in time especially for aspects of the software that are rarely used.

Changes in distribution environments: This specifically affects mobile apps that get distributed through third-party stores like Google Play or Apple App store. These platforms frequently introduce new requirements and deprecate APIs which ultimately render normal working apps unusable.

That’s Just the Way It Is (Things Will Never Be the Same)

The software industry is in a constant state of change and this means there are numerous things that can erode software. I believe this is why software engineers are in high demand as the push for innovation drives change and non-trivial software has to be kept up to date. The need to avert software erosion is why businesses retain their software development teams through support contracts. This is done not only to allow for the introduction of new features in the future but to make sure that software that has been built stays fresh over time. If software deterioration wasn’t a thing, then software will be built once and for all.

Further Reading

  1. Software rot (Wikipedia)
  2. Software Erosion (Heroku)
  3. A comparison of software production vs. that of other engineered products (PDF)