CS 3110 Spring 2019 Syllabus
Professor: Nate Foster
Course Staff: Directory
Table of Contents:
- What This Course Promises You
- How You and the Course Will Fulfill Those Promises Together
- How We Will Understand the Nature and Progress of Your Learning
- Course Materials
- Course Policies
- A Parting Thought
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:
- How do you write code for and with other people?
- How do you know your code is correct?
- How do you describe and implement a programming language?
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.
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:
The features you implement. Each assignment will identify feature sets that comprise a satisfactory, good, and excellent level of completion. That in part simulates the extent to which you delight real-world clients by the features you deliver.
The quality of your code and engineering, and the extent to which that meets the coding standards expected in this course. A TA will examine four aspects (documentation, testing, comprehensibility, and formatting) to determine whether you are meeting expectations, exceeding them, or need improvement. In the latter case, you will meet in person with the TA to better understand how to improve. That in part simulates real-world code reviews.
The correctness of your code with respect to the assignment specifications. Your submission will be tested against a test suite created by the course staff. That in part simulates real-world testing by quality assurance teams.
The teamwork skills you demonstrate. Your team will submit peer evaluations of your effectiveness as a team member. That in part simulates an important component of performance reviews you might experience in the real world.
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:
- 40%: Programming assignments (features and correctness). Individual assignments will be weighted about equally.
- 40%: Exams. About 1/3 of that will be the Prelim and 2/3 will be the Final.
- 10%: Programming assignments (quality and coding standards).
- 10%: Everything else, including recitation assignments (the lowest of which will be dropped), lecture and section attendance (of which at least 1 week’s worth will be dropped), and completion of course evaluations.
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.
The only materials you need to purchase are a copy of The Pragmatic Programmer and an iClicker, which can be obtained 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:
OCaml from the Very Beginning is a very gentle introductory treatment of OCaml programming. 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.
Introduction to Objective Caml by Jason Hickey (Cornell PhD ‘01) is freely available as PDF for now. It would make a good supplement to the course textbook.
Real World OCaml by Yaron Minsky (Cornell PhD ‘02), Anil Madhavapeddy, and Jason Hickey (Cornell PhD ‘01) is freely available as HTML and contains real-world examples inspired by use use of OCaml at Jane Street, a quantitative trading firm at which Dr. Minsky is the Head of Technology. You do not need this book for the course, but some students might find it interesting. Be aware that it heavily uses a rapidly evolving, third-party library called Core, and that CS 3110 does not use that library.
We use Discourse for announcements. You can sign up at discourse. You are responsible for familiarizing yourself with all posts in the “Announcements” category 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 wil lbe your recitation TA. Do not post questions about grading, grades, or regrades on Discourse. Such questions will typically be closed without answer by instructors.
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.