Modular monolith or microservices: choosing on team shape
Microservices solve organisational scaling problems and introduce distributed systems problems. Most teams should start with a well-structured monolith.
Technical debt is a trade-off, not a moral failing. Making it visible and costed turns it into a decision rather than an argument.
Deliberate debt is a conscious choice to ship sooner, understood and recorded. Accidental debt accumulates through inexperience, drift or changing requirements, and nobody decided anything.
Both need managing; only the first is defensible. The distinction matters because it points at different remedies.
“The code is messy” does not compete for priority. “This module causes a third of our production incidents and doubles the estimate on anything touching it” does.
Track where incidents originate, where estimates inflate, and where changes cause regressions. That evidence converts an engineering complaint into a business case.
Ugly code in a stable module that nobody touches and that causes no incidents costs nothing. Rewriting it is effort with no return and introduces risk.
Prioritise by the cost the debt actually imposes. That focuses attention where it pays and prevents refactoring becoming an end in itself.
Paying down debt matters less than slowing its accumulation, and the mechanisms are ordinary engineering practices rather than special initiatives.
Code review that considers maintainability, not just correctness. Tests that make refactoring safe. Architecture decision records so future changes understand the constraints. Time allocated to finish things properly rather than moving straight to the next item.
Where debt is taken deliberately, record it with a reason and a review date. Undocumented shortcuts become permanent because nobody knows they were meant to be temporary.
A consistent proportion sustained over time works better than occasional large efforts. The right figure depends on how much the debt is currently costing.
With evidence: incidents traced to specific components, and estimates that inflate in particular areas. Numbers move priorities; adjectives do not.
Occasionally when the platform is unsupported, when the architecture blocks a strategic requirement, or when the system is small enough to rebuild quickly. It is chosen far more often than it is justified.
Keep reading
Microservices solve organisational scaling problems and introduce distributed systems problems. Most teams should start with a well-structured monolith.
Relational databases handle the overwhelming majority of business workloads well. Alternatives should be chosen for specific reasons.
Complete rewrites fail at a high rate. Incremental strangulation delivers value earlier and carries far less risk.