"Architecture is a science, arising out of many other sciences, and adorned with much and varied learning: by the help of which a judgement is formed of those works which are the result of other arts."
---Vitruvius, Roman architect circa 40BC (requoted from Wikipedia)
Whever anyone asks me to review or define an architecture, the first thing I am reminded of is something Grady Booch said in a lecture I attended once: " What is an architect? An architect is someone who thinks up really cool ideas and gets someone else to create them!"
Hmmm...very often the "genius" of the architect gets lost in translation, and I end up reviewing code that leaves me thinking that an architect is someone who causes trouble...well, at least in software engineering.
To me an architect is someone who can create, critique, compare, contrast, measure, quantify, qualify, rareify, etc. etc., an "architecture". So what is an architecture (in software)? Again, to cite Grady: "Every system has an architecture. Some are not so pretty." In other words, there is no system without an architecture, and conversely, no architecture without a system. One cannot exist without the other.
As an aside, let's consider the most well-known architectural disciplines --- that of building construction. Here, architects are legends and architectures are obvious! No one would ask: What is the architecture of the White House, or the Empire State Building, or even my house. There are categories, and periods, and patterns, and styles that define an architecture for buildings in telescoping detail. As much or as little detail as is needed for the discussion. If you are a constrcution engineer, the architect drops detailed and standardized (digitized) drawings. If you are an interior decorator, you need only define the style and period perhaps. But everyone knows what it is and why and what makes something a good architecture, and what makes it bad (though taste and preference come into play, anyone can articulate WHY they prefer one to another.)
None of this is true today in software. So back to the question: what is a software architecture. The short answer: the set of constraints on a system's design, and therefore code. The long answer: it depends.
Today's exercise will be one of those "depends" cases. Someone dropped a huge pile of Java code on me and asked me to 1) define its architecture, and 2) redefine a better architecture. Note, that there was no definition of what "better" was. So join me if you will on this excursion through time and space...(check back soon)