Lock down the expensive-to-change
Data models, identity, and money are the things that hurt to migrate later, so we get them right early. Clean entities, real auth, and careful handling of anything financial are worth the extra days up front.
We also fix the boundaries between major domains early. Moving a function between modules is cheap; untangling two domains that grew into each other is not.
Defer the rest on purpose
Microservices, multi-region, and elaborate caching are usually answers to problems an MVP doesn't have yet. We ship a well-structured monolith and let real usage tell us where the seams should be.
Deferring isn't neglect — it's leaving clean lines so the future split is a refactor, not a rewrite. Good module boundaries make tomorrow's services obvious.
Instrument so the future is data-driven
With logging, metrics, and tracing in from the start, scaling decisions become evidence-based. You scale the part that's actually slow, when it's actually slow, instead of guessing.
An architecture that ages well is one that postpones complexity until the product earns it — and is ready to adopt it the moment it does.