I believe it was my first ever visit to the US. I was in the Windy City in December, rapidly developing an appreciation for the true meaning of the phrase "wind chill".
I was staring at a sign in a parking lot which said:
No parking South of this sign.
The US is the only place I have ever been where signs contain the built-in assumption that the reader has a real-time appreciation of their location in compass coordinate space. I am always amazed at the way colleagues in the US carry this information around in their heads without having to think about it.
I wish I had such a thing, however I have no such gift. Perhaps for this reason, I like to walk around a city, if possible, on my first visit. I find it gives me a sense of the place that I just don't get from whizzing along in a car. It also, in some way I cannot accurately describe, orients me to where I really am. Gives me a coordinate system to work from.
Needless to say, this shoe leather approach to self-orientation works better in some US cities that in others. Its not easy to walk around, say, Los Angeles or Houston. It works well in places like Boston and downtown Manhattan though. No prizes for guessing what my favorite places in the US are.
Regardless of whether you find it natural or have to work at it (like I do), establishing a coordinate system for the real word is vital to navigating through it. In computing, we have many, many virtual equivalents of such coordinate systems. Just as with their real world counterparts, if they are taken away from us, we become disoriented very quickly.
Take web design for example. Practitioners in this art like nothing better than a fixed coordinate system they can work to. They love to be able to say, for example, that the screen is at least 800 pixels wide by 600 pixels high with 256 individual colors. Increasingly, with the Web, it is hard - very hard - to establish any coordinate system that is a safe absolute from which to work. We have no control over screen size, window size, color depth, fonts, pixel ratios. Heck, the "text" may not even be visible if a voice browser is being used to access it!
In the ideal world, web designers would be able to work without any fixed coordinates. In reality, doing this is hard. No, for "hard" read "impossible". No wonder we see so many web sites, so many systems that work with any browser as long as it is browser X. Nailing your colors to a particular browser establishes a plethora of coordinate spaces that makes the designer's job easier.
Elsewhere in the computing department, there is another group of people heavily enamored with fixed coordinate systems. Namely, the software architects, engineers and developers.
As a collective, we software types probably carry around more fixed coordinate systems than most. They manifest themselves in the real world as "platform dependencies" and "connectivity assumptions". Each one of these merits an article in itself.
I think the most intriguing fixed-coordinate system in the IT industry is the notion that architecture time is completely separate from design-time is completely separate from run-time.
We orient our work in software into these mutually exclusive phases. Why? To orient ourselves in this fiendishly complex space. Is it a reflection of reality or just a sanity preserving convention?
I think it is the latter. We manage the insane complexity of it all by establishing rigid boundaries between these three phases. Are they convenient? Yes. Do they need to be there? No. Would we gain anything by breaking down the boundaries?
I think the answer to the latter is a resounding "yes".
In my mind's eye, I see every application explode into a myriad of autonomous, discrete services running on the network cloud. Data flows between them, like blood around organs. The processes never stop working just as organs never stop working. If new functionality is required, a new organ is "grown" over a few generations. Over time, existing organs (like a human appendix) are retired, and eventually disappear through gene-passing algorithms borrowed from nature.
Nature never switches off. There is no design-time versus run-time dichotomy in biological systems. Wouldn't it be great if IT systems worked the same way?
Actually, I think we are already on the road - perhaps without really realizing it. We see an increasing fuzzing of the distinction between design-time and run-time implementation.
We have a sugar coated word for run-time design and implementation. We call it "configuration". It is a well known fact that the most powerful form of configuration is a run-time interpreter for a fully fledged programming language. A run-time language allows you to dramatically change the behavior of an application at run-time. The days of the static configuration file are drawing to an end. I predict in the not-too-distant future all configurations will be by means of run-time interpreters of languages such as Python, Jython, Ecmascript and Ruby.
Eventually, we may reach the point where everything is effectively done at run-time. This is quite a few years away yet, but I suspect the day will come when we look upon the notion of "compiling a program" with a statically typed, machine code generating compiler as a quaint anachronism.
I also predict that the day will come when we realize the power of run-time design and implementation. When that happens we will no longer feel the need to deflect attention away from it through linguistic devices like the word "configuration".
Run-time design and implementation will be the norm and will involve assembling existing services on the cloud with new services to yield some new functionality. There will be no downtime, no "build" process, no deployment in the traditional sense. Just modifications to the cloud.
It will not be an easy transition for many in IT whose most cherished coordinate system is based around the idea that implementation happens before you run the program.
It will also involve breaking down a very strong and utterly unwarranted prejudice in the industry against what are somewhat disparagingly called "scripting languages".
Increasingly, these will be seen for what they are. The key to unlocking degrees of flexibility unimagined in statically compiled and deployed applications.