Course description

CS 3110 is the third programming course in the Computer Science curriculum, following CS 1110 and CS 2110. The goal of the course is to help students become excellent programmers who can design and implement software that is elegant, efficient, and correct, and whose code can be maintained and reused. CS 3110 covers a broad range of topics, including:

  • Functional programming
  • Software engineering
  • Data abstractions
  • Specifications
  • Interpreters
  • Formal methods


  • Professor: Nate Foster (jnf27), 432 Gates
  • Graduate teaching assistants:
    • Alan Cheng (ayc48)
    • Dietrich Geisler (dag368)
    • Harrison Goldstein (hjg42)
    • Richa Despande (rd382)
  • Undergraduate teaching assistants:
    • Anmol Kabra (ak2426)
    • Adina Walzer (alw268)
    • Anna Fang (amf269)
    • Drew Dunne (asd222)
    • Quinn Halpin (qmh4)
    • Sitar Harel (sh927)
    • Theodore Bauer (tjb272)
    • Tyler Etzel(tje44)
    • Yuchen Shen (ys393)
  • Accounts Czar: Sitar
  • Assignment Czar: Anmol
  • Discourse Czar: TBA
  • Grading Czar: Alan
  • Head consultant: Irene
  • Consultants:
    • Chris Haralampoudis (ch677)
    • Cassandra Scarpa (cls354)
    • Newton Ni (cn279)
    • Devin Lehmacher (djl329)
    • Irene Yoon (ey222)
    • Frank Li (fl338)
    • Wilson Chen (hc626)
    • Jialu Bao (jb965)
    • Iris Zheng (jz678)
    • Kevin Gao (kg346)
    • Kevin Wang (kxw2)
    • Kimberly Guo (kyg6)
    • Meghan Chen (mc2254)
    • Megan Le (ml944)
    • Nina Ray (nr327)
    • Ray Zeng (rz72)
    • Scott Dickson (sdd48)
    • Shumei Guan (sg738)
    • Sonia Appasamy (sma246)
    • Xinyu Zhao (xz293)
    • Tin Kuo (yk638)
    • Ning Ning Sun (ys395)
  • Administrative assistant: Jenna Matthews (jls478), 401 Gates

The schedule of office hours will be posted on Discourse. There are no office hours during official breaks or during exams. Office hours end at 5 pm on a prelim day. Office hours end on the last day of classes.


The course website is

We use CMS for submission of assignments and for grading. Make sure you can login to and see CS 3110. If you cannot access the course, verify with the Registrar that you are enrolled in the course. Within a couple days of enrolling you should automatically be added to CMS; there's no need to contact us directly unless about a week has elapsed without you being added. We will not add students to CMS until they are enrolled with the Registrar.

We use Discourse for announcements. You can sign up at You are responsible for familiarizing yourself with all announcements made on Discourse.

Discourse can also be used for Q&A. We will treat Discourse as a virtual study group attended by all the students in the course, thus capitalizing on its greatest strength: the ability to collaborate with and benefit from your peers. Your questions will therefore primarily be answered by other students.

To encourage collaboration, instructors will allow students to provide the (first) answer to a question. Students who demonstrate exceptional ability to answer their peers' questions on Discourse will be rewarded for their mastery of material and dedication to the course by a small bonus to their final grade. If the initial student answer seems insufficient, begin a follow-up and collaborate to improve the student answer. Posting of assignment solutions or hints is not permitted and could violate Academic Integrity.

Discourse is best used to ask questions whose answers will be useful to many students. If you have questions that are likely to be specific just to yourself—especially if they fall in the category of technical support or debugging—we ask you to take those questions to office hours. But if you can phrase the questions in a way such that they are of broad interest, you are likely to find other students thanking you for them and answering them quickly.

Your primary point of contact about grades is your recitation TA. Do not post questions about grading, grades, or regrades on Discourse. Such questions will typically be closed without answer by instructors.

Emailing with instructors in CS 3110:

  • The best way to communicate with instructors is in office hours. We ask that you always try to use this option first. In-person meetings are more efficient, more beneficial, and more fun.
  • We ask that you refrain from sending direct email to instructors's NetIDs, except for the purpose of coordinating meetings.
  • To contact "anyone in charge" about a matter affecting more than you (and your group), email This email list reaches the professor and is best used to send informational messages, which need no reply. For example, use this email if there aren't any staff members at a scheduled office hour. Emails about issues that could be handled in person might not receive a response. Neither email nor Discourse is an appropriate channel for discussion of grades—such discussions should occur in person.

Course materials

There is no official textbook for the course. The main source of materials will be the notes, slides, and labs posted on the course website.

If you'd like a very gentle, textbook-style introductory treatment of OCaml programming, OCaml from the Very Beginning is recommended. It's currently about $15 to purchase a PDF. It would be a good choice if you are feeling a little nervous or unprepared for functional programming.

Another introductory textbook would be Introduction to Objective Caml by Jason Hickey (PhD '01). It's freely available as PDF for now. It would make a good supplement to the course notes.

For a more in-depth treatment with some real-world examples, you could read Real World OCaml by Yaron Minsky (PhD '02), Anil Madhavapeddy, and Jason Hickey (PhD '01). It's freely available as HTML. Be aware that this book heavily uses a rapidly evolving, third-party library called Core developed by Jane Street, a quantitative trading firm at which Dr. Minsky is the Head of Technology, and that CS 3110 does not use that library. You do not need this book for the course, but some students might find it interesting.

You are required to have an i>clicker and to bring it to each lecture. You can buy an i>clicker at The Cornell Store. CIT provides technical support for i>clicker. Register your i>clicker in the CS 3110 course in Blackboard. Use of someone else's i>clicker, especially if they cannot be there and asked you to click theirs, is a violation of Academic Integrity. You will never be graded on whether the answers you submit by i>clicker are correct; it is simply part of your attendance grade.

A working computer, including screen, keyboard, battery, operating system, and networking, is a requirement for the course. As an option in case of emergency, the CS undergraduate lab in Gates G33 is available soon after the add deadline to all students enrolled in this course, and automatically to all affiliated CS majors. VirtualBox is installed on the computers in the lab, so you can download the VM and use it there. Be aware that the computers lose all local state when they reboot, meaning you must keep a copy of your source code somewhere external.

Class meetings

Attendance at lecture is mandatory and will be recorded by i>clickers. We ask that you silence and put away all mobile devices, so that you do not distract other students or yourself. Students who want to take notes on laptops will be asked to sit in a designated area of the lecture hall for the same reason.

Attendance at recitation is mandatory and will be recorded by TAs. You must attend the recitation section for which you are registered. We wish we could be more flexible on that, but it's going to be necessary to streamline attendance taking, to fairly balance the number of students in each recitation, and to ensure that enough seats are available in each room. Also, your recitation TA will be the primary grader for all your assignments, so it is in your best interest to get to know them and to see them regularly.

This schedule of recitation sections identifies which TA is teaching which section.

There are no excused absences: what we are tracking is whether you are present and participating, not whether you had a reason to be absent. So if you need to be absent because of illness, personal, employment, or academic reasons, there is no need to notify your instructors. Similarly, if your i>clicker glitches on a day, we regret that the instructor software doesn't enable us to record that you were nonetheless present, so it won't help to notify us.

Attendance will be worth only a small part of your final grade, typically around 1%. That's enough to make a difference in borderline cases, but not enough for you to be worried about any particular absence you might have. As a guideline, don't miss more than about a week's worth of class meetings, and you'll be fine.

Assignments and final project

There will be approximately six homework assignments, which may include written problems, programming problems, and optional karma problems. You will typically have two to three weeks to work on each assignment. Early assignments will be individual, whereas some later assignments will permit partners.

Because this is an advanced programming course, we place great value on adhering to specifications. If your assignment solution fails to compile against provided interfaces, or if it fails to pass provided public test cases, you should expect to receive minimal credit. Often that means a score of zero points on the "correctness" part of the rubric. Regrade requests or appeals in such a scenario will be unsuccessful: we are quite serious about this matter.

Partial credit on assignments is based on your solution passing part of the staff's test suite. Each test case you pass gets you more points. So to maximize your partial credit, do your best to submit code that will pass as many test cases as possible. There is no partial credit for code per se, and certainly none for code that fails to compile on its own or against provided interfaces. An underlying bug that is sufficiently severe to cause your solution to fail several test cases will be fully penalized for each of those failures, not for the single bug. (Faulty software costs society time and money based on its failures, not the number of independent bugs.)

There will also be a final project undertaken during roughly the last month of the course. You will build a software system as part of a small team, including designing the system, reviewing your design with the course staff, implementing the system, and demoing it for the course staff.

Extensions and late policy

Extensions will be granted only in exceptional circumstances, such as documented illness, and are handled exclusively by a graduate TA in consultation with the professor. Your copy of a checkout sheet from a medical provider suffices as documentation. Extensions will not be granted for job fairs, job interviews, large workloads in other courses, or extra-curriculars. To request an extension, you may email

Unless otherwise specified, assignments may be turned in after the deadline with the following penalty applied to the score received:

  • 1 day late (i.e., immediately after the deadline up to 24 hours later): −10%
  • 2 days late: −25%
  • 3 days late: −50%
  • >3 days late: −100% (we won't grade it)

The late penalty is applied to your score on the entire assignment, not just individual problems or files. Weekends (Saturday and Sunday) count as a single day for the purpose of calculating late penalties. So turning your assignment in on Sunday night is no worse than turning it in on Saturday morning.

Here are a few words of caution about CMS and late submissions:

  • The deadline for an assignment is not the time by which you must finish writing a solution; rather, the deadline is the time by which you must successfully upload your solution files to CMS and confirm that CMS has recorded the correct versions of those files. CMS might lag near the deadline as many students attempt to upload their submissions at the last minute, perhaps even causing your submission to be marked as late. That is your problem. Requests to have a penalty removed because CMS lagged near the deadline will be denied. We recommend that you upload your files at least one hour before the deadline.
  • There will be a short grace period configured in CMS. Do not (re)submit after the deadline unless you are comfortable with the fact that you might receive a late penalty. The only purpose of the grace period is for you to resolve any last-minute upload issues—not to continue working past the deadline. The grace period applies only to the original deadline, not to any late submission deadlines.
  • You must submit your work through CMS; email submissions, whether late or on time, will be deleted without response.
  • CMS enables you to upload as many times as you wish before submissions are closed. Only the most recent version, with the appropriate late penalty, will be graded. Requests to have the course staff grade earlier versions (with or without a penalty) will be denied.
  • It is your responsibility to verify before the deadline that you have submitted the intended versions of your files. Requests to substitute another version (e.g., "I accidentally submitted the wrong files") will be denied.
  • File system timestamps on your local hard drive are never acceptable as evidence of existence of a file prior to the deadline, because you are under complete control of that timestamp.

We sincerely regret having to enforce these policies, but the administrative overhead associated with late submissions has become too great. And sorting out whether students are unfairly trying to work past the deadline (while unjustly blaming CMS) is not feasible.


There will be two preliminary exams and a final exam. Exams will cover material from lectures, labs, recitations, online notes, and assignments. The final exam is cumulative.

A makeup prelim is offered for students who have conflicts with the 7:30–9:00 pm time scheduled by the Registrar. The makeup for the prelim is held on the same day as the prelim itself, but at 5:30–7:00 pm. No other makeup exam times will be offered for the prelim.

If you cannot attend an exam because of health or family crises, or similar life events, you may ask the professor for permission to be excused from the exam. Once you enter the examination room you may no longer ask permission to be excused. If you miss an exam, and we excused you, we modify the grading formula to compute your grade with just the other exam. You must ask us for permission in advance: don't just skip exams and assume you can be excused retroactively. If you miss an exam and we didn't excuse you, you get a zero for the missing score.

Regrades and appeals

In our experience, exceptionally few regrade requests would actually make a difference in the final course grade. So rather than obsessing over regrades, we'd prefer that you spend your time doing well on the next assignment. The course staff will go to great lengths to help you understand the course content. We are considerably less enthusiastic about discussing how what you submitted could be stretched to seem correct.

Regrades. Regrade requests will not be accepted by CMS. Instead, if there is something you don't understand about your grading comments, your primary point of contact is the grader who wrote them. On assignments, this will usually be your recitation TA. You should feel free to ask them in person for clarifications or for advice on how to improve your work. But the grade on your solution and/or changes to your grade are "out of bounds" for discussion. If during the course of your discussion the grader realizes they might have made a mistake, they will volunteer to take a second look outside your meeting, fix any mistake they discover, and change your grade up or down accordingly. You are free to point out grading mistakes of a purely arithmetic nature, which the grader will happily fix immediately.

Appeals. If, after discussing your solution with the grader, you still disagree with your grade, you may appeal to the professor. Appeals are intended to correct serious errors in grading, not to dispute judgment calls made by graders. Graders do sometimes take off a little too much, but they just as often give a little too much. If you decide that a serious mistake was made in grading your assignment, then we would be happy to fix it. Here is the process:

  1. Prepare an appeal by filling out this form. Attach hardcopies of your entire original solution, including source code, and the entire grading comments. Your appeal needs to demonstrate that there was a serious error in grading, and that you understand the correct answer.
  2. Submit that appeal to the homework handback room (Gates 216).
  3. Be patient. Appeals receive lower priority than any other active grading.
  4. The graduate TAs, in consultation with the professor, will read your request, consider its merits, and make a decision about a grade change. The grade on your assignment might increase, decrease, or remain unchanged as a result of the additional scrutiny the regrade request engenders.
  5. The result of your appeal will be communicated back to you via CMS.

Note that this process is entirely written. We will not discuss appeals with you in person or by email. The deadline for submitting an appeal is ten days after the original grade was released in CMS. Appeals submitted after that will be denied without consideration of their merits.

Resist the temptation to use appeals as a means to fish for a better grade. Here are two words of caution:

  • Any appeal that we perceive to be specious will inspire increased rigor in rechecking your submission, and that often leads to a grade reduction.
  • We track all appeals that are submitted throughout the semester. When we determine final course grades, we look carefully at students who are near the cutoffs between letter grades to see whether any extra consideration is warranted for adjusting their grade up or down. Abuse of appeals will factor heavily into this extra consideration.

We sincerely regret having to enforce this policy, but "grade grubbing" has become a serious problem leading to an unjustifiable amount of work. We would rather be generous at the end of the semester in determining final grades, rather than debate half-point deductions throughout the semester.

Academic integrity

Absolute integrity is expected of every Cornell student in all academic undertakings. If you are unsure about what is permissible and what is not, please ask.

You are responsible for understanding these university, departmental, and course policies:

Integrity includes you being honest about the sources of the work you submit. When you submit work in this course, you are representing it as the work of the stated authors (i.e., the members of the CMS group who submitted it) subject to any exceptions that are clearly stated in the submission itself. To avoid committing plagiarism, simply be sure always to accurately credit your sources. To do otherwise is to commit fraud by claiming credit for the ideas and efforts of others, and that is punishable under the Code of Academic Integrity.

Grades, on the other hand, are about the course staff assessing what you have learned. If you turn in someone else's work for course credit, and forthrightly acknowledge you are doing so, you are not acting dishonestly and are not violating academic integrity. But you also give us no basis for concluding that you have learned the course content. We recommend the following rule of thumb: Never look at any other student's solutions (including source code), or have their solutions in your possession in any portion or form whatsoever. Once you have seen another solution, it becomes impossible to unsee and is likely to infect your own. Likewise, never share your solutions with other students. That includes not writing code together at a whiteboard: even if you erase it and later write code separately at a computer, you are likely to write similar code that could be flagged as a potential violation.

You are always free to use code presented in this class in lecture, or on this semester's course website. It does not require citation. Any other code, however, from other classes, or from previous semesters of this class, should be treated the same as code found anywhere else on the Internet: it at least requires citation, and it could result in a grade deduction.


We expect the breakdown for the final course grade to be as follows:

  • Assignments: 26%
  • Final project: 14%
  • Preliminary exams: 26%
  • Final exam: 30%
  • Other factors: 4%

Assignments are weighted equally unless otherwise specified. We expect A0 to be worth 1% and each of A1 through A5 to be worth 5%. Other factors include attendance, submission of the course evaluations, participation in any CMS surveys or quizzes we might hold, and excellence in answering other students' questions on Discourse.

The final grade you receive will be the grade you have earned based on that weighted average. We look closely at individual students near borderlines at the end of the semester to see whether there is a basis for adjusting the grade up or down. Many factors influence that decision, including trajectory over the semester, performance on individual vs. group work, good use vs. abuse of requests for extensions and appeals, dedicated attendance, successful completion of karma problems, and demonstrated maturity in meeting course requirements.

Sometimes students ask whether the final grade is curved. The answer is that it depends on what you mean by "curved." Any mapping from numeric scores to a letter grade implicitly defines some kind of curve. But we do not give out a fixed percentage of A's, B's, etc. In fact, we'd be happy if everyone in the course learned the material well enough to get A's. Historically that has not happened, though, and the median grade in the course has been between B and B+.

Gratuitous advice

Keep an open mind. Have fun. Learn something about yourself along the way.