Thursday, March 25, 2010

What is Software Architecture - Part I

My job title carries the word “architect” - although my Mom never fails to point out that I am not a real architect like my brother is. This title among the software engineering community in general and in the Silicon Valley in particular almost always is received as an incomplete description of what a person does. People always expect an additional clarification; they give you an inquiring look “… so what is it exactly that you do?”
The title reminds me of “food supplement” industry, unlike drugs it is unregulated and anyone can claim anything from magical weight loss pill to cure for emphysema powder. In our industry too, anyone can claim the title and define it as he s/he sees fit. The title also conjures up images of a two-class software society: a lower class of software engineers who actually code and a ruling, elite class of architects that do not code or even read and understand code– and inevitably overtime lose touch with reality. Out of concern for the latter, some companies even eliminate the title altogether.
But what do exactly architects do?
I try to answer this question by answering the closely related question: What is Software Architecture?
Let me get to the bottom line first and explain later: I view architecture as a discipline that enables system to deal with change in optimally.
There are two key terms in this definition, change and “optimally”.
Let’s start with change.
Non-trivial software is a system, and like any other system is subject to change over time. The change happens in all aspects and along all dimensions: scale, cost, expectations, visibility, criticality, operating environment, competitive landscape, technology, economy, people, organization etc.
One prominent and widely known example of “change” is rapid growth in demand from a software system or what is commonly known as “scale”. Our general expectation of well architected system is to handle the scale gracefully and with no disruption. However some systems crash and need to be fully re-designed for the new level of demand (remember early days of Tweeter ?)
To be presicous, this type of scale is scalability to handle homoginous user i.e. all users of eBay were assumed to be individual buyers and sellers (no medium to large sellers), all facebook users were assumed to be college student or all users of an enterprise system could be assumed to be internal users.
Another example of change is scale of operation or non-homoginous user demand i.e. the system dose not necessary experience a change in volume of demand from one type of users, but has to handle demand from different types of users for example eBay wanting to deal with large merchants, or facebook wanting to open its platform to everyone (not just college students).
These were only two example of change in form of scale. What differentiate a well architected system from a “system that works” is how well systems respond to those changes.
The second key term in our definition was “optimally”. Optimally means the change can be absorbed and handled by the system with no (or minimum) disruption and in other words system is designed in a way that the scope of change is predetermined and extent of it is contained: no crisis, no building the system from scratch, no revolution! They system simply evolves along a smooth path. That is the essence of architecture (at least the software kind).
The pictures below depict the graceful and disruptive response to change:

This one, shows the same change scenario but one where change is handled gracefully, presumable with a well architected system.

In the next post, I will give a few examples to make this view of what architecture is clearer.


jian fei Zhang said...

Hi Farhang

I was reading your MMP blog about commerce OS which led me here,
I would like to share some of my point over your statement "system is designed in a way that the scope of change is predetermined and extent of it is contained".

Scope of change ,or more accurately scope of future change is difficult to achieve.
Firstly, we can't predict all changes, just like you described, so many factors can cause changes to system.
Secondly, scope for future will add more complexity to system, and in turn it will cost more resource than current need, put aside the economy feasibility, if this pre-designed system can fit to future need is still a question.

At some extend, i like the idea of AGILE, Maybe it's just a programming methodology, however, some agile principles can be shared to system design or architecture as well, such as 'Be adaptive, rather than predictive', 'iterative development'.
So looking back to those big company's architecture history, almost every time big change is revolutionary, I think it's a natural process, just like an adult must go through infancy and adolescence, a good architecture must undergo several phases from no architecture to immature to mature to optimally, and i also like the saying that a good architecture is not designed, is evolved.

Revolution(an aggressive way of evolution) is not a bad thing, it's one part of architecture lifecycle, it's the price we have to pay on the way heading to a great architecture.

Just my 2 cents.

Post a Comment