More on this book
Kindle Notes & Highlights
by
Neal Ford
Started reading
March 9, 2023
Don’t try to find the best design in software architecture; instead, strive for the least worst combination of trade-offs.
One of the most effective ways of documenting architecture decisions is through Architectural Decision Records (ADRs).
Fundamentals of Software Architecture (O’Reilly).
2017 book Building Evolutionary Architectures
Fitness functions validate architecture characteristics, not domain criteria; unit tests are the opposite. Thus, an architect can decide whether a fitness function or unit test is needed by asking the question: “Is any domain knowledge required to execute this test?” If the answer is “yes,” then a unit/function/user acceptance test is appropriate; if “no,” then a fitness function is needed.
Fitness functions represent a checklist of important principles defined by architects and run as part of the build to make sure developers don’t accidentally (or purposefully, because of external forces like schedule pressure) skip them.
Static coupling refers to the way architectural parts (classes, components, services, and so on) are wired together: dependencies, coupling degree, connection points, and so on.
Dynamic coupling refers to how architecture parts call one another: what kind of communication, what information is passed, strictness of contracts, and so on.
“Software architecture” is the stuff you can’t Google answers for.
the first step in trade-off analysis is untangle the dimensions of the problem, analyzing what parts are coupled to one another and what impact that coupling has on change.
Coupling Two parts of a software system are coupled if a change in one might cause a change in the other.
An architecture quantum is an independently deployable artifact with high functional cohesion, high static coupling, and synchronous dynamic coupling. A common example of an architecture quantum is a well-formed microservice within a workflow.
An easy way to think about the difference is that static coupling describes how services are wired together, whereas dynamic coupling describes how services call one another at runtime.
static coupling analyzes operational dependencies, and dynamic coupling analyzes communication dependencies.

