You should never procrastinate. You shouldn’t avoid decisions.
But you should always delay making a decision until the last responsible moment.
I learned this concept first from Neil Ford at a “No Fluff Just Stuff” Java conference. He called it “Emergent Design”. Here’s part of his description:
The hazard of Big Design Up Front in software is that you don’t yet know what you don’t know, and design decisions made too early are just speculations without facts. Emergent design techniques allow you to wait until the last responsible moment to make design decisions.
Neil Ford
You don’t know what you don’t know
Over the lifecycle of a creative project, you will discover so many things about the domain you are working in that it is foolish to assume you know everything necessary at the start. Always plan for the possibility that there’s something you don’t know that might be helpful and lead to a better outcome once you discover it. If it’s not necessary to make a decision on a certain aspect of a design, wait! You don’t know what you might discover on the way!
Design decision made too early are merely speculations
Don’t let guesses masquerade as conclusions. Facts make for more accurate conclusions, and better design. The more you discover along the way, the more your conclusions will match the reality of the environment your’e operating in. You may be a good guesser, or a lucky guesser, but it’s really not necessary. Why try to force a decision before it’s necessary when you might be able to decide based on facts later instead of speculations now?
Do you know what it feels like to be wrong? It feels the same as being right. Don’t let that lull you into a sense of safety that your speculations are right.
Prefer facts over speculation
Get to know the “smell” of speculation. The “I think it will probably be…” sort of situations. Get good at making observations, and taking notes. Get good at gathering information as you go. Also be aware of the flavor of decision making that feels important because you speculated that something would be necessary to build. This is a very common wrong-road developers find themselves on in software development. Like a race-car driver who feels like they’re winning because they’re executing every turn perfectly, and taking every opportunity to gain speed and efficiency, only to realize they weren’t on the racetrack. Once you find yourself down that road, all of your efforts may be virtuous and excellent, but if the road is wrong, you’ll be wasting all of your energy. This is commonly warned against with sayings like “Don’t optimize before measurement” or the general phrase we like to say “that’s a premature optimization”. That can also be seen when we build things on the web for users before we even test that they will understand them, or use them in their workflows.
The last responsible moment
I love this concept, which informs us that it’s okay to wait until later if we understand what constraint really makes the decision necessary. Get good at understanding when design decisions are necessary, and don’t decide until then. Once you’ve hit that moment, use everything you’ve learned up to that point to make the best decision possible. You will likely still have some information missing to make a perfect decision. Now is the time to speculate, guess, and make a best-effort decision based on what you know. At this point you’ve actually done the responsible thing and gathered everything that is available, and are ready to make the jump.
Emergent Design
As you build something creative, you will likely find that the answers become clear over time, rather than the deep slog it might take to suss it all out up-front. They will “Emerge” as you decide things, build things, and make observations. I’ve seen this to be true in so many domains: house renovation, software design, woodworking, etc.
So in general, don’t decide something that you don’t have to.
Leave a Reply