The “Language Hunting Proficiency Scale” is an adaptation of the ACTFL Proficiency Guidelines for language speaking proficiency. In typical Languge Hunting style, it can understood in a fun, easy, “obvious” way using a party paradigm:
| ACTFL Level | LH ‘Party’ Level | LH Description |
|---|---|---|
| Novice | Tarzan at a Party | Single words, short vocab lists |
| Intermediate | Getting to the Party | Ask questions and get answers to get needs met: “where/when is the party?”, “what should I wear?”, “what should I bring?” |
| Advanced | What happened at the party? | Recount experience, tell story: “Tarzan drank too much jungle juice and threw a chair out the window, the cops came and took him to the drunk tank and I had to bail him out” |
| Superior | Why do we have parties? | Discuss social, economical, political, culture nature of why we have parties |
Last month, both Mark Seemann and David Bernstein published a critique of TDD based on whether it promoted good design (or not), using SOLID principals as a litmus test. I felt that the source of their disagreement, agreement and confusion about whether they agreed, came from a ingrained response to value knowledge over fluency.
TDD entails the use of software languages to have a conversation with the compilers and interpreters about testing and code. When TDD is viewed through the language lens, we see that the ability to effect good or bad design has nothing to do with TDD itself, but rather depends on the proficiency of the coder (and their fluency will influence how quickly they can exhibit that proficiency).
Below is a first pass at describing fluency and characteristics we might notice of different levels of TDD practitioners. I started by doing a literal replacement in the WAYK fluency inquiry phrases, described characteristics, then (unexpectedly) realized there was a ‘focus’ associated with each level:
| ‘TDD’ Level | Focus | Characteristics |
|---|---|---|
| Tarzan at TDD | Code | Can write unit test that will execute in the runner. Assert.isTrue(). May start with a test, but soon drifts into code first development. Tests may break when ‘not on my box’. |
| Getting to TDD | Coverage | Uses red, green, refactor cycle. Begins to see defect reduction, less ‘silly’ bugs. Tests may have duplicate setup or code. Long ‘work-flow’ tests with many assertions. Inappropriate use of file or db resources. Test files and class files may be many to many relationship. CI build may begin to take a longer time. |
| What happened at TDD? | Maintainability | Learns from TDD experience how to write better tests. Code quality of tests as good as core code. Effective use of setup and teardown. Organizes tests effectively, parity between tests and classes. Uses mocks effectively. Tests and Code still seen as separate steps in a process. Tests run in CI in effective time frame. |
| Why do we have TDD? | Design | Uses tests to express intent that causes simple, effective code to emerge. Sees and factors to patterns effectively. Strong cohesion between test and class. Can safely check-in after every cycle. |
Please let me know your comments and improvements.
The exciting part is that when we realize that effectiveness at TDD is fluency, it opens the door to using Language Hunting techniques to rapidly teach that fluency.

5 comments
Comments feed for this article
January 30, 2011 at 4:20 pm
George Dinwiddie
Wonderful analysis! I love that you’ve done this. I suspect that I would put some of your “superior” TDD points under advanced, but we could have a great conversation about this. (If only I knew who you were, which I can’t decipher from this site.)
See http://blog.gdinwiddie.com/2009/11/22/proficiency-and-fluency-in-self-organization/ for a similar analysis on self-organization.
January 30, 2011 at 4:27 pm
Tweets that mention Using WAYK to Describe TDD Fluency « Software Greenhouses -- Topsy.com
[...] This post was mentioned on Twitter by George Dinwiddie and Marty Nelson, Marty Nelson. Marty Nelson said: "Using #WAYK to Describe #TDD Fluency" http://bit.ly/h06SFU. Appreciate feedback from TDD fans and esp those at superior fluency. [...]
May 17, 2011 at 6:25 pm
Arlo Belshee
Like.
I’d add another item or two at various levels:
Tarzan: just tests state.
Getting to TDD: tests both behavior and state, but without distinguishing.
What happened: One to one relationship between SUT class & test class. Distinguishes behavior from state testing, and tests them in different ways.
Why TDD: starts seeing mocks in tests as a sign of too much coupling between responsibilities. Sees that as design feedback, refactors, and tends not to have many (or any) mocks in the code. One to one relationship between test class and system responsibility. When that isn’t a 1:1 relationship to a code class, sees that as feedback to refactor. Uses simulators, bounded contexts, & anti-corruption layers in code to remove cross-boundary dependencies; uses testing activity to find when one of those is needed. Sees the need for behavior testing as feedback that the code is mixing queries with updates, and refactors. Tests remaining updates via bindings tests combined with simple state-change tests on the destination. Almost all behavior testing disappears.
But then, I like circular systems. So it is pleasing to me to have a system where the practitioner adds all sorts of complex tools, and then stops using them and writes tests which can be describe as those of the amateurs, but which are entirely different.
May 17, 2012 at 1:10 am
Content Index for Unit Test - Mathew Aniyan's Blog - Site Home - MSDN Blogs
[...] TDD Fluency [...]
May 17, 2012 at 4:59 am
Content Index for Unit Test | MSDN Blogs
[...] TDD Fluency [...]