Why We Started With a Monolith
The standard advice is correct: start with a monolith, split when necessary. In the early stages, shared code, shared database, shared deployment are advantages. A change to the user model updates everywhere immediately. A bug fix deploys once. You don't need service discovery or inter-service communication for features that don't exist yet.
For eighteen months, the monolith served us well. Feature velocity was high. The codebase was understandable. Deployments were one command. The team could work on any part of the system without specialisation.
Key takeaways
- Split along team boundaries, not technical boundaries — services that different teams own independently are the right unit, not services that mirror technical layers
- The three signals to watch for: deployment coupling causes unrelated downtime, scaling requirements diverge significantly, and teams are regularly blocked by shared release cycles
- Extract the service that causes the most pain first — don't do a big-bang split, extract one bounded context at a time and stabilise before the next
Conclusion
The monolith-to-microservices journey is not a march towards correctness — it's a response to specific pressures. Both architectures are correct in different contexts. The skill is recognising when the context has changed.
Enjoyed this article?

Vivek Kumar Singh
Technical Expert · Full Stack Cloud Engineer · Tokyo, Japan