Grady Booch IBM Fellow Podcast 1: Current trends in software architecture (5 min 23 sec) IBM software architect kit http://www.ibm.com/developerworks/architecture/kits/index.html In civil engineering, we can identify a variety of movements or genres of architecture. Going back many centuries we can name Egyptian, Grecian, Roman or Romanesque architectures. As the centuries unfolded, new architectural styles emerged which today we label as gothic or Renaissance or Palladian. Around the turn of the century, yet new styles emerged, such as art nouveau or modernism. In contemporary civil engineering, we have the work of Frank Gerry and others that have led to entirely new styles. Being an engineering activity, civil architecture involves the resolution of a variety of forces. First there are the obvious physics forces of tension and compression and all the attendant issues of deadloads and liveloads. There are also the business issues -- cost, schedule, and functionality -- and finally other less tangible issues, such as beauty. In software engineering, being an engineering activity, we can identify a variety of similar movements. For example in web-centric systems going back, in this case, a few decades, the earliest web sites, around the work of Tim Burners-Lee, were very simple ones involving basic formatting and basic hypertext. This led eventually to colorful clients in which we had much more graphics. This then led to simple scripting -- the beginnings of vbscript and Javascript. As those kind of scripting mechanisms became codified, this led to the next generation of web-centric systems and the rise of middleware such as J2EE as manifest in WebSphere and .NET. These then led to the rise of simple frameworks such as Struts, and today, for many web systems, dynamic frameworks such as what we find in Ajax or Java Server Faces or Rubion Rails. As we project forward we can see the beginnings of a new kind of web architecture such as surrounding the semantic web. Just like civil engineering, software engineering involves the resolution of a variety of forces. There are business forces, environmental forces, development forces, operational forces, and even legal and ethical forces. Being an engineering activity, it is the case that in software engineering fundamentals never go out of style, and by those fundamentals I mean the simple principles of building crisp abstractions, devising a clear separation of concerns, building a system with a balanced distribution responsibility, and above all, simplicity, this later of which is the hardest for most organizations to achieve. One thing I observe about watching many organizations, especially the hyper-productive ones, is that there's a very common practice I find among those organizations that are successful and notably absent from those who are not successful. And it's simply this -- those hyper-productive organizations tend to grow a systems architecture through the incremental and iterative release of executables. Now let's tease that observation apart here. First, we see that we have a focus upon executables. Second, we see that these executables are grown through an incremental and iterative release process. And third and the focus of the rest of our discussion here is that those executables are centered around the growing of an architecture. Well, then what is an architecture? We can be sure that every system has an architecture, although in many cases those architectures are accidental and simply grow because of their incremental and iterative development, whereas in some cases those architectures are truly intentional. We can also observe that all architecture is design, but not necessarily the reverse, not all design is architecture. Rather we observe that significant design decisions are the ones that encompass architecture, and by significant I mean those decisions that are costly to change. There is an IEEE standard regarding the description of architectures -- IEEE standard 1472 -- and it states it this way. "Software architecture is the fundamental organization of a system embodied in its components, their relationships to each other, and the environment and the principles governing its design and evolution. Why do we care about software architecture? A process that is centered around growing an architecture is one that is risk confrontive, it's one that focuses upon simplicity and it's one that deals with building systems that are resilient to change. In short, in software engineering, an activity that focuses around the growing of an architecture is very much one that is a fundamental engineering process.