CS4414: Frequently asked questions (FAQ)

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

CS4414 can be used to satisfy the systems-area course requirement for CS majors. 

I am a CS Major.  Does CS4414 satisfy the practicum requirement?

CS4414 does not satisfy the systems-area practicum requirement. 

Can I use a language other than C++ 17, like Java or Rust?

We teach you C++ 17, but during the first few weeks you'll be working in whatever language you are most comfortable with while you learn C++ and start to do small "baby step" assignments.  After a few weeks, we shift to doing all our work in C++ 17.  In fact we recognize that Rust is an awesome language and that there are many other fantastic programming languages that people find totally addictive.  Professor Birman, for example, was totally into SNOBOL 4 as a student, and still feels nostalgic about that language.  But we need everyone in the room to understand the same lectures and doing the same homework projects.  So even if the company where you want to work loves Rust, or O'CaML, or some other language, you need to also learn C++ 17 if you wish to take this class.

You mentioned a test on day one to confirm background.  How will that work?

We expect everyone who takes CS4414 to enter with enough prior coding experience, in some computer programming language, to easily be able to do simple tasks.  For example, you shouldn't have much trouble opening a text file and counting the number of instances of some string in that file, or printing the entire file in reverse, bottom to top.  A person comfortable with programming in Python or Java or some other language should be able to whip up solutions to tasks like these in at most a few minutes.  You should also have learned a little about how computer CPUs work, how assembler language looks, how a stack works, how pointers work and what malloc/free do, and the rules for using them.  You should have experience with object oriented features of whatever language you are familiar with.  Our first-day test is just a simple pass/fail quiz aimed at identifying students who just aren't ready for CS4414 yet.

We do this because we have seen a surprising number of students sign up for CS4414 who barely survived CS3410 and are just hoping that CS4414 will be easier (kind of the opposite: CS4414 is harder!  Take CS4410 if you want a somewhat easier class -- CS4410 doesn't require that you do a lot of coding).  Then there are students who really want to take this course but lack the background.  There are plenty of courses where you can catch up quickly, but that doesn't work in CS4414. 

You really do need the required background, which includes these kinds of practical skills and even the ability to do simple coding tasks rapidly.  People lacking that background just have to get it before they would be ready for 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 your favorite programming language, 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 a reasonable amount of time, like a 3-day weekend, that would be a pretty encouraging indicator that your coding skills won't be a problem. If it would take you three weeks, you probably aren't ready for CS4414.

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.

Can I co-enroll in CS3410 and take the two courses in the same semester?

No.  You must have taken CS3410 and received a B- or better, or taken the corresponding ECE class, or have gained the equivalent background elsewhere -- but then you need to convince the instructor that this is the case.  We found that without an understanding of computer architecture, students struggle in CS4410/  Additionally, by doing CS3410, you learn C and work with pointers, malloc, and free.  This experience turns out to be very valuable when transitioning to C++ 17, which is actually an extension of C.

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 by assigning you a PIN when it is your turn, based on the priorization policy published on the department FAQ for course enrollment questions.   But you

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.

Does taking CS4410 first give me any big advantage in CS4414?

It certainly can't hurt, but we don't require it.  Both courses are self-contained.  By taking CS4410 you could learn about thread synchronization, and this will be more familiar when you encounter it again in CS4414, but the CS4414 version is taught as if the students don't know the topic in advance.  You won't get programming experience in CS4410 (unless you do the CS4411 project), and this is something to keep in mind. Unused programming skills can quickly "rust".  So don't delay taking CS4414 and do other things without any coding for a whole year.

Can I take CS4414 without doing the programming assignments? 

The homeworks are an integral aspect of the course.

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

CS3410 is a prerequisite for CS4414. 

If you are coming from ECE you may have taken other architecture courses.  This is fine, but you still need to have some exposure to C.  The ideas associated with pointers, malloc and free are important background.

I really need an OS 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.  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.

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.

I am unable to attend the required recitation in person.  Could we consider streaming it?

We are not able to get acceptable quality that way, so this isn't practical.

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

For our demos and teaching, we will use C++ 17, but you are welcome to use 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).