Building large software systems introduces new challenges to
software development. Large software is built in teams over a period
of several years. Typically, no individual on the team understands
the entire system. Making appropriate design decisions early in the
development of software can make a major difference in the ability
to develop correct and maintainable software. In this course,
students will learn techniques and tools to help them address these
problems and develop larger software projects, improving their
skills in designing, writing, debugging and testing software. Topics
include design patterns, refactoring, UML, designing for maintainability,
and software architecture. Prerequisite: CS 201.
- You will develop design strategies that improve the
understandability and maintainability of the programs you develop.
- You will learn how to document software designs using notations
such as CRC cards, and UML class and state diagrams.
- You will learn how to use design patterns to recognize common
design problems and incorporate well-understood solutions to those
problems into your designs.
- You will learn how to refactor code to make an existing codebase
easier to understand and maintain.
- You will become familiar with basic concurrency problems and their solutions.
CS 215 contributes to the
learning goals that encourage students to:
- Develop the critical thinking skills to solve problems by
designing and implementing algorithms.
- Be able to design, implement, test, and document computer
programs that solve substantial computational problems.
- Build skills for developing a working understanding of a complex
code base and ability to effectively modify it.
- Be able to think at multiple levels of detail and abstraction.
- Develop a foundation that allows and encourages learning new and
relevant skills and technologies as the field evolves.
- Be able to communicate clearly in written and oral form.
- Be able to work effectively on a team.
More specifically, students are expected to master the following
- Computer programming—including working knowledge of at least two
programming languages in different paradigms.
- Abstraction to manage complexity.