You're not going to need it

This principle is a callout to developers to not over-engineer their systems.

Indeed, it is easy to lose yourself in thinking ahead.

Thinking ahead is good, but what I've seen in many cases is the amount of additional effort which is put into creating bridges in the architecture which might not even be needed, or will be needed only in many months or even years.

We should continue to think ahead, but do the most minimalistic steps in the design to address the potential future needs. Most times these are simple things like:

  • naming the class, interface or method differently
  • make a parameter a list/collection, instead of a single value / object

What I also like to (mis)use a lot at the process level is to create a new user story if I see a need. This is where I can dump all my ideas and move on with actually getting things done.

That being said, there's a catch:

The things that you do need, make them happen. If you see a wart in the design, take your time to actually get rid of it.

Just like over-engineering slows you down, also having a shaky foundation can slow you down.