Software engineering is the discipline of building software in a methodical way to ensure that the product satisfies its users' needs, is correct (or, more generally, dependable) and maintainable. The course teaches the students how to organize software development projects, how to analyze and specify software requirements, and how to verify software. The course will focus on the use of formal models and methods in software development. 1. Software lifecycle models. Project planning and management. Cost estimation. Standards. Maturity models. 2. Requirements elicitation and specification. 3. Notations and models for formal specification: state machines and Statecharts, Petri nets, declarative descriptions (Alloy). 4. Verification: testing, formal program verification, model checking. The course will be based on lectures and exercise sessions. The students will also be given assignments, which will be presented and discussed in class.