Software Engineering

Software Engineering is about the craft and science of software development so that the resulting software is correct, reliable, secure, extensible, and maintainable. In this focus area, students will learn about the systematic, disciplined, principled, and economic way to the building and maintenance of software. Failures in software engineering can and have led of the tragic loss of lives (e.g., plane crashes). As future software engineers, it is of utmost importance for students to have a solid grounding in the art and science of software engineering principles.


CS2103 Software Engineering is the introductory course for this focus area (and a required course for all computer science students). Students in this focus area should then take either CS3219 Software Engineering Principles and Patterns to learn about the requirement specification and analysis and software architecture design patterns, leading to software that meets the clients’ requirements, is extensible, and is maintainable. CS4211 Formal Methods for Software Engineering focuses on modeling software using formal tools such as state machines, temporal logic, model checkers, leading to software that is provably correct. CS4218 Software Testing covers how one can rigorously test and debug the correctness and performance of the software using analytical techniques such as root cause analysis, leading to software that is performant and reliable. Finally, CS4239 Software Security shows how one can integrate security considerations into every phase of the software development life cycle, leading to software that is secure.


Students who wish to have more hands-on experience with software engineering projects can apply to take CS3216 Software Development on Evolving Platforms and CS3217 Software Engineering on Modern Application Platforms; while those who wish to learn deeper about the formal principles of software can consider taking CS3234 Logics for Proofs and Programs, CS5219 Automatic Software Validation, and CS5232 Formal Specification and Design Techniques. Students interested in developing software and systems for embedded systems can consider taking CS5272 Embedded Software Design, which focuses on software engineering for embedded systems.