Computer Systems from the Ground Up

Welcome to prospective students of CS107E Autumn Quarter 2021!

Thanks for your interest in the course! To get a better idea of what this course is about, please read below for answers to common questions. We're looking forward to teaching CS107E in person again and are creating a brand new lab space in Packard because Gates is under renovation.

We (Chris, Phil, Maria, Matt, Liana, and Anna) encourage you to attend our information session on Tuesday, September 7th at 2pm (Zoom link to attend live). The information session is a preview of the course and a chance to ask your questions. Please join us live if possible! If you were unable to make the information session, here is a recording.

CS107E has a limited enrollment of 40 students. Students are accepted into the course through an application process. The Autumn 2021 offering is giving a preference to electrical engineering undergraduates, but will have a mix of CS, EE, and other students in it; we find that a mix of backgrounds and disciplines leads to students learning from each other and having more impressive final projects.

If you would like to enroll in CS107E, you must submit an application by the end of the first class on September 20, 2021. This is a second application deadline: approximately 30 of the 40 positions in the class were filled by students applying at an earlier deadline, but we wanted to keep 10 or so slots open for students who were unaware of it. To submit your application, please fill out this form. If you have further questions or need additional input before making a decision, come chat with the course staff on our Ed forum. We will inform students enrollment decisions via email by September 21st and expect a a commitment to enroll. We may have a small waitlist. Because CS107E involves a kit and lab fee, we do not allow students to shop the course. We ask that you commit to the course only if your plans to follow through are firm.

What is CS107/CS107E? What topics do these courses cover?

CS107 is the second systems course in Stanford’s undergraduate core sequence and introduces students to computer systems focusing on these five fundamental concepts: hardware, architecture, assembly code, the C language, and software development tools. Our classic CS107 course teaches these concepts on a hosted Linux system using standard libraries and tools. The alternative CS107E explores the same concepts through bare-metal programming on the Raspberry Pi using hardware add-ons such as LEDs, buttons, and sensors.

Both versions of CS107 cover the C programming language, data representation, machine-level code, computer arithmetic, compilation, memory organization and management, program execution, debugging, and performance. CS107 has light coverage of floating point and computer security that CS107E does not. CS107E includes topics in hardware and I/O that CS107 does not.

What are the differences between CS107 and CS107E? How do I determine which course is right for me?

CS107 and C107E are considered two embodiments of the same course. They both cover the same core concepts and assign significant programming projects in C and assembly. Both promote effective development and testing through use of good engineering practices and developer tools. Either course satisfies the requirement for the CS major or minor and serves as a prerequisite for follow-on systems courses.

The major difference is the system being explored. CS107 students work on Linux running on the x86 architecture. This modern, hosted system provides the advantages of sophisticated libraries and tools, but it puts you at arms’ length away from the hardware (no direct access to processor, I/O, or framebuffer). CS107E runs bare-metal (no OS or libraries) on a Raspberry PI ARM architecture. There is nothing standing between you and the hardware, but the environment is somewhat more primitive and edit/compile/debug must be done via cross-system tools.

Here are a few other issues you may want to consider in comparing the two:

Whether you take CS107 or CS107E, you’ll learn how a computer system operates and work hard to gain mastery over these topics and advance from a novice programmer to an effective practitioner. Students who do well in either course are excellently positioned to apply these powerful skills to future CS, EE, or ME projects!

This course can accommodate at most 40 students and we must settle enrollment commitments in advance so students can be certain about their schedules. Please see above instructions for prospective students.

What equipment will I need to participate in CS107E?

When/how are lectures and labs delivered? Is attendance required?

Lectures are scheduled for Monday and Friday 1:30am-2:50pm. We use lecture time to cover highly relevant content. Lecture attendance is expected: consistent attendance and active participation are highly correlated with student success and we want you to have this optimal experience! (An ode to “did I miss anything?”)

There are weekly labs on Wednesdays. The lab exercises are designed to be completed in two hours; we run a four-hour lab period to provide flexibility. Labs are conducted in an open group session using online conference tools. Participation in lab is mandatory. During lab, you will work on guided exercises in small groups with the support of the course staff. Lab is also an opportunity to build community with your peers, get to know the course staff, and have fun!

If your schedule doesn’t permit you to consistently attend lecture or lab, consider enrolling in CS107 instead or waiting to take CS107E in a future quarter.

What are the course prerequisites for CS107/CS107E?

Successful completion of CS106B (or equivalent) and eagerness to advance to the next level. You should be an accomplished programmer who has practical C/C++ skills using recursion, dynamic data structures (pointers, linked lists, trees), data abstraction, classic data structures (lists, stacks, queues, sets, maps), and standard algorithms (searching, sorting, hashing). You should have an appreciation of the intrinsic value of good engineering and design and you will be expected to produce well-decomposed, readable code. If you feel on the fence in determining your placement between CS106B and CS107(E), our strong recommendation is to pursue CS106B – we love this course! It is lots of fun, supremely well-taught, and produces thoughtful and accomplished apprentice programmers. You will exit CS106B well-prepared to go on to a satisfying and successful experience in CS107(E).

Still have questions?

If your question is not answered here, email us at and we can help you out!