CS 3110 Fall 2018 Syllabus

Professor: Michael Clarkson (Cornell PhD 2010)

Course 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. 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. 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 starting with the third assignment, you will complete assignments as an instructor-formed team of three to four programmers. The “Overview and Rationale” on the teams page provides more details.

The course is not just about programs, though; the questions we identified above involve concepts that are important to master, too. So each discussion section will be accompanied by a brief recitation assignment. These will ask you to think through some of the concepts raised by the accompanying lecture and reading. Recitation assignments will be due each week on Friday, to help you keep up with the material being covered. You are expected to work together with your team, as well as your entire discussion section, although you will upload your own answers to CMS.

Finally, we want you to benefit from the accumulated wisdom of the programming community by reading a book or two on programming philosophy, reflecting on how the book contributes to your own philosophy, and writing a short essay. The essay assignment handout has the full details.

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. Details about the logistics and scope of exams can be found on this page.


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:

So that you can make informed choices, before the drop deadline and again before the withdraw 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 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 vs B’s vs C’s. Rather, we adjust the median each semester to be consistent with past semesters, thus ensuring some kind of continuity of meaning, then look closely at the handful of borderline cases to see whether there is evidence suggesting that an individual’s grade should be adjusted up or down.

Course Materials

The only materials you need to purchase are a copy of The Pragmatic Programmer and an iClicker. You can buy an iClicker at The Cornell Store. Register your iClicker in the CS 3110 course in Blackboard. You will also be able to see your attendance record in Blackboard.

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:


You are responsible for reading all pinned posts on Piazza, which is how announcements will be made.

Course staff will generally wait about 24 hours before answering questions on Piazza, to incentivize students to help one another. Students who demonstrate excellence in helping their peers on Piazza will earn small bonuses to their final grades.

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 to know what’s expected of you. After that, we hope you never need to consult them again.

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.