This course provides an in-depth look at what it means for software to be maintainable. It presents the principles and practices that have been proposed for developing maintainable software. Students will learn to evaluate and critique these principles and practices by examining their application in practice and through understanding the research on their effectiveness. This will prepare students for developing high-quality software products in the industry. In this course, students will learn the necessary guidelines and techniques to produce maintainable software that has clean code, a clean architecture, and a strong automated suite of tests to change it whenever requirement change.