This document discusses software design using agile methods. It begins by discussing technical debt, where shipping incomplete code is like taking on debt that accrues interest over time. It then discusses how agile embraces changes and focuses on enabling software to be changed easily through practices like automated testing, decoupling code, and refactoring. Refactoring is described as restructuring code without changing its external behavior in order to improve design and remove bad smells. The conclusion emphasizes that agile practices help keep the cost of changes low throughout the project lifecycle.