Duct Tape Considered Harmful
stochasticgeometry.wordpress.com
stochasticgeometry.wordpress.com
I don't want to get into the whole testing debate, but I think you can read the whole article and remove the one point on testing and it still holds.
I have often been guilty over engineering things to do them the "right way", to either end up throwing the feature out anyway or having to reengineer because I didnt know enough about the problem to fulfill its design from the outset anyway.
while prototype fast is a reasonably mundane point, Its still one we get wrong time and time again, and I think programmers pay lip service to it as an ideal, but when it comes to actually having to leave that nasty bit of code alone because it does its job, too often we go down the wrong path of making it "right"
As a web-developer I used to think of tests as frivolous wastes of time, whereas he saw them as an essential and necessary part of the development process.
Since I started implementing testing on all my projects I have noticed that my ability to change the code has actually gone up, which in in stark contrast with my initial expectations. I think that having a sounds testing methodology definitely has benefits even in cases where financial/life loss due to software failure is an impossibility...
The video drivers you mention are a good example: an aerospace customer is almost certainly operating on a slower schedule, and probably has contracted the revenue already. The value of time to market here is less. And of course the value of code quality in a vehicle safety application is much higher than it is in a consumer web app.
So I'm not surprised at all that sane and smart people would make different testing decisions in the two regimes. They're both right.
Here is an argument against Ford Pinto case http://www.pointoflaw.com/articles/The_Myth_of_the_Ford_Pint...
The point wasn't whether the car was okay, it was about the amoral behaviour of the company. Ford crossed a line between wanting to produce something to a given spec; and depraved indifference to the damage the errors in the design would cause. It only sounds like a subtle difference.
Companies and governments should be amoral but rational. otherwise church and state will not be able to separated from each other. To me, moralistic companies/governments do more harm than welfare to humanity.
This is, indeed, an excellent article and, I would suggest, a must-read for anyone with an analytical mind.
Please do so and form your own understanding before reading the rest of my comment.
What I find fascinating adn distressing is the reliance on potentially meaningless statistics to determine relative safety of cars. (Fortunately, today, one can query quite a bit of data at http://www-fars.nhtsa.dot.gov though there may still be a GIGO).
Specifically, I'm uncomfortable with denominators used in such statistics, as they appear to assume consistent driving patterns within a certain "class" of cars. (Is there a study which shows this?) For example, the denominator of units of a model in operation is deceptive, if one model is driven far more than another, or, perhaps, rather, that one model is overwhelmingly favored by those who drive more less.
I have, admittedly, begged defining what driving "more" or "less" means. It seems that miles traveled is commonly accepted, but overall time spent traveling may be equally, if not more, meaningful. Sadly, this latter information isn't readily available, contributing to the GIGO problem. Even person-mile data are elusive.
Since the "nonmotorist" number of fatalities shown by the FARS front page ("Sub Total2") is around one sixth the total, this could easily mask differences in safety between models, since, presumably, car safety features are, first and foremost, for the protection of the occupants, not nonmotorists (or motorcyclists).
Back to the (sub-)topic at hand, my biggest take-away is that the Pinto was not defective or inherently unsafe, as it did not burst into flames on its own, nor is a cost-benefit analysis (which requires putting a price tag on human injury and death when it comes to safety features) reprehensible. Instead, such an analysis is necessary and beneficial.
The most important concept here is risk. How systems behave "in the wild," especially when human users/operators are part of these systems, is far from a certainty. This is the uncertainty is the basis of the polish vs. ship tension, as well as, apparently, the basis for negligence jurisprudence.
That I consider the whole Pinto debacle to be primarily about imposed versus consented risk on the part of the purchaser might make this whole sub-thread irrelevant to the OP's topic, but I think a contrast would be instructive in any case.
Regardless, I personally do not believe it is up to an engineer to make a risk analysis. Rather, I am a firm believer in more "sunshine" on such information, despite the current practice of graffitying products with warning labels.
But there are self-interest forces at work in arguing against the duct-tape arguments--advocates of patterns, tdd and so on.
Two parties in this argument here have shipped real software in crunch mode. Perhaps others in this argument have not.
This is a key point. Agile methodology vendors who wax loudest about TDD and other "core practices" have never shipped any significant software [1]. None of them ever built a software product or a startup. Neither do they show us any decent body of code written with their superior approach [2] (vs talk interminable about how our code will be better if we adopt their advice and pay them the big consulting $$).
After all the book is about Coders At Work, not "Methodology Vendors at Work" (which might be an interesting book, in a very horrific fashion).
[1] How many of the creators of the Agile Manifesto have shipped any significant software or built a software company? Most (All?) of them are methodology consultants.
[2] Kent beck has JUnit. Robert Martin has Finesse. The rest of the agile gurus don't have anything. I leave it to the readers to decide if JUnit and Finesse are significantly superior, designwise, to other Open Source code bases, written without TDD.
Bugs in systems like that will kill people, and we're getting to a state these days where those systems are becoming more and more embedded in day to day life and the risk to Joe Soap is getting higher. How long until a bad UI in a GPS iPhone app turns out to be a contributing factor in a bad car accident? Or until a web-based medical app with a hidden bug screws up a dosing calculation for a patient?
This whole duct-tape-it-and-ship-the-sucker mentality has got to stop, before someone gets badly hurt.
StrawMan.
replace "duct tape programmers" by "TDD/Agile consultants" What do you get? ;-)
"tell me you'd be happy depending on those systems, for your chemotherapy or your ABS brakes or your ATM code or your airliner's fly-by-wire system."
More Strawmen.
Would you be happier if methodology consultants whose only programming experience in the last 10 years was working on a PayRoll System at Chrysler (which failed btw) used TDD to develop your chemotherapy/fly-by-wire/ABS brakes? ;-)
Or are you saying you base your level of happiness on the experience level of the coders involved rather than their test coverage stats? Because last I checked, experience levels meant very little. The Tacoma Narrows bridge was designed by - at the time - the foremost structural engineers in the world. Their paper on its design was recognised as the single most important paper of its kind in that decade. The bridge still fell, not because they were wrong, but because of something nobody had encountered yet (in this case, aerodynamic flutter).
Critical code is precisely that - critical. You don't leave it to the "gifted engineer" model of development because that always fails. Noone is gifted and diligent 100% of the time, everyone screws up eventually. It's dangerously arrogant to think otherwise. You build a system of work that lowers the probability that those screwups make it into a working system, that's all. Civil and Mech. and other engineering branches have been doing it for decades. We're just getting started on it in this branch of engineering.
And to some point, we need people, maybe our beloved one, maybe ourselves to be sacrificed in order for scientists and engineers in the next generation to figure out and put them into their test cases to avoid repetition of tragedies.
I think you misunderstand gifted engineers. Gifted engineers understand what they shipped are imperfect, but they have guts to ship them and see how they work. The failure will be lessons for next generation to learn. I feel more scared of people who think their tests have removed all known defects while they forget about unknown defects. They have committed the sin of "confirmation bias" and is much worse to welfare of humanity.
But there are another part of computer science and engineering dealing with fuzzy requirements or unknown problems. I don't see any better way to explore that area except trials and errors and the scientists and engineers have to face possible charges of "piss-poor", unethical, criminal and evil for the consequences of their solutions.
I feel that you have a very clear dichotomy of moral system. Unfortunately I deal with fuzzy things daily and see the harms of dichotomy in creating new stuffs and burning through money without any fruit of labor. It is easy for you to improve existing technologies because you can define criteria for improvements. But it is so hard in underfunding web startups that you can't expect in advance what a new solutions will be to users unless you make it and test it with them.
If I need someone to preserve and maintain existing software systems, because specifications and use cases are well defined, people like you are well fit for the task. But if someone has a new idea to solve a new problem that no one solved before, I would rather to see an unsophisticated solution first to test against the problem and start from there, and I am ready to rewrite the system when the problem becomes clearer.
I'm not suffering from an absolutist morality here - I'm pointing out that there are consequences to piss-poor engineering, and it is necessary for engineers to take the viewpoint of those being hurt rather than that of those trying to make money selling the product; because after four hundred years of training engineers, that's the best way we've found of preventing disasters. And the same should be true of developers, because just as civil and mechanical engineering before it, computer and software engineering are increasingly forming an integral part of the infrastructure we live our lives in.
You seem to hang up at the concept that it has to be perfect from the first time from your writing.
Luckily, I just finished reading this article by one of the Twisted guys in relation to the recent release of Tornado which, in passing, sings the praises of TDD, basically calling it essential for the work they do: http://glyph.twistedmatrix.com/2009/09/diesel-case-study-in-...
No that isn't what I am saying. I am saying many of these people have no programming experience worth a damn. If someone were to tell me how to program(which is what all these methodology sellers do), they would be much more credible if they actually had the programming chops to back it up.
Musashi writing a book on swordsmanship is one thing. If I (who couldn't wield a samurai sword to save his life) write a book that claims my "style" of swordsmanship is better than anything all the others existent today, I shouldn't be surprised if practicing swordsmen don't pay me much heed.
It is the juxtaposition of people with no demonstrated/demonstrable programming skills being loud and obnoxious about the superiority of their advice about programming which I pointed to.
I was also careful to distinguish between Beck and Martin (who at least walk the walk by putting out code developed using the methods they preach) from the other more "all hat no cattle" folks like Jeffries. so to answer your question,
"Bit of a catch-22 there, no? "
No, Not at all. :-). I don't have any problems with people telling me how to program. But I don't trust people who demonstrate convincingly that they know nothing about programming (like Ron Jeffries does with his Sudoku code) who also claim to be "masters" of programming.
That would be like trying to learn fighting skills from a martial arts "master" you saw getting bashed around by a couple of punks at the bar last night, and ended up being taken to hospital and is still covered with bandages and walks with a limp! A master who wins fights would be much more convincing if he claimed he discovered a new martial art which makes existing ones obsolete.
I explicitly said
"None of them ever built a software product or a startup. Neither do they show us any decent body of code written with their superior approach (vs talk interminably about how our code will be better if we adopt their advice and pay them the big consulting $$)."
I stand by this. These guys write books that are the programming equivalent of "Who Moved My Cheese"?. "Coders at Work" otoh, focusses on people who actually are great programmers. Each interview contains more wisdom on programming than reams of "agile" (and these days "lean") textbooks.
FWIW, I did TDD almost exclusively for three years (when I worked at ThoughtWorks), but I don't do TDD anymore, though I still have unit tests.
I don't know about the specific people named in swordmanship but generally in sport the best teachers, coaches and managers will not necessarily be the best at the actual sport. Maybe that doesn't apply in the martial arts though.
And that's at the top level. For ordinary folks I'd suggest that the advice given by a legend may be inspirational, but that pragmatic advice from a standard teacher which is aimed at their level (e.g. "walk away from bar fights if at all possible") may be more appropriate. So I have no problem with methodology suggestions provided by the less than leet.
Also, your reply suggests you unit test, you just don't write the tests first. Which means, compared with the average programmer, you're like Greenpeace complaining about PETA and while you see a big difference the 'average' person just lumps you in together under the general heading of "extremist weirdos".
Fair Enough. You have a right to form your own opinions. Asking for proof of competence is not "ad hominem", especially in a context where that competence is what is under discussion. But yeah,, whatever.
I think most agile guru can't code for nuts. If you have difference of opinion, show me some great code these agile gurus wrote that in your opinion gives them the "level" to teach us how to code. Or a wildly successful project they managed(No the original XP project at Chrysler that failed doesn't count! ;-)) to the point they can give us the rest of us lessons.
"So I have no problem with methodology suggestions provided by the less than leet."
I don't either. But I do have problems with people who can't put one foot in front of the other masquerading as martial arts teachers. A teacher should know something beyond the students they purport to teach.
Shifting form martial arts to music, If someone doesn't know how to string a guitar and sets himself up as a "master guitarist" , should we all automatically respect him as a maestro just because he calls himself one?
Programming like music depends on quality of the output, not what title is on a visiting card. if someone can't sing "Jingle Bells" in tune, he is hardly a "musician" no matter what he calls himself or how much he blogs/tweets/writes self promoting pamphlets. Likewise for the programmatic equivalent of what (agile "guru" Ron Jeffries's attempts at TDDIng a Sudoku solver are. Please do a web search for "Ron Jeffries Sudoku Norvig" for the gory details).
A master musician is someone who can play very well. A music teacher should play much better than the untrained/untalented, if not at superhuman levels. There is a minimu,m bar of performance where it is criminal to let such a person "teach".
" your reply suggests you unit test, you just don't write the tests first."
I use what works.
But your vague Green peace/PETA analogy doesn't hold. You have your history mixed up.
You imply that anyone who uses unit tests is different from a an Agile Kool Aid drinking, propaganda spouting full time TDDer only as matter of degree. So Unit tests = agile to some degree !
Yeah Right :-).
Unit (and other) tests were used much before the agile weirdos came on the scene and blew it up into some ultimate design method (which I don't believe in - I've stated what I believe in - I think the Agile movement is largely inhabited and sustained by consultants and "scrum masters" and people who write books but no/very bad code.).
Using unit tests is not supporting Agile/XP/whatever. Drawing an occasional UML ish diagram on the whiteboard doesn't mean you support the RUP methodology salesmen.
FYI. I am done with this thread. I have no intention of going back and forth with you on a long and tedious thread. The PlinkPonk Thread Depth Alarm just went off. If you are really interested in discussing this offline, my email is in my profile. Else, well met and have a great day.