Skip to main content

Software as an Enabler

Over my long, somewhat protracted software development career, I have come across many situations of what I like to call "software as a disabler". Situations in which the software seems to work against the end user using arbitrary constraints or limitations that, to the developer, make perfect technical sense. This phenomenon is perfectly summerised by Little Britain's famous catchphrase "Computer says no".

How many times have you used software that just wouldn't quite let you do what you want to do? A lot, I would wager. Problems such as these often occur due to over-ambitious implementation of requirements, usually at a very technical level. Consider a simple calendar application for scheduling meetings. It makes logical sense that users would not want to be double booked, so a naive developer may put in a constraint that prevents such a situation from occurring.

The hapless end user comes to the software. They have a meeting scheduled with a client on Thursday between 2pm and 3pm. Another meeting opportunity then comes up with another client that can only be between 2:30pm and 3:30pm on the same Thursday. Clearly there is an overlap, and the user would be double booked during that time. The user attempts to enter that meeting, and the system refuses. No matter what the user does, they cannot enter two meetings that have conflicting time slots. The developer has "helped" the user by preventing the situation from occurring.

The end user now has a problem. He knows three facts:
  • He has a meeting between 2pm and 3pm that he cannot reschedule right now
  • He has a meeting between 2:30pm and 3:30pm that he cannot reschedule right now
  • The system won't let him do this, even though he is capable of fixing the problem if he were just allowed to
What often happens in situations like this is that the end user is forced to work around the software. Maybe he sets the meeting to run from 3pm to 3:30pm, and makes a note that it should really be 2:30pm. Maybe he arbitrarily deletes the old meeting and has to make a note elsewhere to contact the first client. Anything he does at this point would be purely for the sake of the system, and not help his real situation in any way. He cannot cancel either one of them at the time because it requires speaking to each of the clients, so he just wants to get the info there and have the time conflict visible. He just wants to put his data into the system the way he wants to. But the computer says no.

The right way for the developer to handle this would be to simply allow it, and have the user interface reflect the double booking. Maybe it would just show a message before adding the data. Maybe it could show the two events occurring side by side (Outlook does this), or it might show the overlap period in a highlighted colour to indicate that a conflict occurs. Anything, in fact, that lets the end user input the data he wants to and see it again later.

This is software as a disabler. Software that projects the developer's assumptions about the "right" way to use the software and forces the end user to conform. Sometimes this is necessary. For example, highly sensitive banking systems or insurance systems might need to put a stop to invalid situations before they occur. Even then there needs to be a system to handle the possibility that the real world might not represent the ideal held inside the computer. This is what software as an enabler is all about. Enabling the user to reconcile reality with what's stored inside the system.

So next time you're building an interface to a system, and you come across a constraint that you think would make sense to protect the end user from themselves, stop and think. Would your change actually provide any solid benefit, or would it just be there to make your life easier by ignoring the possibility that reality is not as perfect as your system requires?

It is a lot more work to allow invalid data to be entered and reconciled, but in the end, that's what the system is for. If the user has to perform all reconciliation work before entering the data in the first place, then your system will be viewed by your users as a waste of time. It would just be an extra step of manual labour to get the data into storage, with no added benefit. It has failed to provide the user with an efficient, possibly automated way to achieve a goal. And if your software is preventing users achieving their goals, it will be consigned to the Recycle Bin.

Comments

Popular posts from this blog

Fairy Lights

Street lights at night can be very pretty. For someone who lives close to the centre of a large city, skirting round the edge of the town centre can provide a host of beautiful views at night. One advantage to using a wide open lens when taking these pictures is the capture of bokeh, or creative blur. An extreme example is shown to your right; a mass of coloured circles that roughly represent the city they are part of. A more subtle example, of course, is in the picture of the day at the top of this post. The lights cluster around the top of the leaves like fireflies, obviously part of a cityscape but at the same time abstract. The extreme out of focus image is a blurred version of the picture on the left. A view over Sheffield from Pitsmoor, looking up Netherthorpe Road and up to the university. Even when the buildings are focussed (roughly; I'm still practicing) the lights take on the shape of the lens's aperture. I try to incorporate some foreground focus wh...

In which I complain that coding standards are a waste of time

Just kidding. I'm not going to rail against coding standards. No, I'm going to rail against the absolute and dictatorial enforcement of coding style guidelines, to the point where a single misplaced curly bracket can fail the code review of a thousand line project before it's even started. I'm going to rail against the fact that many people these days don't actually know that coding style guidelines and coding standards are not the same thing. Coding style guidelines are not coding standards. Coding standards are rules on how to construct software. Rules that have practical and defined benefits. Rules than can be proven to assist in the structured and correct building of code. For example: Do not perform database access in the constructor. All database access should use the framework's DAL. Do not rely on complex instantiation instructions; provide a factory method. Do not inherit from a class in a different module or library; only encapsulate. Avoid sin...

DeCSS on Ubuntu 9.10 and later

It used to be the case that enabling DVD playback on Ubuntu was a case of installing ubuntu-restricted-extras and that was that. Unfortunately DMCA nonsense in the US has buggered that up for all of us and so now there's an additional step. So, without further ado, here are the commands that need to be run at a command line: sudo apt-get install libdvdread4 sudo /usr/share/doc/libdvdread4/install-css.sh Voila! DVD playback a-la Ubuntu.