In software development, experience matters. A former boss of mine used to say “Good judgment comes from experience. Experience is the result of a lot of bad judgment.” Most of my sense of “the right way” to do things has been formed by first doing it in every conceivable wrong way.
In our rapidly changing field, there are seldom “textbook solutions” to problems. The textbooks are out of date shortly after they go to press! Thus, we defend our technical decisions – be it object modeling or database design – by pointing out the flaws in the alternatives. We become aware of these flaws by reflecting on past experiences with the same problem. A successful solution to the problem then produces a design pattern, and a proven design pattern applied to future projects allows us avoid prior mistakes.
That’s perfectly reasonable – mostly. Unfortunately, that can lead to a trap when we forget the original problem behind our so-called “best practice” solution.
I heard the parable about “Cutting the Ends Off the Pot Roast” early in my career. I think it really captures the danger of defending software architecture and design decisions with the simple argument “because that’s how it’s done.” A “best practice” solution applied to the wrong problem is costly.
Cutting the Ends Off the Pot Roast
Our story begins with Bill and Mary – a happy couple preparing dinner for a family get-together. As Bill busily chops vegetables and peels potatoes, he observes his wife cutting the ends off the pot roast she’ll be cooking for the meal. As a programmer, Bill believes every step in a procedure should be deliberate and serve a purpose. So, perplexed at his lovely bride’s decision to chop off and throw out two perfectly good chunks of meat, he asks “We are you cutting the ends off the pot roast?”
“Because that’s how you make pot roast,” she tells him.
“But, what good does it do?” he asks gently, taking care not to offend someone he recognizes as a far more capable and experienced cook than himself. “Does it make it taste better?”
“My mother taught me how to make pot roast, and she always told me to cut off the ends. That’s just how you make pot roast.”
Soon, the guests begin arriving. The first is Mary’s mother. As an accomplished cook herself, Bill always knew it was his mother-in-law’s careful mentorship that turned Mary into the culinary wizard she had become. Certainly, she must know the answer to this riddle!
“You taught Mary to cut off the ends of the pot roast before cooking it. Why is that?” he asked.
“Because that’s how you make pot roast,” answered his mother-in-law. “I learned how to cook by watching my mother, and she always cut the ends of the pot roast.”
Bill married well, and he knew it. His wife was part of a long lineage of masters in the art of fine cuisine. Their experience spanned generations. They had accumulated a wealth of skills and knowledge that could compete with all the great chefs of the world. Certainly, the step of cutting off the ends of the pot roast must be some long held secret to dinnertime delight! But why? How does it help? Does it enhance the flavor? Does it make the meat more tender?
At last, the family matriarch arrives. Mary’s grandmother, the inspiration behind three generations of pot roasting perfection, is greeted at the door. It was Bill’s last hope of understanding the most mysterious step of this family recipe.
“Grandma, you taught Mary’s mother to cut off the ends of the pot roast. Mary cooks pot roast the same way, too. They tell me that this is the way pot roast is made. Why is this such an important step?”
Grandma, incredulous, looks at both women and asks “Do you still cut the ends off of the pot roast”.
“Yes,” they said in unison. “That’s how you showed us to make pot roast. We know that’s just how pot roast is made.”
Grandma broke into hysterical laughter. After she composed herself again, she explained “Honey, I cut off the ends of the pot roast because my pot was too small! Cutting off the ends of the pot roast was the only way I could get it to fit!”
The Perils of Experience
If you don’t see how this applies to software development, then you haven’t been paying attention. Cutting the ends off of the pot roast was a “best practice” solution to the problem of the pot that was too small. Because Mary and her mother never understood the underlying problem that motivated this preparation step, they turned a necessary practice into a wasteful one when their larger cooking pots obviated the need to cut the pot roast down to size.
How can we avoid following into traps like this? Never be satisfied with the rationale of “just because.” Every technology decision that carries any cost must be justified by a savings of greater value.
Mentoring junior programmers is a great way to keep us on our toes. It’s often the uninitiated – those unfamiliar with “how things have always been done” – that challenge us the most to explain why we do what we do. If we can come up with a persuasive argument, we solidify our own understanding of the problem and, consequently, enlightened our student. On the other hand, if we can’t answer the simple question “Why?” then we probably don’t fully understand the problem we’re trying to solve.