Monolith to Service
There is a classic pattern while building successful products. Initially, it’s a relatively tightly focused, designed to fit a specific and well-defined need or interconnected set of needs. When it’s released, it’s great, gets widely used and everyone’s happy. Part of its success is its tight focus. But success breeds opportunity, so new tools, features, and functionality get added. In the classic pattern, these additions extend the same codebase and the application grows.
Each addition to the codebase, each new feature, adds to the complexity of the system and increases its fragility. A simple addition — to patch a security issue, for example — can cause a major headache for fear of cascading knock-on effects and trickle-down impacts. Making upgrades to a part of the system just amplifies the problem. There are delays adding them and pushing them out to a production environment where, especially in the need of security patches, they’re much needed.