I had the opportunity to give a talk “Introduction to Test-Driven Development” at the Nashua Scrum Club this week. It is a great group of folks, and if you are interested in learning more about Scrum and Agile practices you should check them out. They are a diverse, engaging group of folks covering the full spectrum of roles in a Scrum organization.
The talk was targeted for all the roles on a Scrum team, and my goal was to give a small taste of what TDD can bring to a software project. I have been using TDD for about 5-6 years, and I have definitely become “test infected”. I can’t imagine developing production code any other way.
I wanted to stress the importance of working iteratively, and getting through the Red-Green-Refactor loop quickly, adding more and more functionality with each new test. One of the areas new teams may struggle with TDD is to try and do too much in a single pass through the loop. If you get bogged down and are in the loop for more than 15-30 minutes you may be biting off too much in this test and should look to a smaller incremental step.
Given the broad spectrum of roles that were at the meeting (Scrum Masters, coaches, QA/test, developers, managers, product owners) I also wanted to show how tests can be used to get the team to collaborate more. I think tests can be a great mechanism for developers to collaborate with product owners to make sure the behavior is as intended. There are also opportunities for QA/test to work with developers to understand what is tested at the unit and integration level. Finally tests are a great mechanism for developers to share knowledge. When I am looking at a code that I may not be as familiar with, I find the tests to be a great place to start to understand what functionality is provided. In essence, the tests become an executable specification of the system.
We also spent some time talking about TDD and design, which I know has been something of a hot-button topic lately. Does TDD guarantee a good design? Is it a good design methodology? In and of itself, I would say no. But what I would say is that TDD encourages good design practices and to do it well, i.e. not have brittle tests, you need good design practices. I had almost 20 years experience before starting TDD and felt I was a good object-oriented designer. TDD helped me step up my game in terms of design and developing more modular, loosely-coupled code. We touched on design practices like SOLID, YAGNI, DRY, separation of concerns, how design patterns like MVC allow better, more thorough testing.
Finally we talked about the challenges of adopting TDD. Change is hard, and a switch to TDD can be a difficult and frustrating experience. TDD requires strong design practices. There is also the battle to fight about writing “all that test code”, to which I always like to ask “How much were you writing before”. Jim Shore summed it up well when he said that you should expect 2-3 months to make the adjustment.
I had a great time at the Nashua Scrum Club, and want to thank everyone there for making it a fun (and hopefully informative) evening. I look forward to a return visit soon.