A monolith is one application, deployed as one unit, containing all the features. Microservices split the system into small services, each owning one business capability and its data, deployed independently and talking over the network. Neither is better in general; they trade simplicity against independent scaling and team autonomy.
A monolith is one big restaurant kitchen where everyone cooks everything together. Microservices are a food court: separate stalls (pizza, drinks, desserts) that open, close and hire staff independently, but now they have to coordinate to serve one combo meal.
As a product and its team grow, one codebase becomes a coordination problem: every deploy ships everything, one bug can take down all features, and teams block each other. Splitting by business capability lets teams own, deploy and scale their part independently.
Monolith Microservices
+-------------------------------+ client -> API gateway
| users | orders | payments | / | \
| catalog | search | email | users orders payments
| one database | [db] [db] [db]
+-------------------------------+ (each owns its data; talk via
one deploy, in-process calls REST/gRPC calls and events)
| Monolith | Microservices | |
|---|---|---|
| Deploy | all at once | each service independently |
| Scaling | scale the whole app | scale only the busy service |
| Calls | in-process function calls (fast, reliable) | network calls (latency, partial failure) |
| Data | one DB, easy joins and transactions | DB per service; cross-service consistency via sagas/events |
| Operations | simple | needs service discovery, tracing, CI/CD per service |
| Best for | small teams, early products | many teams, clear domain boundaries, uneven load |