CS4414: Frequently asked questions (FAQ)

I am a CS Major.  Can I use CS4414 to satisfy the systems requirement?

This is a question related specifically to the CS major.  The CS major includes a requirement that you take a systems course.  For many years, only CS4410 was offered as a way to satisfy the requirement, hence CS4410 was effectively a "required course" that every CS major needed to take.  That rule has changed, and the change is retroactive to Fall 2020. 

CS4414 can be used to satisfy the systems-area course requirement for CS majors.  Thus, CS4414 is now available as an alternative to taking CS4410.    If you took CS4414 in Fall 2020, and received an acceptable grade, you have satisfied the systems-area course requirement.

What about the practicum requirement?

Again, this is a question related purely to the CS major.  Every student in the CS major must take a 1-credit practical course -- a "practicum" -- in which they are able to show mastery of coding by developing a substantial software system.  One of the possible practicum options is CS4411, which is really tied strongly to CS4410.  When you take CS4411, you must either have already taken CS4410, or be taking CS4410 simultaneously. 

CS4414 does not satisfy the systems-area practicum requirement.  Moreover, CS4414 cannot be used the prerequisite for CS4411.  Thus, if you want to have your practicum be CS4411, you will still need to take CS4410 whether or not you take CS4414. 

Help!  The course-enroll system is blocking me from signing up!

Just add yourself to the wait list.  Then the CS Ugrad office will move you into the class.  You do not need any kind of special permission from the instructor, no matter what course enroll may claim in the pop-up window. 

The underlying context is that Computer Science uses a prioritization scheme for large classes. We are forced to use this approach because we have such a large major, and yet our courses are also popular with students throughout the university.  If we don't prioritize, our majors might not be able to get credits required to graduate.  Prioritization allows us to ensure a smooth process for everyone. 

In Fall 2020 CS4414 isn't a widely known class, and so it won't be huge.  Most people (from any major at Cornell, not just CS) should be admitted into the class within a day or two. 

When will I know if I can get in?

We process the wait list continuously over a two week period.  If the class is below the cap, we admit more people.  Once the class  reaches the cap, you may need to wait a little longer.  But keep in mind that in most Cornell classes, 15% or so of the students drop the course quickly, so at any given size, a certain number won't stay in the class.  As they drop, seats open up, and you can get in.

The smart strategy is to stay on the wait list, attend the class, and do the homework.  This way you'll keep up with the students who have already been admitted. Contact Megan Gatech in the CS ugrad laboratories if you have additional questions or concerns.  Worst case, you can always sit in on the class as an online audit (Cornell will not all in-person auditing, but all of our lectures and recitations will be available by Zoom).  You do not need permission to attend via Zoom even if you have not yet been admitted to the official registrar list of attendees.

If you join late, we do not offer any kind of accommodation for catching up.  So you are welcome to hang around waiting to get in, but you still need to keep up!

How do CS4410 and CS4414 really differ?  Would it make sense to eventually take both?

Although there definitely is some overlap, it is actually a lot less than you might think, and we do expect that students who enjoy building systems would take both.  CS4414 is centered on a form of abstraction that views the computing hardware as a tool, and teaches that you can really control "everything" and even do so when code ends up split into more than one module, each running in a different setting.  Our choice of C++ and our emphasis on effective use of Linux as a tool for problem solving are really secondary to this big goal.  There is a primary focus on getting the most performance from your system. 

Thus, you won't need to learn how to build an operating system in CS4414.  The CS4414 student is trying to become a superb developer who uses the hardware and the operating system as powerfvul tools to solve practical problems.   In contrast, CS4410 is all about doing a deep dive and really learning exactly how operating systems work – a deep internals perspective. 

The main overlap arises in a few lectures that look at concurrency control for threads.  There is also some overlap when we look at caching strategies.  But this adds up to just a few lectures out of the whole semester.  On both topics, CS4414 is asking “how can we use these primitives safely?” In contrast, CS4410 also develops the underlying theory, how the kernel implements the primitives, and develops rigorous correctness proofs.

Can I take CS4414 without doing the programming assignments? 

CS4414 teaches C++, and you really need hands-on experience to learn a new language.  Accordingly, the homeworks are an integral aspect of the course.

I don't know C.  Will I be at a disadvantage?

Many students who take CS4414 will have taken CS3410 first, although CS3410 is not a prerequisite for CS4414.  As a result they will have had a small amount of experience with the C programming language.  C++ is built "on" C, and so some aspects of C++ may seem very familiar to C programmers.

However, we could say the same thing about Java -- C++ and Java have many similarities too.  In fact most languages are similar in many ways, and at the same time, each is distinct and has its own special strengths and brings its own challenges.

Experience with C is definitely useful when learning C++, particular if you are familiar with the C concept of pointers, pointer "arithmetic" and malloc/free.  We teach you this in C++ in the recitation sections, but we cover these topics fairly quickly.  So prior experience with C is not required, but can be useful.  If this is a worry for you, it might be good to take CS3410 before taking CS4414.   CS3410 isn't a big programming class, but it does cover these aspects of C.

A different option is to just read the C++ programming textbook.  Many people assume that they will be taught everything they need to learn in class.  This is not really the case for C++ in CS4414.  We actually require you to read the textbook, and our classes assume that you have been doing that homework.  And the textbook is self-contained.  It is a complete and adequate treatment of C++ that does not assume any prior experience with C, and it covers everything you need to know to learn C++ at a very sophisticated level.

I am not a sensational programmer, and had trouble learning Python and Java.  Do I really need to learn C++ too?  Is there an easier path to learning C++?

CS4414 doesn't assume that you are a star computer hacker, but you really do need to be a comfortable, productive programmer to be ready for this class.  Many people get to that point after CS2110, but not everyone.  If you are a person who needs a little more time, we recommend that you take CS3410 before taking CS4414.  CS3410 isn't a prerequisite for CS4414 and in fact the course material has very limited overlap, but it is a systems course, uses some C (which is a subset of C++, so anything you learn carries right over), and has programming assignments, so you would get more programming experience.

You also genuinely do need experience with an object oriented programming language to survive in CS4414.  This is really not intended as the first course in which you would encounter ideas like object orientation, data structures, recursion, abstraction, etc.

C++ 17 is not the world's easiest language, but for students with a solid background -- Java, or object-oriented Python, or something similar, and perhaps a little experience with C at the level of methods, pointers and pointer arithmetic, malloc/free -- learning C++ 17 is pretty straightforward and mostly comes down to learning the notation and then seeing some of the new ideas that go beyond what is possible in Java or other "managed" runtime environments that depend on runtime type checking and reflection.  The bottom line is that C++ 17 gives you more control over the way your code will compile and run, and more awareness of that control, and enables you to create some incredibly efficient solutions that wouldn't be easy to implement in a language like Java, where that level of control involves knowing how the Java runtime and JIT compiler work at a level of depth that comes from compiler building, not just being a normal user.  This is actually why we picked C++ 17 as the language for the class.

Does industry use C++ 17?

The bottom line is that modern industry uses every imaginable programming language.  But C++ 17 is rapidly being adopted and is a major programming language, used heavily at Google, Facebook, Microsoft, Oracle and many other big companies that work at the cutting edge.  None of them requires C++ 17 experience except, perhaps, for candidates to work in their systems development teams.  But all of them view C++ 17 as one of the most important "power user" programming languages available today.

I am unable to attend in person.  Does this mean I can't enroll?

We really do prefer in-person instruction when feasible -- everyone does.  But with Covid, it was not feasible in 2020, and perhaps some people won't be able to attend in person in 2021.

We are trying to understand the number of people in this situation.  If there are a substantial number of people who need to work remotely, we will offer in-person lectures but also have some form of remote video lecture option, both for the main lecture and for recitations.  But this is not yet a promise -- as of April 2021 when this FAQ was revised, we do not yet have clarity from Cornell about what they are asking us to do in such cases, or how common they will be in the fall of 2021. 

How do CS4410 and CS4414 really differ?  Would it make sense to eventually take both?

Although there definitely is some overlap, it is actually a lot less than you might think, and we do expect that students who enjoy building systems would take both.  CS4414 is centered on C++ and on effective use of Linux as a tool for problem solving.  There is a big focus on getting the most performance from your system.  CS4410 is about how operating systems work – internals. 

The main overlap arises in a few lectures that look at concurrency control for threads.  There is also some overlap when we look at caching strategies.  But this adds up to just a few lectures out of the whole semester.  On both topics, CS4414 is asking “how can we use these primitives safely?” In contrast, CS4410 also develops the underlying theory, how the kernel implements the primitives, and develops rigorous correctness proofs.

CS4410 satisfies the CS major requirement for systems, but CS4414 does not.  Will the department reconsider this policy?

The department is hoping that within a few years, CS4414 will be an option for satisfying that requirement.  We cannot predict whether this will actually happen, or when.

Can I take CS4414 without doing the programming assignments? 

No -- the assignments are central to the whole class.  CS4414 teaches techniques that you can only appreciate through hands-on experience.  Accordingly, the homeworks are an integral aspect of the course.

I am unable to attend the required recitation in person.  Does this mean I can't enroll?

We strongly encourage recitation attendance in some form, in-person or remote.   It would be hard to earn a top grade in CS4414 if you simply ignore the recitations.

Which version of C++ and Linux will we use?

For our demos and teaching, we will use C++ 17, but we will not be using C++ 20, which is a more recent but somewhat experimental newer version.  Most companies where you would use C++ are careful about the most recent new features.

There are two main compilers for C++ 11/17/20: GNU GCC (g++) and Clang.  We use g++.  There are very few differences from a user perspective, although most companies settle on a specific compiler and require that everyone use that product.

The version of Linux we use in class is Ubuntu, but if you somehow need to work on CentOS or some other version, this won't be a problem as long as it supports the bash shell.  Still, for compatibility with us and to ensure that our TA's can help, the best match is Ubuntu (the current standard release).