
Andrew Hunt and David Thomas
Good software is not defined by a final design, but by how readily it can change without decaying into duplication, fragile dependencies, and accidental behavior.
Eliminate duplicated knowledge across your system to ensure every piece of logic has a single, authoritative representation.
Design independent, self-contained components that do not affect unrelated modules to make the overall system easier to test and change.
Fix bad designs and poor code immediately, as ignoring small issues signals a lack of care that accelerates the decay of the entire project.