Course Meeting Times

Lectures: 2 sessions / week, 1.5 hours / session

Recitations: 1 session / week, 1 hour / session


The objectives of this course are that, by the end:

  1. You will have the skills to develop a small to medium-scale software system from scratch: formulating and analyzing the problem to be solved; exploring and articulating candidate designs; implementing in Java; and using testing and reasoning to ensure quality.
  2. You will have a solid grasp of, and ability to apply, key software engineering ideas, including invariants, decoupling, and data abstraction.
  3. You will be fluent in three essential and widely used design notations (state machines, module dependency diagrams, and object models) and able to use them effectively in exploring and articulating problems and designs.
  4. You will be familiar with a variety of standard design and implementation patterns (such as model-view-controller and client-server) and with some popular technologies (such as Eclipse, JUnit, Subversion, Swing, HTTP, network sockets).
  5. You will have a stronger inherent ability to make engineering judgments and pick the right tool for the task at hand; improved skills in design, organization and analysis; an appreciation for the importance of simplicity and abstraction; and a greater awareness of risk and how to mitigate it.
  6. You will have had some experience working collaboratively in a team.

Course Elements


There are two 80-minute lectures each week. You're expected to attend all the lectures and to participate actively in class discussions. To encourage a collegiate atmosphere, we request that no laptops or phones be open during class. There is no course text.


The teaching assistants will be leading one-hour recitations on Thursdays. You will be asked to select a time, and to attend the recitation at that time each week.

Problem Sets

To consolidate your understanding of the lecture ideas, you'll do three problem sets, one on each paradigm. Like projects, problem sets will involve both design and implementation work, but the problems will be smaller and less open-ended. Problem sets will be done individually.


You'll complete three small software development projects, each of which goes all the way from specification and design to coding and testing. All projects will be done in teams of three students. You'll have the opportunity to choose whom to work with, and we'll do our best to honor your choices. Any pair of students, however, will only be allowed to work together on a single project. Collaboration is encouraged, although each team member is required to participate roughly equally in every activity (design, implementation, test, documentation), and we may ask for an accounting of what each team member did. Each project will have a deliverable after one week (usually involving exploring the problem and working on design issues), and a second, final deliverable after the second week. Code will be handed in electronically (by committing in the repository before the deadline). For each of the deliverables, your team will submit a single document (in hardcopy and in PDF in your repository) summarizing your design and answering any particular questions posed in the project handout.


A series of three case studies will be presented in lecture, in order to illustrate the concepts being taught on substantial examples. Before each case study, you will implement a solution to the case study problem yourself, both to give you practice coding in Java, and to introduce you to the case study. Your solution will be judged on the correctness and clarity of the code; you will (obviously) not be expected to use design ideas that have not yet been taught. Explorations will be done individually.

Team Meetings

You and your team will meet with your TA during your project to discuss the work. Your TA will assign a grade based in part on this meeting. A single grade will be assigned to all students in the project.

Lab Assignments

Each project will be preceded by a lab assignment to help you get up to speed with the project's technology. Lab assignments will be done individually. A TA will formally check off that you have completed the lab during the session itself. The lab is also a time to chat informally with your TA about your ongoing work and to look over your lab notebook. A team of LAs will be available in the lab to help you slay any technological monsters that impede your progress.


There will be no quizzes or final exam.

Grading Policy

The relative contributions of the various activities to your grade are: explorations 20%, problem sets 30%, projects 40%. The remaining 10% of your grade will be at the discretion of the teaching staff, and will be determined in part by your participation in recitations and your performance in lab assignments. Late work will incur a penalty of 10 percentage points per 24 hours late, up to a maximum of 72 hours. Assignments that are more than 3 days late will not be graded at all.

In unusual or extenuating circumstances, you may be able to complete a project late without penalty, but only if you receive advance permission from your TA. The further in advance you ask for an extension, the more likely it is to be granted. Obviously, exceptions are made for emergencies; we don't expect you to get advance permission if you get sick suddenly, but remember that a health problem can only be considered for an unapproved extension if you present a doctor's note.

In line with the Departmental Guidelines Relating to Academic Honesty, here are our expectations regarding collaboration and sharing. For the projects, you are encouraged to collaborate with your partners on all aspects of the work, and each of you is expected to contribute a roughly equal share to design and implementation. You may reuse designs, ideas and code from your own work earlier in the semester (even if it was done with a different partner). You may also use material from external sources, so long as: (1) the material is available to all students in the class; (2) you give proper attribution; and (3) the assignment itself allows it. In particular, if the assignment says "implement X", then you must create your own X, not reuse someone else's.

Problem sets, explorations and lab assignments are intended to be primarily individual efforts. You are encouraged to discuss approaches with other students but your write-up must be your own. You should not make use of any written solutions or partial solutions produced by others. Material from external sources can also be used with proper attribution, but again only if the assignment allows it. You may not use materials produced as course work by students in the course, whether in this term or previous terms, nor may you provide work for other students to use.

Copying work, or knowingly making work available for copying, in contravention of this policy is a serious offense that may incur reduced grades, failing the course and disciplinary action.