Principles of Software Construction Objects, Design, and Concurrency


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:


Tu/Th 3:00 - 4:20 p.m. in WEH 7500

Professor Josh Bloch
WEH 5126
Professor Charlie Garrod
WEH 5101

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


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

Our final exam may be as late as Monday, May 9th, and we do not schedule make-up exams before the officially-scheduled exam time. If you must schedule summer travel before the final exam schedule is published, please do not plan to leave campus until at least Tuesday, May 10th.