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 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
Note that our course homework and lecture schedule is being substantially revised this year—especially early in the semester—so this schedule is subject to change somewhat more than in a typical year.Date | Topic | Additional Notes/Code | Assignments Due |
---|---|---|---|
Jan 13 | Course introduction and Introduction to software design | simulation example | |
Jan 14 | RecitationCourse infrastructure warmup | Java Quick Reference | |
Jan 15 | Design for change, part 1 (subtype polymorphism, design patterns) | ||
Jan 20 | Design for change, part 2 (encapsulation, information hiding, contracts) | KWIC case study | hw1 Intro to design, course infrastructure |
Jan 21 | Recitation Unit testing, build automation, continuous integration++ |
||
Jan 22 | Design for change, part 3 (unit testing, instanceof) | Expr. problem example | |
Jan 27 | Design for reuse (class level), part 1 | ||
Jan 28 | Recitation Inheritance and modeling | ||
Jan 29 | Design for reuse (class level), part 2 | hw2 Polymorphism, unit testing | |
Feb 03 | Requirements, domain modeling, and system sequence diagrams | Feb 04 | Recitation The Eclipse debugger and other tools |
Feb 05 | Responsibility assignment | ||
Feb 08 | No lecture: Sunday | hw3 Inheritance and delegation | |
Feb 10 | Design for robustness | ||
Feb 11 | Recitation Design process | ||
Feb 12 | Midterm exam 1 | DON'T PANIC | |
Feb 17 | Analysis | ||
Feb 18 | RecitationDesign patterns | ||
Feb 19 | Introduction to GUIs | SwingWorker demo | hw4a Designing complex software |
Feb 24 | Design case study: Java Swing | ||
Feb 25 | Recitation Intro to GUIs | ||
Feb 26 | Design case study: Java Collections | ||
Mar 03 | Design case study: Java I/O | Java I/O examples | |
Mar 04 | Recitation GUIs++ | ||
Mar 05 | Design for large-scale reuse: Libraries & frameworks | hw4b Design to implementation | |
Mar 17 | Design for large-scale reuse: Libraries & frameworks (continued) | ||
Mar 18 | Recitation Frameworks | ||
Mar 19 | API design | hw4c GUI implementation | |
Mar 24 | Concurrency (part 1) | Concurrency examples | |
Mar 25 | Recitation Design pattern mining | ||
Mar 26 | Midterm exam 2 | MOSTLY HARMLESS | |
Mar 31 | Concurrency (part 2) | hw5a Framework design | |
Apr 01 | Recitation API design presentations? | ||
Apr 02 | Concurrency (part 3) | ||
Apr 07 | Distributed system design (part 1) | ||
Apr 08 | Recitation Concurrency | ||
Apr 09 | Distributed system design (part 2) | hw5b Framework implementation | |
Apr 14 | Distributed system design (part 3): MapReduce | ||
Apr 15 | Recitation Distributed systems | hw5c Plugin implementation | |
Apr 16 | No lecture: Carnival | ||
Apr 21 | Transactions and serializability | ||
Apr 22 | RecitationDistrbuted systems, continued | ||
Apr 23 | State: Finite State Machines, the State Pattern, and the Actor Model | ||
Apr 28 | Version control | hw6 Mapping checkpoint | |
Apr 29 | Recitation Collaborating with Git | ||
Apr 30 | People and process: toward 15-313 | hw6 Concurrency and distributed systems | |
May 05 | Final exam, 1pm, DH2210 | ... AND THANKS FOR ALL THE FISH |