Course Syllabus

 Syllabus

CSCI-E 97, Fall 2021

Software Design: Principles, Models, and Patterns

Last Update: 8/29/2021

Abstract

This course is an introduction to the application of software design principles to the design of applications. This course approaches software design from three perspectives: the software engineering principles that enable the development of quality software, modeling of software elements using the Unified Modeling Language (UML), and the application of design patterns as a means of reusing design models that are accepted best practices.

In most IT organizations, software design is a collaborative effort involving software engineers, managers, and other stakeholders in a project.   We will simulate that with several sessions devoted to interactive design. The assignments will apply the Design First Agile methodology.

See the section Course Logistics for information on textbooks, distance education, and the course meeting schedule.

Teaching Staff

Instructor

Eric Gieseke, ALM 

Software Architect

Telephone: 781-330-9835 

email: egieseke@g.harvard.edu

Teaching Assistants

Simili Abhilash

Athittaya Kamlang-Ek

Hannah Riggs

Course Description

The working assumption for this course is that registered students are proficient in programming.  Our goal is to move beyond programming-specific concerns to a point where one can think through a design for a software application without writing code.  It might be useful to apply the maxim that "You can't take people from where they're not to where they don't want to go" to yourself in deciding whether you want to take this course.  In particular, if you are taking this course with minimal prerequisites, or are taking this course as one of the three courses needed before you enroll in the ALM in IT, my advice is to wait until you have more background.  You might be able to meet the requirements for the programming aspects of the course but will struggle through the process of design. We will learn about UML, design principles, design patterns, and how to write a design document, so this course is good to take before the software engineering course where these skills are used.  

What is Software Design?

"Design" can be used as a verb to denote the process of finding a solution to a problem in the form of drawings and plans.  "Design" can also be used as a noun to denote the results of that process.

To keep things simple, we can categorize software design problems based on the context in which they appear and the scope of the problem to be solved.

First, the problem might have a relatively narrow scope and be closely tied to programming decisions.  For instance, the problem might be about choosing the right data structure and algorithm to manipulate it to satisfy given functional requirements.  We'll refer to this as a "detailed design."

Second, the problem might be how best to implement a run-time component that is either a stand-alone application or part of a more extensive system.  Here the scope is larger, and one has to think about what software modules will go into the component and how to implement the interactions between this component and other run-time components in the system to meet a given set of functional requirements.  We'll refer to this as "component design."

Third, the problem might be based on a set of functional requirements and the designer's task is to define a system made up of collaborating components that conspire to satisfy the given requirements.  We'll refer to this as "application design" or "system design." We might even refer to it as "architecture."

In this course, we focus primarily on component design.  We will "do design" by applying principles and patterns and by creating appropriate UML models.

A critical aspect of component design that will be an integral part of each assignment is the definition of interfaces that the component makes available so that other components can interact with the component.  The term interface here is more general than the concept of an interface defined in Java.

Prerequisites

CSCI E-22 (Data Structures) and proficiency in Java (CSCI E-10a and b are not sufficient). If you do not have these prerequisites, do not take this course – take an appropriate prerequisite. Proficiency in other languages, such as C++, Ada, COBOL, FORTRAN, or LISP, is not an adequate substitute for Java.   It would be premature for you to take this course without a more substantial background.

What I expect you to know about Java

The proficiency requirement for Java is much stronger than a brief introduction. All examples in the lecture notes and all programming assignments will be done in Java (in particular, JDK 16).  You should be competent in the following aspects of Java:

  • Basic language syntax and semantics
  • Core packages: java.lang, java.util
  • Core tools: javac, java
  • You should be able to define your code in packages, such as cscie97.problem1, manage the directory structure required, set your classpath for compilation and execution, and so on

 

Skills Check Diagnostic Assignment:  

The first programming assignment, to be given out in week 1 as a warm-up exercise, should help you decide whether you have satisfactorily met the Java prerequisites.

Note - While the object-oriented language used in the course is Java, this is not a course designed to teach Java.

There are numerous other packages or features of the Java platform (inner classes, threads, RMI, JNDI, JDBC, AWT, Swing, etc.) that are not prerequisites. If we decide to use any of the things mentioned in this paragraph, we will cover them in class first.

Writing Requirements

Communication of design is an important skill to be learned in this course; students are expected to demonstrate not only good analytical skills but also good writing skills. Each of the first four assignments will have a specific writing component in addition to the programming component.  The fifth assignment will require writing a design document for a specific application and will not require implementation.

Course Logistics

This section has information about where the course meets, the course website, textbooks for the course, and the schedule of classes.

Class Meetings

Attendance is required for lectures and sections. 

Lectures times: Mondays, 5:50-7:50 pm ET

Sections: Tuesdays, 7 PM - 8 PM

Office Hours:

Feel free to schedule one-on-one meetings with the instructor (Eric) to discuss questions about lectures or assignments.  Meetings will be remote using Google Meet. Use Calendly to schedule:

Eric: https://calendly.com/eric_gieseke/office-hours

Simili:  https://calendly.com/simili_abhilash/office-hours

Hannah:  https://calendly.com/riggsh/office-hours

 Attendance and participation policy

Both the lectures and the in-class sections will be broadcast live, and both will be available on-demand within 24-hours.  Due to the pandemic, lectures and sections will be conducted online using Helix. Please do your best to attend the live lecture and section, when you will be able to interact and ask questions, and maximize your learning.   

Sections provide an opportunity for you to ask questions about lecture material or assignments and practice the art of design with some focused exercises.  During sections, we will review lecture materials with examples and review assignments, and address related questions. Attending the sections is required since participating in sections will help you master the course content.

Assignments and Grading

There are no exams in this course.  Your grade will be based on your performance on the assignments.

The assignments will include object-oriented modeling, application of design principles, and sound programming techniques. Students are expected to write a detailed description of the design for each of their programs, incorporating UML models as appropriate. Students implement their programs in the Java programming language.

There will be five assignments, each lasting about three weeks.

Assignment 1

Implement a solution based on a design document provided to you.  This assignment will introduce you to the practice of upfront design, the contents of a design document, and how design can help streamline implementation and improve overall software quality.  

Assignments 2, 3, 4

In these assignments, you will create a design document, participate in a peer design review, and then implement your solution based on the design.  You will be provided a requirements document, architecture overview, and design template. The design document will be graded along with your implementation. It is important to complete the design and peer review before starting the implementation. Note that assignments 2, 3, and 4 will build on each other, as modules that fit together to create a complete solution that will be realized at the end of assignment 4. 

Assignment 5

The focus of assignment 5 will be a modular design.  You will write a complete design document for modular application. You will be provided a requirements document.  Due to the larger design scope for assignment 5, an implementation is not required.   

This course is based on real-world software design and development.  We will follow Design First Agile development, a means of integrating software design in an Agile development environment.  The inputs to the assignments, primarily requirements and architecture documents are intended to be clear. However, if something is not clear to you, it is up to you to ask questions during class, in sections, or on the Piazza discussion board. Getting clarification of requirements will be part of your responsibility in these assignments. Ask questions when you perceive a requirement to be unclear or incomplete.

Each assignment will have a specific set of functional requirements and implementation requirements, and you will receive a grade sheet specifying the grading criteria for each assignment.  The assignments will allow you to practice lecture material, including UML, design principles, and design patterns.  

Distance Education

In addition to the classroom presentation, each lecture will be available through the Harvard Distance Learning facility. See the website

http://www.extension.harvard.edu/academics/courses/types-courses/video-course-guidelines

for more details on how distance education is supported at Harvard Extension School.   The course website will have links to our course videos.

Text Books

There are two required texts:

  1. Fowler, Martin, UML Distilled, Third Edition, Addison-Wesley, 2004
  2. Freeman, Eric  & Robson, Elisableth, Head First Design Patterns, First Edition, O’Reilly, 2004

Other lecture material will be in the form of notes that will be made available before the lecture.  For local students, the textbooks are available at the Harvard Coop.

Course Website

The URL for the course Canvas site is: https://canvas.harvard.edu

After the first two weeks of the semester, you will need your Harvard ID and PIN to access the site.

All lecture slides, assignments, and related course materials, including this syllabus, will be available in pdf format (readable via Adobe Acrobat) through the course website.

Accessibility Policy

The Extension School is committed to providing an accessible academic community. The Accessibility Office offers a variety of accommodations and services to students with documented disabilities. Please visit www.extension.harvard.edu/resources-policies/resources/disability-servicesaccessibility for more information.

Plagiarism Policy

You are responsible for understanding Harvard Extension School policies on academic integrity (www.extension.harvard.edu/resources-policies/student- conduct/academic-integrity) and how to use sources responsibly. Not knowing the rules, misunderstanding the rules, running out of time, submitting the wrong draft, or being overwhelmed with multiple demands are not acceptable excuses. There are no excuses for failure to uphold academic integrity. To support your learning about academic citation rules, please visit the Harvard Extension School Tips to Avoid Plagiarism (www.extension.harvard.edu/resourcespolicies/resources/tips-avoid-plagiarism), where you'll find links to the Harvard Guide to Using Sources and two free online 15-minute tutorials to test your knowledge of academic citation policy. The tutorials are anonymous open-learning tools.

Class Schedule

Class meeting dates and assignment due dates are as follows:


Date

Event

Notes

Monday 8/30

Lecture 1: Course Introduction

Start assignment 1: Implement a software design

Monday 9/6

Labor Day

No lecture

Sunday 9/12

Assignment 1 due

Monday 9/13

Lecture 2: Introduction to the UML

Start assignment 2: Design and Implement

Monday 9/20

Lecture 3: UML Part 2

Monday 9/27

Lecture 4: UML Part 3

Sunday 10/3

Assignment 2 due

Monday 10/4

Lecture 5: Introduction to Design Patterns

Start assignment 3: Design and Implement

Monday 10/11

Indigenous Peoples' Day

No lecture

Monday 10/18

Lecture 6: Design Patterns - 1

Sunday 10/24

Assignment 3 due

Monday 10/25

Lecture 7: Design Patterns - 2 

Start assignment 4: Design and Implement

Monday 11/1

Lecture 8: Design Patterns - 3 Structural 

Monday 11/8

Lecture 9: Design Patterns -4 Behavioral

Sunday 11/14

Assignment 4 due

Monday 11/15

Lecture 10: Modularity

Start assignment 5: Final project, Modular Design

Monday 11/22

Lecture 11: Complexity Metrics

Monday 11/29

Lecture 12: Microservices

Monday 12/6

Lecture 13: Enterprise Design Patterns

Monday 12/13

Lecture 14: Non Functional Requirements, Retrospective

Friday  12/17

Assignment 5 due


Assignments must be submitted by midnight EST on the due date.  

References

The books and websites listed here are optional references for your out-of-class reading.

References on Design Patterns

  • John Vlissides, Pattern Hatching - Design Patterns Applied, Addison-Wesley, 1998.

References on UML

  • The most recent UML specifications can be found at http://www.omg.org
  • Hans-Erik Eriksson, Magnus Penker, Brian Lyons, David Fado, UML 2 Toolkit, OMG Press, 2004

References on Java

  • Ken Arnold and James Gosling, The Java Programming Language, Addison-Wesley, 1996.
  • David Flanagan, Java in a Nutshell, latest Edition, O'Reilly
  • See http://www.oracle.com/technetwork/java/index.html for lots of documentation, articles, and commentary, as well as to download JDK 16.

Other Interesting Books

  • Frederick Brooks, The Mythical Man-Month, Addison-Wesley, 1995 (includes a reprint of "No Silver Bullet: Essence and Accident in Software Engineering")
  • Frederick Brooks, The Design of Design, Addison-Wesley, 2010
  • Frank Buschmann et al, Pattern-Oriented Software Architecture – A System of Patterns, John Wiley, 1995.  Chapter 6 includes a good description of principles for software design.
  • Paul Clements et al, Documenting Software Architectures – Views and Beyond, Addison-Wesley, 2003.  The first half of this book is a marvelous introduction to terminology and prescriptions for documenting software designs.
  • Eric Ries, The Lean Startup: How Today’s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses, Crown Business, 2011. This book describes how to create innovative applications using Agile development with a focus on delivering customer value.
  • James P. Womack et al, The Machine that Changed the World: The Story of Lean Production, Free Press, 2007.  This book provides an excellent overview of the importance of process in the quest for product quality.  While about the auto industry, the concepts can be applied to software development and using the software design methods learned in this class.

 Course Information

Student Support Tips Instructor Support Tips

Course Summary:

Date Details Due