How Do We Teach TDD Keith Ray

Preview:

DESCRIPTION

Slides from Keith Ray's talk on "How do we teach TDD? Considering the Dreyfus Model of Learning" Presented at SFPSD Monthly Meetup, 2011-03-29

Citation preview

How Do We Teach TDD?

Considering the Dreyfus Model of Learning

C. Keith Ray

Coach, Trainer, Developer at Industrial Logic, Inc.keith@industriallogic.com twitter: @ckeithray

http://industriallogic.com

What's TDD?

TDD is Test-Driven Development. The simple description of TDD is:

Red-Green-Refactor-Repeat: write a test that fails (red), write just enough code to make it pass (green), then refactor to a good design (aka "simple code"), and repeat.

Dreyfus Model

Dreyfus came up with a model of learning. He named five levels:

NoviceAdvanced BeginnerCompetent ProficientExpert

See http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition

Novice

Completely new to the thing to be learned.

Wants recipes, rules, constraints

They don't know what "good" look likes yet, so they want fast feedback.

Craves rules.

Advanced beginner

Knows the rules, but not all the contexts for them, knows just enough to be "dangerous."

As a software developer, probably writing "big balls of mud".

Better to have them learning in a safe environment to learn from their mistakes.

5

Competent

Can do a task without needing instructions.

Identifies patterns and uses them, mostly in appropriate contexts.

May be offended if you treat them like a Novice or Advanced Beginner.

Proficient

Good, but now trying to become expert.

Lots of experience / practice.

Knows how to do stuff, but can't tell people how to do it.

(Teaching has its own Novice to Expert levels)

Expert

Beyond rules.

Working on instinct.

Needs to compare notes with other experts.

Arguing about their subject refines their understanding of it.

TDD seems so simple, so why is it hard to teach?

Teacher: it's red, green, refactor, repeat.

<long time later>

Student: ok, here's all my tests!

Teacher: where's the code?

Student: I haven't written it yet.

Teacher: Photo by striatic

TDD seems so simple, so why is it hard to teach?

Teacher: it's red, green, refactor, repeat.

<long time later>

Student: here's my first test. [400 lines of code in a single test.]

Photo by Marcin Wichary

TDD seems so simple, so why is it hard to teach?

Teacher: it's red, green, refactor, repeat.

Student: <Doesn't understand why the test should fail before it is made to pass, so writes code and tests so that the tests usually pass the first time they are run.>

oops

TDD seems so simple, so why is it hard to teach?

Teacher: it's red, green, refactor, repeat.Student: here's my tests and code.Teacher: nice, but you've got a very large class, with a very large method, and all your tests are repeating lots of code. Did you refactor?Student: I thought we'd refactor next month!

TDD seems so simple, so why is it hard to teach?

Because each of the steps of TDD require skills in three main areas:

Writing tests.

Writing simple code.

Refactoring.

There's more, Refactoring Requires:

Recognizing symptoms of bad design (code smells).

Making small transformations to improve the design. (The actual Refactorings.)

Recognizing good design (aka "Simple Code")

"Simple Design"

Kent Beck's rules for simple design were:1. Runs all the tests.2.No duplication.3. Expresses the developer's

intentions.4.Minimizes the number of classes

and methods.

Photo by GN

Getting back to Dreyfus...We teach using web-base materials in live training and via coaching.

Our web-based materials assume the student is in the Novice stage of learning about TDD.

We also assume the student is at least in the Competent stage as a programmer.

We encourage pairing of students — it makes a large improvement in learning.

What Novices WantA "novice" is completely new to a subject.They want rules, recipes, formulas, step-by-step how-to-do-it.They don't know enough to judge their own results, so they need fast, frequent feedback by coach or trainer.

Photo by Steve Snodgrass

Breaking TDD Skill-Sets into Novice-sized

Pieces

Demo: Exercises

TDDing Big Bill's Billing System

Task 1: Calculate A Simple Phone Bill

Task 2: Calculate Excess Minutes

Task 3: etc.

Student writes the code, compares it with solution(s).

Almost all solutions are demonstrated in video form and downloadable code.

ConclusionOur web-based training with critiques provides feedback that Novices and Advanced Beginners need, and which would otherwise require one-to-one coaching. This works for our live training as well as purely web-based training.

Try it out: http://elearning.industriallogic.com

(PS: Competent, Proficient, and TDD Experts should try Sessions.)

See also Dan North appling the Dreyfus model to a more general level of "best practices": http://www.infoq.com/articles/better-best-practices