Crystal ball development

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 problems.

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 complexity.

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 here:

“…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.