CSC444F (Software Engineering I)
Fall term 2001

Syllabus

The software development process. Software requirements and specifications. Software design techniques. Techniques for developing large software systems. CASE tools and software development environments. Software testing, documentation and maintenance. (Prerequisite: ECE344S)

Course Goals

The course has two main goals:

Course Rationale

Software Engineering is difficult to teach and to learn in a university environment. Most of the important lessons of software engineering only apply to large scale software development, i.e. to systems that are bigger than it is possible for a small group of students to build in one or two terms. The skills needed to develop such systems have very little to do with the type of programming that most students learn at University. In fact, software engineering has very little to do with programming at all. Software Engineering is about the discipline needed to develop high quality software that can be understood, maintained and adapted over long periods of time by many different people. ‘Quality’ is a key word here. The notion of quality for software is different from the notion of quality for other types of engineered systems (electrical, mechanical, etc), because software is different from physical systems (during the course we'll examine why). The notion of quality for software is also different from the notion of quality for programs that students build on programming courses. An understanding of what software quality really means is central to understanding what software engineering is all about.

The course attempts to foster an understanding of software quality: what it is, and how to achieve it. We do this through the use of a team project running throughout the course, in which teams trade software modules with one another. By attempting to understand, assess, and modify one another’s programs, students will gain insight into the nature of software quality, and why an ability to program is not sufficient for the construction of high quality software.