General Information


Matthew Wachs (Section 1)

John Reppy (Sections 2 & 3)

Lab TAs:


This term, the first two weeks of the course will be taught online with synchronous lectures and lab sections. The University expects to resume in-person classes starting the third week of the term.

If you need to contact the course staff via written communication, you should do so using our Ed Discussion site, described below.

Course Description

In CMSC 15100 (informally CS151), we introduce a selection of major computer science topics through instruction in computer programming and various analytical techniques.

CS151 is designed for students intending to major or minor in the subject, although others are welcome. The specific goals of the course are these:

  • to understand solving computational problems in terms of identifying and, when necessary, designing relevant abstractions,

  • to process data structures in several ways, most importantly by the technique of structural recursion,

  • to learn to recognize and exploit common computational patterns through code organization and higher-order programming,

  • to learn to use simple and polymorphic types as a powerful approximation of correctness in computer programs, and

  • to analyze the efficiency of certain algorithms.

In pursuing these goals, students will become acquainted with a selection of classic data structures and algorithms. Broader, more technical treatments of these topics, in particular algorithm analysis, are presented in later undergraduate courses.

We use the Racket programming language in our studies. Racket is a dialect of Scheme, a language with a long history in the field of computer science generally and college-level instruction specifically. Specifically, we use the Typed Racket variant of Racket.

Having completed this course, students will be able to use computer programming as a robust and efficient method for analytical problem solving and creative endeavors, and develop a sense of the relationship between computer programming and computer science. Students will discover, in future work, that the experience gained in this course applies to programming generally, in any programming language; that is, CS151 should not be thought of as a course in programming Scheme. Furthermore, students will have gained experience with some best practices in the discipline.

Lectures and Labs

This class meets four times a week: three lectures on Monday, Wednesday, and Friday, and a lab session on Thursday. For the first two weeks, the meetings will be remote using Zoom. The Zoom links for the lectures and labs are posted on Ed (the links for Sections 2 and 3 are also posted on Canvas).

Office Hours

Here is the schedule of office hours; all times are CDT. For now, office hours are being held using Zoom. You can find the Zoom links on Ed.

Weekday Time Host



Sumaiya Ahmed


Dante Gil-Marin


Elizabeth Coble


Dhruv Baid



Beza Desta


Skye Soss


John Reppy


Nick Seltzer



Matthew Wachs


John Reppy


No Office Hour (help available in Labs)



Sumaiya Ahmed


Matthew Wachs


John Reppy


Dhruv Baid


The course is taught in Typed Racket, which is a statically typed dialect of Scheme. We roughly follow the pedagogy of

How to Design Programs (Second Edition)
by Felleisen, Findler, Flatt and Krishnamurthi.
MIT Press, 2018
The full text is available online.

While this book is the undisputed primary ancestor of this curriculum, over the years, and as our curriculum has evolved, we have departed from the text to such an extent that we only occasionally refer to it directly. It is a useful reference, however, and a very good book in its own right.

We supplement this text with our own Notes on Typed Racket. This document covers the aspects of the language that we use in this course and includes a style guide for writing good code.

Course Work

The assignments in this class are all programming assignments, but they come in three different flavors:

Lab assignments

These will be posted before Lab on Thursday and will be due on Sunday. The Lab TAs will usually present material specific to the lab and be available to help while you work during Lab.

Homework assignments

These exercises will be posted on Friday and will usually be due the following Wednesday (but always remember to check the due date).


The course project is a larger programming exercise that will be split into two parts. The project will be assigned in the second half of the term.

Assignments will usually be due at 23:00 (CDT), but you should always be careful to check the due date and time for each assignment.

Exams and Quizzes

There will be two in-person exams in this class. The exam will be in the same place and at the same time for all three sections.

Exam 1

Thursday, February 10


Kent 107

Exam 2

Thursday, March 10


Kent 107

In addition, there will be short quizzes at the beginning of most Friday lectures (once we are back in the classroom).

Getting Help

Programming is a challenging activity and students are often faced with problems that they do not know how to solve. If you are stuck, you should ask for help. We provide extensive office hours during the week; but for immediate feedback we use Ed Discussion, which is available from the course Canvas page.

Asking Questions on Ed

Here are a few guidelines to the use of Ed that we would like students to follow in this class.

Before Posting a Question

Before you post a question of Ed, you should check to see if your question has already been answered in a previous discussion. Ed has a search mechanism that you can use and filters to narrow the volume of posts.

Check the pinned posts for information that may address your question.

Make sure to actually ask a specific question about the problem that you are facing.

Public vs. Private Questions

Ed has a mechanism that allows you to ask a private question, which will be seen only by the instructors and teaching assistants. This mechanism should be used only for truly private matters that relate uniquely to you (e.g., you need to notify us of a family/medical emergency, etc.)

In general, all questions about coursework, course logistics, etc. should be asked publicly (note that you do have the option of asking the question anonymously if you prefer). If you ask such a question privately, we will not answer it. Instead, we will ask you to ask it publicly and answer it once you do. This way, everyone can benefit from the answer to the question and, if someone runs into the same issue you do, we can refer them to the answer we provided in your post.

Provide Information

While you should not be posting your code (see below), your question should contain as many details as possible. In particular, you should include the full text of any error messages.

What Not to Include

You should never post your code (that violates the academic honesty policy). If we need to look at your code to understand the problem, we can do so via GitLab (so make sure that you have committed your code!).

Also, please do not post screen shots of code and/or output (unless the output involves graphics).

Academic Honesty

The University has a formal policy on Academic Honesty that you are expected to adhere to. In this section, we elaborate on what we understand by academic honesty, and provide specific rules to ensure that you do not cross the line into academic dishonesty.

Academic dishonesty can encompass many activities, but one of the gravest is plagiarism: knowingly handing in someone else’s work as your own, whether it be work done by another student in the class or available publicly on the Internet. This class has a ZERO TOLERANCE policy on plagiarism. If we determine you committed plagiarism, you will receive an F in the class regardless of how small the offence was. You will also be referred to the Dean of Students in the College for further adjudication. The College may impose further penalties, up to and including suspension and expulsion.

Please note that plagiarism is fairly easy for us to detect: we use a variety of automated tools that look for similarities between your code and other students’ code (across all sections of the class), including code submitted in previous offerings of this class. If you use someone else’s code, it is very likely you will get caught and, to reiterate, you will then automatically receive an F in the class.

Fortunately, avoiding plagiarism is very simple! For the most part, you just need to follow these rules:

  • DO NOT ask another student in the class to show you or e-mail you their code. It doesn’t matter how you want to use it: even if you just want to skim through their solution for inspiration, this is still plagiarism. Needless to say, you MUST NOT use someone else’s code (with or without their permission) in your own solution.

  • Similarly, DO NOT show or share your code with another student in the class. If someone in the class asks you to share your code with them, even if you’re certain they won’t use it and they just want to look at it to get “unstuck”, please point them to this page. Take into account that, if you willingly share your code with someone else, you are not being a “Good Samaritan”: you are an equally guilty party in a plagiarism offence, and will also receive an F.

  • DO NOT post your code in publicly-accessible websites, like pastebin, a public GitHub repository, GitHub gists, etc. While it may seem like a convenient mechanism to share code with an instructor/TA, it can also expose your code to other students in the class. You are provided with a private repository on our GitLab server, and you should use that repository exclusively to share code with the instructional staff.

  • If you do post your code in a publicly-accessible location, and we find out about it outside of a plagiarism incident, you will just get a warning. If, however, another student in the class uses code that you posted on such a site (even if you did not intend for that code to be used by someone else), you will receive an F in the class.

  • Please note that the above two prohibitions also apply after the course is over! You should NEVER share your code from this class with other people. Not now. Not after the quarter is over. Not after you graduate. Never.

  • We make only one exception to this rule: if a prospective employer asks to see samples of your code, you are welcome to send them your code from this class, but must do so privately, not by posting your code in a publicly-accessible location.

  • In general, DO NOT use code you find on the Internet. There are certain situations where consulting and citing online sources (including those that may show code examples) is appropriate, and we elaborate on this point below. Please be aware, however, that the moment you use code on the Internet, you are walking into an academic honesty minefield (and, even if you provide a citation, you may not get any credit for that code).

We realize that sometimes students commit plagiarism out of desperation and as a measure of last resort. If you are in this situation, please just ask the course staff for help. If you are having a hard time in the class, we will provide as much assistance as we can. Plus, a poor performance in one assignment is unlikely to wreck your grade for the class. Plagiarism is never worth it.

Students often turn to their roommates, friends or paid tutors for help. While you are welcome to ask friends and tutors for help understanding concepts, you should never ask someone outside the course staff for help with on short exercises, programming assignments, or timed assessments. We want to know what you can accomplish, not what your roommate, friend, or tutor can do. If you need help with understanding concepts, deciphering assignments, finding bugs in your code, etc, please consult the course staff. (See help for ways to get help.)

All that said, we believe that student interactions are an important and useful means to mastery of the material. We recommend that you discuss the material in this class with other students, and that includes the homework assignments. So what is the boundary between acceptable collaboration and academic misconduct? First, while it is acceptable to discuss homework, it is not acceptable to turn in someone else’s work as your own. When the time comes to write down your answer, you should write it down yourself from your own memory. Moreover, you should cite any material discussions, or written sources, e.g.,

Note: I discussed this exercise with Jane Smith.

Using outside sources is generally acceptable as long as:

  1. You cite the source you used.

  2. You do not use verbatim blocks of code from that source.

  3. The source does not provide a complete (or nearly complete) solution to the assignment.

Some sources may provide small code examples that are used to illustrate a concept. We encourage you to never use those examples verbatim in your code, but we understand that, in some cases, your own code may be reasonably similar to those examples (e.g., because there are very few ways in which a given piece of code could be written). To ensure this is not flagged as plagiarism, always err on the side of including a citation.

If you have any questions about what is or is not proper academic conduct, please ask your instructors.

Recording and Deletion Policies for Academic Year 2021-2

The Recording and Deletion Policies for the current academic year can be found in the Student Manual under Petitions, Audio & Video Recording on Campus.

  • Do not record, share, or disseminate any course sessions, videos, transcripts, audio, or chats.

  • Do not share links for the course to those not currently enrolled.

  • Any Zoom cloud recordings will be automatically deleted 90 days after the completion of the recording.

Zoom guidelines

We will be using Zoom for many parts of this class. We expect your interactions via Zoom to be consistent with an in-person class experience. Respect the people you are working with. Enter the Zoom meetings muted if possible (unfortunately, it will not be possible if you’re calling in), and unmute to speak. Raise your hand if you would like to speak. [There’s a “Raise Hand” button on the participant page.] If your background is unusually noisy, use the chat channel instead of unmuting. We strongly encourage you to have your camera on during our Zoom sessions, but we will understand if some of you prefer to keep your video off.

Note that you can set your name in your Zoom profile, so you do not have to go with whatever was assigned. Feel free to include your pronouns in your name (if you do, please include them after your last name).

Some of our Zoom recitation meetings may be recorded and saved to the cloud to allow students in this class to review the discussion, and especially to allow students who cannot participate the opportunity to benefit from them. We will not make these recordings available to anyone but class participants, we will not make them available after the quarter, and students will not be allowed to save copies. We have no way to guarantee that students will follow this policy, however. If you have FERPA concerns, please mask yourself accordingly, e.g., by turning off video and using an alias.

COVID-19 Policies

UChicago Health Pact

All students on campus are required to adhere to the guidelines in the UChicago Health Pact in order to promote a safe environment in the classroom.

Secure face coverings must be worn appropriately at all times while in University buildings. Maintain a distance of 6 feet from others. Do not attend an in-person class if you feel unwell or are experiencing COVID-19 related symptoms The complete text of the UChicago Health Pact along with additional information about COVID-19 protocols can be found here.

Any concerns over inappropriate PPE usage, physical distancing, cleaning/disinfection, or other COVID-19 related public health concerns should be directed to UCAIR.

If there is an emergency, call 773-702-8181 or dial 123 on any campus phone.

Reporting COVID-19 Exposure or a Confirmed Case

If you were potentially exposed to COVID-19 or your COVID-19 test results come back positive, reach out immediately to