I've spent the last decade preaching microservices, but I was wrong. What we call microservices usually means a bunch of loosely coupled and independently deployable units that are actually a misnomer. We need to focus on true functional boundaries instead of arbitrary borders.

The problem starts with how we build them. We draw lines based on technical convenience, org charts, or vague requirements. Systems balloon with unnecessary complexity. Bounded contexts reflect the actual domain.

Take an e-commerce app. Order management, inventory tracking, and payment processing look like natural split points. Then they start talking to each other directly. Order management calls inventory, which checks payment status. You get a distributed monolith that is harder to debug than a clean single-binary app.

Here is a basic Go setup before splitting:

// monolithic.go