|laziness, impatience, and hubris|
I've had several of these happy events. With my current project, I chose at the beginning to use Object-Oriented Perl, mostly just to learn it, but it also seemed to fit. I've had some training in OO and in Design Patterns, but have never implemented anything with it.
What a nice surprise when changes that would have taken days now take minutes!
However, I know that my code could use some improvement. You can always make it more flexible, faster, give it better error handling, etc. I believe that admitting that fact alone makes you a better programmer!
There is definite satisfaction in finding you've written "good code"...
On a tangent... The company I work for has a large development project running using Extreme Programming (XP). It stresses good programming, but from a slightly different angle. Here's just a part:
Break your goal into small piecs
Work in pairs
Design your test cases (be thorough) first
Write your code
Test your code
In many cases, later you will find that you could write that method better, faster, etc. With XP, you can now rewrite the method, and you already have the test cases to verify that you didn't break it.
Moral: You can always write better code. If you know from the beginning your going to rewrite it, then plan for it.
Also, programming in pairs reduces bugs, and tends to lead to better design because you have more "brain power" (we hope anyway!).
For an article on XP, and a link to a web site all about it, click here. Brian