When I'm out, it is nice to be sophisticated every once in a while. However, in general I'm an ordinary guy with a wife, two kids and a dog who enjoys some terrible TV shows.
My coding is about the same. Sometimes I can write really, really nice code. Small, tight and sophisticated. A bunch of the time I'm just an ordinary guy. Being sophisticated is work, and really, like most people I can't (No matter how much I try) pull it off all the time. Yes, duplicate code is bad. But I think 2 duplications is better than 3 duplications. I'll try harder on the third duplication to make them all the same than the second.
Sophistication is a sign of maturity. Most of the code I write is new and hot off the press. Making it sophisticated is really hard when it's new. My code will get more sophisticated (read less duplication, more intention revealing) as it gets older and more experienced (ok, more used, refactored).
Sometimes I think the XP community is just trying to move the problem around from: "you need to be really smart to design" (waterfall) to "you need to be really smart to code" (XP - no duplication, write intention revealing code). Agile will fail if all the projects need the top 10% of developers. Agile must work for ordinary development teams.
I think we need to stop telling ordinary developers they need to get smarter about writing code and start showing them how to help their code get sophisticated as it gets older. Strategies for figuring out how and when to refactor AND redesign AND where to move the responsibility will help a lot more than asking them to get it "right".
Your code should mature as it ages. Maybe I'll write down my strategies...