The purpose of this course is to provide students with the design and implementation skills necessary for working with large software systems. Design skills include understanding software architectures down to the class level, effectively communicating designs, user interface design, the use of threads and sockets, and file I/O. Coding techniques include proper use of tools, testing, modularity, and programming styles. Software engineering concepts are reinforced with a substantial term project, where the emphasis is on learning how to design and work as a team, present to others, and write maintainable and extensible code.

Who Should Take this Course?

Students who are interested in software design and engineering principles should take this course as an introduction. It is excellent preparation for future work in industry because it emphasizes the skills required to work well on teams and with large codebases. It will also help you decide if software engineering might be something you want to continue with or at least work closely with.

We expect the students taking this class to have good Java programming skills, a working knowledge of Linux, a good understanding of data structures, and the motivation to create large, complex projects from scratch. If you have taken CS 15/16, 17/18, or 19, you should be sufficiently prepared for this course. If you aren't certain that you are prepared, feel free to email us or consult the course staff to determine if CS 32 is right for you.

Meetings and Assignments


We will have traditional lectures. These will be focused on design issues and should provide the basic principles and techniques you will need to master in order to design and implement the programming assignments and your term project.

There will be in-class activities in lecture, which will form a portion of your final grade. The clickers are mostly meant for the professor to gauge students' understanding.


We will have lab sessions throughout each week. These are meant to teach new skills with the guidance of TAs. We suggest students use the skills learned in lab when completing their projects. Labs are graded on a pass/fail basis. Labs are released on Thursdays as indicated, and you may get checked off for the lab the last lab hours on Wednesday. You will be assigned to a weekly lab slot after the first lab of the semester. If you cannot attend your scheduled lab slot, email the HTAs. If you do not finish your lab in your scheduled slot, you may get it checked off at your scheduled lab slot the next week for full credit.


There are two major projects, each taking about three to five weeks. These will compose 40% of your final grade. Each project will be split into weekly checkpoints, and we will have "gear-up" sessions shortly after each project is released to help you get started. These gear-up sessions are optional, but will help guide you through how to approach each project.

Term Project

Students will work on the term project throughout the entire semester in groups of four, making presentations and design documents along the way. You will be able to come up with and implement any ideas you have or had in the past. Anything you create, you own.

Code Reviews

After the backend portions of the two major projects (Stars, Maps) are due, you will be assigned to review another student's submission using Git. You will review the submissions of your partners for the next project. See the projects page or course calendar for due dates. You may not use late days on readings and reviews, so the deadline is strict. Each day late will result in a 20% deduction.


Code review assignments will also contain a corresponding reading assignment. Students will complete reading(s), write responses to provided questions, and submit answers through a Google Form.

Time Management

Although this class is not meant to be “killer”, it is a lot of work. On the other hand, you're going to learn a lot of material. All of the assignments build on top of one another. We will also assess severe grading penalties to late assignments. Therefore, it is imperative that you manage your time effectively. There will be no rest days between projects. Start early, and spread out your work.


You must hand in a version of 2 out of the 3 major projects (Stars, Maps 1-2, Maps 3-4) that passes minimum functionality in order to pass the course. Each project handout specifies minimum functionality, but in general it requires passing the basic test suite and having a functional GUI. However, merely producing a working version of each project is not necessarily enough to guarantee you a passing grade. It is just an extra requirement.


Assignments are not only graded on their functionality: there will be a large emphasis placed on good software engineering practices. In general, functionality will not be worth much more than half the credit for any project. This means that we will expect you to produce readable, well-documented, and well-tested code.


  • 40%: Regular Projects
  • 40%: Term Project
  • 15%: Labs
  • 5%: Professionalism and Participation


Late handins will be penalized 20% per day late. A day begins at 6pm after the assignment is due and ends 24 hours later. Assignments more than two days late will not be graded. As assignments handed in more than two days late without an extension will not be graded, this mans you cannot use more than two late days on any one assignment. The Maps checkpoint and the term project may not be handed in late.

Late day policy: You will be given four free late days to use on any of the deadlines in the first two projects (Stars and Maps) as you wish. Late days will be applied in the optimal order at the end of the semester, and will not result in the 20% deduction specified above. Each late day extends the deadline by 24 hours - making an assignment due at 6pm the following day. On partner projects, your group will be allowed to use the maximum of you and your partner's late days.


In the event of an illness or substantial emergency, extensions will be granted on a case-by-case basis subject to a note from health services or a dean. Contact the professor to request an extension.


It is your right to challenge a grade you receive. If you disagree with your grade on a project, contact the TA that graded you. No TAs will comment on grading done by another TA. If you are still unhappy, you can contact the Head TAs with your complaint. Then comes the professor, then the deans, etc.


The TAs will grade assignments and answer general questions about course content. The primary point of contact for TAs should be Piazza. To contact the head TAs and the professor, you can email

Times and locations for office hours are posted on the course web page. You may not ask the TAs questions while they are not holding scheduled hours. We expect that you have made a considerable effort to figure out a question or problem before you go to TA hours. If you have not, the TAs will likely refer you to documentation and other resources. Furthermore, if you have not implemented Boggle and come with simple Java questions, the TAs are free to reject your question, so if you are unsure of your Java skill, we highly suggest implementing Boggle.