Before software can be designed, its requirements must be well understood. This in turns requires a thorough understanding of the application domain. In developing domain descriptions and requirement specifications, we need to acquire and analyse domain knowledge and system requirements, transform them into domain and requirement models, and validate these models together with domain and requirement stakeholders. Once the domain and requirement descriptions are clear, a software design can be constructed to capture software architecture and components. This course will cover the principles and techniques of these three major phases of software engineering: Domain Engineering, Requirements Engineering and Software Design.