CSE 331: Software Design and Implementation


What qualities make a program good? How can we tell if a program is good? How can we build good programs? We will consider these questions as we explore concepts and techniques for the design and construction of reliable and maintainable software systems in modern high-level languages; program structure and design; program-correctness approaches, including testing; and event-driven programming. To practice the concepts from lecture, we will build substantial projects.

Lecture Mon, Wed, Fri 10:30 SMI 205
Section AA : Thu 8:30 MGH 254
AB : Thu 9:30 MGH 254
AC : Thu 10:30 PAA A110
Instructor Zach Tatlock (ztatlock@cs)
Fri 2:30 CSE 546
TAs Justin Bare (jbare@cs)
Fri 12:00 CSE 006
Christopher Chen (chrisc94@cs)
Wed 3:30 CSE 006
Deric Pang (dericp@cs)
Thu 3:30 CSE 006
Marcella Cindy Prasetio (mcp21@cs)
Mon 1:30 CSE 006
Vinod Rathnam (vinodr@cs)
Tue 2:00 CSE 006


Jan 4, 1. Introduction (materials)

Jan 6, 2. Formal Reasoning (materials)

Jan 8, 3. Reasoning About Loops (materials)

Jan 11, 4. Specifications (materials)

Jan 13, 5. Abstract Data Types (materials)

Jan 15, 6. Representation Invariants (materials)

Jan 20, 7. Abstraction Functions (materials)

Jan 22, 8. Testing (materials)

Jan 25, 9. Style and Design (materials)

Jan 27, 10. Equals and Hashcode (materials)

Jan 29, 11. Assertions and Exceptions (materials)

Feb 1, 12. Subtyping (materials)

Feb 3, 13. Generics 1 (materials)

Feb 5, 14. Generics 2 (materials)

Feb 8, 15. Debugging (materials)

Feb 17, 16. Checker Framework (materials)

Feb 19, 17. Events, Listeners, Callbacks (materials)

Feb 22, 18. Java Graphics and GUIs (materials)

Feb 26, 19. Java GUI Events (materials)

Feb 29, 20. Design Patterns 1 (materials)

Mar 2, 21. Design Patterns 2 (materials)

Mar 4, 22. System Development (materials)

Mar 7, 23. Verifying System Architectures (materials)

Mar 11, 24. Wrap Up (materials)


Jan 7, 1. Hoare Logic and Git (materials)

Jan 14, 2. Project Setup and More Git (materials)

Jan 21, 3. ADTs and HW4 (materials)

Jan 28, 4. Graphs and Testing (materials)

Feb 3, 5. Interfaces and HW6 (materials)

Feb 11, 6. Midterm Review (materials)

Feb 18, 7. Dijkstra's Algorithm (materials)

Feb 25, 8. Model View Controller (materials)

Mar 3, 9. Design Patterns (materials)

Mar 10, 10. Final Review (materials)


We will be reading selections from The Pragmatic Programmer and Effective Java throughout the quarter. You can find quizzes on the reading in Catalyst.

PP numbers correspond to sections and EJ numbers correspond to items. Very sorry for the confusion on this issue earlier in the quarter!

Week 1 : Get books!

Week 2 : quiz due 2/3

PP sections:

Week 3 : quiz due: 2/3

PP sections:

EJ items:

Week 4 : quiz due 2/10

PP sections:

Week 5 : quiz due 2/10

EJ items:

Week 6 : quiz due 2/17

PP sections

EJ items:

Week 7 : quiz due 2/24

EJ items:

Week 8 : quiz due 3/2

PP sections:

EJ items:


Submit homeworks 0, 1, and 2 via the 331 Dropbox. Submit programming assignments by pushing and tagging your git repo as described in the assignment spec. If you absolutely must, you can use up to 4 late days during the quarter, but at most 2 per assignment.

To get ready for future homeworks, please see the References

Homework 0 : due Friday, January 8 at 10am

Homework 1 : due Wednesday, January 13 at 11pm

Homework 2 : due Tuesday, January 19 at 10am

Homework 3 : due Thursday, January 21 at 11pm

Homework 4 : due Thursday, January 28 at 11pm

Homework 5 : due Monday, February 8 at 11pm

Homework 6 : due Thursday, February 18 at 11pm

Homework 7 : due Friday, February 26 at 11pm

Homework 8 : due Friday, March 4 at 11pm

Homework 9 : due Friday, March 11 at 11pm


Midterm : Friday, February 12, in class (midterm soln)

Final : Monday, March 14, 8:30 - 10:20, SMI 205

Previous midterms:

15au   (solution) 15sp (solution)  15wi (solution)  14au (solution)  14sp (solution)  14wi (solution)  13au (solution) 13sp (solution)  13wi  (solution12au (solution)  12sp (solution)   12wi (solution)

Previous finals:

15au   (solution) 15sp (solution)  15wi (solution) 14au (solution)  14sp ( solution14wi (solution)  13au (solution)  13sp (solution)  13wi  (solution12au (solution)  12sp (solution12wi (solution)



Basic Environment Setup

Version Control

Assignment Submission

Working at home

Editing, Compiling, Running and Testing Java Programs

Eclipse Reference


Java Style Guide

Class and Method Specifications

Rep Invariants and Abstraction Functions




Goals: There is a level of programming maturity beyond introductory programming that comes from building larger systems and understanding how to specify them precisely, manage their complexity, and verify that they work as expected. After completing this course successfully students should be able to:

To gain experience we will use Java and associated tools like Eclipse, JUnit, JavaDoc, and git, but the goal is to understand the underlying ideas and concepts that are widely applicable to software construction.

Prerequisite: The only formal prerequisite is CSE 143. We will very much rely on a thorough understanding of the concepts from CSE 143 as well as Java programming skills. We will go much further and you will be challenged to approach software development much differently than you have in CSE 143 or other courses.

Grading and Exams: Your overall grade will be determined as follows (subject to change as necessary, but substantial changes to the numbers below is unlikely):

There is approximately one assignment per week, but not on an exact schedule (i.e., assignments may be due on different days). The assignments are not weighted equally because they are of different length and sophistication. The exact weighting is to-be-determined and is not likely to be published in advance (we need to see how the course goes). Later assignments are likely to be weighted more heavily because they are more involved.

Late Policy: Deadlines will be given with each assignment. These deadlines are strict. For the entire quarter, you may have four "late days". You are strongly advised to save them for emergencies. You may not use more than two for the same assignment. They must be used in 24-hour (integer) chunks. This policy may not be the same as in your other classes. You are responsible for understanding it if you choose to submit late work.

Academic Integrity: Any attempt to misrepresent the work you submit will be dealt with via the appropriate University mechanisms, and your instructor will make every attempt to ensure the harshest allowable penalty. The guidelines for this course and more information about academic integrity are below. You are responsible for knowing that information.

Texts: There are two required books for the course:

These books contain a great deal of distilled wisdom about software construction in general and Java best practices, technical details, and style issues. Reading about software development is an important skill.

There will be assigned readings from these books during the quarter, and you will be required to complete short online quizzes from time to time about the readings.


Approximate Topics (subject to change): We expect to cover the following, with an emphasis on specification and design. The order these are listed is only very rough as we will revisit some topics iteratively.

Academic Integrity

You are responsible for understanding every word in this document.


Material in this course based on work from Michael Ernst, Hal Perkins, Dan Grossman, David Notkin, numerous TAs, and past 331 students.