And yet it is impossible to know all the requirements upfront which is why micro services and atomic functions are so popular. It seemingly reduces the complexity of redoing everything.
For me, the appeal of microservices is the organizational challenges it solves (allowing teams to move and deploy at their own pace).
My current codebase is a monolith because we're a tiny team, but the different parts are not tightly coupled more than they need to be and it doesn't feel slow to change things.