EECS 111: Fundamentals of
Computer Programming I

Syllabus – Spring 2018

Tech L361, TuTh, 2–3:20 PM

Course staff & office hours

Instructor: Jesse Tov jesse@eecs Ford 2-215 Tue. and Thu. by appointment
Head TA: Shu-Hung You Wilkinson Lab M 2–4
Peer TAs: Jeffrey Birori jeffreybirori2019@u Wilkinson Lab Su 2–4
Prashanth T. V. tvp@u Wilkinson Lab M 4–6
Alin Hulli alinhulli2020@u Wilkinson Lab M 6–8
Rohit Rastogi rohitrastogi2019@u Wilkinson Lab Tu 4–6
Aaron Kaneti aaronkaneti2020@u Wilkinson Lab Tu 6–8
Hayden Udelson haydenudelson2020@u Wilkinson Lab Tu 8–10
Shu Han shuhan2020@u Wilkinson Lab W 1–3
Nila Suresh nilasuresh2020@u Wilkinson Lab Th 4–5, 6–7

General information & course policies

This course is an introduction to computing and programming. Its major goal is to introduce students to the principles of systematic problem solving through programming and the basic rules of computation.


The course assumes a basic familiarity with arithmetic and algebra. It demands curiosity, self-discipline, and some amount of people skills, because all computer scientists end up working with others interactively all the time, including in this course.

The course does not assume any prior programming experience. It is therefore suitable for first-year students—majors and non-majors alike—who wish to explore the intellectual ideas of the discipline.

Earning a grade

Many of you have one burning question on your mind as you start your college careers:

How am I going to get an A in this course?

We have some news for you: you are in college now, and in college, it really is about learning something and not (just) getting a grade. As a matter of fact, if you are taking a course and the A comes easy, you are either cheating yourself or you are allowing the instructor to cheat you.

Here is the positive take-away from this section: College is your last chance to learn how to learn by yourself, without pressure from parents, teachers, or peers. You want to learn that, because the quality of your life depends on it. Your life. Nothing more, nothing less.

Naturally, we understand that you want some feedback, both in terms of specific corrections and in terms of a grade. You want feedback so that you can improve your learning process. And we will give you that feedback. It is our end of the bargain. Your end is to demonstrate that you actually use the methods and tools for learning that work best in our experiemce. After all, you don’t want to waste your time, and we don’t want to waste ours either.


In a large introductory course such as EECS 111 you typically encounter three kinds of people, listed in increasing order of relevance to you:

  • Jesse Tov
Head TA:
  • Shu-Hung You

Head TAs supervise the grading of homework sets, hold office hours, deal with failed quizzes and regrades, and occasionally substitute in lectures. In general, they are apprentice teachers and are here to learn how to run a course.

Peer TAs (a/k/a peer mentors):
  • Jeffrey Birori
  • Shu Han
  • Alin Hulli
  • Aaron Kaneti
  • Rohit Rastogi
  • Nila Suresh
  • Prashanth Tirupachur Vasanthakrishnan
  • Hayden Udelson

Peer TAs hold office hours, run labs, grade homeworks, and provide feedback about the class’s progress. In general, they are undergraduate students who know that to learn something really well, you need to teach it.


Class consists of lectures and lab meetings.

Lectures meet on Tuesdays and Thursdays from 2:00 to 3:20 PM in Tech L361.

The course also has small lab sections which will be held at various times. You will sign up for one. The purpose of labs is to give you some hands-on experience with the actual tools, and to explain some of the principles from lecture with hands-on examples.

Computing environment

We will use DrRacket v6.12, a programming environment for the Racket programming language, some dialects of Java, Algol 60, OCaml, Scheme, and a few others. For EECS 111, we will stick to the HtDP teaching languages plus teachpacks. DrRacket is freely available on the Web at, and you should install it on your computer.

DrRacket runs on most popular platforms (Windows, Mac OS X, Linux, and other UNIX systems). Programs written in DrRacket work the same on all platforms. You therefore do not need to worry what kind of machine you use when you run DrRacket programs.


We have a Piazza discussion board where you can ask questions. Your questions (and answers) must not reveal information regarding solutions.


Most actual learning happens while completing homework, and the homework will help to prepare you for the exams

There will be weekly homework assignments. Some problems are drawn from HtDP, the textbook; others are constructed for this instance of EECS 111. We will grade some but not all problems from each set.

We will drop the homework grade with the worst impact on your final grade from consideration for the final grade. Thus, if you choose to skip homework or if you just don’t get it one week, nothing is lost. The story is different for the second or third or…time.

You may only collaborate on problem sets with your assigned partner (see below). You must acknowledge your collaborator/partner on your cover page. Any other collaboration is cheating; we will report all cases to the university administration.

Pair programming

You must work on your homework (from HW1 onward) in pairs. Your lab TA will assign you a partner. Every few weeks, you will get a new partner.

Pair programming means that you and your partner work on the problem sets jointly. You read them together and you work on the solutions together. One of the lab’s purposes is to teach you how to work in pairs effectively; indeed, pairs are provably more effective than individuals in programming. The rough idea is this: One of you plays pilot, the other co-pilot. The pilot works on the keyboard and explains aloud what is going on; it is the co-pilot’s responsibility to question everything. After a problem is solved to the satisfaction of both, or after a fixed period of time, you must switch roles.

Exams and quizzes

We will have two in-class exams to assess your progress:

The exams will test material similar to that assigned in weekly homeworks. You will take the exams by yourself. Collaboration is not tolerated. If you can solve every homework problem on your own, the exams will be easy. If not, you will have a difficult time.

We will also have daily quizzes in class. It is our one concession to “high-school thinking.” (Consider it a crutch for your self-discipline.) Quizzes are pass/fail, and if you fail a quiz, you have a week to make it up at instructor or head TA office hours. Missed quizzes may not be made up without prior permission from the instructor.


For the final grade, we will assign a weight of 30% to your overall homework grade and 30% to each of the two midterm exams. The remaining 10% depends on the daily quizzes and discretion of the instructor. Additionally, you cannot pass on exams alone—you must have a passing grade for your homeworks alone in order to pass this course.


This table specifies the reading and lecture schedule. The link in the first column connects this page to the homework that you will be working on for the corresponding week. The second column gives the date for Monday of each week. The third column lists the sections in How to Design Programs that cover the lecture material. The fourth through ninth columns give the pages or sections for your reading for that day.

This daily reading schedule is intentionally not tied to the lecture schedule. Instead it is designed to cover a reasonable amount of material on a regular basis. On the average, you will need to read six to twelve pages a day, which in our experience is an appropriate speed of reading. As a result you will occasionally be behind the lecture schedule, and most of the time you will be ahead, which will help you and us to make lectures interesting.

(Reading schedule last updated Tue, 27 Mar 2018 16:19:28 -0500)

# wk. of Topic MTuWThFNotes, etc.
0 Apr. 2 Preliminaries prologue §1 [0 1]
1 Apr. 9 Fixed-size data §2 §3 §4 §5 §6 [2; lab; 3 4 5]
2 Apr. 16 Structs & itemizations §8 §9 i1–2 §10 essay [6; lab; 7 8]
3 Apr. 23 Recursive unions §11 i2–3 §14 essay [8; lab; 9 10]
4 Apr. 30 Recursive unions §15 §16 exam prep. §17 i3–4 [10 11; lab]
5 May 7 Abstraction §19 §20 §21 §23 i4–5 [12 13; lab; 14]
6 May 14 Mutual recursion §25 §26 §27 §28 [15; lab; 16]
7 May 21 Generative recursion §29 i5–6 §31 §32 §33 [17; lab; 18]
8 May 28 Accumulators epilogue [18; lab; 19]
9 June 4 Conclusion exam prep. exam prep. essay


Homework is generally due at 11:59 PM on Tuesdays, though you should check each individual assignment to be sure. Please let the teaching staff know ASAP if you have trouble submitting, because turning in homework on time is your responsibility. Barring exceptional circumstances, late homework will not be accepted.

Link Assigned Due
Homework 0 Thursday, April 5 Tuesday, April 10 at 2:00 PM
Homework 1 Tuesday, April 10 Tuesday, April 17 at 11:59 PM
Homework 2 Tuesday, April 17 Tuesday, April 24 at 11:59 PM
Homework 3 Tuesday, April 24 Tuesday, May 1 at 11:59 PM
Homework 4 Tuesday, May 1 Tuesday, May 8 at 11:59 PM
Homework 5 Tuesday, May 8 Tuesday, May 15 at 11:59 PM
Homework 6 Tuesday, May 15 Tuesday, May 22 at 11:59 PM
Homework 7 Tuesday, May 15 Tuesday, May 29 at 11:59 PM
Project Proposal Tuesday, May 29 Tuesday, June 5 at 11:59 PM
Final Project Tuesday, May 29 Tuesday, June 12 at 11:59 PM

Please submit your homework according to the instructions on the web page for the individual assignments, following the guidelines for turning in homework.

In general, except for HW0 you will submit your work through Canvas. Only one member in the group needs to submit the assignment. (Note that by the design of Canvas, only the one submitted the assignment can re-upload newer versions.)

Lab schedule

Day Time Place Leader
Wed10 AMTech M166Jeffrey
Wed11 AMTech F280Rohit
Wed12 PMTech F280Shu
Wed1 PMTech F280Aaron
Wed2 PMTech F281Hayden
Wed3 PMTech L168Prashanth
Wed4 PMTech F280Nila
Wed5 PMTech F280Alin
Week Materials
lab 1 01-lab.rkt 01-lab-done.rkt
lab 2 02-lab.rkt 02-lab-done.rkt
lab 3 03-lab.rkt 03-lab-done.rkt 03-lab-08-itemizations.rkt
exam 1 office hours 05-lab-partially-done.rkt
lab 5 05-lab.rkt 05-lab-done.rkt
lab 6 06-lab.rkt 06-lab-done.rkt
lab 7 07-lab.rkt 07-lab-done.rkt
lab 8 08-lab.rkt 08-lab-done.rkt
9: no lab -- --


Required reading

Your daily readings come from:

Very much optional Racket readings

If you wish to learn to use Racket as a tool, which is not the goal of this course, then take a look at the following:


You cannot learn everything you need to know in lectures and/or homeworks. You must:

  1. Read the textbook (How to Design Programs, Second Edition).

    Try to stay ahead of the game and read material before it is covered in class. If you have questions, write them down. If these questions don’t get covered, ask in class and/or meet with the TAs or professor.

  2. Attempt to solve additional problems.

    Try to solve as many exercises as possible as you read sections in the book. If you can’t do them, read the material again.

  3. Attend the lecture.

    Every professor has a personal understanding of a course and teaches the material according to a personal style. It is important to get used to and to exploit this “personalization of courses”; otherwise, you’re wasting your money.

  4. Talk to the course staff.

    If the lecture and the notes leave you with questions on the material, see your teacher(s) during office hours or make an appointment. Mark the passages in the book(s) that you haven’t understood and prepare questions that express what you haven’t understood.

  5. Keep up.

    Experience proves that students who fall behind quickly drop out. So, keep up with the readings, tutorials, and the homeworks. Ask for additional problems, if the homeworks failed to make a point.