Here is a quote attributed to Darwin:
"It is not the strongest of the species that survives, nor the most intelligent that survives. It is the one that is the most adaptable to change."
Right there, for me, is the best definition of software architecture I have seen. Software architecture is whatever you do that allows your system to be adaptable to whatever changes its environments throws at it (scale, hardware failure, legal changes, change of business model, new forms of distribution etc.), better yet Darwin goes to to say
"In the long history of humankind (and animal kind, too) those who learned to collaborate and improvise most effectively have prevailed."
So in his view the keys to adaptability are collaboration and improvisation, which I'd translate it into modern systems as "Communication" and "Experimentation". Communication is THE key to collaboration and a quality lacking in a large number of leading engineer/architects. The core communication skill here is not about communicating what one's particular solution to a problem is, but more a style that is about inquiry, a style that illicit input and views from all significant parties and synthesize them into models and hypothesis and communicate them back and form common understanding (does your architect do that?)
Experimentation is both a personal quality and something that must built into any system as a first class architecture requirement. Experimentation is generally under-valued in architecture discussion. Systems in general have multiple views, the most popular being the 4+1-views, I would add an "Experimentation View", a view of architecture that describes which sub-systems can be experimented with and in what ways, and how would an experiment success be measured. More on "Experiment View" later, but for, I am even more convinced that analogies with and inspiration from biological systems is worthy guide for designing software systems.
2 comments:
Hi Farhang-- An experimentation view is a very interesting lens to apply. I've read a few articles that try to resolve the inherent tensions between formal software architectures and agile methodology; do you see this "view" contributing to such an inquiry? In agile approaches, of course, "generativity" -- the ability of the system to accommodate unexpected reuse -- is typically prized. It would be great to see a method of measuring and thereby encouraging it.
(I'm also reminded of the work of Christopher Alexander, the architect (of actual buildings) whose design-pattern approach was adopted in (adapted to!) software. He talked about "habitability" of human spaces, meaning various kinds of adaptability and resilience to new uses.)
Eve,
My interpretation of agility is the ability to adapt and change fast enough to survive. in other words the ability to evolve. Experimentation is vital to evolution. Nature "experiments" thru random mutation and the successful ones become the features of next generation of species. In systems we have to plan experimentation, preferably in a non-random fashion. So I do think more emphasis on what sub-systems can be experimented with and how (the experimentation view) can certainly be helpful in bringing agility and formal architecture together.
To give you an example, we have a system that measure "similarity" between two accounts (to decide whether they belong to the same real user), this sub-system, from the start, was marked for experimentation i.e. we formally defined how its success is measured, how the system can switch among different candidates and how different population can be tested (over all defining what an experiment is), as a result we can constantly change this subsystem to try to catch up different ways people "pretend" to have different identities. Doing this would be almost impossible without having an "experimentation" view from the start.
Post a Comment