Saturday, December 23, 2006 

Infrastructure and Superstructure

A few months ago, in his column on IEEE Software, Grady Booch came up with an interesting distinction between:
- intentional architecture ("explicitly identified and then implemented")
- accidental architecture ("emerges from the multitude of individual design decisions that occur during development,")
( - to these, I would add "no architecture", when the accidental architecture has no internal coherence, but more on that later).
I've been using those terms since then, but recently I realized that I would prefer to use Structure as the foundational term. Architecture (from Greek, αρχιτεκτων, "master builder") is an act of will; in this sense, it's always intentional. Structure can be the consequence of several unrelated decisions. Lack of structure is the byproduct of unrelated and inconsistent decisions.
So, what Booch calls "accidental architecture" I would simply call Structure; "intentional architecture" is indeed "intentional structure", or Architecture tout-court.
Structure can also be found at finer granularity, and it makes sense to say that although we have no Architecture, some modules are well Structured.
We also use the term Infrastructure quite liberally, while its use should be somewhat constrained, as the implication of a real infrastructure is that it soon disappear from conscious thought processes. If you have to think about it all the time, it's not an infrastructure.
Indeed, quite recently one of my clients told me "with this infrastructure we built, we have a foundation for further developments". Which would be nice, except that what they build it's not an Infrastructure: it's a Superstructure.
Now, the difference between an infrastructure and a superstructure is that the superstructure is built upon something else. Quite often, in software development, that "something else" is relatively ill-structured, and the additional layer is supposed to bring some order to the chaos.
The dark side is: unless you can remove all access to the underlying layer (that includes calls from existing software) you're not building an infrastructure. Unless you have to go through it, it's not an infrastructure.
If you have to be consciously aware to use it properly, if you constantly have to pay attention, if you can bypass it by mistake, it's a superstructure, not an infrastructure.
Note that a superstructure is not inherently bad: quite the opposite, the ultimate goal of an infrastructure is to be the foundation for a superstructure. However, when we mistake (or sell :-) a superstructure as an infrastructure, we're in for some major headaches...
Mi sfugge qualcosa: perché una infrastruttura deve nascondere completamente ciò che sta a livello più basso?
Da come la intenderei io, una infrastruttura è un insieme di strutture o sovrastrutture "distribuite" che, prese insieme, forniscono funzionalità essenziali ai livelli soprastanti. Mi sembra più vicino al significato originale del termine infrastrutture...
Ottima osservazione, nel senso che non spiegavo perche' dovrebbe farlo. Anche se le argomentazioni sono un po' metafisiche, provo a farlo in un post dedicato.
Post a Comment

<< Home