Software development is a balancing act of spending too little time planning out a project and spending too much time. If we under-engineer the project by not planning enough, then we will end up with lots of technical debt. The result will be lots of time wasted dealing with that technical debt. Think of it as building a house with a really shaky foundation. You end up spending more trying to fix things than it would have cost doing things properly the first time.
On the other hand, over-engineering is also a problem. It is very easy to get into a mindset of spending lots and lots of time planning. The project then gets delayed because people become hesitant to start it. The buzzword for this is “analysis paralysis”. The result is the same as under-engineering: wasted time. Think of it like planning out the foundation for a skyscraper… when you only want to build a 3 story house. Not exactly a worthwhile endeavour.
Cities don’t start off as cities. They start off as a series of houses. The people who built those houses only planned to have those houses. If no one else moves into the area, then those just end up being the only houses there. No overinvestment in planning.
However, what happens when you need a second house? With the monolith, developers essentially attach the second house to the first. A third house is then added. Then a fourth. You start running out of land so then houses are built on top of other houses. Eventually you end up with something like this:
With microservices, you can choose to rebuild it entirely with the confidence that it will not affect your other systems.