I've noticed I suffer from this problem as well.
The first projects I ever did, I felt I had to go back and fix the messy code whenever I could. Thought about it all the time. They were crazy to maintain.
Then later on, in later projects, things would go a bit better, prettier code. I didn't feel the same. Then in other projects (these are all small C# desktop apps mainly) things would go better and better.
I think that as programmers we need to keep coding and coding to really understand when we need to stop, or start. I'm still a victim of over-engineering though, and there's also something saying "One day a programmer will look a this code.. what are they going to think? How are the going to see it?".. and every programmer will think "Damn! I have to impress.".
This can also lead to that. I've broken software and made it too complex sometimes for the size and capability it was meant for.
Many, many times I've created classes that soon after were no longer needed, and then eventually discarded them. A lot of time goes wasted, a damn lot.
I now believe thanks to these posts in the time frame problem: if we have too much time, we'll waste it. Our brains as developers must have a funny neurology, since we start to 'refactor' our lives sometimes.. thinking of data structures before we sleep.
I've asked my boss to have a programmer working with me on day, someone that has enough guts to sit there, go line by line, and one that's able to criticize. But beware, not too much. Pair programming can help, and discussing the architecture with someone that has done more OO and less code in their lives could introduce some new views. Also pick up 'Object Oriented Software Construction', by Bertrand Meyer.
All the best and happy engineering.