Reposting a section from this Paul Graham essay:
“The best writing is rewriting,” wrote E. B. White. Every good writer knows this, and it’s true for software too. The most important part of design is redesign. Programming languages, especially, don’t get redesigned enough.
To write good software you must simultaneously keep two opposing ideas in your head. You need the young hacker’s naive faith in his abilities, and at the same time the veteran’s skepticism. You have to be able to think how hard can it be? with one half of your brain while thinking it will never work with the other.
The trick is to realize that there’s no real contradiction here. You want to be optimistic and skeptical about two different things. You have to be optimistic about the possibility of solving the problem, but skeptical about the value of whatever solution you’ve got so far.
People who do good work often think that whatever they’re working on is no good. Others see what they’ve done and are full of wonder, but the creator is full of worry. This pattern is no coincidence: it is the worry that made the work good. (emphasis mine).
If you can keep hope and worry balanced, they will drive a project forward the same way your two legs drive a bicycle forward. In the first phase of the two-cycle innovation engine, you work furiously on some problem, inspired by your confidence that you’ll be able to solve it. In the second phase, you look at what you’ve done in the cold light of morning, and see all its flaws very clearly. But as long as your critical spirit doesn’t outweigh your hope, you’ll be able to look at your admittedly incomplete system, and think, how hard can it be to get the rest of the way?, thereby continuing the cycle.
It’s tricky to keep the two forces balanced. In young hackers, optimism predominates. They produce something, are convinced it’s great, and never improve it. In old hackers, skepticism predominates, and they won’t even dare to take on ambitious projects.
Also, watch this video: http://vimeo.com/24715531