As an example, imagine we’re an organisation giving out grants for research in some area. We have structured our early-stage software platform in the mvc manner, and are at this point in our development:
Now we want to add the ability for users to write comments on yet-to-be-approved grants. Think about how we need to change the diagram to accomplish that: we will have to extend all three layers out to the right, and add more code to each to support the feature. That’s what happens when we draw module boundaries along technical boundaries. It also becomes clear why Frontend at Scale suggests we need to “move quickly across layers” when this is their idea of how to structure code.
I have a suggestion for how to do it instead, where “moving quickly across layers” becomes unnecessary: build it on core business fundamentals instead.
If we want to add comments to this, we will probably need a business logic column for that, but we would not have to do anything about what’s below the horizontal dotted line. Business concepts rarely change when features change. We’ll plug in our commenting flow using existing functionality among the business concepts.4 Note that I’ve thought about this specific example for all of a grand three minutes, so there are definitely even better ways to do it. I’m not trying to prove my architectural skills here; I’m trying to illustrate a point.
To emphasise how we don’t have to “move quickly across layers” in this codebase, we could imagine implementing the domain concepts as their own libraries. We could even open-source those libraries, should we dare, and maintain them on a separate schedule. We don’t need to move fast with business fundamentals, because business fundamentals don’t move fast.
The difference to mvc is that with this architecture, when we go down through the layers, we get closer to business fundamentals, not to the hard drive.
As programmers, we already know this. We can construct good libraries. Open up your npms, PyPIs, Mavens, NuGets, Packagists, RubyGems, etc. Full of great libraries. That is the type of abstraction that works to minimise maintenance over time. We just forget how to do it once we start developing an application.