CS 3110 Fall 2019 Syllabus
Professor: Michael Clarkson (Cornell PhD 2010)
Course Staff Leads:
- Grading and Appeals: Edgar Marroquin (PhD TA, emm392)
- Autograder: Nathaniel Diamond (MEng TA, ncd27) and Chris Roman (MEng TA, cr469)
- Head Consultant: Amanda Xu (Undergraduate, ax49)
Full 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
- Grades
- Workload
- Course Materials
- Campuswire
- Course Policies
- Accommodations and Mental Health
- Tips for Success
- 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, 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:
- 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. 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:
-
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 engineering of your code. A grader will examine your test suite and code quality, including how readable your code is and how it adheres to community-developed OCaml coding standards. 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 in the team project. 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. Further details about exams can be found here.
Grades
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:
- 37%: Programming assignments
- 20%: Final Exam
- 15%: Prelim
- 15%: Team project
- 6%: Reflections
- 5%: Attendance
- 2%: Everything else
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.
Workload
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 will be available as an eBook in Canvas through a Cornell Bookstore program called Instant Access. Your bursar account will be automatically charged for the book unless you opt out by the date communicated to you by 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:
-
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 the 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.
Campuswire
We will use Campuswire for announcements and online Q&A. The code to join the class is 8014. 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.