Something Interesting Maybe

A blog about software development

On Software Design: Plan for the Future, but Don’t Try to Predict Everything

At the turn of the 20th century, a number of artists in France tried to imagine what the world would be like in the year 2000. These predictions of the world of tomorrow were originally produced for the 1900 World Exhibition in Paris, and showcased how advances in technology would lead to amazing improvements in fashion, agriculture, public transport, and other areas of everyday life.

There were a few cases where the predictions were surprisingly accurate (such as the use of helicopters for military reconnaissance), but there were also many misses.

Consider for example the (aptly-named) “Whale-Bus,” which, incidentally, is a bus strapped to the underside of a whale. The whale provides the propulsion needed to shuffle bored Parisians to work. In the artist’s mind, by the year 2000 whale-powered-vehicles would be at the heart of any well-developed 21st century public transportation system:

A Bus Attached to a Whale

Fortunately for whales, this did not pan out, but it’s actually not difficult to see how the artist might have developed this prediction, if you consider the circumstances and the times he was living in:

  1. Deep-sea exploration was being popularized in science fiction, and interest was bolstered by some of the first scientific explorations of the deep ocean, including the discovery of many as-yet-unknown species of marine creatures.

  2. The automobile and in particular the internal combustion engine were relatively new inventions at the time and were not yet mainstream.

  3. Public transportation was already a well-developed idea in France at the time and a familiar concept.

  4. Whales were more culturally-significant at the time, as they were actively hunted for their oil and blubber, which were used in the making of many commercial goods. The whale-bus have been seen as just another practical use for this well-known sea-creature.

In other words: Your ability to predict the future is limited by the present, and probably more than you think.

There are also a number of likely reasons why this could never have happened, and why it didn’t:

  1. Modern animal-rights groups, and modern societal views on the treatment of animals in general, would have never allowed whales to be used this way.

  2. Much more efficient (and practical) means of transportation were subsequently developed.

  3. As of yet, the Earth has not experienced a dramatic enough rise in sea-level to make undersea travel necessary or required.

  4. Too many people have seen Jaws.

In other words: Circumstances change and you won’t be able to predict how they will affect your current understanding of things.

You Don’t Need a Whale-Bus if a Bus Will Do…

The artists faced a problem that is all-too-common in software development: attempting to predict the future too far in advance.

To be clear, there is definite benefit to planning ahead when developing software, and I would argue that this is actually necessary for most projects: you want to have milestones, goals, and a general sense of direction for where your software is going. You want to have a rough idea of how users will use your software, and you want to figure out if you want to expose a public API for other developers (or for yourself) or not, and so on, and try to plan accordingly.

At the same time, however, it’s easy to get into the trap of micromanaging “the plan”: when you find yourself side-tracked adding features and functionality to your application that don’t solve any immediate problems, or you attempt to solve a real problem in an overly-generic but convoluted or more complex way. In short, you are either creating solutions to problems that don’t exist but you are convinced might exist eventually, or you build grand designs to solve simple problems, usually in the name of “flexibility” or “future-proofing.”

The problem with this approach is that you have to make a lot of assumptions in order to make these design decisions, and the further ahead in the future you go as you try to imagine how your software will evolve weeks, months, years, decades from the here-and-now, the more likely you are going to make choices that seem reasonable now but which will turn out to be wrong.

Since you are more likely to be wrong than right when you try to make projections far out into the future, this also means most of the time you spend trying to predict the future and in turn code “for the future” will be wasted time.

Instead, focus on the present and do what will solve the problem at hand, not the problems that might happen later. Plan ahead in terms of hours and days, not months or years. Plan and allow for change, but don’t force flexibility where it isn’t necessary.

Creating software that can adapt to changing needs doesn’t mean you have to build a highly-configurable system where you expose dozens of checkboxes, dials, sliders, and configuration files to control each possible point of change in the application: the code itself can be written in a flexible way that is easy to refactor as-needed. You can’t predict everything, and you shouldn’t try: ship your product, get feedback, and adapt your software once you get real feedback from real users.

In short, if you need an ordinary bus, just make an ordinary bus. Don’t go hunting for a whale first.