I was awoken on the first day of my holiday to a clattering sound and my girlfriend exclaiming "I can't get the top drawer open". I turned over and looked at the clock. It read 05:50! Something within the drawer has risen high enough so that when you try to open it it catches and the drawer can't open.
I then had to spend 30 minutes taking the whole set of drawers apart with a screwdriver to get this drawer open. I don't know how many times I've come across this same problem but still the design of drawers, and more to the point their casing, stays the same. The drawer cavity always has space above the actual drawer to allow things within the drawer to move into this space and then catch when you try and open the drawer.
I've recently been working on a product which all in all has been a big success but there is one particularly ticky piece of code that is continuing to be troublesome. The interface to the section of code is well defined but the implementation continues to cause problems. The implementation was designed and has organically changed throughout the project and at various stages we've said that it could probably do with a redesign. However, it generally works without problems so we keep putting of the redesign. This is the same as the drawer design; you can open the same drawer 1,000 times without the contents catching but when it catches on the 1001st it's still very annoying.
It is usually difficult if not impossible to make the desired level of improvement without significant change to the original design. Everytime (yes, everytime!) I have been through this struggle, hindsight has shown that if we had bitten the bullet and made the significant design change called for at the first sign of a problem, the product cost and project schedule would have been better off.
The fact is that if something has a flaw which may require an overhaul in design then it should most probably be done. Something as simple as a drawer opening mechanism should work flawlessly. I'm not saying that software is as simple as this but the same design and redesign principles should be used across all forms of engineering.
If it works all the time and does everything you need then leave it alone. If it works most of the time then redesign and fix it - most of the time isn't good enough.