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. 

Will my programming (and my object oriented coding experience) be adequate?

When a student struggles in CS4414, it invariably turns out that they really weren't very comfortable with object oriented Java programming or some similar language and had relatively little prior coding experience.  Proficiency in a programming language includes being able to solve programming assignments (this may entail tasks such as reading data from files, building data structures in some way that corresponds to the input, then executing non-trivial logic, and then writing output).  You need the ability to understand such a task without step by step guidance, and must be comfortable designing the solution, implementing it, and testing carefully.  So if this doesn't describe you, you just aren't ready for CS4414 yet.

For example, you've probably played Sudoku games in the newspaper.  Could you write a Sudoku solver in Java, using objects to represent various aspects of the game state, reading the game itself from an input file in a sensible format and then printing the input and the solution side by side formatted to look (more or less) like the "yesterday's solution" the newpaper prints?  If you can do this in your favorite language that would be a pretty encouraging indicator that your coding skills won't be a problem.  Sudoku won't really test your object oriented computing skills, but if you can solve Sudoku and had no problems in an object oriented data structures class like CS2110, we would take that as "proof" that programming won't be a big issue for you.  Beyond that if you've seen classroom material on how languages like Java are compiled to machine code, and understand the concept of global variables, objects on the heap, and objects on the stack, you should be fine.

Unlike CS4410, which has very little coding (in that class the coding all occurs in the optional CS4411 practicum), CS4414 really is serious about coding -- we have many substantial programming assignments over the entire semester.  If you are a skilled programmer, you won't find these unreasonably hard and they help you come up to speed in C++.  But if you are just learning object oriented programming and have never written non-trivial programs on your own, our assignments could overwhelm you.

CS4414 doesn't specify CS3410 and CS4410 as prerequisites because some Cornell undergrads actually do come in with substantial coding experience and knowledge of computer systems, acquired through jobs or other classes they have taken.  We are comfortable allowing those students to self-select and enroll in CS4414. But any student who feels at all tentative and unsure about their coding abilities should take a bit more time to gain experience before enrolling in this sort of advanced course.

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. 

At present the class runs in a bigger room than the demand requires.  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, and hence will know C, 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 really need this class to graduate but I'm not excited about the coding.

In this situation, CS4410 is probably the wiser choice (even if that forces some restructuring of your schedule).  CS4414 is harder than CS4410 because of all the programming assignments, and if you are only trying to get a requirement out of the way, you might be signing on for more work than you realize.  That becomes a formula for falling behind and doing poorly in the class.

The timing of this class is a problem for me.  Can I skip the lectures and just watch the videos from Fall 2021?

Attendence in class is a requirement and we will not approve other modes of taking the course.  In fact we sometimes take in-room attendance, and deduct one point per day missed.  The attendence rule reflects a Cornell policy.  We do have recorded videos, but those are to help people catch up if they miss a lecture for health reasons, but not for routine use.

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.  Could we consider streaming it?

Cornell is not permitting us to use Zoom this year.

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).