This course exposes students to the problem of determining and specifying what a proposed software system should do, why and for whom the system is needed—not how the system should do it, which is the topic of downstream software engineering activities such as design and coding. The course will discuss concepts for systematically establishing, defining, and managing the requirements for a large, complex, changing and software-intensive systems, from technical, organizational, and management perspectives. The course will consider the past, present, and future paradigms and methodologies in requirements engineering. The course will cover informal, semi-formal, and formal approaches, while striking a balance between theory and practice. The course will involve building models of both requirements engineering process and requirements engineering product, concerning both functional and non-functional goals/requirements/specifications, using a systematic decision-making process.