This course is an introduction to the fundamental principles and techniques of software construction that have greatest impact on practice. Topics include capturing the essence of a problem by recognizing and inventing suitable abstractions; key paradigms, including basic concepts of software design and their expression using notations from Unified Modeling Language (UML); software testing, automated software test generation, automated software security testing via blackbox, greybox and whitebox fuzzing approaches, detection and removal of software code smells, software coding standards to avoid security loopholes, concurrent programming, including programming with threads and processes, understanding concurrency problems like deadlock and data race. This course includes exercises in software design, implementation, testing and reasoning.
- Design medium-scale software system from scratch: formulating and analyzing the problem to be solved; writing formal software requirements, exploring and formulating system designs; and using extensive and systematic testing and reasoning to ensure quality.
- Apply key software engineering ideas, including invariants, decoupling, and data abstraction.
- Apply key software engineering ideas, including software design, specification, abstraction, verification and correctness.
- Apply widely used design concepts and notations (UML diagrams) and patterns in exploring and articulating problems and designs.
- Learning effective techniques on ensuring quality of large-scale software systems.
- Apply concepts of systematic software testing to discover bugs (including security vulnerabilities) in large-scale software systems.
- Apply concepts to reason about the security loopholes in software systems.
- Learning secure software coding standards.
- Learning key concepts in developing concurrent programs.
- Learning key concepts in reasoning and testing concurrent programs.
- Build medium-scale software prototype (LO 1-5).
- Design solution to questions related to the requirement prior to software development. (LO1, LO2 and LO4).
- Design blackbox, whitebox and diabolic software tests for validating software prototype. (LO6).
- Design critical part of the software by reasoning about its security. (LO8).
- Design small/medium-scale concurrent programs. (LO9).
- Design techniques to reason about the correctness of the concurrent programs (LO10).
- Design software prototype with the objective of its maintainability and security. (LO5, LO7).
- Design sofware testing methodologies to automatically discover potential security vulnerabilities, such as program crashes (LO6).