Most of the cost of a system appears after the first release. That single observation shapes almost every technical choice we make: conventional technology over novel technology, explicit code over implicit magic, boring data models over flexible ones that nobody can query.
We design boundaries first. Deciding which component owns which data, and what each one promises to the others, removes most of the coupling that makes later change expensive. Interfaces are written down as contracts and versioned when they move.
Failure is part of the specification. Timeouts, retries, idempotent operations, partial degradation and recovery procedures are designed with the feature, because distributed systems fail continuously in small ways.
Finally, we optimise for legibility. A junior engineer reading a module for the first time should be able to predict what it does. If that is not true, the module is not finished.