[rspec-users] Do you still Write Tests First on code that is churning hard?
Chuck van der Linden
cernenus at gmail.com
Mon Feb 22 12:29:28 EST 2010
> Date: Sun, 21 Feb 2010 10:37:14 +0000
> From: Andrew Premdas <apremdas at gmail.com>
> To: rspec-users <rspec-users at rubyforge.org>
> Subject: Re: [rspec-users] Do you still Write Tests First on code that
> is churning hard?
> <88fd8ddc1002210237m39085abbo6c43a7dc34130463 at mail.gmail.com>
> Content-Type: text/plain; charset="iso-8859-1"
> On 19 February 2010 08:59, Erik Pukinskis <erikpukinskis at gmail.com> 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
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> I think you can consider writing a completely separate spike to explore
> subject, so long as you make absolutely certain that you do not merge it
> into production code. To avoid that temptation it really should be
> Speculating a bit however, I think your process for developing this part of
> your code maybe very wrong. It sounds like your looking for justification
> for hacking - which generally is a bad sign - and that maybe you need to
> take a step back and look at different approaches. Maybe instead of
> on results you could focus on process e.g. to calculate foo I first need to
> bar etc. or perhaps you need to go more granular and create some tools to
> simplify your calculations. Finally if you have any long methods in your
> calculations (> than 5 lines) refactor them. Decomposing them into smaller
> methods could reveal alot about the structure of your problem
I'm a bit with Andrew on this. I think you are not asking the right
In TDD/BDD I view writing the tests/spec as PART of writing the code, so if
you are questioning the value of spending the time to write the specs, and
lamenting that you feel this is wasted effort, I have to ask why are you not
questioning the value of even writing code when the target is changing so
frequently? Why don't you feel that the code itself that you've had to
discard/rewrite/refactor so much has not also been wasted effort? How is
what you are doing going to deliver value to the end user?
If this is a case where someone else can't make up their minds what they
want, then potentially it might be a situation where writing the code itself
is just a waste of time, much less writing the specs, and you need to spend
your effort elsewhere until what is needed is better known.
OTOH, if this is a situation where you are doing a lot of experimentation
and discovery, and the writing of the code is necessary to figure out 'what
will work', then the writing of tests might not add value and just being
slowing you down. I'd base that judgement on the degree to which the code
itself is considered disposable and the likelyhood that it won't ever make
it into production 'as is'. In that case, then there may not be much value
to fleshing out anything but the high level spec definitions (just as a
means of keeping straight what you are trying to do this iteration, and
potentially a type of documentation to others of what 'approach number 27'
is supposed to take for inputs and produce for outputs.
Kent Beck touches on this in his 'flight of the startup' blog post
http://www.threeriversinstitute.org/blog/?p=251 and a followup 'developing
for the flight of the startup'
http://www.threeriversinstitute.org/blog/?p=252 and he makes some good
points about when it pays to be dogmatic about some agile practices such as
TDD, and when it's better to put some of those practices aside depending on
what it is that you are trying to deliver to the customer at a particular
point in the project.
If you are currently in the phases Kent describes as Taxi and Takeoff, then
you could very well be right to dispense with a majority of tests and other
practices that are needed for maintainable high quality code. (because
you're not trying to deliver highly maintainable code.) OTOH if you are in
the Climb or Cruise stages, then I'd be greatly concerned that 'what we are
building' is in such a constant state of flux, and I'd suggest something has
a smell that's ungood.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the rspec-users