This course provides hands-on experience in the architecture and design of object-oriented software systems and a review of best practices for the communication of that design. Issues in the landscape of software design, including complexity, constraints, progressive discovery, and limitations in communication will be explored. Specific topics and projects will vary year by year, but generally, our discussion of software design will be understood to operate within the object-oriented paradigm. In this course, students will be organized into teams and each team will be provided with a set of (partial) requirements and will be responsible for the analysis, design, design documentation, and implementation in source code of a project that constitutes a complex software system. Each team of students will work through requirements analysis, expression of design using a modeling language, and implementation, and techniques and tools will be provided in order to facilitate the delivery.
The progression of design will be peer-reviewed by the student teams. While this course focuses on design and implementation of software, it does not focus on the software development process or SDLC per se. That being said, we will work within an "Agile" design and implementation framework and adopt agile approaches to lean design. One of our efforts will be to dispel the myth that design is not performed within an agile environment.
During the course and lectures, we will cover the following topics:
Why is design important, even in an agile environment?
Attributes of good design: coupling, cohesion, law of Demeter, generic solutions vs. specific solutions
What is the role of modeling in software development?
Documenting and communicating software design using the Unified Modeling Language notation
Lean thinking and lean modeling
Design guidelines for quality, interoperability, modifiability, performance, security, testability, and maintainability
The role of patterns in designing software and design refactoring
Decomposing systems into recognizable patterns