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 12:00 - 1:20 p.m. in DH 2315

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
Aug 30 Course introduction
Aug 31 RecitationCourse infrastructure warmup
Sep 01 Introduction to Java
Sep 06 Introduction to Object-oriented Programming in Java readingSee Piazza
Sep 07 Recitation Unit testing, build automation, continuous integration++
Sep 08 Introduction to Java; Specification and Testing hw1 Intro to OO, course infrastructure
Sep 13 Delegation, Inheritance, and Behavioral Subtyping
Sep 14 Recitation Behavioral Subtyping
Sep 15 Introduction to Design Patterns Handwritten notes for Design Patterns lecture readingSee Piazzahw2 Polymorphism, unit testing
Sep 20 Design Patterns (continued) and Parametric Polymorphism Handwritten notes for decorator pattern reading See Piazza
Sep 21 Recitation Inheritance and Delegation
Sep 22 Object-oriented analysis: Modeling a problem domain
Sep 25 No lecture: Sunday hw3 Inheritance and delegation
Sep 27 Object-oriented design: Responsibility assignment
Sep 28 Recitation Design process
Sep 29 Midterm exam 1 DON'T PANIC
Oct 04 ’tis a Gift to be Simple: Midterm 1 and Homework 3 Post-Mortem
Oct 05 RecitationDesign patterns
Oct 06 Class invariants, immutability, and testing hw4a Designing complex software
Oct 11 A Brief Introduction to Multithreading and GUI Programming
Oct 12 Recitation Intro to GUIs
Oct 13 How to Design a Good API and Why it Matters - Part 1
Oct 18 How to Design a Good API and Why it Matters - Part 2
Oct 19 Recitation GUIs++
Oct 20 The Design of the Java Collections Framework hw4b Design to implementation
Oct 25 Design for large-scale reuse: Libraries & frameworks
Oct 26 Recitation Frameworks
Oct 27 I/O and Reflection hw4c GUI implementation
Nov 01 Concurrency (part 1)
Nov 02 Recitation Design pattern mining
Nov 03 Midterm exam 2 MOSTLY HARMLESS
Nov 08 Concurrency (part 2) hw5a Framework design
Nov 09 Recitation Concurrency
Nov 10 Concurrency (part 3) - java.util.concurrent
Nov 15 Concurrency (part 4) - parallelism hw5b Framework and plugin implementation
Nov 16 Recitation Framework presentations
Nov 17 Introduction to networks and distributed systems
Nov 22 Distributed system design: MapReduce hw5c Plugins for others' frameworks
Nov 23 No recitation Thanksgiving
Nov 24 No lecture: Thanksgiving
Nov 29 Serializability and transactions
Nov 30 Recitation Distributed systems
Dec 01 23 Patterns in 80 Minutes: a Whirlwind Java-centric Tour of the Gang-of-Four Design Patterns hw6 Checkpoint (Friday 5 p.m.)
Dec 06 Functional Constructs in Java 8: Lambdas and Streams
Dec 07 RecitationStreams
Dec 08 Finale hw6 Concurrency and distributed systems
Dec 16 Final exam, 5:30-8:30 p.m. ... AND THANKS FOR ALL THE FISH

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