CS 61 is a first course in computer systems programming, meaning the creation of high-performance programs that use computer hardware effectively. Although many programs today are written in high-level programming languages—and many programs simply glue together existing components—the best programmers are craftspeople who understand their tools. For software builders, this requires a working knowledge of computer internal organization. It means understanding how machines interpret instructions, how compilers turn programming languages into instructions, and how operating systems combine programs and libraries to create running code. And it requires understanding the factors that affect code performance.
CS 61 introduces you the tools you need to build robust, efficient software and the mental tools you need to understand software systems written by others. We hope you’ll discover that systems software development is fun and worth the effort. We intend the course to be broadly accessible, though it will be easier for those who have some experience with systems programming in C++ or other C-like languages.
Objectives
After this course, you should be able to:
- Write robust and efficient software.
- Use operating system interfaces effectively.
- Read and explain C and C++ programs.
- Read and explain simple assembly programs.
- Read programs that combine C/C++ and assembly language.
- Solve problems using computer arithmetic.
- Implement synchronization of simple concurrent activities.
- Analyze program performance and apply basic optimizations.
Diversity and inclusion
CS 61 welcomes a diversity of thoughts, perspectives, and experiences. The CS 61 teaching staff respects our students’ identities, including but not limited to race, gender, class, sexuality, socioeconomic status, religion, and ability, and we strive to create a learning environment where every student feels welcome and valued. We can only accomplish this goal with your help. If something is said in class (by anyone) or you come across instructional material that made you uncomfortable, please talk to the instructors about it (even if anonymously).
Students are expected to behave collegially in class and in our discussion forums. Harvard College and Extension students must follow school policies regarding disruptive behavior.
Joining the course late
Students who enroll in this course after the first day of class are responsible for making up all missed work (i.e., watching recordings of missed lectures (see Canvas > 'Extension Class Recordings' tab), reviewing any missed section material, and submitting problem sets). Catching up may take a significant time investment, depending on your level of preparation and how many classes you’ve missed. We want you to get caught up as quickly as possible so that missed content doesn’t accumulate and make it even harder to catch up. To that end, the latest date at which you may join the class is 9/17 (i.e., two days before pset 1 is due); you will still be required to submit pset 1 on time (or use some of your late hours to submit it after the due date). Joining the course after 9/17 will only be considered in exceptional circumstances, and will require instructor approval; if you wish to join the course after 9/17, you should email cs61-staff.
Assignments
Programming assignments (psets) are a critical part of the course. There will be six assignments handed out at one to two week intervals. We encourage collaboration among students (subject to the collaboration policy below), but all assignments will be graded based on individual turnins.
Assignments will be due at midnight (11:59:59pm Eastern) on the due date. Assignments will be submitted on the CS 61 grading server. A course announcement will be made when grading server accounts have been created.
Late work and your health
Every student will begin the semester with 120 free late hours (equivalent to 5 days) which can be applied to psets 1–3, and 120 free late hours that can be applied to psets 4–6. This means that psets 1–3 can be late by a cumulative total of 120 hours without penalty, and psets 4–6 can be late by a cumulative total of 120 hours without penalty. Unused late hours from psets 1–3 are not carried over to psets 4-6.
To notify the course staff that you are using late hours on an assignment, click the “DO NOT GRADE” button on the grading server for that assignment. When your submission is ready for grading, click the “Grade this commit” button.
Penalties kick in for lateness beyond the corresponding late hour bank. We don’t share the specific penalty formula, but here are some of its properties.
-
Additional lateness will reduce the maximum grade you can achieve on the corresponding psets. Unreasonable lateness could set the maximum grade of a pset to 60%.
-
Skipped assignments receive a zero, which is far worse than any amount of lateness. It’s better to complete and turn in assignments late, regardless of late hours, especially if the alternative is skipping an assignment or turning in a half-done assignment.
-
But don’t lie to yourself about your ability to complete work late, or the consequences of falling behind. If you ignore deadlines altogether, you will likely fail.
To put it another way, late assignments might affect your grade at the margin, but will not affect your ability to pass the class.
Late hours are intended for emergencies as well as for other circumstances, such as illness, computer malfunctions, extracurriculars, and personal days. If you use your late hours for personal reasons, you risk running out should an emergency occur; this tradeoff might be a good one in your situation. We do not give additional late hours for self-reported emergencies or exigent circumstances. The late hour policy for the course is already quite generous. Course staff may not respond to emails about late hours or requests for more late hours, especially from students who haven’t even used their existing late hours yet.
But if you find yourself struggling, please contact the instructors via
cs61-staff@g.harvard.edu
. We work hard to help all students complete the
course without overwhelming stress.
Getting help
Office hours are a great place to get help in this course. The office hour schedule will be posted in the first week of class.
For college students: Individual and small-group tutoring is available through our Patel Fellow and the Academic Resource Center (ARC).
For Extension students: ARC referral form.
Attendance
Attendance at lecture and section is required for college students. Important things are discussed in lecture and section. Attendance at section is recorded for all college students.
For simultaneously enrolled college students only:
Attendance at section is critically important for simultaneously-enrolled college students. If you are simultaneously enrolled in CS 61 and another course, your section attendance will count toward the class participation portion of your grade. (This is required by the college’s simultaneous enrollment policies.) Simultaneously enrolled students must attend section in-person (i.e. attending section on Zoom or watching a recording does not count). All sections use the same attendance form, so attending any in-person section in each section cycle will fulfill this requirement. This means that if in a given week you miss the section that you usually attend in-person, you should try to attend a different in-person section. We understand that this isn't always possible, so up to two missed section cycles will be dropped from the calcuation of your participation score at the end of the semester. You should plan to use these 2 dropped absences to account for any foreseeable reasons for not being able to attend an in-person section, including one-time schedule conflicts, travel, illness, etc.
Course lectures are recorded by the Extension School, and these lecture videos are available for viewing for all students, including college students, via Canvas > Extension Class Recordings.
Sections
Section begins in the first week of class. New material will always be introduced on Wednesdays, and sections will run through the following Tuesday. Attendance is required for all college students (see previous section). Section material will be posted under the 'Sections' tab of the course site. There is usually no preparation required for section, but we will make a course announcement if there is any. There is nothing that you need to turn in after section. Attendance and participation are the only requirements of section.
Times and locations for in-person sections are posted on my.harvard, and will also be circulated in the first week of class. College students who are simultaneously enrolled in CS 61 and another course are required to enroll in one of the timed sections on my.harvard. All other college students have the option of enrolling in a timed section, or remaining in the 'placeholder' section. Regardless of whether or not you enroll in a timed section on my.harvard, you may attend any section on the schedule each week. All sections use the same attendance form, so you do not need to notify the course staff if you attend a different section than the one that you signed up for.
A Zoom section will be offered for Extension students, which college students may also attend (though the Zoom section does not count towards the participation score for simultaneously enrolled students.) Details for the Zoom section will be posted under Canvas > Zoom (which redirects to a site called Gather). Zoom sections will be recorded and posted via Canvas > Zoom > Published Recordings.
Tests
There will be two mid-semester tests and a final. Both the tests and final will be open-book and open-note. Computers will be allowed with limited Internet access. This is the policy:
The exam is open book, open note, limited open computer. You may access the textbook and your own notes. You may also use computers or electronic devices to access your own class materials and public class materials. Specifically:
- You may access your own notes and problem set code electronically.
- You may access Internet sites on which your own notes and problem set code are stored.
- You may access a browser and a PDF reader.
- You may access the course site.
- You may access pages directly linked from the course site, including our lecture notes, exercises, and section notes, and reference material, such as cppreference.com.
- You may access our lecture, problem set, and section code.
- You may run a C++ compiler, including an assembler and linker.
- You may access manual pages and common utilities, including calculators and a Python interpreter.
However:
- You may not access class discussion forums or other question forums such as Stack Overflow.
- You may not access an on-line disassembler or compiler explorer.
- You may not access solutions from any previous exam, by paper or computer, except for those on the course site.
- You may not broadly search the Internet for answers to questions or access other courses’ materials. Stick to our course site.
- You may not interact with AI models (e.g., ask ChatGPT a question).
- You absolutely may not contact other humans with questions about the exam—whether in person, via IM, or by posting questions to forums—with the exception of course staff.
Any violations of this policy are breaches of academic honesty and will be treated accordingly. Please appreciate our flexibility and behave honestly and honorably.
Additionally, students are taking the exam at different times. Do not post publicly about the exam until given permission to do so by course staff. This includes general comments about exam difficulty.
Tests in CS 61 have typically been considered difficult.
Grading
CS 61’s final grades are assigned using a formula based on this rough breakdown. We will not explain this formula further.
- 50% assignments
- 35% tests and final
- 15% participation (lecture, section, office hours, discussion forums)
CS 61 is not harshly graded; many students get A or A- grades. However, we grade using a mastery framework for assignments. The assignments purposely allow most students to pass almost all provided tests. Obtaining 92% of the available points on assignments does not indicate mastery of the subject, and will not guarantee you a straight A. We encourage students to do two things:
-
Don’t overworry about grades. In the long run, it is extremely unlikely that getting an A versus a B will have a material impact on your happiness. Many students find it healthier to try to learn as much as possible without stressing yourself out.
-
Do some extra credit work to demonstrate mastery (and to have fun).
We are unlikely to respond to questions about course grades before they are assigned. For instance, we do not know what your course grade is going to be.
Extra Credit
Each problem set will describe additional features that you can implement for extra credit. You can still submit extra credit after a problem set's due date. The last day to submit any extra credit will be the last day of reading period (12/10) at midnight (11:59:59pm Eastern). Extra credit should be submitted in a seperate commit on the grading server. There will be a way to mark which of your commit(s) are to be graded for extra credit.
Collaboration and academic integrity
Tests and exams
No collaboration whatsoever is allowed on tests and exams. You may not contact any other entity, human or AI, when taking a test.
Problem sets
Collaboration is welcomed on problem sets. Discussion and the exchange of ideas are essential to academic work, and to engineering. We encourage you to consult with your classmates as you work on problem sets. You may discuss general strategies for solutions or specific bugs and code structure issues. You may also search the Internet for general information.
However, the work you turn in must be your own—the result of your own efforts. You should understand your code well enough that you could replicate your solution from scratch, without collaboration, and you should be able to answer staff questions about your code.
In addition, you must cite any books, articles, online resources, and so forth that helped you with your work, using appropriate citation practices; and you must list the names of students with whom you have collaborated on problem sets and briefly describe how you collaborated. (You do not need to list course staff.)
Limitations and caveats:
- Do not ask questions on Stack Overflow, paper.camp, or any similar site. The only discussion board you should use for questions is the class board. Of course, if you search for some C++ problem, Stack Overflow answers may come up—just don’t ask questions yourself.
- Do not ask anyone else, human or AI, to create solutions for you.
- Do not search for or use solutions from past (or future) years.
- Do not post solutions in a public place. Do not make your course repository public.
Generative AI: When doing problem sets, you may ask questions of generative AI tools, such as ChatGPT or GitHub Copilot. But you still must understand the code you turn in: you must be able to explain your code without the help of an AI assistant. Furthermore, we care about correctness, and generative AI tools can provide information that is subtly or dramatically wrong. Use with caution!
If you do use generative AI to help you during a problem set, your turnin must mention this and describe the interaction (e.g., include a transcript of the sessions).
Again, no collaboration, including with generative AI, is allowed on tests and exams.
Rationale: Collaboration is an important part of coding and of CS 61. Talking through your code with other students can help you think. However, in group assignments, students often shirk work or skip assignments entirely. That’s why each student must turn in separate code for each problem set. You may create code together, and may share small amounts of code, but each student must understand all code they turn in. A good way to ensure this is to type in solutions individually, rather than cutting and pasting. Another good way is for students to discuss ideas and code and help each other debug, but write their code themselves.
Embedded EthiCS
CS 61 participates in the Embedded EthiCS effort collaboratively launched by faculty from CS and Philosophy. In addition to the technical knowledge and skills one gains through a CS education, today’s computer scientists need to reason ethically about the design decisions they make. The course instructors and a graduate or postdoctoral fellow in Philosophy will present a unit in this course that exemplifies how you can identify ethical and social issues, think rigorously about those issues, design systems that thoughtfully address those issues, and communicate clearly the design decisions and tradeoffs made.