This course aims to introduce students to the foundational principles of designing software that is flexible, reusable and maintainable.