Any project that enjoys a long and productive life will encounter many points at which new changes do not fit perfectly into the system as a whole. The project’s developers make many decisions along the way about how to organize code and how data passes through the system. We can think of these as design decisions, and just like other areas of design, we can improve our software’s ability to change and communicate intent by adhering to certain design principles. One such set of principles is the five SOLID principles of object-oriented design. Individually, they inform us about specific conditions our code should meet. Collectively, they help us think about how to respond when software becomes difficult to change and test.