Desktop-filing and under-engineered applications

I am sure you know all about the desktop filing system. Yes, when you use the desktop as a filing system. This works well to start off with - adding stuff is a breeze. However, as the pile grows:

  • it becomes unstable. Adding new stuff requires a bit more effort to make sure you don't topple the pile
  • it becomes harder to find the thing you want - it's somewhere right in the middle of the pile

This technique is almost very well in practice but never works in theory. The end result, at least for me, is sit down and re-organise everything from the start. It takes time, and effort. But at the end of it, I can find things faster and hopefully have an idea of where to put new stuff. Now if only I could maintain this habit.

But we all know this is all very well in theory but never works in practice.

Under-engineered application

The desktop-filing system is akin to an under-engineered application, where an application is poorly designed. Some hints of an under-engineered system are (quote from Refactoring to patterns)

Data structures may be haphazardly constructed, or even next to non-existent. Everything talks to everything else...Functions themselves may make extensive use of global variables,... are lengthy and convoluted, and perform several unrelated tasks. Code is duplicated. The flow of control is hard to understand, and difficult to folow.

As with desktop filing, an under-engineered system will become expensive and hard to maintain. It becomes progressively slower to add new features, and eventually it topples over.

Why do we under-engineer

Some common reasons given for an under-engineered system are

  • we don't know how the system will evolve, how the new requirements are going to change
  • we work on too many tasks at once
  • over-analysis will waste time and money, and be the death of us
  • we need to add new features quickly
  • that pesky king, the customer, is breathing down my neck and I have to do this now. I will think about the design later.
  • there is no time/budget for refactoring
  • lack of sufficient knowledge on software design

You will be happy to know there is a way out of this mess - it's called refactoring.