I recently became embroiled in a discussion about what exactly Software Architecture, Software Design and Software Engineering are, and if and how they are different. Despite how often these terms are used in the course of creating software, there seem to be as many definitions as there are people who use them. I have had reasonably durable definitions of these concepts for decades, so I thought I might discuss them in a post.
Firstly, I generally think that in the context of Software Development the terms Architecture and Design, as both verbs and nouns, are interchangeable, with the exception of User Experience Design and Interface Design which I consider different disciplines and domains entirely.
A useful generalized definition of Architecture is the process of envisioning and planning the implementation of a coherent system or systems to meet the static and dynamic constraints imparted by the broadest possible contexts in which those systems will operate over their lifetimes. Not all systems have direct users per se, but when they do Architecture should always prioritize the constraints imparted by its human users.
A foundational dichotomy in traditional Architecture seems to be the relationship between Form and Function, and which of these should be the prime mover. It would seem that the current zeitgeist has Function in the clear lead, and that Form should follow (though you might disagree after looking at the utterly magnificent buildings designed by Zaha Hadid or Frank Gehry).
My opinion is that Form is in fact just Function with a human face.
In meatspace Architecture the human emotional, social and cultural contexts are fundamental to creating buildings that are optimized for their human occupants. Novelty, for its own sake, seems to be something that humans are neurologically hard-wired to receive neurochemical reward for. It does not require a massive amount of imagination to see how, from an evolutionary perspective, desiring new and different might be highly adaptive, particularly when balanced against a similar hard-wiring to need things to remain the same (though they might not be embodied equally in the same individual).
Humans are also significantly emotionally impacted by certain forms. Whether this is culturally informed, or by Genetic or Evolutionary Aesthetics, the apprehension of structural, non-structural, and environmental elements of buildings can and do have very significant psychological impact on the humans who live or work within or around them. For example, the unfortunate emotional impact that Le Corbusier’s architecture had on some of the people who had to live in his buildings is well documented, and one cannot help but be awed by Antoni GaudÃ's Sagrada Familia.
I would assert that Form can be thought of as the sum of several Functional contexts related to Human psychology.
So how does this relate to Software Architecture? Where does Form, artistry and creativity fit in to the design of software systems?
I think it is safe to say that all human endeavors involve some component of creativity. No matter how dry and formal a domain, humans are continually finding new and often “better” ways to do things. And Software Architecture is no exception. Great software architecture does most definitely require and benefit from creativity, though I would assert that unlike meatspace Architecture, creativity for the sake of novelty is a very bad idea in most cases (that I have seen anyway). Recall that I am not including User Interface and Experience in this; I am referring to the design of software systems. And that is also not to say that a computer system, described in diagrams, algorithms or code, cannot be things of stunning beauty. But that beauty is a function of simplicity, rather than novelty in my opinion.
Knowing when and where to be creative, and where to explicitly not be, is the mark of a great Software Architect. All too and painfully often I have observed Software Architects add novelty to a system that ultimately makes that system less stable, usable, maintainable, scalable, perfomant, future-proof and cost effective. Software Architecture is a sub-discipline of Software Engineering after all. When faced with a problem and a set of constraints on the solution, an engineer’s first action must be to see if there exists a canonical solution that holds over the same constraints. If there is, then there is no discussion; the most efficient and cost-effective solution is to use what already exists. Only in the case that the problem and its constraints are truly novel is creativity required. And that creative process must be heavily informed by existing bodies of work that relate to solutions to similar problems.
I like to think that I am an artist, so I fully acknowledge the value of and need for creativity, but we need to endeavor to deploy it judiciously in the design of software systems. We should recognize and reward Software Architects and Engineers for how much code lands up NOT being written!
No comments:
Post a Comment