Rome is old. Most buildings look like they are about to fall down, yet they don’t. Every structure has been repaired a million times. Often a single building is mix of old and new; as the owners have extended them piecemeal over a long period of time as needed. It seems like chaos when you first see it. But it shows a very pragmatic approach to building and maintenance. If a building needs extending, it is extended only when needed. If something needs repairing, it gets repaired so that it is good enough – just.
One of the effects of this “as needed” maintenance approach is that if it isn’t needed or used, then it’s not fixed and eventually goes away. This implies that everything that remains working, is used and needed. There are many things that seem to be designed specifically for ease of maintenance too.
The roads are a good example. The narrow alleys and roads of Rome are cobbled stone. In many places they are not even concreted together. At first I dismissed it as a quaint hangover from centuries past. Then I saw some workmen doing some roadwork, fixing some pipes or something. They simply removed the stones, did the work, and replace the stones like lego bricks. This left the road looking like new. In Australia, our “modern” roads are very nice and smooth when they are new, but after a few years, the inevitable road work leaves them with large chunks cut out of them and poorly matching bitumen repairs.
The cobbled roads look primitive, but have some sophistication about them. They are still around because they work as roads, and are easy to repair.
If software was a road, then many systems are like the modern roads we have in Australia. They are very pretty when they are first made, but as soon as any work needs to be done on them they become an ugly mess that doesn’t work too well.
I think a Roman road is the model we should aspire to. It is built for change. It isn’t always obvious how to make software so that it can be changed later. Usually, it comes with experience. Often it is quicker to make software that doesn’t handle change as well. But with experience comes the necessary cynicism and the knowledge deep in the pit of your stomach that the requirements will change. They change because we don’t know enough about them when we start. Usually we have to guess the areas where change is likely.
If we did know everything about it, then the program probably wouldn’t be worth writing anyway. You only need to write software if it doesn’t already exist to do the job you want. So by definition, engineers should always be doing stuff they have never done before. So we should plan for the unexpected.