CS 3110 Spring 2020 Syllabus

Professor: Nate Foster

Course Staff Leads:

Full Staff: Directory

Table of Contents:

What This Course Promises You

At some level, programming is not hard. Opportunities abound for anyone to learn to program, ranging from summer coding camps for kids to MOOCs to code academies. You’ve already invested at least two semesters in college-level programming classes, CS 1110 and CS 2110, or their equivalent. But programming well is very hard. Software engineering experiments suggest that professional programmers vary in their productivity by at least 2x to 4x. Wouldn’t you like to be twice as productive, or more?

This course will give you the opportunity to become a better programmer. First, you will learn a functional programming language, OCaml. There are two dominant paradigms in programming, functional and imperative, and learning a functional language will complement the imperative languages you learned in CS 1110 and CS 2110.

Second, we will explore questions that arise in the fields of software engineering, programming methodology, and programming language theory, such as:

Third, and most importantly, this course will give you the opportunity to read and write a lot of code, and to strive for excellence in your own programming.

To appreciate programming as an intellectual activity…you must read and write computer programs—many of them. It doesn’t matter much what the programs are about or what applications they serve. What does matter is how well they perform and how smoothly they fit with other programs in the creation of still greater programs. The programmer must seek both perfection of part and adequacy of collection. [Alan J. Perlis]

That Perlis quote is from the foreward to Structure and Interpretation of Computer Programs (1996), which was the original textbook for this course over 20 years ago. Though languages and technologies change rapidly, many key ideas underlying the theory and practice of programming are immutable. This course promises to expose you to those ideas.

How You and the Course Will Fulfill Those Promises Together

Your active participation is an essential component in realizing the promises this course makes. To help you keep up with the material in the course, there will be brief homeworks associated with each lecture. These are highly recommended but not required; they will not be collected or graded. Solutions will be provided so that you can check your own work.

Becoming a better programmer requires that you spend significant time practicing, much like a musician or an athlete. To give you that practice, this course will offer you weekly programming assignments. Each assignment will entail writing 100 to 400 lines of solution code (starting low and increasing as the semester progresses) in addition to unit tests.

And just like musicians and athletes need to learn to work with other skilled professionals to achieve great works, you need to practice working as part of a programming team. Great software is too big and too complex for individuals to craft on their own. So in the second half of the semester you will undertake a project as part of a team of three students.

Finally, we want you to benefit from the accumulated wisdom of the programming community by reading a book on programming philosophy writing a series of short reflections on how the ideas in the book relate to your own programming experience.

How We Will Understand the Nature and Progress of Your Learning

To understand your progress in learning to program productively, we will assess these aspects of your programming assignments:

And to understand your progress in learning the concepts covered in the course, as well as solidifying your own ability to code, we will have one preliminary exam (prelim) and a final exam. The final is cumulative. These will be closed-book, written exams with problems that require short answers, including English and code. Further details about exams can be found here.


We urge you not to focus on numeric scores and grades. Most students get good grades in this course. The median is typically between a B and a B+, and almost no one ever fails the class. So instead, focus on where the assessments show that you can or need to improve. A decade from now the grade you got in this course will be irrelevant, but what you learned about programming might just be crucial.

Nonetheless, in the midst of a busy semester we all end up with moments of triage in which we need to understand where to concentrate our efforts. So to give you a sense of the relative importance of each form of assessment, we expect the breakdown for the final course grade to be as follows:

Programming assignments will be weighted equally—except for the very first, which will be worth only 1%.

Attendance will be tracked in lecture by iClicker. These points are intended to be an incentive to attend, not a penalty for absence. To encourage you to arrive on time, the first question of the day is usually worth about 50% of the points for that day. We will drop the scores from your four lowest days, which means that you can be absent up to four times without any consequence to your attendance points. See this page for more details about iClickers. Attendance in discussion section will not be tracked.

Everything else includes participation, professionalism, completion of surveys and course evaluations, etc.

So that you can make an informed choice, before the drop deadline we will release a midterm grade to give you an estimate of your overall letter grade in the course.

Sometimes students ask whether the final grade is curved. The answer is basically: “no.” We do not give out a fixed percentage of A’s vs B’s vs C’s. Rather, we compute weighted final average scores, adjust the median to be consistent with past semesters—thus ensuring some kind of continuity of meaning—and decide on letter grade boundaries in way that’s also consistent with the past. We will not announce those boundaries in advance nor at the end of the semester. But to give you a sense of scale, a 5% reduction in your weighted average is likely to result in your final letter grade dropping by one third (e.g., A to A-), and a 1% reduction is unlikely to do so.

Assignments and exams are not individually curved, so you should not get stressed about means, standard deviations, etc. related to particular scores you receive. Similarly, emailing us is not a viable strategy to increase your final grade. What matters is your weighted average; we do not give favorable (or unfair) treatment by raising or lowering individual students’ letter grades.


CS 3110 is a 4-credit class intended for CS majors (and minors) as part of the core of the major, which are generally quite challenging courses. Accordingly, many students find the workload in CS 3110 to be intense. But that varies from person to person with work habits, prior mastery of programming, and adaptability to functional programming. It’s hard to say how many hours you will spend. The median hours spent per week on assignments last fall was 10 to 12, as self-reported by students. But, we urge you to consider spending only a healthy amount of time on the course. Most students could spend less time on the course and still get good grades.

Course Materials

The only materials you need to purchase are an iClicker and a copy of The Pragmatic Programmer. You can buy an iClicker at The Cornell Store. The iClicker REEF app will not be supported in this class; we do not wish to encourage the distraction of phones during lectures. Use of iClickers will begin with the second lecture.

The Pragmatic Programmer is available in digital and physical form at the Cornell Bookstore.

For OCaml, the main textbook is the 3110 online textbook on the course website. Here are some optional OCaml textbooks that you might also find useful:


We will use Campuswire for announcements and online Q&A. The code to join the class is 0085. Please read these tips on how to ask technical questions before posting on Campuswire.

If you’re curious about the transition from Piazza to Campuswire, these posts [1] [2] might be of interest. They are written by Campuswire—so, consider the source—but we have had encouraging experiences with Campuswire in the last year.

Campuswire has a reputation system, in which you earn achieve levels based on answers and upvotes. The participation component of your final grade will be based on your Campuswire reputation. Don’t stress about this; it’s a very small percent of your grade. If you don’t want to participate in Campuswire, you don’t have to.

Course Policies

Cheating, habitual lateness, grade grubbing, and shirking responsibility: these are not behaviors that anyone should exhibit. Unfortunately, in a large course, these come up every semester. And when they do, they make the course worse for everyone, because then the course staff is distracted from their real job of helping you to learn.

But penalties and policies aren’t the purpose of the course. So we’ve factored them out into the following documents. You should read them once to know what’s expected of you. After that, we hope you never need to consult them again.

Accommodations and Mental Health

Your mental health is important. If there are struggles you are facing, we hope that you seek help; we have listed several resources on the bottom of this page. The professor is happy to have a private conversation with you—just drop by, no appointment necessary—if you ever just need to talk.

If you need ongoing accommodations in this course for reasons of mental health, there are three ways to make that happen. The first is for Student Disability Services (SDS) to issue a letter on your behalf. The second is for your college’s advising staff to issue a Request for Academic Consideration on your behalf (which might be based on you asking your CAPS counselor to contact your college advising staff). The third is for a private health care professional to write a letter on your behalf. Note that Cornell Health will usually decline to write letters, but will instead to prefer to work through your college advising staff.

Accommodation requests need to be made as soon as possible, so that there is time to work out the logistics. Last-minute accommodation requests (such as, “I can’t submit this assignment by tomorrow” or “I can’t take the exam tomorrow”) due to procrastination are very problematic.

For emergent issues, including sudden medical and mental health crises, temporary considerations will be arranged by the professor to help you meet course requirements. But for ongoing concerns, you are encouraged to seek consultation with CAPS, your academic advisor, and/or your advising dean.

Tips for Success

Here is a list of tips for success in 3110 that we have compiled.

A Parting Thought

I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun…I hope the field of computer science never loses its sense of fun…What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more. [Alan J. Perlis]

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