I am reading "Fundamentals of Software Architecture" by Mark Richards & Neal Ford. They introduce the notion of an architectural quantum (p 92):
An independently deployable artifact with high functional cohesion and synchronous connascence.
Let's break that apart.
By independently deployable they mean it includes "all the necessary components to function independently from other parts of the architecture". They don't define "to function", but it is stated that "if an application uses a database, it is part of the quantum because the system won't function without it."
By high functional cohesion they mean "how well the contained code is unified in purpose."
By synchronous connascence they draw on a little-known measure of coupling—connascence—introduced in "What Every Programmer Should Know About Object-Oriented Design". Confusingly, for the purpose of their definition, they repurpose the term "connascence" to denote coupling on a higher-level architectural component level, e.g., a software package. Synchronous connascence (coupling) then implies "synchronous calls within an application context or distributed services" which prevent choosing meaningful differing "architectural characteristics" (the author's preferred name for non-functional requirements) for different components. For example, they state: "If the caller is much more scalable than the callee, timeous and other reliability concerns will occur."
I'm a sucker for good definitions with clear delineations (I'm an architect after all). But, at a glance, I see several problems with the proposed terminology:
- "To function" is ill-defined and depends on an ambiguous scope of functionality, which goes beyond the deployed artifact, to consider. The authors imply here that in microservice architectures a single microservice can "function" independently. But, even in an appropriate microservice decomposition, parts of an end-user's workflow will still stop "functioning", even if only temporarily in case eventual consistency is applied, if some of the dependent services are unavailable.
- Is there value in using a different name for the same concept at a different level of abstraction? I.e., connascence vs. coupling? Personally, I always understood "coupling" as a concept which can be applied to any level of abstraction in a codebase, i.e., within functions, between functions, between classes, or implicit knowledge a developer needs to know for two different parts of the codebase (semantic coupling). If connascence is a specific measure of coupling, why overload that term?
- This definition seems to mix architectural goals with a way to classify existing architectural components.
While reading this, I kept thinking: isn't this just a subsystem? As in, "subsystem decomposition", and "deployment diagrams" in UML (emphasis mine).
In UML models, subsystems are a type of stereotyped component that represent independent, behavioral units in a system. Subsystems are used in class, component, and use-case diagrams to represent large-scale components in the system that you are modeling.
Certainly, I appreciate the attempt at a more precise definition, since UML keeps it intentionally vague:
Definitions of subsystems may vary among different domains and software methods. It is expected that domain and method profiles will specialize this element.
But, I have a hard time understanding how the notion of "architecture quantum" can improve architectural discussions (especially given the esoteric definitions it relies on) over pre-existing terminology such as "subsystem", "coupling", "non-functional requirements", "deployment", "microservice", and "eventual consistency".
In what ways is "architecture quantum" more specific or meaningful than "subsystem" or "microservice"?