There’s a well known software development maxim called
YAGNI: “You Ain’t
Gonna Need It”. YAGNI is a general rule for deciding whether or not to implement
something or add complexity. It’s designed to give some resistance against the
temptation to spuriously add features or try to solve hypothetical future
Applying a bit of inversion to YAGNI, you
get something that might be called “crystal ball development”. This describes
the attempt to make magic predictions about the future and apply them to
software development. As with a crystal ball in popular culture, the prediction
is an illusion that leads you astray.
Crystal ball development should be avoided because you can rarely predict the
future effectively enough to make net-positive implementation decisions now. You
either know you need something or think you might need it. In that latter case,
avoid crystal ball development and don’t implement it.
The optionality of this is better. If it turns out you do actually need it in
future, you can just implement it then, with the benefit of more concrete
information. If it turns out you don’t need it, then you have saved effort and
Put another way, I have never regretted keeping something simple or leaving out
potential additions to something. Convsersely, I have regretted trying to add
extras to a project or preempt predicted future work.
I’ve quoted this before, and it is relevant
“…unless your universe is very different from mine, you can’t ‘save’ time by
doing the work now, unless it will take more time to do it later than it will
to do now.”
Crystal ball development is worse than just not saving time, though. It usually
wastes time and makes things more resistant to change in future. In that way it
tends to lead to abstraction castles.
Crystal ball development