When we started building TaskJect, we went with microservices. It felt like the “right” move — modern, scalable, modular.
But… the reality hit hard:
– Too much overhead for a small team
– Local dev setup was a nightmare
– Most bugs weren’t in business logic — they were in communication between services
– Shipping a feature meant syncing across multiple repos/services
So we re-evaluated and did something counterintuitive…
🚀 We moved everything into a clean monolith — built with ASP.NET Core + Razor Pages.
The result?
✅ Faster development
✅ Simpler deployments
✅ Easier testing
✅ More focus on features, less on orchestration
The takeaway: complex architecture ≠ maturity. Sometimes simplicity is the smartest form of scaling.
💡 When microservices actually make sense:
✔️ You have a large dev team working in parallel
✔️ You’re dealing with high-variance workloads
✔️ You need to scale across domains/languages
✔️ You can afford strong DevOps and observability tooling
But for small teams or early-stage products — monoliths are often the better tool.
Have you ever simplified your stack and felt the relief? Would love to hear your experience.
Here is my longish thread about microservices.
https://x.com/_zenman/status/1225649080069525509
These are the exact reasons why I think they are unnecessary for most small to medium size products.
– Most bugs weren’t in business logic — they were in communication between services
– Shipping a feature meant syncing across multiple repos/services
They probably make sense when you're building a large platform.
Absolutely agree with you! Those two points resonate a lot with our experience: most of our headaches were around service-to-service communication, not actual logic.
Also checked out your post on X — really enjoyed it!
I think people often misunderstand "best practice". There isn't one right way to do anything. I've noticed a ton of college grads come in thinking that there is, or expecting to learn, the "one true" way to solve a specific problem. I found myself constantly teaching them that you can never do anything "that correct way" because of constraints and requirements.
We found ourselves building a system to replace our archaic solution that was built about 8 years before. An engineer, funnily enough not knowing I was the one that built that archaic system all by myself, asked me innocently, "Why did they build it wrong? Why didn't they just make it like we're making it now?" I'm not offended. I told them that the system had been in place for 8 years so you could argue that it had actually been overengineered when we expect our software at our growth rate to have a shelf life of about 18 months. That that archaic piece of software in all it's glory was designed to do less than 100 millionth the volume that we had by then and it had also gotten us to where we are, even though it was now the most hated software at the company. Many of the new technologies we were replacing it with didn't exist when it was originally built and we probably couldn't have built it the new way anyway because our team didn't have the expertise and was about 1/50 the size. Even if we were successful in building it then, it would have been too expensive and had too much overhead... we wouldn't exist anymore.
This was going from monolith to microservices. The right answer is not the same for everyone. And it changes over time.
I couldn’t agree more: context is everything. What might seem like a "bad decision" in hindsight was often the best (or only) decision at the time — given the team, tools, and constraints.
We also try to avoid the “one right way” mindset at TaskJect. Our own shift from microservices to a monolith wasn’t about saying one is better — it was about aligning with our current team size, velocity, and what our product needed right now.
Loved the story about your old system — it’s a great reminder that even "archaic" solutions might have done a great job under very different conditions.
Thanks for sharing — I think many builders need to hear this perspective.