Why the Best Systems Are Built Like Productive Monoliths

tfc

Hatched by tfc

May 27, 2026

9 min read

83%

0

The real question is not monolith or platform, but where complexity is allowed to live

Why do so many software teams keep reinventing the same painful debate? They split into camps over monolith versus microservices, or framework versus custom code, as if architecture were a moral choice. But the deeper question is simpler and far more useful: where should complexity be concentrated so the system stays legible, adaptable, and safe to change?

That question connects two ideas that often get discussed separately. A modular monolith says application logic can be organized into clear modules without scattering it across dozens of services. An opinionated data framework says teams can build a data platform from common building blocks, then customize the edges without starting from zero. Both are responses to the same pressure: modern systems become unmanageable when every team invents its own structure, naming, deployment path, and runtime assumptions.

The surprising insight is that good architecture is rarely about maximizing freedom. It is about creating the right kind of constraint. The best systems are not the most decomposed ones, nor the most abstracted ones. They are the ones that make the common path easy, the unusual path possible, and the internal boundaries explicit.

Great architecture does not eliminate complexity. It decides where complexity belongs.


The hidden cost of too much independence

Software teams often reach for microservices or fully bespoke infrastructure because independence feels like progress. Each team can move faster, choose its own tooling, and avoid waiting on others. In theory, this reduces friction. In practice, it often relocates friction from the codebase into the organization.

A distributed system can become a distributed argument. One team owns orchestration, another owns data ingestion, another owns schema evolution, another owns deployment pipelines, and yet another owns observability. Every boundary seems clean on a diagram, but the lived reality is coordination overhead, duplicated effort, inconsistent conventions, and failure modes that are hard to trace.

The same pattern appears in data engineering. If every data solution is assembled from scratch, engineers spend their time stitching together a lake, security controls, compute jobs, environment configuration, and CI/CD plumbing before they have even reached the actual business problem. That is not engineering freedom. That is infrastructural tax.

This is why modularity and opinionation matter together. Modularity prevents a codebase or platform from becoming one giant tangle. Opinionation prevents every module from becoming its own universe. The goal is not autonomy everywhere. The goal is bounded autonomy, where teams can innovate inside a shared shape.

Consider a city as an analogy. A city works because buildings can differ, but roads, utilities, zoning, and safety standards are shared. If every building had its own private power grid and sewage system, the city would not be more innovative. It would be uninhabitable. Software systems face the same truth: when every part is unique, the burden of integration overwhelms the benefit of local freedom.


Modularity is not decomposition, it is disciplined sameness

People often mistake modularity for fragmentation. They imagine a modular system as one that has been broken into as many pieces as possible. But real modularity is not about making pieces smaller. It is about making responsibilities sharper.

A good module has a clear purpose, explicit boundaries, and a stable contract with the rest of the system. It should be easy to reason about on its own, but also fit into a larger structure without surprise. In that sense, modularity is a form of compression. It takes a messy reality and expresses it through a smaller number of meaningful abstractions.

This is where the modular monolith becomes interesting. Instead of turning every domain into a service, it keeps the application in one deployable unit while still forcing internal boundaries. That arrangement gives teams many of the benefits people want from microservices, such as separation of concerns, independent code ownership, and clarity of domain logic, without prematurely paying the price of distributed complexity.

The same logic applies to a data platform framework built from reusable building blocks. An opinionated framework does not try to hide all the hard parts. It codifies the standard shapes that recur across projects: data lakes, processing pipelines, multi environment deployment, test scaffolding, and infrastructure definitions. In doing so, it turns repetitive decisions into shared defaults. The framework becomes a memory of previous projects.

Here is the key insight: standardization is not the enemy of flexibility, it is what makes flexibility affordable. If every team must first decide how to create a bucket, wire permissions, manage environments, and deploy Spark jobs, then customization becomes expensive. But if the platform already provides these foundations, teams can spend their energy on business logic instead of reinvention.

The best modules are not just separated. They are disciplined enough to be repeated safely.


Opinionated frameworks are not cages, they are leverage

There is a persistent suspicion that opinionated tools reduce creativity. Sometimes they do, especially when they are rigid for no reason. But the better way to see them is as leverage mechanisms. They turn a few high quality decisions into a multiplier for every future project.

Think about a kitchen. A professional kitchen is highly opinionated. Knives go in certain places. Ingredients are stored in standardized containers. Cooking stations are arranged for throughput. This does not diminish the chef. It lets the chef focus on flavor, timing, and judgment instead of searching for pans or debating where the salt lives.

A strong data framework works the same way. It establishes a common set of primitives and a repeatable delivery path, including the ability to test and deploy across multiple environments. That means less time spent reproducing platform basics and more time spent solving domain specific problems. The framework is not the product. It is the condition that allows product work to accelerate.

This is especially important because data systems tend to accumulate accidental uniqueness. One project uses one deployment style, another uses another. One team stores metadata in one format, another in a different one. One pipeline is testable, another is hand verified. Each exception seems reasonable in isolation. Together they form a swamp.

Opinionated frameworks interrupt that drift by making the default path good enough that most teams happily use it. The framework is most successful when it becomes invisible in the best way possible: not because it does nothing, but because it removes repeated decision making from the critical path.

A useful mental model is to treat a framework as a rail system rather than a cage. Rails constrain direction, but they also enable speed, reliability, and coordination. The question is not whether there are rails. The question is whether the rails are laid along the routes the organization actually travels.


A better architecture principle: shared structure, local freedom

Both modular monoliths and opinionated data frameworks point toward the same architectural principle: shared structure, local freedom.

Shared structure means that some parts of the system should be common across teams, projects, or domains. These include deployment mechanisms, security patterns, testing conventions, and core domain boundaries. These are the places where inconsistency becomes costly very quickly.

Local freedom means that inside those structures, teams should retain enough latitude to solve the specific problem in front of them. The value is not in enforcing sameness everywhere. It is in distinguishing between the parts that must be standardized and the parts that should remain adaptable.

This principle is powerful because it reframes architecture as a design of friction. You want to reduce friction in repetitive, low value decisions. You want to preserve friction where judgment matters, because some friction is simply the cost of thinking well. If a team can no longer make domain level choices, the architecture has become too rigid. If every decision is bespoke, the architecture has become too loose.

A practical way to test this balance is to ask three questions:

  1. What is repeated in almost every project? These are strong candidates for abstraction, templates, or shared modules.

  2. What creates the most operational pain when it varies? These are strong candidates for standardization and guardrails.

  3. What is genuinely domain specific and likely to change? These should remain customizable, even if that costs more up front.

This is the difference between a helpful platform and an overbearing one. A helpful platform knows where to stop.


The strategic virtue of not over separating too early

There is also a broader organizational lesson here. Many systems are made harder to evolve not because they are too big, but because they are too quickly split apart. Teams separate code before they have stabilized responsibilities. They introduce platform layers before they understand the recurring patterns. They design for theoretical scale before they have established actual reuse.

A modular monolith can be a wiser starting point because it keeps the system cognitively accessible while still establishing internal seams. Those seams matter. They allow the team to observe which boundaries are real and which were merely imagined. If a module remains stable and distinct over time, it may deserve stronger isolation later. If it turns out to be tightly coupled to others, then premature extraction would have been a mistake.

The same evolutionary patience is useful for data platforms. A shared framework can establish common infrastructure without freezing the organization into one rigid implementation. Because it is customizable, teams can adapt it as real needs emerge. That is the sweet spot: a platform that is opinionated enough to prevent chaos, but open enough to evolve with experience.

This suggests a more mature approach to architecture maturity. Maturity is not adding more layers. It is developing the judgment to know which boundaries are structural and which are temporary. The point is not to maximize architectural sophistication. The point is to maximize organizational learning without letting the system collapse under its own diversity.

Premature separation creates operational debt. Premature standardization creates product debt. Good systems avoid both by learning their boundaries before hardening them.


Key Takeaways

  • Standardize the repetitive, not the creative. Build shared modules and frameworks around recurring infrastructure, deployment, and operational patterns.
  • Use modularity to sharpen responsibility. A module should have a clear purpose and boundary, not just be smaller than the rest of the codebase.
  • Treat opinionated frameworks as leverage. The right defaults reduce setup work and let teams focus on business logic.
  • Prefer bounded autonomy over total freedom. Let teams customize within a shared structure rather than inventing their own foundations.
  • Delay hard separation until boundaries prove themselves. Keep systems integrated enough to learn where the real seams are before extracting services or rebuilding platforms.

The best systems do not remove choice, they make it more meaningful

The deepest connection between modular monoliths and opinionated data platforms is not technical. It is epistemic. Both are ways of saying that software teams do not benefit most from having infinite options. They benefit from having the right defaults, clear boundaries, and room to adapt where it matters.

That is a more mature vision of engineering than either extreme offers. It is not the fantasy of one perfect architecture for all problems. It is the discipline of shaping systems so that complexity is neither scattered everywhere nor buried in a rigid center. Instead, complexity is concentrated where the organization can actually manage it.

In that sense, the best systems are not really monoliths or platforms. They are carefully negotiated agreements about how a team will think, build, and change together. Once you see architecture that way, the real design problem becomes clearer: not how to maximize decomposition, but how to make coordination cheaper than chaos.

And that is a different way to build software, one that scales not just code, but understanding.

Sources

← Back to Library

Hatch New Ideas with Glasp AI 🐣

Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)

Start Hatching 🐣