I just finished reading the book “97 Things Every Software Architect Should Know”. It contains 97 different articles written on to become better software architects. The authors of those articles were also various, in line with the book’s target of having collective wisdom. However, I kept encountering one common theme through the pages: Change is inevitable; build your systems considering that they become legacy as soon as they’re built. This motto is perfectly in line with what I’ve been experiencing throughout my career and the software principles I hold dear.

Change is eventual. The system you are building today will not be able to provide for the needs of tomorrow. Therefore, it’s good to stretch important architectural characteristics to see how well the system can scale. However, designing a system answering the so-called future requirements does not make sense. After all, future requirements are only assumptions. We don’t know if those assumptions will stay true. That’s why we software craftspeople have a principle to avoid premature optimizations.

Building a system to meet today’s needs is the only logical thing to do. We know today’s requirements. We don’t know what the future is going to bring. However, we do know that tomorrow is going to bring something different. One way or another, the system we build today will not fulfill tomorrow’s requirements. So while we build for today, we also need to keep the doors open. The design should be flexible and adaptable. When the conditions change, the system should change as well. As long as the system is flexible, predicting the future remains a useless and counter-productive act.