The romantic image of an über-programmer is someone who fires up Emacs, types like a machine gun, and delivers a flawless final product from scratch. A more accurate image would be someone who stares quietly into space for a few minutes and then says “Hmm. I think I’ve seen something like this before.”
I wouldn’t correct a single word of this paragraph. It perfectly describes the difference between good and great developers.
I would elaborate a bit and say that great programmers also know when to STOP thinking, and begin trying things out. I’ve seen and been in the case where more thinking simply won’t solve a problem, and you’ve got to roll up your sleeves, get dirty, and learn something.
Another difference between good and great developers is the latter’s willingness/insistence on refactoring their code. First drafts are rarely the best, it takes a dedication to rewriting the code a second or third time to get it great.