Software are primarily designed for changes.
"...accepting the fact of change is way of life, rather than an untoward and annoying exception." - Brooks, 1974
"Software without changes becomes useless overtime" - Belady and Lehman
Throughout the product lifetime, the labor forces for a system changes from simple to complex:
Design for knowledge changes usually relates to domain or resources measuring via understanding deepness. This includes things like:
Design for reuse changes focuses on capability gains over less production by reusing the existing proven working solution. This saves resources and perform exponentially over time for both computer and human output.
The promise is that the development efforts is getting lesser without compromising the capability, leading an exponential gain in product production lead time, over time.
That's all about changes we need to track of.