Time, this morning, to return to the underplayed TDD premise called the money premise.
In one phrase:
"We’re in this for the money."
What does that mean? In the software business, like every other business in a long period of very high demand, we make more money when we ship more value faster. Please be careful here. When we say "more value faster", we’re not trying to constrain the possible varieties of value. THIS IS AN INCREDIBLY IMPORTANT THING TO REMEMBER.
There are lots of kinds of value we could ship. We could be talking about more features, more function, more stability, more performance. All of these are values we can ship more of faster with full-on TDD.
I know. Sounds like maybe I skipped my meds, right? How on earth can one approach supply more value faster when the values listed above are so different from one another? (it’s okay, go ahead and back away slowly. I get that a lot.) the answer is actually straightforward. It’s because TDD is currently our best known answer to the challenge of changing layered branching logic, and all of those values depend ultimately on exactly that: changing layered branching logic.
"Making software" is "changing layered branching logic". TDD is the fastest way to do it that we currently have. That’s all it is. It’s not mystical, or ideal, it’s not a slogan we can put over a poster with eagles on mountains. It’s a style of changing layered branching logic.
You want more money? You get more money by changing layered branching logic faster. The money premise is hard-nosed about this. "we’re in this for the money." when you tell me your managers won’t let you TDD because they don’t want you to "take the time", either they or you or both are not understanding the proposition correctly. Most commonly, they or you or both think that TDD is some kind of quality initiative. In other words, that the value of TDD depends on us wanting fewer customer-noticed bugs. This is a misunderstanding, and laboring under it is costing your organization money.
TDD allows us to change layered branching logic at a significantly faster marginal rate. We don’t have to justify paying a higher marginal rate for TDD in terms of one or another of those values, because it doesn’t have a higher marginal rate, it has a lower one.
Now, don’t misunderstand, there’s no free lunch, and TDD certainly isn’t one. There is a startup cost. It’s possible that you and your management are arguing about the capital outlay — the cost of getting us all to a TDD style. We can argue about what that cost is, and whether we can afford to do it now. That, at least, is a legitimate argument to be having. But let me make this clear: if NON-TDD and TDD both had zero capital outlay, one would never choose NON-TDD for any reason, because TDD is faster.
When you go to management & propose TDD, you absolutely must keep the money premise front and center. "at some initial outlay, we will be able to ship more value faster, for your definition of more value, as long as that value depends on us changing layered branching logic." don’t let them get sidetracked on that word "test". That’s just a label. TDD has almost nothing inherently to do with the usual uses of that word, all of which are focused around a specific kind of value. You have to make that clear.
TDD lets us change layered branching logic far more quickly. We can use that speed to add more function, to raise the customer perception of our quality, to improve our runtime performance, to do anything that depends on changing complex layered branching logic.
The money premise: we’re in this for the money. In software, money comes from shipping more value faster. TDD is the fastest current way to do that, regardless of the particular kind of value we need, as long as getting that value means changing layered branching logic.