The Tendency to Overdesign

I got an email tonight with a great question and I thought I’d share my thoughts / gather some feedback.

Here’s the question:

One problem that I have always had  that after I design a website or Silverlight application I tend to start second guessing what I have produced.  Next thing you know I start tweaking a little bit here and a little bit there and in the end it ends up totally different when maybe it was fine to begin with.  It’s almost as if it’s not good enough and I am over critical. Do you have that problem?  If so, how do you deal with it or how do you recommend I deal with it?

Here’s my response:

That’s a great question. I’m certainly no stranger to overdesigning something that was good to begin with. On the other hand that refining process often makes things better not worse. So, I don’t have a perfect answer for  when to stop, but I do have some thoughts:

First, your instincts get better with time and you need to trust them. If you don’t have that “in the pocket” feeling about something, it’s probably good to keep exploring. You can always go back.

Second, it’s always a good idea to put some space between you and a design from time to time. I usually have two or three things “cooking” just so I get some perspective as I bounce between them. If you have the luxury of a time, taking a few days is great. Use that time to try to shift your thinking, find new inspiration, etc. When you go back, you’ll almost definitely see the design in a different light.

Third, backup as you go and keep a history of your iterations. Once you give yourself some space, go back and try to deconstruct your thinking. That will give you a chance to find the good among the bad. It will also help you understand yourself and refine your instinct.

Your response?

Wondering what other folks would say to this. Anybody have thoughts to share? How do you know when a design is good enough to stop?

5 Comments

Stephen Cleary / MAY 05 2010

First, let’s make a distinction between “overdesign” and “redesign.” Overdesign is when good design principles are taken too far; this is usually the result of accommodating imaginary future requirements. IMO, overdesign is a common and very dangerous pitfall.

Redesign is completely different. As one develops software in a new technology (which can include new languages or major version upgrades of existing technology), one learns as one goes. As time goes on, this increased familiarity will spawn better designs. There’s nothing wrong with refactoring a completed system (especially if you’ll have to maintain it).

The newer designs should become part of your skill set. By this I mean that your redesigned web site should be the same as if you designed it from the beginning after the period of increased familiarity. It’s also OK to experiement with possible design approaches, though each experiment should be kept separate from all other refactoring.

As long as I have to maintain the code, it is subject to redesign at any time. You could call this “proactive redesign.” I don’t want to have to add a feature a year down the road and be fighting code written when I was still a newbie at .NET 4.

John-Martin Malone / MAY 06 2010

Accept that there is rarely a single correct approach for any problem.
Some alternatives may be better than others, some may be equally good.

If you’re having trouble deciding about ‘good enough’ or ‘better’ try stepping back and looking at your goals.
What are you trying to achieve with this design? Who is it aimed at?
Some goals are measurable – user testing can help.

‘Good enough’ is ultimately determined by your customers.
If you can, get feedback from stakeholders during the development process.

When I tweak a bit here and there, I’m often too focused on particular details at the expense of the whole.
Time away from a particular project definitely helps get back the big picture view.

Remember: ‘real artists ship’
It’s good to want to do better, keep thinking about it and it may be inspiration for future projects.

Ed Gonzalez / MAY 06 2010

I enjoy the second pass. I often find ways to simplify or extract patterns I didn’t see the first time around. It isn’t uncommon for me to get something together and working, then redesign it (especially when working on a new problem).

Without a doubt, there is some wasted effort when you pull apart a working piece of code/application and redesign it. However, I find it to be a very Zen thing Like having a conversation with a past self.

Other than being a soul pleasing effort, there is real value to it. Speaking to Stephen’s point about redesigning older software: I’ve seen several teams suffer because they maintained projects that were first passes that were put into production as soon as it ‘worked’. Some projects were redesigned others were not and the latter cost way more to maintain, in my experience.

Austin Avrashow / MAY 06 2010

I use the limitations of tight deadlines to counter the tendency to tinker. I tend to use the simplest default behavior as a starting point. It’s surprising how often that works best even when I make the effort to tweak or customize or enhance some interaction or appearance.

When I do add a flourish, it stands out and suggests the whole thing has an amount of careful detail work that’s not really there.

Bernardo Terrazas / MAY 07 2010

I agree enhancing doesnt necessarily turn negative, though while rethinking you should always take some time for new technics or look at old ones.. Wether you just started lots of old useful things are overlooked as the newer stuff tend to be repeatitive or overlook somethings that be helpful.. My best advice when to stop is when the project flows.. if you see a pause or feel a humorous break is needed, you should think 2 steps foward and backward.