From Joel’s blog:
One principle duct tape programmers understand well is that any kind of coding technique that’s even slightly complicated is going to doom your project. Duct tape programmers tend to avoid C++, templates, multiple inheritance, multithreading, COM, CORBA, and a host of other technologies that are all totally reasonable, when you think long and hard about them, but are, honestly, just a little bit too hard for the human brain.
The issue is software complexity and how to deal with it. It’s an issue all programmers have been dealing with since the was such a thing as coding. In a perfect world, one could architect and plan every last detail of a software project before any coding happens. After all, that’s what real architects of buildings do.
Unfortunately, software is inherently malleable and the hardware platforms change every 12 months. And new software solution appear every day. Planning takes a long time and complete planning is a task that I think can never be completed. So how can systems be designed at all?
There are many methodologies that have been proposed to accomplish all the good things that top-down design gives without all the costs. I subscribe to no formal methodology, but believe in iteration from prototypes.
Start with a flexible platform that’s amenable to constant change. The Linux, Apache, MySQL, Perl (LAMP) stack is exactly this kind of platform. Start building prototypes rapidly and get feedback from your clients on them. Apply changes as needed. Use source control to trim Bad Thinking. Design should be only a complex as necessary and no more. Don’t paint yourself into a corner, but don’t look to support all possible features that might or might not be requested of your software in the future.
As Fred Brooks said so wonderfully, there is no silver bullet to software design. And there probably will never be.