Objectives
The course covers a wide range of software development concepts,
abilities, and skills, from
analyzing a problem to implementing a solution. On completion of the
course, students should be able to
- Analyze a software development problem and express its essence
succinctly and precisely;
- Design a module structure to solve a problem, and evaluate
alternatives;
- Implement a module so that it executes efficiently and correctly;
- Appreciate engineering issues in the development of software, such as
the importance of addressing the user's concerns, working with
limited
resources, maintainability, dependability, and division of labor.
Prerequisites
The course assumes that the student is conversant with Java and is able to
- Write a small (e.g., 100 line) program to meet a specification;
- Understand basic notions of imperative programming (such as loops,
procedures, exceptions, and aliasing) and of object-oriented
programming
(such as objects, references, self, interfaces, and subclassing);
- Use, and understand programs that use, basic data structures such as
arrays, hash tables, trees and lists.
Outcomes
On completion of the course, students should be able to
- Identify key entities and relationships in the problem domain; write
succinct textual descriptions of problems in the style of a user
manual;
- Design programs:
- Construct a design consisting of a collection of modules,
;
- Exploit well-known design patterns (such as Iterator, Observer,
Factory and Visitor);
- Devise appropriate module specifications and express them informally
in terms of pre- and post-conditions;
- Understand the appropriate roles of subtyping and inheritance,
and use them effectively.
- Implement programs:
- Write object-oriented code to satisfy the specification of a
module;
- Express representation invariants, understand their impact on efficiency and
ease of implementation, and implement them as run-time assertions;
- Understand the fundamental notions of data abstraction, and read
and write informal abstraction functions for simple datatypes;
- Evaluate the correctness of a module by careful manual review
using the specification, rep invariant and abstraction function; and
- Develop unit and system-level test suites, and evaluate their
effectiveness using simple notions of specification and code
coverage.