Computer Science · Columbia University
This is an all-around phenomenal class. If you enjoy systems, you should take it. If you don’t enjoy systems, you should still take it. You will come out of this course a better software engineer. The homework assignments include implementing malloc, building a grep-like file search tool, writing a chat server, building an assembly-level debugger, writing a linker, and implementing a container-like system. Along the way, you learn memory allocation, concurrency, UNIX programming, git internals, assembly, ELF/linking, debugging, and other genuinely valuable systems skills. It is also a great class for interviews because it forces you to understand what is actually happening underneath the abstractions. The best part of the class is Jae’s instruction. He might be the best lecturer in the department. If you go to class and pay attention, you will rarely feel lost. He is extremely good at distilling complicated material down to the essential idea without oversimplifying it. He does not leave holes in his explanations, and he draws clear diagrams for anything complicated. You also do not really need to take notes because the course notes are already online. How to succeed: go to every class in person, keep your computer closed, and actually pay attention. Ask questions whenever you are confused. Do the homework assignments yourself. If you work in a group, do not divide up the work…
This class was genuinely one of the best classes I've taken in my life - probably the most I've ever learned in one class. I would definitely recommend taking this class with Jae as his version really demands deep knowledge of the material, which is super useful not only if you want to understand C and systems well but also for testing your abilities to understand things deeply in general. That being said, the class can definitely be very difficult. The only reason I would consider not taking this class is if getting a 4.0 really matters a lot to you.
Disclaimer: AP has been my favorite class at Columbia. The word around the street is that Jae is not as good in OS as in AP but I think people who say this are being unfair. Kernel hacking and OS theory are by nature tougher beasts. There is no easy way to approach the material without severely watering it down. I found AP to be more enjoyable but only because I never felt lost. Yes there were some frustrating debugging moments but I always knew the path the success. OS was different. I felt completely and utterly lost multiple times while doing the hws. I questioned my love of coding, my humanity and my sanity, all while cussing out this class and the kernel documentation. Jae thrusts you into the wild with just the basic necessities (the roadmap for HW7 was generous and appreciated) and we were forced to find our way home. Some can consider this bad teaching. I think of it as tough love. It was necessary to push you to the next level. AP was for teenagers, OS is for adults. Once I became more comfortable with the kernel and its ways (around HW7), I found the class just as enjoyable as AP. Overall, great experience. I only refrain from ranking OS among my favorite courses since I am pretty sure it gave me PTSD. Maybe in a few years I will look back at OS with endearment. The tests....They are much worse than AP's... coming from a guy who got 100 on the AP final. The T/F and m…
This class was probably the most immediately applicable class I ever took, and it's easy, too. Jae teaches you C, much like in the Advanced Programming Course, with an emphasis on the subtleties of memory allocation and pointers. In the last 5-ish weeks you make the transition to C++ and focus on references and object-oriented structure. During all of this, you're also learning about fundamental data structures like linked lists, trees, and graphs. It's a crash course in everything you need to know to get your foot in the door for programming and helps a lot for physics, chemistry, economics, or whatever you're trying to do (if you're not a comp sci major). Highly recommend it.
Great follow up from AP with Jae. Not as polished of a course as AP was but still very well designed. Good lecture notes and very flexible attendance policy. Jae is a fantastic lecturer, very organized, and you'll leave feeling like you've learned a lot. Take this if you loved AP and want to go even deeper down in systems level work.
This was hands down the hardest and most time-consuming class I have ever taken at Columbia. It was also my favorite. If you really enjoyed AP and think you would enjoy getting into the nitty gritty details of Linux, take this class. Jae is a good lecturer, but it seems that he is still figuring out how to teach operating systems, so his lectures are not as great as his AP lectures. Still, it shows that he put a lot of thought into the way the class and assignments are laid out. I found the order of the material to be pretty natural and easy to follow, but I'm sure the syllabus is still changing every semester as he figures out how to teach this class. Although I found the lectures and readings easy to follow, my team and I really struggled with the homeworks. However, I'll admit that part of the reason that we struggled so much was that we did the readings right before the tests rather than before attempting to do the assignments. So, if you want to make your life easier, do the readings before you get down to coding. There will still be some shooting in the dark involved, but not nearly as much as if you only rely on your knowledge from the lectures. That being said, what made the class truly enjoyable was having an amazing team. None of us knew each other before OS, but we became close friends by the end of the semester because we were spending close to 40 hours/week with e…
5 programming projects. The first is easy, second is hard, third easy, fourth hard, fifth kind of hard. He may have added an exam since I took the course.
Have mixed feelings about this class. Took AP with Jae many years ago and can say that it was significantly better run and more structured than OS. He seemed much less prepared to teach this class. The content wasn't terribly interesting. We spent a lot of time on UNIX APIs and not enough time kernel hacking. It was an 8:40 am class so no one really showed up. It didn't really matter since Jae would just talk about a couple of functions from a man page for an hour any way. Most of the learning is done on your own by reading many chapters from 3 textbooks. The first midterm was poorly written and essentially required you to know random facts from the textbook and didn't really test conceptual thinking. The second was slightly better but still overall not a great test. The HWs were hard. Required a lot of reading of man pages, kernel code and experimenting. Doing it on your own was a miserable experience that led to many sleepless nights. Always felt pressed for time on the group projects. I never felt intellectually challenged by any of it but did feel like it was a lot of worked. There was never an aha moment where I appreciated the beauty of an operating system. It's just a mangled mess that we deal with since that's how some bloke decided things should be done many decades ago. Ensure that you form a good team. They don't have to be incredibly smart, just very hardworking, s…
I'm sure everyone has heard about this class and what to expect, but I'll be the positive one and say this has been the best class I've taken in my life. Yes, I was terrified going into it, and Jae definitely scares you when he tells us 12 hours per week is the minimum workload. However, he is also completely right in saying you get what you put into it, and you should treat this like a workout regiment. Obviously this class covers topics that aren't for everyone, but it's a requirement for a reason. I knew no C or anything about systems programming going into this class, and now I finally understand the saying "There are two types of Java programmers: those that know C and those that don't." No one has ever said this class is easy, but it is far from impossible. If you have the motivation to put in the time, you'll be rewarded for it!
So Jae taught this course in Spring 2014 because the normal OS professor was on leave. I'm not sure when he will teach the course again, but I wanted there to be a CULPA review so that people can go into this well-informed. --- The Course --- I learned a ton from this course, though I didn't necessarily realize it as I was slogging through. Jae reformatted the course and taught it with undergrads in mind, which was appropriate given that the class had many more undergrads than in past years (no doubt because of Jae's popularity). As such, much of the first half was actually an extension of AP (lab7/http-server) used to teach OS concepts such as concurrency, memory sharing, and inter-process communication (user space programs to teach kernel stuff). It again demonstrates Jae's theory of teaching, using previous knowledge in order to bridge the gap to new concepts. With regard to content, Jae put a great deal of time into UNIX programming compared with hardware knowledge / kernel hacking. Jae explains that the earlier stuff is more applicable and the latter stuff is changing (e.g. we didn't cover hard disks, probably because SSDs sort of shift that paradigm). I buy his explanation. The pacing of the course wasn't great, with probably too much time spent on UNIX programming on the front and too little systems/kernel work at the end. Of course, this is understandable given that th…