There's little more frustrating than learning new things without the chance to use them.
I've been reading all sorts of guide to good programming. Design Patterns and the like. Unfortunately, I'm currently in a job where nobody's heard of SDLC, nobody has time to apply it, all architectural work was done years ago, and it's a matter of adding a business rule here and a report there. OO? Not even a consideration. We can't even come up with a decent set of internal tools, either because nobody will agree on them, nobody is given time to implement things people agree on, or they are still-born because "you can't teach all [five] of the developers to do that."
Now, while rigorous software design could surely help this company, it's hard to convince other people of that where average projects need to be done in a week and there are vast expanses of code that are so fragile that any attempt to modify them break... even when the person doing the modification has been with the company for >10 years.
This has taught me something: you must keep some distance from customer demands. Part of our problem is that we try to provide extremely short turnaround on customer requests, quoting them a price and due date before getting anything more than a vague request. There are no requirements drawn up, yielding the expected iteration of code, test, deliver, repeat. There's no time for reflection, to think whether the architecture needs to be changed, or how this should be generalized.
Regression testing was attempted and abandoned before I arrived at the company, and internal documentation is of the "Ask Bob" variety.