My wife and I are in the middle of a bathroom reonnvation right now.
This afternoon the installer asked me to verify the placement of the new lighting fixtures, and I commented “I’m glad you’re doing this work instead of me. There are a lot of details I would miss.”
His response I found interesting.
“It’s just a matter of planning everything out. Then testing it every step of the way!”
I hear a lot of talk from two different schools of thought when it comes to software and IT systems design.
To over-simplify, one school of thought says “We should spend some extra time planning our system before we dive in” and the other says “We should work in small iterations, and let the overall design emerge.”
Both are right, of course. These aren’t actually mutually exclusive concepts. My bathroom installer has a plan (which my wife and I helped design). But every day he has a new question, as new constraints become discovered.
Short iterations, and practices like TDD, are not excluslive of good architecture (or even BDUF, not that I recommend it). Short iterations are simply a way to verify frequently that you’re still moving along the right track, and an opportunity to adjust course at the earliest sign of trouble, before it’s more difficult.