The great thing about software patterns is that they convey many useful design ideas. It follows, therefore, that if you learn a bunch of these patterns, you'll be a pretty good software designer, right? I considered myself just that once I'd learned and used dozens of patterns. They helped me develop flexible frameworks and build robust and extensible software systems. After a couple of years, however, I discovered that my knowledge of patterns and the way I used them frequently led me to over-engineer my work.
Once my design skills had improved, I found myself using patterns in a different way: I began refactoring to, towards, and away from patterns, instead of using them for up-front design or introducing them too early into my code. My new way of working with patterns emerged from my adoption of extreme programming (XP) design practices, which helped me avoid both over-and under-engineering.