Types of Changes

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

Labor Changes

Throughout the product lifetime, the labor forces for a system changes from simple to complex:

  • build by a single person
  • comprehensible by a single person
  • support by 2 or more people
  • comprehensible by 2 or more people
  • community is built

Knowledge Changes

Design for knowledge changes usually relates to domain or resources measuring via understanding deepness. This includes things like:

  • learning curve
  • technical debt
  • complexity vs simplification
  • user experiences
  • etc.

Reusability Changes

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.


Example of Reuse

  • Family development tools (golang-lint, vim, etc.)
  • Web browser extensions (reuse capability of an extension over multiple sites)
  • Linux OS in different platform (phone, laptop, printer, machine, server, etc.)
  • Flavor of Linux

That's all about changes we need to track of.