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) techniques for robustness, including testing and static and dynamic analysis for programs, and (4) concurrent software. Students will gain concrete experience designing and building medium-sized systems. This course substantially improves its students' ability to apply general computer science knowledge to real-world problems using real-world tools and techniques.

After completing this course, students will:


Tu/Th 3:00 - 4:20 p.m. in Doherty A302

Michael Hilton
WEH 5122
Bogdan Vasilescu
WEH 5115

The instructors have an open door policy: If 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 several changes to the course this semester. The schedule below is a draft based on previous instances of the course and is likely to change.

Date Topic Reading assignments* Assignments due*
Tue, Jan 15 Course introduction and course infrastructure
Wed, Jan 16 rec 1 Introduction to course infrastructure
Thu, Jan 17 Introduction to Java + Design for change: Information hiding Optional: Java Precisely (e.g., Sec. 4, 9, 10, 22)
Tue, Jan 22 Design for change, information hiding Effective Java, Items 15 and 16
Wed, Jan 23 rec 2 Unit testing, continuous integration
Thu, Jan 24 Specification and unit testing Optional: Effective Java, Items 10, 11, 68; UML and Patterns, Ch. 16 hw1 Intro to OO and course infrastructure
Tue, Jan 29 Design for reuse: Delegation and inheritance Effective Java, Items 17 and 50
Wed, Jan 30 rec 3 Behavioral subtyping
Thu, Jan 31 Class Canceled for Polar Vortex Optional: Effective Java, Items 18, 19, and 20 hw2 Polymorphism, unit testing
Tue, Feb 5 Introduction to design patterns, and design patterns for reuse UML and Patterns, Ch. 9 and 10
Wed, Feb 6 rec 4 Inheritance and delegation
Thu, Feb 7 Object-oriented analysis: Modeling a problem domain Optional: UML and Patterns, Ch. 17; Effective Java, Item 49, 54, and 69
Tue, Feb 12 Object-oriented analysis: Modeling a problem domain Continued UML and Patterns, Ch. 14, 15, and 16 hw3 Inheritance and delegation
Wed, Feb 13 rec 5 Design process
Thu, Feb 14 Midterm exam 1
Tue, Feb 19 Object-oriented design: Responsibility assignment
Wed, Feb 20 rec 6 Design patterns
Thu, Feb 21 Testing Continued hw4a Designing complex software
Tue, Feb 26 Introduction to multi-threading and GUIs UML and Patterns, Ch. 26.1 and 26.4
Wed, Feb 27 rec 7 Introduction to GUIs
Thu, Feb 28 Design case study: Java Swing Optional: Effective Java, Item 1
Tue, Mar 5 Design case study: Java Collections Effective Java, Items 6, 7, and 63
Wed, Mar 6 rec 8 GUIs++
Thu, Mar 7 Design for large-scale reuse: Libraries & frameworks hw4b Design to implementation
Tue, Mar 12 No Lecture, Spring Break
Wed, Mar 13 rec 9 No Recitation, Spring Break
Thu, Mar 14 No Lecture, Spring Break
Tue, Mar 19 Designing APIs Effective Java, Items 51, 60, 62, and 64
Wed, Mar 20 rec 10 Frameworks
Thu, Mar 21 Designing APIs part II Optional: Effective Java, Items 52 and 53
Mon, Mar 25 hw4c GUI implementation
Tue, Mar 26 Version Control with Git
Wed, Mar 27 rec 11 Git and Github++
Thu, Mar 28 Midterm exam 2
Tue, Apr 2 Git workflows, Concurrency: Java Primitives
Wed, Apr 3 rec 12 Framework presentations hw5a Framework design
Thu, Apr 4 Concurrency: Java Primitives, continued Java Concurrency in Practice, Ch. 11.3 and 11.4
Tue, Apr 9 Concurrency: Safety, Structuring applications Optional: Java Concurrency in Practice, Ch. 10 hw5b Framework and plugin implementation
Wed, Apr 10 rec 13 Concurrency
Thu, Apr 11 No Lecture, Carnival
Tue, Apr 16 Concurrency: Parallelizing algorithms, concurrency frameworks Optional: Java Concurrency in Practice, Ch. 12
Wed, Apr 17 rec 14 Java concurrency framework
Thu, Apr 18 Design case study: Java functional APIs and streams hw5c Plugins for others' frameworks
Tue, Apr 23 313 Pitch class
Wed, Apr 24 rec 15 Java functional APIs and streams
Thu, Apr 25 Developer tools
Tue, Apr 30 DEVOPS hw6 Concurrency
Wed, May 1 TBD
5/2/2019 Design pattern tour
TBD Final exam
* = For details, see assignment on Piazza or your GitHub repository.

Our final exam may be as late as Monday, May 13th, 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 Tuesday, May 14th.