Archive for December, 2022
Get a coach to embed with the team–someone who’s got practical, hands-on expertise in implementing TDD in legacy systems.
Trying to get TDD rolling on existing codebases is hard, hard, hard. Having a guide to help the team figure out how to succeed at TDD is critical.
I couldn’t agree more.
I was once asked to work with a team to help them improve their TDD practice. Except that they weren’t practicing TDD yet.
The team had taken a TDD class and started to write as many tests as they could. They said: “our test files are very cluttered, very brittle“. Yes they were.
As the team describes what they are experiencing, it is clear that the tests are written after the feature implementation. Further inspection of the test files confirms that, with signs of copy-and-paste throughout and across several files.
Had the team stayed on that path, they’d quickly abandon tests altogether, as it was getting too hard to maintain those tests and write new ones.
By getting a few sprints of coaching, they learned to:
- refactor the existing tests
- identify flaws in the software’s current design and implementation
- start developing the mindset of test-driven design
🚨 Spoiler alert: the evidences you seek aren’t likely to be found here!
There are a number of studies available on the web with numbers, charts, etc. This post does NOT include any of that.
For the readers who enjoy geeking out on studies and researches, here are some great books that include some of that:
What follows are some of my current thoughts on the topic at hand.
Weeks ago I shared some thoughts on this question I’ve heard many times over the years: Is TDD something you do sometimes or all the time? It generated a great conversation with an old fox who has been stalking me for several years. 😉
It started like this:
I’ve never seen good evidence that TDD is better. Oh sure, there are opinions, but not concrete evidence.
That’s a common comment, so I wanted to explore it more.
As a guitar player, I’m often asked questions like “who do you think is better: Tony Iommy or James Hetfield? Yngwie J. Malmsteen or Eddie Van Halen?”
At one point in my life, I’d answer Iommy. At a later point, Hetfield. Then, at another point, Malmsteen. And depending on the day, Van Halen.
It’s all contextual. I’ve listened to a lot of music by those four guys since the mid 80’s. The circumstance, the people who were with me, my personal experiences, all of that influenced who I thought was better at one time or another.
But better at what?!
Influence over new bands and/or guitarists?
Number of hit songs?
Number of memorable riffs and/or guitar solos?
Guitar playing technique? Innovation?
Caring for their fans?
As the old fox said, “oh sure, there are opinions…”
Over the years, I couldn’t agree with my own opinion, let alone the opinion of others. So who is better?
The fox says “…but not concrete evidence.”
Wait; what kind of evidence are we looking for? I think we’d only know that if we could answer the “better at what?” question. In the case of guitarists, if we’re considering “better at selling records”, that’s something measurable.
But who’s better: a best selling or the most influential guitarist? The latter? But most influential at what?
At some point, I gave up on answering those questions. I’ve let it go. Depending on a number of factors based on a single moment of time, I will deliberately choose one guitarist over the other.
But I digress…
So, is TDD is better?
Better at what? Better than what?
Better at decreasing bugs?
Better at increasing code quality?
Better at bringing clarity to our thoughts before we decide how we want to implement something?
Better than not practice TDD?
(I can’t come up with any other options here…)
If we manage to add more context to the question, then we can look at the next one, “is there any evidence?”, and define what kind of evidence we’re looking for, and finally look at how we could possibly measure it.
Say the question is, “is TDD better at delivering software faster than not practicing TDD?“
If we’re looking at it only in the context of a very short period, we may find it that it is not.
If we’re looking at a longer period of time, I’d bet it is better.
But we should figure out what we’re measuring besides the time spent writing tests. For example:
- time spent reading code until we feel confident to change it
- time spent on a debugger troubleshooting issues
The old fox is wise; one needs to try something before reaching any conclusions:
“I’ve tried it. I can’t say I saw an improvement in the code or fewer bugs. There’s no way to accurately measure that.”
How do we see improvement in code?
There are code metrics we can use, such as cyclomatic complexity (CC), but can one see improvement in code if CC decreases? If developers working on the code can’t yet appreciate low CC, they don’t see it as an improvement.
Occasional music listeners may not appreciate improvements in remastered albums. Many times we need to be trained so we can start seeing (perceiving?) things as improvements. As someone who dabbles at playing classical guitar, Julian Bream’s Masterclass videos has made me hear and see nuances I was respectively deaf and blind to before.
The fox continues:
“But when I wrote code I refactored a lot, not just the code I was writing, but the existing code around it. So that could have an effect on quality.“
But the old fox wasn’t finished:
“I think there are enough developers out there that don’t know how to do unit testing properly. If we want to turn them into TDD devs, first they need to learn how to write good unit tests. Here’s an example: At my last job, I was moved to a team that had little unit testing. They owned code that I was told “It can’t be unit tested.” I showed them it could. Once they’ve learned how to effectively unit test, only then should they be pushed to TDD. At least, that’s my opinion.“
BINGO! That resonates a ton with my own experience. Years ago I even gave a talk titled “I Cannot Write Tests for That!”: UI Edition. I’ve had several similar experiences coaching developers into the practice just like the fox described. I draw great satisfaction from helping developers through that journey, and more often than not, I don’t have to “push them to TDD”; they are the ones “pulling for it”!
Final thoughts for now…
If I am to look for “evidences that TDD is better”, I think of what works for me and those around me:
- The time spent designing potential solutions to problems is time well spent
- and it is shorter than the back and forth of implementing features without designing them
- It’s very satisfying to be able to refactor implementation when there are good specs to back it up
- The level of willingness a development team shows to embrace changes
- It feels very pleasant and productive to collaborate with others and have conversations using well-crafted specs
Now if you excuse me, I have some TDDing to do.