The DRY Principle (Don't Repeat Yourself) suggests that "every piece of knowledge must have a single, unambiguous, authoritative representation within a system." A powerful guideline, but it is often heeded without a clear understanding of its underlying motivations, nor consideration for other principles that might lead the code in other directions. In this talk, we'll explore duplication in code in a variety of forms and the risks associated with each. We'll look at strategies for reducing duplication without sacrificing design basics like encapsulation, low coupling, and high cohesion. We'll look at other principles that are often left behind in the name of keeping the code DRY, and how to balance them to keep your code flexible and maintainable.