On 19 Feb 2010, at 08:59, Erik Pukinskis wrote:

Hello Specmeisters!

I have a bit of a philosophical question for the TDD witches and
wizards out there.  I'm working on some code that is really
churning... It's doing complicated calculations, but the actual
desired results are a moving target. The acceptable values, and even
the structure of the software's output are changing constantly.  The
internal architecture is changing rapidly, and I'm constantly throwing
away methods I no longer need.

This has resulted in me no longer writing specs on this part of my
codebase.  They just become obsolete very very fast.  Changing the
specs constantly feels like a pointless doubling of my effort.  Specs
seem to help with debugging and verification that the software is
performing as expected.  But I'm spending most of my time trying to
figure out what I should be expecting.  I verify that things are
working quickly and informally, because it's likely the definition of
"working" will change before the week is up.

Am I being stupid?  Is it really a pointless doubling, or am I
creating more debugging time for myself than I'm saving without
writing specs?  Should I be more religious about Test First?

Thanks in advance for the insights,
Erik

Here are some rules of thumb I would use:

If requirements are churning, I would try to use high-level acceptance tests (e.g. with Cucumber) to firm them up.

If I can't firm up my requirements, it's because we're still going though a discovery process - we don't understand what the problem is, let alone the solution - and that means it's too early to write any production code. I would happily write code without tests at this point, but I'm going to be loud and clear about the fact that the code I'm writing is a spike, and will have to be thrown away and re-written before we go live. This kind of code is much more valuable than you think - most of the value is in the learning that goes into your heads as you do it, rather than in the cobbled-together, un-tested code you write. Writing code like this can be fun, but never be tempted to check it in!

Once the requirements start to stabilise (but are still changing) I often go through a process where the design is still churning as I try to work out how I best want to solve the problem. At this point I would rely on those high-level acceptance tests to cover me and only write specs for parts of the design as it started to stabilise.

The thing you have to remember is the point of TDD/BDD is to surface uncertainly and misunderstanding early. Once you get past the discovery stage, having the discipline to write tests first will reduce churn, because you ask more questions (and make more decisions) before you actually sit down and write code. If you don't have enough information to make those decisions though, don't be afraid or ashamed to write a spike, but make sure everyone on your team understands the distinction between that and production code.

cheers,
Matt

http://mattwynne.net
+447974 430184

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to