News for hackers. Stuff that matters.
Re:Be professional, do TDD by teilo on Wednesday October 27, 2010 @08:15AM (#1838202)
And yet ... millions of lines of code are written every day and tested the old fashioned way, and the world keeps spinning round and round.

Granted, every project can benefit greatly from unit tests. As for TDD, it is an admirable practice, but let's not get religious.

Re:Be professional, do TDD by lyudmil on Wednesday October 27, 2010 @08:51AM (#1838313)
I didn't like the tone of the post either. I do think that this needs to be settled, though. If we're ignoring a practice that guarantees an improvement in the quality of our code and the speed of our delivery without a very good reason, then we are being unprofessional.

Does TDD deliver what the OP says it does? I think so (anecdotal evidence, so, worthless), and there is research out there to support it [1] (possibly valid evidence). It seems we have at least a basis for debate.

Therefore, if you don't use TDD, you should raise objections to the existing research you have. Or, offer some anecdotal evidence in opposition to TDD. Then perhaps we could conduct experiments to test the corresponding hypotheses and finally converge on a verdict regarding this. I think if we (as a field) fail to do that, we are unprofessional.

[1] Evaluating the Efficacy of Test-Driven Development [pdf]. http://research.microsoft.com/en-us/projects/esm/fp17288-bha...

Re:Be professional, do TDD by mhd on Wednesday October 27, 2010 @09:10AM (#1838380)
That study you cite has a very lenient definition of "comparable team".

Not too surprising, most methodology studies that I've seen can't exactly claim scientific rigor. (Yes, it's hard to do when it comes to real-world projects, but other fields of scientific study manage better.)

Re:Be professional, do TDD by lyudmil on Wednesday October 27, 2010 @09:32AM (#1838486)
"Lenient" would imply that their approach skewed the results. If that's what you meant, could you explain why you say that? I'm hoping your explanation could lead to a testable hypothesis.

If you meant that they weren't rigorous in controlling variables related to team composition, I'd agree. However, I think those variables can safely be ignored if the study is repeated and validated many more times (which the authors acknowledge is a work in progress).

Re:Be professional, do TDD by mhd on Wednesday October 27, 2010 @10:25AM (#1838713)
Project A:

TDD Team: 6 people, 24 man-months, no legacy code, 6 KLOC;

Trad Team: 2 people, 12 man-months, no indication whether it was a legacy project, whether they used unit testing at all (and if yes, what their coverage was).

Project B:

TDD Team: 8 people, 46 man-months, no legacy code, 26 KLOC

Trad Team: 12 people, 144 man-months, 149 KLOC, again no indication whether it was legacy, used unit testing etc.

The report mentions that they were comparable, because both teams reported to the same manager (Not too surprising for Microsoft).

I hope that there's more info about this study and that I'm a bit overreacting, but just given these tables, I wouldn't agree that we're talking about comparable teams and projects here.

So does this test unit-testing? Does it test TDD? Does it test development without legacy code vs legacy code? And even if you would get results, would it be the same for people with different experience levels? (Which is a problem for academic studies)

Re:Be professional, do TDD by gte910h on Wednesday October 27, 2010 @11:00AM (#1838875)
>If we're ignoring a practice that guarantees an improvement in the quality of our code and the speed of our delivery without a very good reason, then we are being unprofessional.

Very good reason? Yes, it's very costly and only catches a certain sort of error.

Would clients prefer 25% more features or the set you have with a full suite of unit tests? Many would prefer the 25% more features.

Additionally, with that same amount of money you could spend doing TDD, you can do any number of OTHER practices which ALSO increase code quality, including, formal design reviews, informal design reviews, informal code reviews, formal code reviews, desk checking of code, automated analyzers, running through profilers, running through memory leak detectors, modeling, prototyping, component testing, integration testing, regression testing, system testing, beta testing and many more techniques.

All of these take TIME and MONEY. TDD is just one of the many things you can do if your client/employer cares about code quality, and not necessarily the best thing. I mean formal inspections (according to code complete 2, pg 470) and formal design reviews are always much more efficacious at finding bugs than unit testing (which is what TDD revolves around). According to that, we shouldn't be spending the quality improvement time doing TDD based procedures then, but instead pouring over the code in review sessions.

Secondly, many other techniques CAN yield better results than TDD, and in less time (but don't always). These include protoyping, personal desk checking, system tests, and beta tests with more than 1000 users.

So many adherents of methodology X don't accurately scope in the tradeoffs of their costs, etc, when advocating their system. Morning scrumm meetings sacrifice people who want to have long (and therefore, more unpredictable commutes). People who like automated function comment headers don't count how much time people spend filling in those header boxes. People who like variable naming conventions don't spend enough time understanding what that does to the people who have to constantly change the way they name them. People who like full waterfall don't understand the morale crushing cost of huge changes after large design/documentation pushes like that. I could go on and on.

TDD has costs. Those costs aren't necessarily worth it. Sometimes they are, sometimes they're not. The people who say "it saves you time" are full of crap. It may, sometimes, save some people, some time. All the tests, if they're at all worthwhile, both take time to write and maintain. I've been on projects which use it and don't, and while there was a lower defect rate on certain types of bugs, those weren't always very important, nor was the time cost of writing the tests worth it, as those projects had several high value features which couldn't be completed due to time.

Re:Be professional, do TDD by lyudmil on Wednesday October 27, 2010 @04:08PM (#1840255)
I don't want to be dismissive of your point of view, but I take issue with your mode of argument. You've made a lot of assertions without evidence and done a lot of hand-waving. These are valid concerns but I think we need to get away from this mode of thinking and get to the details.

TDD makes pretty specific claims. Most of those are testable (at least to some extent). To assert that it's all relative is to dismiss the possibility that TDD advocates are onto something. As I outlined before, outright dismissal is arrogant and unprofessional. Please, back your assertions with evidence so they can be debated.

Edit: Removed an paragraph that diluted the point.

Re:Be professional, do TDD by gte910h on Wednesday October 27, 2010 @10:07PM (#1841393)
Made claims without evidence? I quoted the book with page number.

>(according to code complete 2, pg 470

Go look up the evidence and studies there. Respected book, respected author vs random blogger.

Hand waving? I quoted a book and talked about in a small portion of the post my personal experience on TDD and non TDD projects.

TDD, like everything else, isn't a silver bullet. It's a tool, and one you're often perfectly justified in not using.

Re:Be professional, do TDD by lyudmil on Thursday October 28, 2010 @09:01AM (#1842672)
You talked about unit testing, which is not TDD. In fact, TDD specifically predicts that unit tests will not be as effective if they're not written before the code.

I would really like it if you expanded on your personal experience, because there are probably valid objections contained there.

I really don't want to come off as a religious defender of TDD. It seems to me like you've made a lot of arguments against claims I never made (that TDD is a silver bullet; that adherence to a "methodology" trumps economics and other practical concerns). All I'm saying is: We have specific claims backed by detailed data that might allow us to be better at what we do; Let's look at those claims critically and figure out how to test their accuracy (by setting up similar experiments to produce data of similar rigor). I think that's a pretty conservative position. I'm not defending anything, even though I might be leaning a certain way in my evaluation of a hypothesis.

Re:Be professional, do TDD by gte910h on Thursday October 28, 2010 @12:41PM (#1843607)
> If we're ignoring a practice that guarantees an improvement in the quality of our code and the speed of our delivery without a very good reason, then we are being unprofessional.

Looks like silver bullet reasoning there. It slays every problem, at least a little, and never makes anything worse.

I've done red green TDD before on 10-35k LOC systems in a couple high level languages (C, C++, Python). Used different automated testing frameworks when doing it. I've even taught it as a TA in college (although a decade ago, when XP was all the rage). I was doing test first unit testing before many of the existing frameworks existed.

You have supporting data: You have instances where it supports the conditional in your statement. The studies are not done in situations where it really can be found to be scientifically rigorous, only suggestive, and therefore my reaction is at the idea "We're unprofessional for not doing X", which implies a certainty to the idea far beyond what it is yet due.

I find the very assertion "a practice that guarantees an improvement in the quality of our code and the speed of our delivery" insulting and ironically very unprofessional, as it prioritizes advocacy of a technique over results. The tone of the OP is "TDD is like washing your hands before eating; You're paleolithic if you don't do it". He's calling those of us who don't always do it unprofessional.

I find the argument trying to get everyone to always do TDD very unpluralistic, another unprofessional tendency in my mind. There should be a heterogeneity of ideas and methods, as every situation is not the same and with the more developed tool box we can accomplish more things with the right set of tools rather than rigidly applying the few tools we apply in every situation. While there are things that should almost always be used (source control), they are very few in number. I mean, before DVCS, source control use wasn't always something that made 100% sense (remote development was quite hard to factor in with say, CVS or RCS usage without network connectivity).

TDD is horrid for soome applications, especially UI heavy ones. TDD has real costs. The idea that any technique doesn't have real costs is somewhat out there. Lots of TDD advocates espouse "it saves you more time than you spend". That's a pretty hard claim to prove, and suggestive studies don't prove it to a degree to make institutional adoption of the system mandatory. I mean, even source control has real costs, and people rarely argue against its use anymore.

My issues with this discussion: The strength of adoption which you (or at least the OP) are advocating requires almost absurd levels of proof. It literally will require some hiring/firing to implement in organizations, as some people can't handle that amount of testing. I personally have been on projects with different teams doing TDD, and don't find it to have met the promise of the central claim of this "always should use" position, which is it saves more time than it costs. I find it a mixed bag, therefore not a requirement for professional conduct.

The amusing thing is: I USE TDD (for appropriate projects). I just find the idea that it's the second coming a bit absurd and the way this is being asserted somewhat insulting. Most people think it has value, but the idea it should be cannon law is silly.

Re:Be professional, do TDD by lyudmil on Thursday October 28, 2010 @02:03PM (#1844072)
I'm sorry, I must not have been clear before. I'm not trying to assert or to prove that TDD "guarantees an improvement in the quality of our code and the speed of delivery" and I regret that it's come off like that. I'm saying that it's worth investigating with rigor and trying to steer this discussion towards specifics. As I implied in my first post, I disagree with the OP's opinions specifically because it stomps out the discussion I want to have here.

As you've implied, there are probably situations in which TDD is useful. There are situations where TDD is detrimental. The discussion I want to have is to define and support as precisely as possible when it's good to use TDD and when you should not. This isn't a call to bring up objections that I can shoot down - I'm genuinely interested in knowing because not knowing (or at least having a very good idea) is unprofessional (in my opinion, obviously).

Anyone who disagrees TDD is "a mixed bag" is unprofessional (as you pointed out - "No silver bullet!"). What I asserted originally was about what's in that bag. I asserted that not knowing is unprofessional because then you're advocating or dismissing a practice without evidence.

Re:Be professional, do TDD by gte910h on Thursday October 28, 2010 @03:06PM (#1844415)
Yeah, I didn't catch that earlier:

IMO, TDD shines when:

You're doing completely data oriented tests

You're doing things that have to work under changing (non-GUI) conditions without crashing

You're using embedded/system level controllers which need to be functioning under all inputs.

You have a moderately data intensive app and a moderately complex GUI action required to put in edge cases.

You have a automation framework at your disposal to push buttons and capture window contents.

You can structure your project into backend library/front end GUI using library.

TDD lacks luster when:

You have lots of GUIs and no automation framework

You have poor definition of system behavior (proofs of concept based apps sometimes have this)

You have an embedded target with limited debugger support

You have physical switches in your application

You have apps with lots of heterogeneously structured mutli-threading (the more conditionally compiled/run code, the worse the heisenbugs get), especially with a strong GUI component.

Re:Be professional, do TDD by jimbokun on Wednesday October 27, 2010 @09:14AM (#1838413)
"tested the old fashioned way"

Maybe a good follow up question would have been "...or any other kind of automated testing?"

If there are not any kind of automated tests, I think there is a good chance the project is in trouble, or will be shortly.

Re:Be professional, do TDD by elmomalmo on Wednesday October 27, 2010 @08:32AM (#1838241)
Because a flawed process has worked in the past is no reason to dismiss a newer, better process as 'religion'.
Re:Be professional, do TDD by mjw on Wednesday October 27, 2010 @09:04AM (#1838360)
Nor does the emergence of a new design methodology preferred by some programmers in some situations, in itself serve as a reason to dismiss older processes out-of-hand as "flawed" and the new process as "better".

There's a big difference between telling someone, "the code you're delivering is not meeting objectively-decided maintainability goals for this project", and micromanaging the personal workflow which someone uses to acheive these goals (test first, test soon after, use TDD as your primary deisgn methodology vs use whatever design methodology has worked for you in the past).

Trying to do the latter, especially when it's done with a tone of superiority and "you're doing it wrong", I think sums up why TDD advocates often tend to rub people up the wrong way -- especially experienced programmers.

Re:Be professional, do TDD by aristidb on Wednesday October 27, 2010 @08:44AM (#1838284)
It is, however, a reason to dismiss arguments that everybody would have to use the newer process. Besides, it is not really clear whether "TDD" is superior to older processes.