GeePaw Hill Profile picture
Aug 9 42 tweets 6 min read
I spoze the historic and ongoing inability/unwillingness of the software trade to grasp and adopt test-driven development (TDD) is one of the most frustrating & demoralizing events of my forty-two years as a professional geek.
I believe there are several related factors in play, ranging in abstraction level from pressures of global ieconmics to mistakes in local human interaction. Studying this large-scale failure, even while having some small-scale successes, underlies much of my work on change.
Because, while the overall world of geekery uses TDD approximately not at all, I have had many personal successes, using it, teaching it, and coaching it. Reconciling this seeming contradiction is hard.
My current thesis is that it comes down to a combination of lousy timing and even worse handling.
The stretch from '95 to '05 was, frankly, a really lousy time to introduce *any* change in second- and third-tier geek thought and practice.
(By "tier", here, I mean some rough combination of skillset, mindset, and experience. By "second" and "third" I mean to refer to the leaders, de facto and de jure, of technical teams, people who are themselves still technical on a daily basis.)
The second technical revolution was going on. The first -- cheap physical computing -- was slowing down but still active. The second -- essentially infinite free distribution -- was rolling out like a house afire.
This created a truly extraordinary marketplace. I'd go so far as to say "unique", though I'm not being rigorous, and I won't claim perfect knowledge of all prior markets.
Making software was ridiculously cheap, and ridiculously profitable, and demand was insatiable, and the pressure it put on supply was unbearable.

That supply, the geek trade, was dancing as fast as it could, in the year 2000.
We were churning out product, making billions of dollars of profit, and we were doubling our geek census every four or five years.

To heighten the pressure? The demand was so high, we discovered that we could do this all rather badly and *still* make more money than we lost.
And who was doing this? Who was keeping all these wobbly balls in the air, simultaneously geeking 40 hours and managing 40 hours and planning 40 hours every week?
Right. The second and third tier of geeks, the leaders, some young, some pushing forty, the people who knew enough geekery to keep it all afloat.
You can do a lot when you're dancing as fast as you can. You can code. You can ship. You can run a team. You can double-check everything they do. You can re-direct bad product ideas. You can hire and fire.
The one thing you *can't* do, though, when you're dancing as fast as you can: you can't learn a whole new kind of dance.
TDD is not an after-market bolt-on to the geekery that came before it. It is a set of practices based in a sophisticated theory about what parts of programming are hard, what parts easy, about what parts break, and what parts don't.
To take the simplest possible practical impact of the TDD dance, the designs you make with TDD are different -- sometimes radically -- from the designs you make without it. Just because of TDD.

There's more than that, too, but that, alone, is a huge deal.
So there's this lousy timing. The very people we needed to turn on to this different dance were the people who were utterly and completely swamped. Anything we had to teach them had to pay off in a matter of *days*.
TDD was not the only great idea emerging in that stretch. The design patterns movement. Extreme Programming itself. Late-stage OO theory, all of these were happening. None of them get much attention or mindshare today, and for much the same reason.
But wait. Act before midnight tonight, and we'll not only send you the lousy timing, but look, our operators are standing by, and we'll throw in this *exclusive*: really bad handling.
Duplicate bridge is a weird world. You play bridge, the card game. And you play against a whole big tournament of other people. But it's not fair, right, what if my hand is crummy, and the other pair gets a good one?
Well, with duplicate, we fixed that. See, every table gets the exact same deck. And we don't compare your performance against the people at your table. We compare your performance against all the people who were dealt the same hand you were.
It's one thing to get dealt a lousy hand. It's another thing to play whatever hand you were dealt in a lousy way.

It was a lousy time to introduce a new sophisticated idea. But that was our hand. And we didn't play it very well.
To begin with, tho we liked the practice of TDD, and were gradually learning how best to use it, our theory about what made it work was not very strong yet. Introducing a practice w/o any idea of what makes it work is a recipe for failure. We pushed too hard, too soon.
We were desperate for mindshare. We wanted people to do this, and we wanted them to pay attention to it. This led us to a couple of very challenging problems.
TDD's great, you think, and you want everybody to do it. But without some serious underlying sense of how what we were doing actually worked, it gets very hard to say what the "it" really is.
There are a lot of things that resemble TDD. Test-after Developers writing tests. Non-developers writing screen-scraping scripts. Full or large-scale integration tests. There's even more.

None of them are TDD, but they sound like they are.
And this lack of understanding led to not just one follow-on problem, but a second major one, and then even more problems after that.
In the early '70s, the Doonsebury cartoon had Lacey and Dick Davenport, a wealthy patrician couple. And Dick was fuming one day, if I recollect it was about the Nixon whitehouse. And he said, "That's the trouble with the Republican Party, they let just anybody in."
Without a deeper understanding of how TDD works, and because of our desperate desire for mindshare, anything resembling TDD, regardless of whether it relied on the same underlying mechanisms or not, was good enough.

We let just anybody in.
And I'm not speaking here of formal certification, or review boards, or any of that. I'm talking about culture, not rules. I wouldn't "enforce" such an idea as TDD even if I could.
But when you let just anybody in, especially in a market as insane as the geekery market, you get some follow-on results that aren't good.
You get rote. You get bad pedagogy. You get pedagogues who don't even care, who are in it for the income. You get significant failures. You get empty slogans repeated over and over and over ad nauseum.

And the worst part is when you "win".
When you make the cover of an airline magazine, with no coherent understanding of what TDD is or why it works, you get top-down pressure to make line geeks do a thing they don't understand and, especially, don't believe in.
We got all of that.

And as a result? We got a lot of implacable foes, a lot of awful-sounding and true failure reports, and a lot of "influencers" decrying our pratice.
And now, when we have a much richer understanding of what it is, of how it works, of *when* it works, and of why it works, well, we're too little too late.
Lousy timing, lousy handling. Both of these are flavors of rush rush rush. The timing was so bad because the would-be recipients were rush rush rush. The handling was so bad because the would-be TDD'ers were rush rush rush.
Rushing, as hard as you can, directly at your goal, regardless of your hand, your timing, your context, it seems right, mete and just, and it seems *so* important!
But it's nearly always a flaw in your change plan. It was a terrible flaw in ours. And now, to an arbitrary error epsilon, the uptake of TDD overall in the trade -- a model I regard as the most significant advance in geekery of my entire career -- is zero.
Thanks for hanging in this long. I didn't mean this to be such a downer, and I feel a little silly asking you to take action as a result. Just the same, tho, if my thinking about change interests you, do me one or two favors:
1) Take my seminar in "Leading Technical Change". 12 people, 4 sessions, 2 hours, across 2 weeks.

One topic:

Getting to Real Change in the Real World.

geepawhill.org/courses/leadin…
2) Subscribe. It's free, it's spam-free, and it includes full-text and audio of these threads, right to your inbox.

geepawhill.org/subscribe
I'mo have a cold beer and listen to some tunes. Y'all have a good night and a better tomorrow.

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with GeePaw Hill

GeePaw Hill Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @GeePawHill

Aug 8
Va's out of town for a few days, which puts me in charge of canine recreation. This means I'll be doing and/or arranging 1-2 tiger patrols every day.
Va wears the pants in ths family. She doesn't have to do special tiger patrols, because her very nature is to engage in heavy activity all over hell's half acre: the backyard, the garden, the barn, the tractor shed, the bees. Wally & Molly usually just hang out with her.
They go wherever she goes, sometimes help however they can, otherwise just run around and get lots of stimulation. (Four days w/no exercise isn't much of an issue for these buff active dogs, but four days w/o stim would be a real drag.
Read 6 tweets
Aug 8
Heh. It's that one at the bottom of the stack. You know. The one that was too simple to test.

<sigh>

Physician, heal thyself.
"Baby, I can explain."

It *was* too simple to test, at its first draft. I don't write tests for getX(), because I work for a living, and I TDD for money, not purity.

The classes above it in the stack had tests, and they were green.

And it all worked perfectly.
But when I changed my mind about the design, welllllll, I tweaked all four classes. And I tweaked the *three* test classes. I did not tweak that first class's test class. Cuz it dint have one, you see. And I tweaked the "too simple to test" until it wasn't "too simple to test".
Read 5 tweets
Aug 7
So, my friend and mentor @/RonJeffries has started a new series that is a real challenge, because it puts him into an environment with a *ton* of things that are new to him.
Ron writes an article most every day. There are four up already, and I've just read them. This is the link I use to find out what's new in the series.

ronjeffries.com/categories/kot…
Watching a master geek tackle something this foreign is a blast. He's learning kotlin, javafx, tornadofx, and intellij all at once. He's seen bits here and there of all of them, but not used any of them in anger before, so it's not "new" exactly, but new enough.
Read 22 tweets
Aug 6
You ever think about how hard it must be for your dog to pretend to not understand your language?
Like, spoze you were hanging with a bunch of people who were speaking a language you were fluent in, but they didn't know, and were *counting* on the fact that you didn't know what they were saying.

I'm thinking it must be pretty hard to pull that off.
I always keep my eye out, when I'm talking to Molly & Wally, for little tells.

Never caught'em yet. Maybe a couple of times that were suspicious. That's really all I got, nothing indictable.
Read 7 tweets
Aug 6
Oh! I was bitching about libGDX in the framework vs library department the other day.

I was wrong.

Mea culpa, mea maxima culpa.

Allow me to loudly sit corrected for a minute.

The tutorial code suggests you define your app from ApplicationAdapter. That makes it, on first blush, resemble frameworks like JavaFx, which require one to start at the very top with implementation inheritance.

But. Today I quit whining and looked closer.
ApplicationAdapter implements an interface ApplicationListener. Its implementation of that interface is to no-op the seven methods. That's it. That's all it does.
Read 7 tweets
Aug 5
Fats Waller, "I'm Gonna Sit Right Down".

This is my favorite take of his by a lot. I love his voice. His playing here is so smooth and confident, it's hard to realize what a strong player he was.
Nowadays, of course, we associate jazz with high intellectual art, but the triumvirate of jazz's emergence on the national and then the world stage, Armstrong, Waller, and Bechet, was *entertainment*.
Read 5 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(