| Introduction and overview of the course
| Software development paradigms: basic (‘waterfall’, prototyping, reusable components, formal methods) and evolutionary paradigms (incremental development, spiral model, concurrent engineering)
| Modern software processes: the unified software development process, agile methods and extreme programming
| Basic software engineering activities (specification, development, validation, evolution): concepts and principles
| Developing requirements: domain analysis, techniques for gathering requirements, capturing requirements as use cases
| Formal specification: formal modeling and analysis, introduction to probabilistic model checking
| Tools in support of formal methods: PRISM probabilistic model checker, software performance modeling and analysis.
| Modeling with classes: UML class and object diagrams, semantics of UML class diagrams, the process of developing class diagrams, implementing class diagrams in Java
| Using Design Patterns (Abstraction-Occurrence, Composite, Observer, Delegation, Adapter, Façade, Proxy, etc)
| Modeling software behavior: UML interaction diagrams (sequence and communication diagrams), UML state diagrams
| Architecting and designing software: design principles (increase cohesion, reduce coupling), architectural patterns (Multi-Layer, Pipe-and-Filter, etc.)
| Testing and inspecting to ensure high quality: testing techniques (equivalence partitioning, path testing), integration testing strategies (top-down, bottom-up, scenario-based), inspections
| Use case driven development: use case specifications, analysis, design and implementation to realize the use cases, testing the use cases
| Program specification and verification: well-founded induction, pre-and post-conditions, declarative prototyping