Two things I've learned:
in reply to Tricking Our Egos
1. Write all code as if someone else is going to have to go through it without your assistance. I made the mistake of assuming no one would ever see the backend code to something I wrote. Completely wrong. It's no fun having someone actually laugh at you for routine or variable name choices-- even if you find out later that you're a better programmer than they are.
A consequent of this mindset is that you have the ability to go back into code later and expect that you don't have to dredge through frail memories of why you did what where.
2. Ego? I make enough completely stupid mistakes that I figure every bug is my fault, even after I've tested it upsidedown, backwards, and inside-out. It's actually a relief to run against some undocumented feature/failing of a language, module, or (most often in my case) database interface application.