Software development must plot a course between over engineering and insufficient design. In a struggle to avoid over engineering it is possible to go too far the other way. So what if Agile and TDD built a bridge?
Story 1: I want to drive my car over this ravine so I can get to the other side.
Step 1: Design a failing test. A car is driven over the edge of the ravine. It crashes in a spectacular ball of fire.
A simple beam bridge is laid across the ravine. It takes the weight of the car. The test passes. Story 1 is complete.
Story 2: I want to drive this lorry over the ravine
Step 1: Design a failing test. A lorry is driven onto the bridge. Part way over a loud cracking noise is heard and the lorry falls into the ravine.
The bridge is replaced with a new suspension bridge that takes the weight of the lorry. (The cost of Story 1 is effectively written off). The test passes.
An engineer notes that the bridge really ought to have vibration damping on the span and spirals attached to the verticals to prevent vortex shedding. He is told that there is no story for this, that is has a “Design Smell”.
Some time later the storm arrives. The wind howls. We don’t know what failed first but think it most likely the span buckled. (See The Tacoma Narrows Disaster (YouTube))
Story 3: Our bridge must withstand strong winds
Step 1: Design a failing test….