User:DKinzler (WMF)/Monolith

What's a monolith? The answer seems to depend on context. Most generally speaking, it's "one big chunk", referring to a lack of modularity. But what exactly makes it "one", and what kind of modularity is meant, depends a lot on what the speaker is interested in.

In software architecture, "monolith" tends to refer to a tangled "big ball of mud" with no clear component boundaries. As software architecture is mostly concerned with reducing static coupling by encapsulation, modularity is achieved by creating and enforcing component boundaries and constraints.

In system architecture, "monolith" tends to refer to a single deployment unit that performs many functions (as opposed to a micro-service, which only performs a single function). As system architecture is mostly concerned with dynamic behavior, modularity typically refers to separation of components into processes that communicate of the network.

Typically, software systems will match both definitions (or neither of them): a single deployment unit tends to get internally tangled; Conversely, a highly modularized component tends to be pulled apart into multiple units of deployment. However, this is not necessarily the case. A "structured monolith" (or "modular monolith") is a piece of software that performs multiple functions, has a modular internal structure, but is deployed as a single unit. Maintaining the internal structure of the monolith takes conscious effort, since it has a natural tendency to degrade into a tangle.

Resources:


 * en:Monolithic application
 * en:Monolithic system
 * http://www.laputan.org/mud/
 * https://martinfowler.com/articles/dont-start-monolith.html
 * https://www.thereformedprogrammer.net/my-experience-of-using-modular-monolith-and-ddd-architectures/
 * https://searchapparchitecture.techtarget.com/tip/Understanding-the-modular-monolith-and-its-ideal-use-cases
 * https://microservices.io/patterns/monolithic.html