version 1


David J. Malan, Instructor

Rob Bowden, Preceptor


Introduction to principles of software engineering and best practices, including code reviews, source control, and unit tests. Topics include Ajax, event handling, HTTP, MVC, object-oriented design, relational databases, and user experience. Projects include web apps with front-end UIs (mobile and desktop) and back-end APIs. Languages include JavaScript and PHP.


Permission of the instructor is required.


Students will work on projects in groups. Enrollment may be limited. In 2014, this course will focus on the design and implementation of web apps.


Any four CS courses numbered 50 or higher (or, with instructor’s permission, multiple years of programming experience).


You are expected to attend or watch occasional talks, participate in all meetings, meet weekly milestones, and submit two projects.


All students must ordinarily attend or watch all talks, participate in all meetings, meet all milestones, and submit two projects in order to be eligible for a passing grade.

Final grades are based primarily on:

  • students' contributions to projects;

  • students' improvements over time;

  • students' preparation for meetings;

  • scope, correctness, design, and style of students' projects;

  • quality (not quantity) of students' participation in meetings; and

  • timeliness of students' milestones met.

Students will be apprised of their relative standing during the term. Members of a team will not necessarily receive the same final grades.


This course lives at


Students are expected to work in teams of size four.


Most of the course’s instruction will take the form of team meetings with one or two staff. During these meetings will each of a team’s four students be expected to report on milestones, defend design decisions, and/or present code for review.


Via occasional technical talks (some during class, some via video) will the course introduce these topics and/or others, subject to change:

  • Backbone.js

  • Bookshelf.js

  • Eloquent

  • Express.js

  • Git

  • HTTP

  • Laravel

  • MVC

  • Node.js

  • SQL

  • Underscore.js


Students are expected to submit two projects, the first PHP-based (using Laravel and Eloquent atop Apache), the second JavaScript-based (using Express.js and Bookshelf.js atop Node.js). Projects will be assigned by the staff after input from students.


The course uses Asana for project management and GitHub for code repositories.


No books are required for this course, but the resources below are recommended by the staff.

Academic Honesty

This course’s philosophy on academic honesty is best stated as "be reasonable." The course recognizes that interactions with classmates and others can facilitate mastery of the course’s material. However, there remains a line between enlisting the help of others and submitting the work of others. This policy characterizes both sides of that line.

The essence of all work that you submit to this course must be your own and your team’s. Collaboration on projects with individuals not on your team is not permitted except to the extent that you may ask classmates and others for help so long as that help does not reduce to another doing your work for you.

Below are rules of thumb that (inexhaustively) characterize acts that the course considers reasonable and not reasonable. If in doubt as to whether some act is reasonable, do not commit it until you solicit and receive approval in writing from the course’s staff. Acts considered not reasonable by the course are handled harshly. If the course refers some matter to the Administrative Board and the outcome is Admonish, Probation, Requirement to Withdraw, or Recommendation to Dismiss, the course reserves the right to impose local sanctions on top of that outcome that may include an unsatisfactory or failing grade for work submitted or for the course itself.


  • Communicating with classmates about projects in English (or some other spoken language).

  • Discussing the course’s material with others in order to understand it better.

  • Helping a classmate identify a bug in his or her code, as by viewing, compiling, or running his or her code, even on your own computer.

  • Incorporating snippets of code that you find online or elsewhere into your own code, provided that those snippets are not themselves solutions to assigned problems and that you cite the snippets' origins.

  • Sending or showing code that you’ve written to someone, possibly a classmate, so that he or she might help you identify and fix a bug.

  • Sharing snippets of your own code somewhere online so that others might help you identify and fix a bug.

  • Turning to the web or elsewhere for instruction beyond the course’s own, for references, and for solutions to technical difficulties, but not for outright implementations of projects.

  • Whiteboarding implementations of projects with others using diagrams or pseudocode.

  • Working with (and even paying) a tutor to help you with the course, provided the tutor does not do your work for you.

Not Reasonable

  • Asking a classmate who’s not on your team to see his or her implementation of a project before (re-)submitting your own.

  • Deleting an assigned milestone.

  • Failing to cite (as with comments) the origins of code that you discover outside of the course’s own lessons and integrate into your own work, even while respecting this policy’s other constraints.

  • Giving or showing to a classmate who’s not on your team your implementation of a project when it is he or she, and not you, who is struggling to implement it.

  • Paying or offering to pay an individual for work that you may submit as (part of) your own.

  • Providing or making available implementations of projects to individuals who might take this course in the future.

  • Searching for or soliciting outright implementations of projects online or elsewhere.

  • Splitting a project’s workload with another individual who’s not on your team and combining your work.

  • Submitting (after possibly modifying) the work of another individual who’s not on your team beyond allowed snippets.

  • Submitting the same or similar work to this course that you have submitted or will submit to another.

  • Submitting work to this course that you intend to use outside of the course (e.g., for a job) without prior approval from the course’s heads.

  • Viewing an implementation of a project by someone not on your team and basing your own implementation on it.

Acknowledgement and Authorization

Harvard plans to make video and audio recordings of Computer Science 164 (CS164) lectures, meetings, and other events and activities related to CS164, with the aims of making the content of the course more widely available and contributing to public understanding of innovative learning (the "Projects"). The recordings, or edited versions of them, may be made available to other Harvard students, to students at other educational institutions, and to the broader public via edX, the Internet, television, theatrical distribution, DVD, or other means. It is also possible that the recordings may be used to make other derivative works in the future. Students may elect not to appear in video used in the Projects and may still participate fully in CS164.

When you section for the course, you will need to sign online an Acknowledgement and Authorization in the following form:

I understand that, if I do not wish any video footage of me to be used as part of the Projects, I should so inform the course’s instructor by emailing within one week of enrolling in CS164. In that event, I understand that I should sit in the designated "no film" section of CS164 classrooms and should not walk in the field of view of the cameras. I understand that Harvard will take reasonable steps, with my cooperation, to avoid including identifiable images of me in Project video shot in classrooms and other course locations after I opt out as just described. I understand that I am free to opt out of the Project videos in this way, and that doing so will not affect my grade or my ability to participate in course activities.

Unless I opt out of the Project videos as described above and take the steps that will be outlined by the instructor to avoid being filmed, I authorize Harvard to make and use video and audio recordings of my participation in CS164 and activities related to CS164 (the "Recordings"). I understand and agree that the Recordings may include my image, voice and name. I also understand and agree that, even if I opt out of the Project videos, my voice and spoken name may be picked up by microphones outside the "no film" section and may be included in the Recordings.

I understand and agree that Harvard will have the irrevocable, worldwide right to make, edit, modify, copy, publish, transmit, distribute, sell, publicly display, publicly perform, and otherwise use and make available its respective Recordings and any other works that may be derived from those Recordings, in any manner or medium now known or later invented, and to authorize others to do so as well. I hereby transfer to Harvard any rights, including copyrights, I may have in the Recordings Harvard makes. I will remain free to use and disseminate any ideas, remarks, or other material that I may contribute to course discussions.

I acknowledge and agree that I will not be entitled to any payment, now or in the future, in connection with the Recordings or any works derived from them. This Acknowledgment and Authorization is a binding agreement, and is signed as a document under seal governed by the laws of the Commonwealth of Massachusetts.

Unless you opt out as described in the Acknowledgment and Authorization, you are agreeing, by attending CS164, that your participation in CS164 and related activities may be filmed and used by Harvard in connection with the video projects without further obligation or liability to you, even if you do not sign any authorization.

If you have any questions about the above, contact