Overview
Software engineers today are less likely to design data structures and algorithms from scratch and more likely to build systems from library and framework components. In this course, students engage with concepts related to the construction of software systems at scale, building on their understanding of the basic building blocks of data structures, algorithms, program structures, and computer structures. The course covers technical topics in four areas: (1) concepts of design for complex systems, (2) object oriented programming, (3) static and dynamic analysis for programs, and (4) concurrent and distributed software. Student assignments involve engagement with complex software such as distributed massively multi-player game systems and frameworks for graphical user interaction.
After completing this course, students will:
- Be comfortable with object-oriented concepts and with programming in the Java language
- Have experience designing medium-scale systems with patterns
- Have experience testing and analyzing your software
- Understand principles of concurrency and distributed systems
Coordinates
Tu/Th 3:00 - 4:20 p.m. in WEH 7500
jbloch@gmail.com
WEH 5126
Both instructors have an open door policy: If either of the instructors' office doors are open and no-one else is meeting with us, we are happy to answer any course-related questions. For appointments, email the instructors.
Course Syllabus and Policies
The syllabus covers course overview and objectives, evaluation, time management, recommended books, late work policy, and collaboration policy.Learning Goals
The learning goals describe what we want students to know or be able to do by the end of the semester. We evaluate whether learning goals have been achieved through assignments and exams.Course Calendar
Schedule
We are expecting greater-than-usual changes to the course this semester. The schedule below is merely a draft (based on previous instances of the course) and is likely to change.
Date | Topic | Additional Notes/Code | Assignments Due |
---|---|---|---|
Jan 12 | Course introduction and Introduction to software design | ||
Jan 13 | RecitationCourse infrastructure warmup | ||
Jan 14 | Design for change, part 1 | ||
Jan 19 | Keepin’ It Real: Achieving and Maintaining Correctness in the Face of Change | reading Larman ch. 14 and 16 hw1 Intro to design, course infrastructure |
|
Jan 20 | Recitation Unit testing, build automation, continuous integration++ |
||
Jan 21 | Achieving and Maintaining Correctness in the Face of Change – Pt. 2 | reading Larman ch. 15 | |
Jan 26 | Design for reuse (class level), inheritance and delegation | hw2 Polymorphism, unit testing | |
Jan 27 | Recitation Inheritance and modeling | ||
Jan 28 | Design for reuse (class level), patterns for reuse | reading Larman ch. 20 |
|
Feb 02 | Design for reuse (class level), parametric polymorphism and the iterator pattern, with an Exceptional guest appearance | reading Larman ch. 9 and 10 |
Feb 03 | Recitation Behavioral subtypes |
Feb 04 | Object-oriented analysis: Modeling a problem domain | reading Larman ch. 17 and 18 |
|
Feb 07 | No lecture: Sunday | hw3 Inheritance and delegation | |
Feb 09 | Object-oriented design: Responsibility assignment | reading Larman 36.1-36.4 |
|
Feb 10 | Recitation Design process | ||
Feb 11 | Midterm exam 1 | DON'T PANIC | |
Feb 16 | 'tis a gift to be simple - Midterm 1 and Homework 3 Post-Mortem | ||
Feb 17 | RecitationDesign patterns | ||
Feb 18 | Testing: One, Two, Three | hw4a Designing complex software | |
Feb 23 | A Brief Introduction to Multithreading and GUI Programming | reading Larman ch. 26 |
|
Feb 24 | Recitation Intro to GUIs | ||
Feb 25 | How to Design a Good API and Why it Matters | ||
Mar 01 | The Design of the Java Collections Framework - Part 1 | ||
Mar 02 | Recitation GUIs++ | ||
Mar 03 | The Design of the Java Collections Framework - Part 2 | hw4b Design to implementation | |
Mar 15 | Design for large-scale reuse: Libraries & frameworks | ||
Mar 16 | Recitation Frameworks | ||
Mar 17 | I/O and Reflection | hw4c GUI implementation | |
Mar 22 | Concurrency (part 1) | ||
Mar 23 | Recitation Design pattern mining | ||
Mar 24 | Midterm exam 2 | MOSTLY HARMLESS | |
Mar 29 | Concurrency (part 2) | hw5a Framework design | |
Mar 30 | Recitation Concurrency | ||
Mar 31 | Concurrency (part 3): java.util.concurrent | ||
Apr 05 | Concurrency (part 4): The Java concurrency framework | hw5b Framework and plugin implementation | |
Apr 06 | Recitation Framework presentations | ||
Apr 07 | Distributed system design (part 1) | ||
Apr 12 | Distributed system design: MapReduce | hw5c Plugins for others' frameworks | |
Apr 13 | Recitation Distributed systems | ||
Apr 14 | No lecture: Carnival | ||
Apr 19 | 23 Patterns in 80 Minutes: a Whirlwind Java-centric Tour of the Gang-of-Four Design Patterns | ||
Apr 20 | Recitation Distributed systems, part 2 | ||
Apr 21 | Transactions and serializability | hw6 Checkpoint (Friday 5 p.m.) | |
Apr 26 | Functional Constructs in Java 8: Lambdas and Streams | ||
Apr 27 | Recitation Collaborating with Git | ||
Apr 28 | Finale | hw6 Concurrency and distributed systems | |
May 3 | Final exam, 5:30-8:30 pm, PH 100 | ... AND THANKS FOR ALL THE FISH |