The late Arthur C. Clark famously once said that any sufficiently advanced technology is indistinguishable from magic.
The term 'magic' is one we ruefully use for IT systems too. Of course we cannot
make the system magical but some of the things users ask us to make the machine
do automatically? ... Magic. Sorry. Machines don't do magic.
Sit around with a bunch of engineers reading through a set of system requirements
documents and sooner or later one of their number will exclaim 'Yeah. Right.
And then magic happens!'.
We all have idealized visions of IT systems that are at once totally flexible
and totally automated. We want the system to be smart, to know how to do the
right thing. Oh, and we want it never to allow users to make mistakes.
Therein lies the problem. To paraphrase Arthur C. Clark: any sufficiently advanced
end-user action is indistinguishable from an end-user error.
Let us take a simple example. Imagine a workflow in which three pieces of information
are required from the end-user in order to proceed. Let's call them A, B and
C and let's imagine that they can be either on or off. That leads to eight combinations.
Developers proceed to code for the 8 combinations. That is version 1. Now comes
the flexibility question: 'what if we need another on/off variable, D?' or worse
'what if we want A to have three possible values not two?'. Or even worse 'what
if we need to be able to add new variables on the fly?'.
Well, we could try to make the variables completely configurable in terms of
what they are called, what values they can take and what logic should be triggered
based on the combination of values at any given point. Unfortunately, the only
way to cover all possible non-magic configurabilty possibilities would be to
allow direct change to the source code. Short of that, the best we can do is
make some of these things somewhat open ended. Allow some fields to take arbitrary
values. Make some actions scriptable by the end-user. That sort of thing.
Sadly, the result of this is invariably the introduction of the possibility
for human error. Locking everything down so that the system is foolproof and
fast and correct - and all such good things that appear in most requirements
specifications - is fundamentally at odds with having a system that is completely
flexible - which also appears in most requirements specifications.
Any system that claims to provide all these at once is - unless I have missed
something fundamental - not advanced technology at all. It is pure magic.