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 12:00 - 1:20 p.m. in DH 2315
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
Date | Topic | Additional Notes/Code | Assignments Due |
---|---|---|---|
Sep 01 | Course introduction and Introduction to software design | simulation example | |
Sep 02 | RecitationCourse infrastructure warmup | ||
Sep 03 | Design for change, part 1 (subtype polymorphism, design patterns) | ||
Sep 08 | Design for change, part 2 (encapsulation, information hiding, contracts) | reading Larman ch. 14 and 16 hw1 Intro to design, course infrastructure |
|
Sep 09 | Recitation Unit testing, build automation, continuous integration++ |
||
Sep 10 | Design for change, part 3 (unit testing, instanceof) | ||
Sep 15 | Design for reuse (class level), part 1 | reading Larman ch. 15 |
|
Sep 16 | Recitation Inheritance and modeling | ||
Sep 17 | Design for reuse (class level), part 2 | reading Larman ch. 20 hw2 Polymorphism, unit testing |
|
Sep 22 | Requirements, domain modeling, and system sequence diagrams | reading Larman ch. 9 and 10 |
Sep 23 | Recitation Behavioral subtypes |
Sep 24 | Responsibility assignment | reading Larman ch. 17 and 18 |
|
Sep 27 | No lecture: Sunday | hw3 Inheritance and delegation | |
Sep 29 | Design for robustness | reading Larman 36.1-36.4 |
|
Sep 30 | Recitation Design process | ||
Oct 01 | Midterm exam 1 | DON'T PANIC | |
Oct 06 | Analysis | ||
Oct 07 | RecitationDesign patterns | ||
Oct 08 | Introduction to GUIs | hw4a Designing complex software | |
Oct 13 | Design case study: Java Swing | reading Larman ch. 26 |
|
Oct 14 | Recitation Intro to GUIs | ||
Oct 15 | Design case study: Java Collections | ||
Oct 20 | Design case study: Java I/O | ||
Oct 21 | Recitation GUIs++ | ||
Oct 22 | Design for large-scale reuse: Libraries & frameworks | hw4b Design to implementation | |
Oct 27 | Design for large-scale reuse: Libraries & frameworks (continued) | ||
Oct 28 | Recitation Frameworks | ||
Oct 29 | API design | hw4c GUI implementation | |
Nov 03 | Concurrency (part 1) | ||
Nov 04 | Recitation Design pattern mining | ||
Nov 05 | Midterm exam 2 | MOSTLY HARMLESS | |
Nov 10 | Concurrency (part 2) | hw5a Framework design | |
Nov 11 | Recitation API design presentations? | ||
Nov 12 | Concurrency (part 3) | ||
Nov 17 | Distributed system design (part 1) | ||
Nov 18 | Recitation Concurrency | ||
Nov 19 | Distributed system design (part 2) | hw5b Framework implementation | |
Nov 24 | Distributed system design (part 3): MapReduce | hw5c Plugin implementation | |
Nov 25 | No recitation Thanksgiving | ||
Nov 26 | No lecture: Thanksgiving | ||
Dec 01 | MapReduce, part 2 | ||
Dec 02 | Recitation Distrbuted systems | ||
Dec 03 | Transactions and serializability | hw6 Checkpoint (Friday 5 p.m.) | |
Dec 08 | Version Control | ||
Dec 09 | Recitation Collaborating with Git | ||
Dec 10 | Lambdas and Streams in Java 8 | streams examples | hw6 Concurrency and distributed systems |
Dec 17 | Final exam 8:30-11:30 a.m. | ... AND THANKS FOR ALL THE FISH |