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.
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.
- Write programs that combine C/C++ and assembly language.
- Solve problems using computer arithmetic.
- Solve coding exercises requiring synchronization of concurrent activities.
- Analyze program performance and apply basic optimizations.
- Write simple network servers.
Programming assignments 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. This is a change from previous years.
Assignments will be due at midnight (11:59:59pm Eastern) on the due date.
Each student has 144 free late hours which can be applied to any of the assignments. (That’s a total of 6 late days.) This means that all assignments can be late by a cumulative total of 144 hours without penalty. If you wish to take late hours, you must add a prominent "DO NOT GRADE" notice to the top of your
README. This notice must be visible on the grading server from the assignment deadline until your submission is ready for grading.
Significant penalties will kick in after the 144 late hours are exhausted, such as a letter grade off on over-late assignments per 4 hours of additional lateness, down to a minimum of F.
No assignments will be accepted after solutions are discussed in class or section. This will generally happen about 5 days after the assignment is due; deviations will be preannounced.
Skipped assignments receive a zero, not an F. Zero is far worse than F (in the letter grading system F is often represented as 50%). You don’t want zeros on any assignment: a great way to get a bad class grade is to skip an assignment. It’s better to complete and turn in assignments even if you’ve already used your late hours.
Attendance at lecture and section is required.
There will be a midterm and a final. Both midterm and final will be open-book and open-note. Computers will be allowed, with restricted Internet access. The Internet access policy will resemble this:
The exam is open book, open note, open computer. You may access the book, and your own notes in paper form. You may also use a computer or equivalent to access your own class materials and public class materials. However, you may not access other materials except as explicitly allowed below. Specifically:
- You may access a browser and a PDF reader.
- You may access your own notes and problem set code electronically.
- You may access an Internet site on which your own notes and problem set code are stored.
- You may access the course site.
- You may access pages directly linked from the course site, including our lectures, exercises, and section notes, and our preparation materials for the midterm (including solutions).
- You may run a C compiler, including an assembler and linker, or a calculator.
- You may use a Python interpreter.
- You may access manual pages.
- You may not access Google or Wikipedia or anything else except as directly linked from the course site.
- You may not access Piazza.
- You may not access course videos.
- You may not access an on-line disassembler, compiler explorer, or similar applications.
- You absolutely may not contact other humans via IM or anything like it.
- You may not access solutions from any previous exam, by paper or computer, except for those on the course site.
Any violations of this policy, or the spirit of this policy, are breaches of academic honesty and will be treated accordingly. Please appreciate our flexibility and behave honestly and honorably.
A tentative grading breakdown for College students follows.
- 45% assignments
- 20% midterm
- 25% final
- 10% participation
CS 61 labs may be completed in groups, but we expect every student to turn in a separate code repository—even if partners’ code is very similar. Here’s what that means and why we’re doing it.
Collaboration is an important part of CS 61. Talking through their code with partners and other students leads to less stress and loneliness and easier debugging.
But partner dynamics can hurt too. We want every student to have worked on every problem set, but previously some partners have shirked work or alternated assignments (“you do pset 4 and I’ll do pset 5”), which isn’t fair to others and reliably causes problems. Partner concerns have also led us to put more grading weight on exams.
We seek a happy medium. We want to allow strong collaboration between partners, and collaboration even outside of explicit partnerships, but avoid the pathologies of group turnin. So we ask every student to turn in separate code for each problem set. Partners may create this code together, and may share code, but code submissions must not be wholly identical. A good way to ensure this would be for partners to pick at least one part of each lab and type in their solutions for that part individually. Another good way would be for partners to discuss ideas and code and help each other debug, but type everything themselves.
Collaboration is encouraged on all aspects of the course except exams. You are welcome to communicate with your classmates about strategies for solutions and about specific bugs, and you are welcome to use Internet resources for general information. However:
- You must not ask questions on Stack Overflow, paper.camp, or any similar site. (Of course, if you search for some C++ problem, Stack Overflow answers may come up—just don’t ask questions yourself.)
- You must not use solutions from past (or future) years.
- Cite help. If a classmate, other collaborator, or online resource helps you, acknowledge this in your assignment. Name the helpers and briefly describe how they helped. (You do not need to cite help from course staff or resources directly linked from this site.)
Do not post your solutions in a public place.