CPSC 329 Software Development Fall 2010

CPSC 329 Course Information

Course Description

This course continues the study of programming by focusing on software design, development, and verification - the skills beyond fluency in a particular language which are necessary for developing large, reliable programs. Topics include object-oriented design, using APIs, and testing and verification. Techniques common in modern software development will also be studied. Specific techniques may include GUIs and event-driven programming, multi-threading, client-server networking, fault tolerant computing, stream programming, and security. This course is required for the major in computer science. It includes a required lab component.


Stina Bridgeman
Lansing 312, x3614

Course Web Page


You are expected to regularly consult the course web page for announcements, assignments, and most handouts.


Head First Object-Oriented Analysis and Design
McLaughlin, Pollice, & West
O'Reilly, 2006

This book should be in stock at the bookstore.

We will make limited use of a second text:

Object-Oriented Design and Patterns, 2nd ed.
Wiley, 2006

A copy is on reserve in the library. It is not in stock at the bookstore, but you can purchase a copy at amazon.com or a variety of other online retailers if you wish.

Additional material will be handed out or posted on the course webpage.


CPSC 225

Rationale, Aims, & Objectives

This course completes the programming sequence begun by CPSC 124 and 225 - CPSC 124 introduces the basic ideas of programming along with the syntax and semantics of the Java programming language, CPSC 225 focuses on common data structures as the organizational building blocks of programs, and this course addresses the process of creating good software.

This course has three main goals:

  • developing strategies to provide direction in the software development process, to keep from getting stuck, and to make the process of creating large programs more manageable and successful
  • developing principles of good design, good coding practices, and strategies for producing robust and correct code
  • developing a habit of reflection for self-improvement

Developing strategies for approaching the process of software development is essential: eventually everyone will reach a point where the program is too large to be able to just start coding and pound out something successfully. Large programs require planning and organization, particularly when the program is too large to be implemented by a single person.

A second major theme in this course is design: a design is an essential intermediate step between specifications and implementation, having a design is essential for working in a team, and a good design makes it easier to create a program that is correct and which can grow with new features.

Finally, learning from experience is crucial for becoming a good developer, designer, and programmer. Much about the material in this course is not black-and-white: there are many judgement calls and many instances where you just have to know what to do. As a result, many of the skills in this course are things that are developed over many years. The third goal of this course is to set the process of gaining - and learning from - experience in motion.

Course Content Overview

The course material can be roughly divided into three areas: a process for developing software, creating good software, and things the modern software often contains.

Software Development Process: One major topic of the course is how to make the process of creating a large program smoother and more successful. We will study both an approach to help guide the process and strategies for dealing with particular phases of the development process. Specific topics include:

  • requirements gathering
  • use cases and use case diagrams
  • determining classes, state, and behaviors
  • basic UML diagrams and notation
  • identifying architecturally significant features
  • feature driven, use case driven, and test case driven implementation

Creating Good Software: There's more to software development that just getting a program that works. A well-designed and well-written program is easier to create and easier to extend with new features, and careful testing raises confidence that the program works correctly. Specific topics include:

  • object-oriented design principles
  • design patterns
  • good coding practices and code quality
  • programming by contract and defensive programming
  • unit and systems testing
  • white-box, black-box, and gray-box testing
  • test coverage

Things You Find in Modern Software: We will also look at several topics that come up frequently in modern software, including:

  • GUIs and event-driven programming
  • threads
  • the client-server model of networking

The emphasis will be on using the Java API for these tasks, though some general concepts will be considered. These topics will also serve as illustrations for some of the design patterns discussed.

Valid HTML 4.01!