Software is malleable and software architecture should not be different (you can read more on that in Don’t let your architecture become the new hardware ). Furthermore, it is hard to peg down an architecture that would serve all future needs since you either don’t know enough about what that end would be, if you aim too high your upfront investment will be too high or both things can be true. Thus, the alternative is to keep the architecture agile, make it evolvable.
How do you do that ?
The short answer is that you change software architecture like you change highways not for example like you change buildings. i.e. you don’t demolish and rebuild rather build bypasses and have awkward interim states but traffic (business) must keep on flowing
For the long answer, I made a series of posts, which you can find below: