Echoes from the Stone Age 295
The echoes from Joel Spolsky’s Duct Tape blog continue to bounce off the blogosphere and twitterverse. Tim Bray and Peter Seibel have both written responses to Joel, me, and each other.
Here are some stray thoughts…
TDD
Anyone who continues to think that TDD slows you down is living in the stone age. Sorry, that’s just the truth. TDD does not slow you down, it speeds you up.
Look, TDD is not my religion, it is one of my disciplines. It’s like dual entry bookkeeping for accountants, or sterile procedure for surgeons. Professionals adopt such disciplines because they understand the theory behind them, and have directly experienced the benefits of using them.
I have experienced the tremendous benefit that TDD has had in my work, and I have observed it in others. I have seen and experienced the way that TDD helps programmers conceive their designs. I have seen and experienced the way it documents their decisions. I have seen and experienced the decouplings imposed by the tests, and I have seen and experienced the fearlessness with which TDDers can change and clean their code.
To be fair, I don’t think TDD is always appropriate. There are situations when I break the discipline and write code before tests. I’ll write about these situations in another blog. However, these situations are few and far between. In general, for me and many others, TDD is a way to go fast, well, and sure.
The upshot of all this is simple. TDD is a professional discipline. TDD works. TDD makes you faster. TDD is not going away. And anyone who has not really tried it, and yet claims that it would slow them down, is simply being willfully ignorant. I don’t care if your name is Don Knuth, Jamie Zawinski, Peter Seibel, or Peter Pan. Give it a real try, and then you have the right to comment.
Let me put this another way. And now I’m talking directly to those who make the claim that TDD would slow them down. Are you really such a good programmer that you don’t need to thoroughly check your work? Can you conceive of a better way to check your work than to express your intent in terms of an executable test? And can you think of a better way to ensure that you can write that test other than to write it first?
If you can, then I want to hear all about it. but I don’t want to hear that you write a few unit tests after the fact. I don’t want to hear that you manually check your code. I don’t want to hear that you do design and therefore don’t need to write tests. Those are all stone-age concepts. I know. I’ve been there.
So there. <grin>
The Design Pattern Religion
Tim Bray said:
My experience suggests that there are few surer ways to doom a big software project than via the Design Patterns religion.
He’s right of course. The Design Patterns religion is a foul bird that ravages teams and cuts down young projects in their prime. But let’s be clear about what that religion is. The Design Patterns religion is the ardent belief that the use of design patterns is good.
Here’s a clue. Design Patterns aren’t good. They also aren’t bad. They just are. Given a particular software design situation, there may be a pattern that fits and is beneficial. There may also be patterns that would be detrimental. It’s quite possible that none of the currently documented patterns are appropriate and that you should close the book and just solve the problem.
Here’s another clue. You don’t use patterns. You don’t apply patterns. Patterns just are. If a particular pattern is appropriate to solve a given problem, then it will be obvious. Indeed it is often so obvious that you don’t realize that the pattern is in place until you are done. You look back at your code and realize: “Oh, that’s a Decorator!”.
So am I saying that Design Patterns are useless?
NO! I want you to read the patterns books. I want you to know those patterns inside and out. If I point at you and say “Visitor” I want you at the board drawing all the different variants of the pattern without hesitation. I want you to get all the names and roles right. I want you to know patterns.
But I don’t want you to use patterns. I don’t want you to believe in patterns. I don’t want you to make patterns into a religion. Rather I want you to be able to recognize them when they appear, and to regularize them in your code so that others can recognize them too.
Design Patterns have a huge benefit. They have names. If you are reading code, and you see the word “Composite”, and if the author took care to regularize the code to the accepted names and roles of the “Composite” pattern, then you will know what that part of the code is doing instantly. And that is powerful!
Minimizing Concurrency.
In my first Duct Tape blog I made the statement:
I found myself annoyed at Joel’s notion that most programmers aren’t smart enough to use templates, design patterns, multi-threading, COM, etc. I don’t think that’s the case. I think that any programmer that’s not smart enough to use tools like that is probably not smart enough to be a programmer period.
Tim responds with:
...multi-threading is part of the problem, not part of the solution; that essentially no application programmer understands threads well enough to avoid deadlocks and races and horrible non-repeatable bugs. And that COM was one of the most colossal piles of crap my profession ever foisted on itself.
Is concurrency really part of the problem? Yes! Concurrency is a really big part of the problem. Indeed, the first rule of concurrency is: DON’T. The second rule is: REALLY, DON’T.
The problem is that some times you have no choice. And in those situations, where you absolutely must use concurrency, you should know it inside and out!
I completely and utterly reject the notion that ignorance is the best defense. I reject that lack of skill can ever be an advantage. So I want you to know concurrency. I want to shout “Dining Philosophers” and have you run to the board without hesitation and show me all the different solutions. If I holler “Deadlock”, I want you to quickly identify the causes and solutions.
Here’s a clue. If you want to avoid using something, know that something cold.
Sudoku
At the end of his blog, Peter jumps on the pile of bodies already crushing Ron Jeffries regarding the Sudoku problem from July of 2006.
I find the pile-up disturbing. Ron had the courage to fail in public. Indeed he announced up front that he might “crash and burn”. And yet he got lambasted for it by people who hid behind someone else’s work. The responses to Ron’s tutorial blogs were completely unfair because the authors of those blogs had everything worked out for them by Dr. Peter Norvig before they published their screeds. They were comparing apples to oranges because their responses were about the solution whereas Ron’s blogs were about the process.
Which one of us has not gone down a rat-hole when hunting for a solution to a complex problem? Let that person write the first blog. Everyone else ought to be a bit more humble.
Do the people on the pile think that Ron is unable to solve the Sudoku problem? (Some have said as much.) Then they don’t know Ron very well. Ron could code them all under the table with one hand tied behind his back.
Personal issues aside, I find the discussion fascinating in it’s own right. Ron had attempted to solve the Sudoku problem by gaining insight into that problem through the process of coding intermediate solutions. This is a common enough TDD approach. Indeed, the Bowling Game and the Prime Factors Kata are both examples where this approach can work reasonably well.
This approach follows the advice of no less than Grady Booch who (quoting Heinlein) said: “when faced with a problem you do not understand, do any part of it you do understand, then look at it again.“
Ron was attempting to use TDD to probe into the problem to see if he could gain any insight. This technique often bears fruit. Sometimes it does not.
Here is a classic example. Imagine you were going to write a sort algorithm test first:
- Test 1: Sort an empty array. Solution: Return the input array.
- Test 2: Sort an array with one element. Solution: Return the input array.
- Test 3: Sort an array with two elements. Solution: Compare the two elements and swap if out of order. Return the result.
- Test 4: Sort an array with three elements. Solution: Compare the first two and swap if out of order. Compare the second two and swap if out of order. Compare the first two again and swap if out of order. Return the result.
- Test 5: Sort an array with four elements. Solution: Put the compare and swap operations into a nested loop. Return the result.
The end result is a bubble sort. The algorithm virtually self assembles. If you had never heard of a bubble sort before, this simple set of tests would have driven you to implement it naturally.
Problems like Bowling, Prime Factors, and Bubble Sort hold out the interesting promise that TDD may be a way to derive algorithmms from first principles!
On the other hand, what set of tests would drive you to implement a QuickSort? There are none that I know of. QuickSort and Sudoku may require a serious amount of introspection and concentrated thought before the solution is apparent. They may belong to a class of algorithms that do not self-assemble like Bowling, Prime Factors, and Bubble Sort.
This blog by Kurt Christensen provides all the links to the various Sudoku articles, and sums it up this way.
TDD may not be the best tool for inventing new algorithms, it may very well be the best tool for applying those algorithms to the problem at hand.
Actually I think TDD is a good way to find out if an algorithm will self-assemble or not. It usually doesn’t take a lot of time to figure out which it’s going to be.
So TDD causes programmers to implement Bubble Sort instead of Quicksort, and this is good thing? With methodologies like these, no wonder so much of today’s software is bloated and slow.
I have no problem with thinking that TDD is faster in the long run, but what about in the short run? When you are starting out and have an entire code base that is legacy code? In the short run it feels slower, even if the work I am doing sets me up for faster coding agility in the future. When it comes to claiming that it is faster, “it just is” isn’t convincing anyone who isn’t already convinced. Is it possible that the project timeline is ever too short to gain the speed benefits of test-first design?
Peter Siebel’s article has a number of examples of people who aren’t convinced that it is always faster, and intuitively writing tests feels like writing code that no customer cares about and so slows you down. Perhaps the speed improvement argument isn’t well described? I’m looking up “fast” on this blog, and I found this:
* Indeed, as the application increases in complexity, the test code grows at a rate that is faster than the production code. Sometimes the production code actually shrinks as the test code grows because the programmers moved a load of functionality out of the code and into the data.
And there’s this quote from your talks and this post: http://blog.objectmentor.com/articles/2009/05/11/why-the-sea-is-boiling-hot
The only way to go fast, is to go well.
and
Once we, as professional developers, realize that the only way to go fast is to create clean and well designed code, then we will see the business’ need for speed as a demand for high quality code. *
Maybe there should be a greater emphasis on how slow the non-TDD engineers are without realizing it. They may think they are moving quickly, but spinning wheels working in a morass of ugly, dirty, hard-to-maintain code is slowing them down.
But there’s still that perception that TDD is slowing you down, especially when you are starting, and especially when you’re learning. How do you convince someone that they are moving faster when TDD feels like they have to stop doing what they have been doing for years (and feel that it is quicker to “just do it”) to do TDD?
Get someone over that hump, and the speed benefits of TDD will probably be much more apparent.
I think the problem is most of avg. programmer wants to set the rules within the system;for them world is black or white.
Each technique and practice is double edged sword. It can save your life or kill you. so is the case, with TDD/Desgin patterns or any other notion of knowledge. With sword extremists faught wars and wise keeps peace.We want to be wise rather than extremist.
Second observation of mine is life is balancing act. Every problem and solution has its own context.We need to observe the context and wisely apply the solution fitting in the same (e.g. Sugar is good but it can be fatal for diabatic).
@Kjetil
No. TDD allows programmers to implement bubble sort first, testing against it’s interface completely. It then allows them to go back later and implement quick-sort and be extremely confident that they didn’t break the system by doing so.
What is gained by iteratively developing a Bubble Sort algorithm, when you have to replace it with a performant Quicksort anyway? Seems like a horrible waste of time, since by Uncle Bob’s own admission, Quicksort can not easily be implemented by applying TDD principles.
I think the point is that once you’d written the tests for the simple algorithm (bubble sort) and you decided it was too slow, you could then try out any other algorithm (quick sort, kjetil sort, or whatever) and your tests would still be valid and would actually help you code the new algorithm much quicker
@Kjetil
don’t do the geek thing and focus on one detail, missing the broader point.
TDD is one of the many ‘common practices’ available (I should really say required) for programmers. Patterns are another, and knowledge of common sorting (and other) algorithms is another.
As in every professional field, it’s the combined application of these well known tools and practices that makes a good practitioner.
A programmer who has diligently applied TDD as in the example above, to arrive at bubble sort is not ready. He or she is missing knowledge of algorithms. Quicksort (or better, I’m lacking here myself probably) should have been the answer here, for every single programmer (implemented TDD wise to make sure it is done properly).
Remember that the book is called ‘learning to program in 20 years’. There is a lot of this stuff and not all of it is part of the standard educational package for programmers.
Imagine a medical school that did not include hygiene in the basic drilling of their students. As if duct-tape surgeons were ok because they get the patient out the door quickly on both legs.
This is alas the current state of affairs in software land.
So keep pushing TDD until it’s unquestioned. And patterns and all the other stuff.
Uncleanbob, you’re not an idiot, so why do you write idiotic things? Why do your clean code fanaticism only apply to Java and not functional languages? Is it because of elitisim? Is clean code something for the unwashed java masses? Those who are turned away at the ivory tower gates?
What on earth drives you to believe that test driven development conjures up algorithms from the nothingness? Are you really so blind to the suppositions you freely insert?
The fact that you actually need to know something about factoring numbers before you get anything other than an if-else explosion from your prime factors-”kata” unless you actually know something about the end result and what you are trying to achieve? Indeed, you cannot even write a meaningful test without knowing something about what should happen with the input parameters!
Why muck about with toy examples creating primitive sorting algorithms no one in their right mind would use? Step 5 in your example is only natural to someone who actually know how to sort elements. Stop pretending it’s not. The proof? How do you know you are done at step 5? Because you know you are writing a sorting algorithm, and you know what it looks like. You know there is not a 6th test that will break the last algorithm exactly because you have all the prerequisite knowledge. Then why not stop pretending and just write the damn thing!
I use test driven development daily. Mainly because I find it useful to define usage of a class first, before I implement it. The tests are there to make sure things are still working as the system evolves. They are examples of approved behavior, the are not a specification for implementation. That would never result in anything other than a bunch of if-tests returning whatever passes the test code. Why do you pretend that it would?
Kjetil: The interface and behaviour of quicksort and bubblesort are equal. You can test drive bubble sort and replace is later by quicksort and still have the result thoroughly tested! Using quicksort right away would be premature optimization anyways…
TDD slows you down if your goal is to be “done coding”. If your definition of done amounts to “It compiles, and nobody can prove that it doesn’t work” then writing a bunch of tests to prove whether or not it works makes your job harder, not easier. Sadly, in many organizations this is what “done” means, and so good developers wind up fighting against their environment, while the bad ones are encouraged to do more of the same.
If, on the other hand, your goal is to deliver a working system, then TDD makes you go faster. This is the only useful definition of “done” anyway, because that’s where you start making money.
I haven’t given TDD a fair shake, because it doesn’t seem accessible to me at all. I would like some feedback on how to overcome some of the inherent technical couplings that occur on every project I participate in.
I feel that I’m not blessed with the ability to do green field development at all. I have it in my head that if I were creating a new web application from scratch, or a new service, something simple, TDD would work easily.
As a consultant in the Microsoft space, every application I create is coupled with other technologies that can’t be uncoupled easily – SharePoint, SQL Server Reporting Services, CRM/xRM…
For example, how would one test a SharePoint Web Part that calls into the SharePoint API for rendering HTML? Or an application that generates a SQL Server report on a timer? I do very much feel like I’d be spinning my wheels pretending these other technologies are there for the purpose of testing.
I can wrap my head around testing basic library code. Does my service timer work in a variety of scenarios? Does the database layer return the right data?
But how do I translate this with complex requirements?
Awesome post. I think there’s a reality show in here with Uncle Bob screaming at developers and them sprinting to the the whiteboard to draw a design before being eliminated.
“Are you really such a good programmer that you don’t need to thoroughly check your work?”
No, I write tests. I just write them last most of the time.
“Can you conceive of a better way to check your work than to express your intent in terms of an executable test?”
No, tests are the best way to check your work, but these tests don’t have to be written first to be effective.
“And can you think of a better way to ensure that you can write that test other than to write it first?”
I don’t see how writing them first makes my code better.
These three points just make a case about the importance of testing, and we are in agreement about that. But you’re not making a very convincing argument as to why writing these tests first is so important, and in my experience, doing so often slows you down since it encourages code churn (you spend a lot of time testing code that you will be replacing, see the Ron Jefferies example) and promotes micro design over macro design.
It’s also been my experience that TDD works great for easy problems such as bowling games or stacks but it scales very poorly in the real world or for problems where the input and output are very clearly defined. Good luck applying TDD for GUI’s or mobile devices. This is why TDD is not becoming mainstream, because people try it at their work and then realize it just doesn’t work.
“Sorry, that’s just the truth”
Sure, your saying so makes it so.
“TDD is not my religion, it is one of my disciplines.”
It is your religious discipline. Like some cultist dancing around the fire baying at the moon exactly at midnight every single day. He is disciplined, sure. That doesn’t make his rituals effective.
“Then they don’t know Ron very well. Ron could code them all under the table with one hand tied behind his back.”
heh heh! Sure! We can see that from how he thrashes around for days on a simple problem. “Sudoku” was followed by “Shotgun blasts” (again incomplete), then “falling off rails” (because he couldn’t fix a deployment issue) and so on….and on …and on. Just read the man’s blog archives to see how he “codes everybody under the table” And now he is being some kind of Scrum Trainer, telling others how to do what he can’t do, and writing bad fictional accounts of “agile” success.
But then who cares about what actual code reveals? Your saying so makes Mr Jeffries a super coder. More “religious discipline” I am sure.
If any of you TDD fanatics think you are so much better than others at programming, show us code you wrote that is better than all the “stone age” programmers like Zawinski and Norvig and Knuth wrote or shipped. Go on, should be easy right?
Show us the brilliant code or products you shipped. THEN call other programmers “stone age” primitives. Right now you are “all hat and no cattle”.
As it is you sound like a lunatic insisting that his schizophrenic visions he sees are real and that people who don’t see the bugs on the walls are somehow deluded!
You call Peter Norvig and Don Knuth “Stone Age” programmers!
God, the arrogance.
As a commenter elsewhere put it, the “duct tape” types apparently really believe those of us who apply TDD were born with it and have yet to be shown the light of giving it up. It took me years of denying, then trying, then seeing both the quality and velocity of my work improve. shrug
Thing is, TDD is no guarantee of success. It merely improves the odds. That’s not sensationalist enough, so neither side focuses on that critical piece.
I can also accept that some people’s brains aren’t wired for TDD, and they do better work without. Some of these people have a far better ability to hold the whole system, quirks and all, in their brain at one time than I. If that’s how they create value, so be it.
I’d rather spend time getting things done than advocating for how I do them anyway. Within my teams, I lead by example. Or, as with TDD, sometimes I follow by example. :)
Again, shrug
Not every problem you solve is researched like sorting algorithms. If it were all of us were unemployed. Not every part of a system is that mission-critical you need it to be perfect. If a feature is run once a day i give a shit on performance. If i figure out later that it is run a thousand times i will start all over and make it perfomant… without breaking the rest of the system.
Its not about perfect, super-performant software, its about shipping a product that works (even with bubblesort) and will still be working after a couple of changes and performance-tunings.
TDD is not a process that guarantees you a working system out of the box. You still have to about how to solve a problem.
Good choice of name!
bq. You call Peter Norvig and Don Knuth “Stone Age” programmers!God, the arrogance.
Actually, if you read carefully, you’ll see that I did not call either of them any names at all (other than to use Dr. Norvig’s proper salutation. Indeed, Dr. Norvig did not appear in the section about “Stone Age” that you refer to.
Dr. Knuth, and a few other’s did appear, but only because words were put in their mouths by another author; and I was refuting that author.
To me, automated tests are the only way to confidently improve existing code in a non-trivial system. The only economical alternative is write-once, test-once, debug-once, fix-once, deploy-once and then keep the code base the same as long as freaking possible. And in a world of constant streams of bug reports, change requests, system upgrades and what-not, the latter alternative is usually not very fast at all…
I devour this blog, but I struggle – how can I use TDD in my windows kernel driver development? Please share experience.
Sigh. The fundamental problem with people who are anti-TDD is that they seem to not understand that test-first is about the DESIGN of the class interfaces you’re using, not about the “proving your code works.” Proving your code works is just a nice side benefit, but I would argue that TDD doesn’t really satisfy that requirement completely, either. You need to go to functional/integration tests, then UAT to get to a point where you can be comfortable that the code “works”. Maybe I’m wrong about that, and certainly someone will correct me.
If you start writing your system and have no clue what your classes should look like and where your important abstractions need to be, then why not write a test that can tell you what functions/abstractions it probably needs, or makes sense to have?
I don’t see what the big deal is. I use TDD to tell me the technical specs for my class/interface design, and it has NEVER failed to simplify my systems. What is there to dislike about it?
For those who don’t see TDD as making development faster: You’re not giving TDD a real try unless your current test run in less than 0.5 seconds (seriously).
Using TDD in “real world” situations, like driver development, systems with lots of interconnections etc. is harder, at least in the beginning. Trying out TDD on a toy problem is a good idea to understand the discipline. Then applying it in harder situations, or at least in subproblems in harder situations is not so hard.
“Actually I think TDD is a good way to find out if an algorithm will self-assemble or not.”
And why is this important? The whole “self-assembling” code thing sounds rather religious to me. And it’s the reason Jeffries failed to finish his Sudoku solver. Testing is no substitute for thinking about the problem at hand.
“They were comparing apples to oranges because their responses were about the solution whereas Ron’s blogs were about the process.”
So what’s more important to the client, the process or the solution? At the end of the day, if all you are doing is gluing APIs to create your bloated CRUD app that has been done over and over and over again in different ways, then you might get away with TDD being a good approach.
However, if you are planning to do any serious problem solving that require a little deep thought process, jumping in and writing tests first is a complete stupid idea. It’s a lazy, hacking, and procrastinating idea. I guess in the age of instant gratification, TDD do strike a chord.
The sad thing with this blog post is that it doesn’t provide evidence to back it up, only childish name calling. In addition, I find it fascinating that you are commending an obvious failure, making excuses and yet fail to even notice Norvig’s success.
> Which one of us has not gone down a rat-hole when hunting for a solution to a complex problem? Let that person write the first blog.
Peter Norvig? He didn’t fail as well.
> Everyone else ought to be a bit more humble. Irony much?
Hey Uncle Bob, I’m not sure I like the implication in one of your comments above that I put words in anyone’s mouth. And as long as we’re being polite, it should probably be Professor Knuth; professors outrank mere PhDs.
-Peter
Peter,
Apologies. You are right, I overstated the issue. You didn’t actually put words in their mouths.
Bob.
If someone claims that a method (like TDD) saves time or improves quality, compared to some other method, I think that he has to provide some evidence supporting that claim. My question is: Do you have any references to studies made showing that TDD saves time or improves quality?
Duct tape programming and TDD programming are two extremes. Neither is a winner and neither proves to be the silver bullet for their respective problems.
I think that as a programmer you need to learn all those tools/concepts that you mentioned in your post (design patterns, concurrency, algorithms) but everyone cannot be an expert and evolution is the process to go. Evolve with all these concepts, with TDD, with duct taping…
btw. @unclebob I think this post of yours was just an anger expression (and not only an answer to Joel), meant to provoke arguments. Joel’s post was also provoking but I don’t think it was intentional.
Where is the TDD equivalent of Netscape, Google Search, Fogbugz, Doom, World of Warcraft, Linux, Photoshop? Hmm?
When I read all those blog entries, it seems that this one is just a way to put oil on the fire just because there was no clean winner when this debate was began.
Just a childish game to see who has the biggest toy? Well, it seems like the usual to me, when we’re talking about a consultant’s world…
“Where is the TDD equivalent of Netscape, Google Search, Fogbugz, Doom, World of Warcraft, Linux, Photoshop? Hmm?”
but …but .. you mean the Chrysler Payroll project isn’t equivalent to these silly operating system kernels and games written by Stone Age programmers? ;-)
What does it matter that the team was kicked out and the project shut down? It still validates “cutting edge” programming practices like TDD. We TDD folks are very modern folks let me tell you . No “Stone Age” programming here, No Sir.
So there. Silly Fellow asking foolish questions.
I got no beef with TDD. At least not the flavor of TDD I was taught and gotten used to. Writing tests to define usage of interfaces is a good idea. Using tests to get rapid compile->test iterations, instead of build->deploy->test is a good idea, and certainly makes me faster. Having tests to provide safety when refactoring is also very useful.
However, trying to use fanatic TDD to convince yourself you are growing algorithms like bacteria in a petri dish, evolving them by providing evolutionary constraint in the form of test cases, that’s just crazy!
Ron Jeffries failed not because he is a bad programmer. He failed because he used an idiotic approach. You agree that extreme TDD is sometimes fruitless. In fact there are no fruits. It’s more like an easter egg hunt where you bring the eggs. Ron didn’t know how to write a sudoku solver (he brought no eggs). No one should be surprised that no eggs were found.
How do you expect TDD to coax out an algorithm for any non-trivial problem without tests for subsets of the problem that require knowledge about the resulting algorithm itself? You still have to think, then code. Either think as you write the test, or think as you write the algorithm. In the end it hardly matters, except that writing tests for absolutely everything is most likely a waste of time.
This blog sounds like a catholic priest teaching teenagers about sex.
The author is bragging about how something should be done without ever doing anything substantial and non-trivial himself.
Uncle Bob, when you write something like Tex, Vim or Linux or Samba or even a sudoku solver, you can have some substance to criticise Knuth or Zawinski methods of programming.
“Those who can do, those who can’t teach”
@razornl
Really, quicksort should have been the answer to begin with? How big is the input? For small values of N, quicksort takes longer than bubble sort. In fact, many sorting algorithms switch to bubble sort when then partitions get below a certain value. Besides, you missed the larger point of
@Cedric TDD is becoming mainstream, you’re just not paying attention. Also, there is a vast difference between “trying” and “mastering”. And the comment that it doesn’t work where input and output are clearly defined, quite frankly, makes little sense. Having the I/O clearly defined makes the TDD process a breeze as you have concrete data to test against.
Honestly, you’re not going to change your mind, so I’m not really sure why I am bothering, but your dogmatic denial of the benefits of a practice betray a close-mindedness. Whenever someone says “In my experience, you’re wrong”, it means they have decided not to listen to data and are determined not to learn.
My bad, didn’t finish a sentence. Should read “missed the larger point of there are algorithms that cannot be arrived at through this process”. And frankly, most programming doesn’t involve the creation of new algorithms.
Oh, another thing on the concurrency aspect. I came up with a good phrase for it:
Multi-threading is the first resort of the over-architect.
“Uncle” Sam – you said just about the stupidest thing I’ve ever heard. Sorry for the non sequitur here Uncle Bob – it’s just stuff like that that really pisses me off.
http://www.yafla.com/dforbes/The_Underappreciated_Art_of_Duct_Tape_Programming/
Appropriate read. Moderation is key.
As of a poor developer point of view: I see TDD as a very structured and sensible approach to write code. It’s better to write them first because this way you describe what need to be done and what you expect from the code you are about to write. Any test written before code manifests your understanding of the code being written. And it’s really so much easier to write them first. After writing code any test is not specifying requirements – it’s more like documenting without giving possibility for the tests to aid the designing process. Documenting also means I have to look at the code and put comments in it and construct documents which sooner or later begin to lag.
But I would not call anybody who write their code without writing tests unprofessional because that’s simply too risky – there are very brilliant guys who don’t use this discipline but surely they use other – like convensions to organize the code wisely. But if you don’t have an automated suite of tests it will be difficult for someone to take the project over. However I would be afraid to become in charge of such codebase. For me maintainability is a matter of concern and I think for UncleBob is that too because maintaining code is where real costs and the really tidious work hide.
But one more thing to say – test driven development is not as easy in real world scenario and real problems arise because you need good isolation frameworks and knowledge to be able to stub your dependencies. Sure everybody can instantiate an object in a test, call a method or two and than assert on something. Well that’s an ideal scenario which happens to be more likely to occure if you TDD, but if you write tests aftewards or write tests for a piece of legacy code chances are there are already so much coupling problems that creating even a simple test is really tidious. These skills take time to develop, books to read and sometimes in existing system you have to write one single line to alter the behavior but constructing a test for it with all the isolation you have to apply can take many, many LOC of so.
That saying should be expanded with “those who can better than everyone else, also teach.” A true master is one who can teach others to become as good as himself.
For example, you mentioned Donald Knuth and he teaches. He has even written some pretty deep books. So your argument is conflicting itself.
@
In Uncle Bob’s previous post, you expressed concern at the blurring of the line between “having unit tests to do regression testing” and “developed test first and designed with TDD ” when arguing for TDD.
In this post, you said: If any of you TDD fanatics think you are so much better than others at programming, show us code you wrote that is better than all the “stone age” programmers like … Knuth wrote or shipped.
From this interview with Donald Knuth:
So it seems that you are blurring the line between “having unit tests to do regression testing”, and “rarely having unit tests”: the question you should be asking is “If any of you automated unit-test fanatics think you are so much better than others at programming, show us code you wrote that is better than ….etc”.
As Keith Braithwaite says in this post:
and also:
Reading all these comments, it reminds me of an evolutionist trying to explain the concepts of Darwin to creationists. TDD is there to protect us! If you are lucky enough to have a decent spec, that will NEVER change, code without it! But the rest of us have to deal with horrible, ever changing specs. Agile and tdd is a worm digging through the path of least resistance (see YAGNI). Non-TDD coders use a bulldozer, leaves gaping holes everywhere and someone else ends up rewriting it all.
its to easy to be negative! When someone is trying to do something positive.
Re 42’s comments: Yes, this sounds like a discussion between evolutionists and the creationist, with the difference that the TDD programmers are playing the role of crearionists – asking everybody to “faithfully” accept their claims that TDD is indeed better. Evolutionists (stone age programmers) want to see evidence.
Good response Uncle Bob. How people can continue to think that TDD is some silly fad continues to amaze me. Anyone with an ounce of experience would know that TDD helps produce clean, professional code that has been proven that it needs to exist thanks to well defined examples.
It isn’t just silly, but unprofessional imho not to do TDD. Deal with tons of legacy code packed with 2000 line classes and no tests around it and please someone try to tell me that TDD is a bad thing.
James: thousands of companies are producing very good software every day without using TDD (and sometimes without even using automated testing).
Calling them unprofessional is not just disrespectful, it makes you sound like a zealot…
And I understand that you and Rob live off the TDD industry, and as such, you are surrounded with companies that do use TDD, but hopefully you realize that you are seeing the inside of a bubble.
TDD is still far from being mainstream and so far, remains confined to conferences, books and a very small subset of companies.
Cedric: What!? How can you prove to me your code is even needed if you haven’t proved the need for it to exist with a well defined example? How can you refactor without having to worry about breaking some unapparent piece of functionality that will cost a company millions of dollars?
I work both on new projects and legacy projects all the time, some done with TDD and some that were built by hacking away with no tests. I find the latter to be a lot more difficult to work with.
Maybe you just don’t have the industry experience that has taught me that code written test first is always a lot more cleaner and easier to work with than code that is not.
Or maybe I should just listen to you and see the beautiful light of cowboy coding? :)
I might have came off in kind of a condescending tone. My point is “my” experience has taught me to value TDD over DDT. Maybe this is the opposite for you, but I know that it works well for me and the code I have written without doing TDD is always a bit of a mess.
James, you seem to assume that there are only two states for code: “written with TDD” and “with no tests”.
There is a third state, “written with tests last”, and my claim is simply that millions of lines of code were written this way and that this code is working just fine.
Mocking developers and companies that write code this way and calling them “unprofessional” is precisely what makes people think that there is a disconnect between the TDD crowd and the rest of the world.
By the way, thanks for rectifying the tone in your second post.
The constant use of deprecating adjectives for people who don’t use TDD (unprofessional, cowboy coding, etc…) doesn’t really help when you are trying to convince.
James, you seem to assume that there are only two states for code: “written with TDD” and “with no tests”.
There is a third state, “written with tests last”, and my claim is simply that millions of lines of code were written this way and that this code is working just fine.
Mocking developers and companies that write code this way and calling them “unprofessional” is precisely what makes people think that there is a disconnect between the TDD crowd and the rest of the world.
“I think that any programmer that’s not smart enough to use tools like that is probably not smart enough to be a programmer period.”
I totally agree with you on that. However, we can’t ignore reality. How many programmers are out there? and how many of them are really good at those tools? So if we kick them out of the industry just because they aren’t smart enough to be a prammer, this industry will collapse…
How do you respond to this Microsoft study saying that TDD results in fewer bugs, but longer development time:
http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf
They say they saw 40-90% lower defect density with TDD, but 15-35% increase in initial development time.
(though the development time number was merely an estimate, as opposed to a measured number)
Wow – feel the love in these comments.
The simplest thing I could suggest to people detracting the effectiveness of TDD is to simply try it. Then try to live without it.
I can only speak out of personal experience, but to me this is the clincher.
I read Spolkys article and thought, well, he has some points. I’d never thought what kind of blogstorm he’d raise with this.
Folks, please, do not be religious about this. If TDD helps you, great! Keep it up. Personally, I try to work like Peter Norvig and Knuth—though I know I’ll never play at their level. To me, TDD (yes, I tried) seems kinda cool if your code can be handled like a black box with nice interfaces that are not crossing system boundaries or user interfaces and if you are not trying develop an algorithm. You can only solve problems that you really do understand.
For all those TDD evangelists out there who cannot stop saving the poor sheep out there (like myself), why don’t you guys gather the evidence that TDD is really, truly producing more stable and better code? Your claims should be measurable. Repeating them does not help. You should have some statistics that count applications crashes and whatnot in order to solidify your claims. Remember: People like me do not try to convince you that TDD is bad, but that we simply do not buy into this as religiously as you do. And we do not call you names, ok?
Until then, pretty please, stop preaching and state the facts and your conclusions. You never know, you actually might win me over, but, sorry to say, the tone in these discussions is revolting.
if you compare TDD with the hygiene practices a surgeon does, i think its not entirely fair. If a surgeon does not wash his hands before a surgery, the chance is almost 100% the patient will suffer. However, i have written lots of code and it works till today and i did not do TDD as it did not exist in its current form. So, absence of TDD is not life threatening, you can succeed without it.
Bottom Line: TDD is a tool that i use when appropriate. There are cases when its not appropriate. I expect an real professional to look at the problem and pick the right tools to solve the problem most effectively. And i don’t agree that TDD makes you a better programmer. Its the other way round, if you are a good programmer you adopt techniques like TDD. If you are a lame coder no tool nor technique will save you.
just my 2 cent.
TDD is awesome and there is no doubt about it. It gives you confidence to make changes and in the long run it proves to be very useful.
But then there are some straight forward projects like “Building Discussion Boards”, “Building Knowledge based WebSite” to host articles and stuff that does not require TDD approach.
The reason that they don’t require TDD is that there is no complexity in the code. Everything is so straight forward.
Bottom line is that the domain will dictate if TDD is required or not. For complex domain TDD should be mandatory but for simple projects it MIGHT be an overkill.
Thanks, Azam
I don;t understand why we speak about developing speed when we speak about TDD.
In my opinion, the main goal of TDD is not “increase productivity”. I never think at TDD as a productivity booster. For me TDD is a guarantee offered to myself and to the client that my work is well done. Is a way to protect my reputation.
So, in my opinion, speeding or slowing the development process when we speak about TDD is meaningless.
My remarks regarding:
“How do you respond to this Microsoft study saying that TDD results in fewer bugs, but longer development time”
TDD = longer development time (~40%) = fewer defects = less time for bug fixing = The total time spent in developing an US is smaller because what we lose in development we gain by spending less time in bug fixing.
And think about your reputation when the client sees an “null reference set to an instance of an object” exception.
dumys
http://www.sextoy7.com
shop sex!
I’m impressed, you know what you’re talking about
Bookmarked this site and emailed it to a few friends, your post was that great, keep it up
Vote for TDD’s big future!
I wish things were that easy!
Thanks for sharing this great article! That is very interesting Smile I love reading and I am always searching for informative information like this.
Thank you for submitting this cool story – Trackback from Dotbot.
Very quietly I take my leave.To seek a dream in http://www.edhardy-buy.com/ starlight.
I like This site! Thank you for your information..
hi!! thanks for a very useful information i got in this post!!i really enjoy reading it!really really nice post!
I had never seen anyone talk about TDD before.
I like your blogs very much. Your posts are different from others. I always find something interesting in your blogs. This time you have posted such an informative article than the previous one. Thanks for sharing your precious posts with us.
That was my favoritie ages. Love this very much
That was my favoritie ages. Love this very much
That was my favoritie ages. Love this very much
Thank you for sharing this information with us
That was my favoritie ages. Love this very much
hi!! thanks for a very useful information i got in this post!!i really enjoy reading it!really really nice post!
It looks like nice one. Stone edge echoes indeed.
I just couldn’t leave your website before saying that I really like this article. there’s a good chance to receive a perfect concept in your mind. the quality information you offer to your visitors
Thanks for the post. I will be back for the next one.
Bull-puncher knickers is always at leisure wear the limelight, cowboy comfortable and cool and refreshing knickers shading effect, it is become big period of change garments according to the spring love and melody. Loose t-shirts , vests even swimsuit can matching, become do not fall convention of change garments according to the collocation of the election.
Thank you very much for this blog.I like its.As to me it’s good job.I come to this site then read this article and i will read your next articles.
Wow – these are absolutely fantastic. We love Creative Commons and thank you for putting
Here’s a clue. Design Patterns aren’t good. They also aren’t bad. They just are. Given a particular software design situation, there may be a pattern that fits and is beneficial. There may also be patterns that would be detrimental. It’s quite possible that none of the currently documented patterns are appropriate and that you should close the book and just solve the problem. cheap VPS Here’s another clue. You don’t use patterns. You don’t apply patterns. Patterns just are. If a particular pattern is appropriate to solve a given problem, then it will be obvious. Indeed it is often so obvious that you don’t realize that the pattern is in place until you are done. You look back at your code and realize: “Oh, that’s a Decorator!”.
very informative good post.I love read this blog.
very informativevery informative good post.I love read this blog. good post.I love read this blog.
news , Style and info there’s a good chance to receive a perfect concept in your mind. the quality information you offer to your visitors
this is great, needed this information thanks Austin Mobile Mechanic I
dupont lighter, dupont lighters, st dupont lighter, s.t. dupont lighters. As classical music evolved, distinctive characteristics developed. Changes in form were seen along with changes in phrase structure.
louis vuitton wallet, louis vuitton wallets, mens louis vuitton wallet, women louis vuitton wallet.
Bedrooms are a place for rest and relaxation. The simplicity of modern bedroom designs creates a calmness that makes that feeling even more prevalent, There are funny and strange bedrooms with different shapes .
gucci wallet, gucci wallets, mens gucci wallet, women gucci wallet.
To get the beachy, wavy look it helps if your hair has some natural wave to it and this look works on hair of almost any length, even chin-length hair or a bit shorter.
gucci wallet, gucci wallets, mens gucci wallet, women gucci wallet.
To get the beachy, wavy look it helps if your hair has some natural wave to it and this look works on hair of almost any length, even chin-length hair or a bit shorter.
LV belt, LV belts, LV belts for men, LV Mens belts.
The earpiece also works with most phones that allow Bluetooth connections, although Earloomz suggests users check their phone manual to be sure.
Men’s belts, LV men’s belts, Fashionable Gucci men’s belts, Attractive style Hermes men’s belts.
The earpiece also works with most phones that allow Bluetooth connections, although Earloomz suggests users check their phone manual to be sure.
armani belt, armani belts, armani belts for men, armani mens belt. If your feel that classic styles tend to be on the boring or drab side, remember that you can always add a little personality. The simple designs go wonderfully with a huge assortment of trendy accessories. By adding some jewelry, a hat or a scarf, you can transform the look for any occasion.
replica louis vuitton belts, replica lv belts, replica lv belts, Elegant replica louis vuitton belt, Fashion replica louis vuitton belts for men, replica louis vuitton mens belt.
Adjusting your diet to a healthier way of eating is a way to lose belly fat without dieting that works for many people. Instead of putting yourself on a restrictive and often unsafe diet, you can try adjusting the way you eat. Instead of five cookies, maybe have one small slice of low fat angel food cake. Simple exchanges like that will provide you with a way of eating that will keep you healthy your entire life.
I am also going to TTD’s future. I think it really need our support.
TDD is faster in the long run and even the short run at times. However in the short run it feels slower, even if the work I am doing sets me up for faster coding agility in the future. When it comes to claiming that it is faster, “it just is” isn’t convincing anyone who isn’t already convinced.
read this article and will read your next articles.
No. TDD allows programmers to implement bubble sort first, testing against it’s interface completely. It then allows them to go back later and implement quick-sort and be extremely confident that they didn’t break the system by doing so. Thank you Guest.
Problems like Bowling, Prime Factors, and Bubble Sort hold out the interesting promise that TDD may be a way to derive algorithms from first principles!.
I just couldn’t leave your website before saying that I really like this article. there’s a good chance to receive a perfect concept in your mind. the quality information you offer to your visitors
It is true. we know it
Wide range of web hosting services are accessible, such as cheap vps , email hosting, Unix hosting, forex vps , Windows hosting, Linux web hosting windows vps etc. We hope you will find a cheap hosting company.
backup and export the iPhone SMS to computer easily.
Get the iPad shared easily, you can transfer the iPad to iPad by drag and drop.
hei, you also can download user manual for free in http://usermanualguides.com
thanks you
http://www.volkswagenmanual.com is for volkswagen lovers, vw manual ebook..
In fact, you know. the contacts and SMS have more values than an iphone’s own value. You can spend money to buy a new iPhone, However, if you get your SMS and contacts lost, it is hard to retrieve them. So, you need backup them.
To be fair, I don’t think TDD is always appropriate. There are situations when I break the discipline and write code before tests.
What on earth drives you to believe that test driven development conjures up algorithms from the nothingness?
Thank you for this nice post
my blog: justin bieber biography | how to get rid of love handles
As iPad come out, it has already draw the tech fans attention around the world. However, no matter how perfect it is, there also exists some disadvantages, e.g. how to enjoy DVDs on iPad, what shall I do if my iPad does not support some of the video formats, how to transfer iPad to Mac.
with their own execution of SuiteSetUp and SuiteTearDown.
However, if you get your SMS and contacts lost, it is hard to retrieve them. So, you need backup them. Portable Tape Recorder
I am impressed of the write.
Great stuff, worth reading. Thanks for sharing!
It’s very important. I love this!
Come and make a change for your lovely iphone 4 white!
“Actually I think TDD is a good way to find out if an algorithm will self-assemble or not.” expections
To be fair, I don’t think TDD is always appropriate. Great stuff, worth reading. Thanks for sharing!
I am impressed of the write. Thanks for this great post.
This is the perfect blog for anyone who wants to know about this topic. You know so much its almost hard to argue with you (not that I really would want…HaHa). You definitely put a new spin on a subject thats been written about for years. Great stuff, just great! I Waiting you!
Nice post. Its really worth to share and spread.
Incontinence products
Thanks for share! I agree with you. The artical improve me so much! I will come here frequently. iPhone Contacts Backup For Mac can help you backup iphone contact to mac.
I really like this essay. Thank you for writing it so seriously. I want to recommend it for my friends strongly. iPad to Mac Transfer can help you transfer music, movie, photo, ePub, PDF, Audiobook, Podcast and TV Show from ipad to mac freely.
TDD is faster in the long run and even the short run at times. However in the short run it feels slower, even if the work I am doing sets me up for faster coding agility in the future. When it comes to claiming that it is faster, “it just is” isn’t convincing anyone who isn’t already convinced.
TDD is faster in the long run and even the short run at times. However in the short run it feels slower, even if the work I am doing sets me up for faster coding agility in the future. When it comes to claiming that it is faster, “it just is” isn’t convincing anyone who isn’t already convinced.
To be fair, I don’t think TDD is always appropriate. There are situations when I break the discipline and write code before tests.
To get the beachy, wavy look it helps if your hair has some natural wave to it and this look works on hair of almost any length, even chin-length hair or a bit shorter.
I like This site! Thank you for your information
is very important
Visit
vendita computer
lago di caldonazzo
read this article and will read your next articles.
Great news update!! I am wondering how you guys manage to find such kind of information so early. Certainly helpful for me and other readers also as I am finding so many good comments here.
Hermes belts, Hermes belt, Hermes belts for men, Hermes mens belt, dupont lighter, dupont lighters, st dupont lighter, s.t. dupont lighters.
LV belt, LV belts, LV belts for men, LV Mens belts, louis vuitton mens wallets,gucci mens wallets,hermes mens wallets,prada mens wallets.
replica gucci belts, replica belts, replica louis vuitton belts, replica hermes belts.
LV belt, LV belts, LV belts for men, LV Mens belts, louis vuitton mens wallets,gucci mens wallets,hermes mens wallets,prada mens wallets.
If you can, then I want to hear all about it. but I don’t want to hear that you write a few unit tests after the fact.
ma sélection de maillots de bain pour l’été.
Lots of people whine that bluetooth Sony Headphones are pricier than their features worth. But,Stereo Earphones those who have attempted the Sony DRBT50 Stereo Wireless bluetooth Headset scarcely have any reason to whine. The retail price, not necessarily sky-high, is worth just about every centStudio Monitor.In spite of enclosing your ears, the headset’s cups will hardly cause discomfort or fatigue, even if you use the wireless bluetooth Sony Earphones nearly its maximum of 17 hrs play or talk-time. The actual cause of this comfort may be the Stereo Earphoneswell-designed and tough underlay on both the earcups and also the headband.
LV belt, LV belts, LV belts for men, LV Mens belts, louis vuitton mens wallets,gucci mens wallets,hermes mens wallets,prada mens wallets.
Men’s belts, LV men’s belts, Gucci men’s belts, Hermes men’s belts.
replica gucci belts, replica gucci belt, replica gucci belts for men, replica gucci mens belt.
lv belt, lv belts, lv Mens belts, lv belts for men.
replica gucci belts, replica belts, replica louis vuitton belts, replica hermes belts.
Ct Credit Bureau offers full tenant screening services to property managers, landlords, and others in the real estate and rental industry.
JAY Follow laptop accessories the detail tips below, you can increase the laptop battery life of a year or more. 1. The laptop battery first thing you should care about the
Oh.. Finally, I found the article I need.
Thanks
This is very helpful information.
Exactly as I wanted somethingI´ve tried Piwik and it worked good!Great Work — thanks. tr
very helpful stuff in here.
Buy $10 Replica Designer Sunglasses with 3-day FREE SHIPPING
I am following your blog regularly and got great information. Thanks
These articles very helpful thanks for shairing.
Hello Great articles and I agree with all comments thanks
Great to met this blog.Good knowledge!!
We are the professional t-shirts manufacturer. t-shirts supplier. t-shirts factory, custom t-shirts.
Wow!! this is one of the best articles good job!! thanks
Hi!! I hope you will write the quality articles like these again .
Have a great day Thanks for your knowledge.
Thank you. I have checked out how this server works with my current application too. So far there is no problem
I was very encouraged to find this site. I wanted to thank you for this special read. I definitely savored every little bit of it and I have you bookmarked to check out new stuff you post.
Thanks for this article.I like its.As to me it’s good job.I wait ur next articles.
Yes, I must admit I was swelled into tears by the soundtrack. Gulping it all down in continuous sittings over the last two weeks has left some things undone here in my own little blue box, but well…It’s alright. I had a good sit coming to me. It has been a long summer.
The upshot of all this is simple. TDD is a professional discipline. TDD works. TDD makes you faster. TDD is not going away. And anyone who has not really tried it, and yet claims that it would slow them down, is simply being willfully ignorant. I don’t care if your name is Don Knuth, Jamie Zawinski, Peter Seibel, or Peter Pan. Give it a real try, and then you have the right to comment.
I think you are overlooking a more important issue here, I would like to hear more about the Digital Dealer curse. San Diego Podiatrist
Hello I really want to say thank you for this article and all of comments.
I feel charmed to read such a good post, I would like to thank the Author for this fabulous information
G Day!! I really happy to read these article very helpful and want to read great articles like these again thanks
The blog is really appreaciable and i like to keep on visiting this site once again that it would help me in further thanks for sharing the info. Social Network
I was very encouraged to find this site. I wanted to thank you for this special read. I definitely savored every little bit of it and I have you bookmarked to check out new stuff you post.
A programmer who has diligently applied TDD as in the example above, to arrive at bubble sort is not ready. He or she is missing knowledge of algorithms. Quicksort (or better, I’m lacking here myself probably) should have been the answer here, for every single programmer (implemented TDD wise to make sure it is done properly).
Remember that the book is called ‘learning to program in 20 years’. There is a lot of this stuff and not all of it is part of the standard educational package for Techno News.
represent agony which was accrediting central box. Your address of the necklaces and their accurate adventitious to angle aloft the butt of this class has created these alike with angle and elegance.
a Seobaglyak igazán éjszaka érzik elemükben magukat. Szinte ”kétlaki” életet élnek. A Seobaglyak éjszaka sokkal éberebbek, és agresszívabbak, olyannyira, hogy olyankor saját fajtársaikat tartják a legnagyobb ellenségeiknek.
It is good and would be helpful for others.
When I read all this post, there was no clean winner when this debate was began.
I feel charmed to read such a good post. My salute to Author for doing such a wonderful job Thanks
I think this is a great way to check the old age.
thanks for the information uncle bob..
Yeah,.. agree with you,.. it’s good to know..
hahaha,...this is what i looking for..thanks..
Yes i agree with it.
internette görüntülü olarak okey oyunu oyna, gerçek kisilerle tanis, turnuva heyecanini yasa.
This is the best article on objectmentor. I like it. I’am added to friendly post list. Thank you.
Okey günümüzde gerçek ki?ilerle internette bildi?imiz klasik okeyden çok daha büyük bir kitle taraf?ndan oynan?l?yor. Okey oyunu indir sizlere ücretsiz oyun deste?i sunmakta. Farkl? hizmet anlay??? ile di?er oyun sitelerinden çok daha e?lenceli okey oyunlar?n? bu sitede oynayabilirsiniz. Oyunu oynamak için hemen okey yükle ve bilgisayar?na kur. Ücretsiz program art?k seninde bilgisayar?nda s?n?rs?z heyecana hemen ortak ol.
ighest quality and cheap belts shop at Hermes belts store.
thanks for this useful informations uncle bob .. i really like it.
wow so useful blog thanks a lot uncle bob,, God bless
wow..now i realize how important stone age is.. one of the best blog ever,, got a lot of info.
the best blog.. thanks a lot.
This article very interesting I will try to find the best blog like this.thanks
I really agree with all of comments thanks
Hello everybody this blog is so cool
i really love your post, its very nice.thank you.
What youre saying is completely true. I know that everybody must say the same thing, but I just think that you put it in a way that everyone can understand. I also love the images you put in here. They fit so well with what youre trying to say. Im sure youll reach so many people with what youve got to say.
I wait behind the visit … Techno News
I am really not too familiar with this subject but I do like to visit blogs for layout ideas. You really expanded upon a subject that I usually don’t care much about and made it very exciting. This is a unique blog that I will take note of. I already bookmarked it for future reference.Thank you.
The beauty of these blogging engines and CMS platforms is the lack of limitations and ease of manipulation that allows developers to implement rich content and ‘skin’ the site in such a way that with very little effort one would never notice what it is making the site tick all without limiting content and effectiveness. It’s as Techno News
Thanks for your marvelous posting! I quite enjoyed reading it, you are a great author.I will be sure to bookmark your blog and definitely will come back from now on. I want to encourage that you continue your great job, have a nice day!
Very good I will recommended to more friends.Good luck! http://www.gzqiyue88.com/">HeidelBerg Parts http://www.gzqiyue88.com/">Printing Spare Parts
Online UK costume and fashion jewellery shop with,
When I started to read article I was thinking about the way you present such great topic. By the way could you please post more article on such topic? I really appreciate it
I am really not too familiar with this subject but I do like to visit blogs for layout ideas. You really expanded upon a subject that I usually don’t care much about and made it very exciting. This is a unique blog that I will take note of. I already bookmarked it for future reference.Thank you.
When I started to read article I was thinking about the way you present such great topic.You really expanded upon a subject that I usually don’t care much about and made it very exciting.
What a wonderful article! And are doing well on the whole, but their work also has shortcomings.
Weekend ago, I purchased this ray ban online here. Today, I come here to select another cheap ray ban sunglasses for my son. I am fond of good sunglasses for the charm I bought here.
This is unique blog.I found this blog really helpful.Thanks for those information.
I have already bookmarked this blog for further study.I am eager to see update here.
thanks nice grat site and i have added in my favorites list
Nice post with innovative contents
The article is very good, I like it very much.
divineproportionscosmeticsurgeryplasticsurgery
divineproportionscosmeticsurgeryplasticsurgery
”>
Nice Article. I wish everyone help by this site.
Scottsdale Custom Home Builders High End Home Builders
Sudoku has taken the world by storm—or at least the part of the world that still solves numerical problems in the newspaper.
It’s a lucky day!I get one pair of women heels from http://www.aliexpress.com/fm-store/908014 ! It’s have beautiful appearance and very comfortable! Here’s your first look at the first Women’s Heels that I have ever seen. I do believe this is the first time our store has released a Women’s Heels in a high top form.
Nice blog, have food day and fun because i love you very much!!
That fantabulous post this has been.
It is always nice when you read some thing that is not only informative but entertaining. Excellent! this post is not only informative but entertaining. Excellent! Great post!
Exactly as I wanted somethingI´ve tried Piwik and it worked good!Great Work — thanks. tr
thanks a lot for your valuable sharing ,right from the beginning till end it was really very informative .i can witness the experience and steps you have taken to accomplish this wonderful work.
You really have command of the English language and have superior writing skills. Kudos to you my friend.
Exactly as I wanted somethingI´ve tried Piwik and it worked good!Great Work — thanks. tr
The article is very good, I like it very much.
The site is more informative and contain useful content for the visitors. It got good posts as well. I will bookmark this site for future viewing. Thanks for sharing.
Thanks & Regards. James Thomas
Great post! I really enjoyed reading it and will certainly share this post with my friends . Read everything you ever wanted to know about birthstones
Admiring the interval and trouble you put into your blog and itemized news you put forward! I will bookmark your blog and have my children thirstily check a depart up here often. Thumbs up!
you put forward! I will bookmark your blog and have my children thirstily check a depart up here often. Thumbs up!high quality headphones new design headphones
First of all, I really like this post. The most important thing I loved about your site and blog is the way of portraying what you want to say. As blogging attract more visitors towards your site and that is the most prominent way of getting good customers, we must take part in it.
HuangXiao surplus think gymnastics and fashion in her speaking complement each other, gymnastics is full of petr cech itself design changes T-shirt stores and inspiration, so she’s graduation work also is a gymnastics, and he came to different parts of the world DuoNian in gymnastics competition, but also to her to experience different cultures, and expand the horizons of their own design.
As Hong Kong the highest level of women’s gymnastics athlete, in addition to the Olympic Games this year, at the age of 24 HuangXiao surplus what game in, and that is also graduated from the www.t-shirtsgo.com/">cheap t-shirts university last year of the last time she in the world university games. Don’t say don’t know, original HuangXiao surplus last year in the Hong Kong polytechnic university graduate, major is fashion design, although after the graduation HuangXiao surplus temporarily when a professional athlete, but she told the reporter, you actually or want to be professing clothing designers, so is looking for work. In my spare time, she will also test NiuDao, such as design some to gymnastics as the theme of the T-shirt, this www.t-shirtsgo.com/">wholesale t-shirts year’s gymnastics championship will be held in Hong Kong, she is involved in the game T-shirt design, very happy.
I liked that great piece of work. Nice quality of work indeed. Hope to find out some sort of work in future in more details.
It is nice of you to post this.I will pay more attention on it. Discount fashion men Prada Lowcut shoes AAA from China for wholesale free shipping,more order,more discount
Good article more useful to me, I will continue to pay attention, and I love discount evening wedding dress,I hope you lot just my site! discount aline wedding dresses http://www.tofuchina.com
I was awaiting for such an article and I have gained some useful information from this site Thanks for sharing this information, There is no better way to give information to people than on this way.The right information always find way to targeted people.I completily realize you admin.Great recourse of info.
I enjoyed reading this post. Actually any event like a marriage is always enjoyable even its discussion is much more enjoyable than attending it. Thanks for sharing.
Thanks for posting such informative article. Really it is appreciated for such stuff.
thanks for posting this article sir.
I must say. After reading what I just read, you are an amazing author! Really, you use proper grammar, proper use of pronunciations, proper everything! I might also like to add and say that I think you pin pointed my style of writing as well which I adore! What I also like about your blog is that you give an opportunity for a wider variety of an audience to unravel the immense storyline of your writings. And with that, I think you will definitely keep up succeeding in flourishing an exceptionally well written piece
Hotels Ithaca NY | Ithaca Hotels NY
Thanks for posting some great ideas and I’ll try to return back with a completely different browser to check things out! Also, I put a link to your blog at my site, hope you don’t mind?
Folder Printing | Presentation Folders
Thanks a lot for your valuable sharing,right from the beginning till end it was really very informative.I can witness the experience and steps you have taken to accomplish this wonderful work.
Therapy New York | Therapy NYC
It help me very much to solve some problems. Its opportunity are so fantastic and working style so speedy. Thanks for posting this informative article Thanks a lot for enjoying this beauty blog with me. I am very enjoyed for this blog. Gifts For Women .
The post is written in very a good manner and it entails many useful information for me. I am happy to find your distinguished way of writing the post.
Swing Set Accessories | Accessories For Swing Sets | Rope Ladder For Swingset | Slide For Swing Set | Infant Swing Seats | Toddler Bucket Swing Seat
The upshot of all this is simple. TDD is a professional discipline,and seems really effecient.
asdas dfsa68d98ssss
asdfsd fgd77d7d7d
asas df+a7s0+ fas4d+9f sd
http://www.capshoponline.com/
thanks great info!
I can’t say that I’m using TDD all the time , but still it works for many occasions.
Wow this looks interesting information, I am going to give it a try. Thanks
Well I didn’t knew this much about all these! Great informations, I guess I would follow all your posts :)
bus today, make them Cheap Beats By Dremiserable. One said: “I ??am really unlucky it! I was packed Beats By Dre Studioin the car to flow production.” One said: “I ??called Beats By Dre Soloit bad luck! In I was packed car are pregnant.Beats By Dre Pro Classic joke: I TVU A university studentbeats by dr dre caught by the enemy, the enemy tied him at the poles,just beats solo headphones purple and then asked him: say, where are you? You do not say it electrocuted! Scheap dr.dre beats studio headphones balck/yellowtudents back to the enemy a word, the result was electrocuted, he said: I am TVU.Hot sale beats by dr dre pro headphones
I really believe that TDD brings lots of quality to your product
I read a lot of posts, you know, on just this very topic; and many just leave me feeling as though so much is missing. Not so with this post! What a satisfying read this was! So much so that I read it twice!
This is a really good read for me. Must agree that you are one of the coolest blogger I ever saw. Thanks for posting this useful information. This was just what I was on looking for. I’ll come back to this blog for sure! I bookmarked this blog a while ago because of the useful content and I am never being disappointed. Keep up the good work.
Stereotactic Surgery in Tennessee
Very good, I like your article, continue to work hard, I will often come to pay attention!
Où acheter assurances autos bon marché s’il vous plaît?
Uncle Bob, I have read Knuth, and I have read you, and you, Sir, are no Donald Knuth.
Okay, jokes aside….
it strikes me that there are a lot of assertions in your article that are not backed up by concrete data.
For instance, you say that unit tests, and in particular test-driven development, make one go faster. Okay; but where is the data to to back that up? A recent paper out of Microsoft Research showed that TDD did substantially reduce defect rates, but at the cost of slowing down development by 15-35%. (See, e.g., http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx) Does the defect rate reduction and enhanced ability to intuit the effects of changes on the overall system facilitate integration? Change? Enhance ongoing maintenance? Perhaps, but that’s not well articulated by most TDD proponents.
Another misconception I see in some of the comments is the assertion that tests prove correctness. I don’t understand why acknowledging that this is simply not true is so hard for testing proponents and TDD-afficienados. Testing can certainly help one gain confidence in the correctness of the code, but it just cannot prove it (it can, however, prove that code is incorrect). Testing can be, and is, a very effective method for finding (and thus aiding in the repair of) defects, and then adding checks to ensure those defects (or similar classes of defects) do not recur in one’s code. However, it is no substitute for reasoning about one’s code and about the problem domain at hand. And the criticism that it encourages a micro, rather than macro-level view of the code is often valid; e.g., Jeffries’s failure because he gets so tied up on issues of representation.
A related point I’ve seen in many of your books, and from many members of the “agile” and “craftsmanship” communities, is this false dichotomy that seems to say that if one does not follow that one must then be doing the opposite. E.g., the satire in Appendix C of “Agile Software Development: Principles, Patterns, and Practices” which contrasts the “traditional” waterfall development model and CMM with XP. “We can only do design because we are in the design phase.” Now, I’m sure that was exaggerated for satirical effect, but it just comes across as sour-grapes. A more concrete example is placing what seems to be too much faith in, e.g., TDD. One doesn’t have to accept all of the TDD doctrine in order to appreciate the considerable benefits of automated testing.
I think that part of what Seibel said, that is valid, is that these claims would be taken more seriously if they weren’t quite some bombastic. TDD demonstrably does not always make one go faster; programmers who think that TDD slows them down are not all living in the stone age (e.g., Knuth doesn’t seem to see much value in it). And it’s somewhat self-serving to assert that it should be part of the canon of the profession in the same way that hygiene is for the medical profession without at least acknowledging that there are other methods for doing things. Just because one doesn’t use it as a primary method doesn’t mean that one can’t produce high-quality, well-tested software.
To summarize by basic complaint for the TL;DR crowd: there needs to be more empirical data to back up the claims of the agile community, and there needs to be more balance.
Great post. Bookmarked this site and emailed it to a few friends, your post was that great, keep it up…..............
This article is impressive,I hope that you will continue doing nice article like this.
Its been very informative posting. I have got some great tips from your blog. Thanks for sharing such valuable stuff with us.
Great easy way to do a backup of iPhone files to Mac with this program and you can easy recover them from computer.
TDD is a means to an end. Sometimes it’s highly appropriate, sometimes it just creates the illusion of progress while obscuring ignorance of how to actually solve the problem. It would be more useful to focus on when TDD is the right tool (and when it’s counterproductive), rather than asserting that it’s always the best technique.
Worry about all contacts in your iPhone will be lost in case of accidental breakdown of the phone? Or wanna transfer iphone contacts information from one phone to another? Now, you get 4Media iPhone Contacts Transfer, a convenient iPhone contacts management tool to help you backup iphone contacts, import/export, restore and manage contacts information in your iPhone to wipe out all your worries and fill your needs on important contacts information security.
This article is GREAT it can be EXCELLENT JOB and what a great tool!
great post and a great blog!! thank you!!
It is a good post , I like it and please keep writing .
when i was still studying, my favorite subject then that time was science and english but the “History” teacher came it, i feel dizzy and would want to whole period to end too soon.
Sounds like my experiences from working on websites, deserves a share
excellent information on this website and good post. Thanks for sharing the info!
well i think this echoes from the stone age is already part of our lives.
your website is place that has really got some interesting articles.
Its really very informative posting indeed. Thanks for sharing such valuable info with us.
Bed Bug Control Toronto
Best seborrheic dermatitis treatment If You Have Itching & Flaking Then You Are Missing This Ingredient!
your website is place that has really got some interesting articles.
Australia Beats By Dre Studio dr dre beats headphones beats studio beats pro beats solo hd pro headphones music Official store Monster Beats By Dre Pro
Thanks for the information, I’ll visit the site again to get update information video games
Thanks for the information, I’ll visit the site again to get update information video games
This is a really good read for me. Must agree that you are one of the coolest blogger I ever saw. Thanks for posting this useful information. , convert m4r and iphone ringtones maker, mp3 to m4r
Ramen Noodle Recipes Ramen Noodle Recipes this is great article, i very helpfull with this articles and to admin thanks
can, then I want to hear all about it. but I don’t want to hear that you write a few unit tests after the fact. I don’t want to hear that you manually check your code.
n the stone age (e.g., Knuth doesn’t seem to see much value in it). And it’s somewhat self-serving to assert that it should be part of the canon of the profession in the same way that hygiene is for the medical profession without at least acknowledging that there are other methods for doing things. Just because one doesn’t use it as a primary method
Your writing is good.
I liked your comparison with the stone age. It is very interesting. keep writing these great posts. I love it. They are great.
michael kors black bagStroll through the gardens, explore the hidden and michael kors tote salelabyrinthine alleys, take tapas in one of michael kors bags salethe many cafes and watch an unhurried world pass gently by. michael kors tote bag If you have only ever visited Seville in your imagination then the Barrio michael kors satchel handbagSanta Cruz is probably what you had in mind michael kors shoulder bagSeville Cathedral michael kors hamilton handbagBuilt on the site of a great 12th century mosque, the Cathedral is the largest Roman Catholic church in the world, so prepare to be staggered by its sheer size and opulence. It is also notable for its altarpiece – a masterpiece of Gothic carving fashioned from mind-boggling quantities of gold. michael kors hamilton large toteThe cathedral also houses a famous tomb – and one that undoubtedly deserves a visit – that of certain Christopher Columbus. And if you want to enjoy some fantastic view of the Seville, make the effort to climb to the top of the Giralda – the cathedral’s magnificent minaret – the most visible, and many would say, the most memorable landmark in the entire city Alcazar michael kors hamilton bag
With more than 20 years of experience, Intertech provides an extensive integrated operational ability from design to production of molds 100% made in Taiwan. Additional to our own mold making factory, we also cooperate with our team vendors to form a very strong working force in Taiwan.
For the overseas market, we work very closely with local representatives in order to take care of the technical communication and after-sales service to our customers. We also participate in the EUROMOLD & FAKUMA exhibitions and meet our customers every year in Europe. By concentrating on mold “niche markets”, we play a very useful mold maker role from the Far East whenever customers want to develop their new projects. We provide services from A to Z to our customers on a very economic cost and effect basis.
beats by dre headphone vivienne westwood Melissa chirstian louboutin sale michael kors outlet store vivienne westwood handbags
michael kors outlet storeThe newly elected President of Egypt Morsy muhammad published the first speech since his victory over ahmed ShaFei g announced on Sunday night, vowed to “protect the international agreement and obligations”, this seems to be a reference of the peace treaty with Israel..chirstian louboutin outlet
vivienne westwood melissa Morsy tried to appease those worried that he will take immediate action to change the whole Egypt, is expected to become the President all the egyptians, “muslims, christians, old people, children, women and men, farmers, teachers, workers, those engaged in the private and public sectors, the businessmen.”beats by dre headphone
michael kors clearance bags Morsy welcome Obama’s support, the two leaders reaffirm their dedicated to advancing US-Egypt partnership, agreed to maintain close contact with the future of a few weeks, months, according to the statement. Christian Louboutin Daffodile 160mm Pumps
The movement that may be army in acclimation for any to dedicated an acquirement in any of those crave to October September not Launched Exactly the same idea goes when you plan to use December
November be The next step is once in that simple. that is application the accuracy that address ancient is on types would not in accomplishment do the ambuscade for you, to not accepting which they
what can be the allowances of address these from Well, are several of it for you Inexpensive the absolute which don’t match your entire outfit will never be this type of strategy.
celebrated out of your West Coast. ve been anchored Los Angeles County. activity that you could crop with address these from Ceramics is that, it giving the look a stretched or pulled together,
I am happy to find this post Very useful for me, as it contains lot of information. I Always prefer to read The Quality and glad I found this thing in you post. Thanks
I wanted to thank for this great read!I really enjoyed reading. One of the more impressive blogs Ive seen. Thanks so much
Thanks for sharing this great article. I feel strongly about it and love learning more on this topic. It is extremely helpful for me.
Boots have always been the favorite of most the women. Wedge boots are special christian louboutin Bibi kinds of boots that have been designed for the women of today to keep them christian louboutin pump shoes up to date in fashion. They have a unique style and are loved by many.
There was a great stuff in this article I really liked it very much! Gold had save a lots of informative site. Thanks a lot for this post!
I’m very glad to see such good information being shared freely out there.