“Yeah,” he says, “At the end of the day, ship the fucking thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.”
My hero.Spolsky goes on to bash multiple inheritance, architecture astronauts (a frequent peeve of his), templates, COM, multithreading, unit testing, et.al.
This has led to numerous rebuttals, here, here, here. Taking a shot at unit testing is always guaranteed to get some flaming started. Zawinsky hates on C++... which of course is heavily used at Google and apparently multiple inheritance has its fans.
A cheap shot from mhinze throws in a little ad hominem:
never take advice from a bug tracking salesmanBetween fast, good or cheap, this debate seems to be about the relative merits of fast or good. Though I expect that Joel would argue that the addition of at least some of the features (multiple inheritance, COM, not sure about unit testing) actually makes it less good as well as lest fast. Many of those on the side of good seem to be focused on code maintenance.
For established companies, projects with an existing code base, or projects that have a guaranteed audience and lifetime, we understand putting more emphasis on good. The lifetime of the codebase is such that the maintenance cost is likely to be high. However, for most startups money is tight, likilihood of success -- and thus the likilihood that your code will ever need to be maintained is low, thus arguing for fast.
That said, we are fully in the worse is better camp. Maintenance is for drones.