This document discusses design smells in software and their impact on quality. It begins with an introduction to design quality, technical debt, and design smells. It then provides a catalog of various design smells organized by principles of abstraction, encapsulation, modularization, and hierarchy. For each smell, it provides examples from code and discusses corresponding refactoring techniques. It also discusses how smells are interrelated and how understanding their ecosystem is important for improving design quality in practice. The key takeaways are repaying technical debt through refactoring design smells to improve changeability, understandability and other quality attributes.