CS4414: Systems Programming
Goals: Systems programming aims at students who are proficient in an object-oriented programming language like Java or Python, and have completed a course on data structures, but would like a deeper understanding of how "real world" computing systems are built. In CS4414 you will learn an additional programming language, C++, and will learn to use the Linux system as a way to create high quality software, with an emphasis on parallelism and other ways of maximizing performance. The C++ with Linux technology pair has gained nearly universal adoption at every level, from small devices hidden within "smart things" to the world's largest cloud computing systems. As such, the skills you gain in CS4414 are very broadly relevant, no matter what you plan to do in your career.
Prequisites: We aim at two groups of students. One group will have already taken CS3110 and CS3410 (or the equivalent), done some substantial coding projects in Java and also in a language like C (with real pointers, malloc and free), and are seeking additional perspective on the creation of large, complex, software systems. These students would have gained extensive programming experience along the way and will be very comfortable in object-oriented programming. A second group might have less formal background, but already be sure they can handle a more advanced programming class. Such a person could enroll in CS4414 fairly early, before taking 3410, but after discovering a significant love for and talent for "hard core" programming.
We do see some students who have already taken CS4410. For them, some ideas we cover will be familiar, but in fact the overlap is surprisingly small. CS4410 focuses on how the OS was built, not on how to use it very effectively to achieve the highest possible performance. This shift in emphasis leads to material you won't have seen in CS4410. On the other hand, both courses do look closely at Posix threads and monitor-style synchronization. One difference is that in CS4410, that topic is treated mostly "on paper". In CS4414, we program with threads, almost from the start of the semester.
Coding test on the first day: CS4414 can be problematic for students who are not yet confident programmers with a good level of understanding of computing environments and tools, and the ability to pick things up with relatively little direct guidance. That sort of student should first get more experience -- CS4414 is not an easy class, moves very quickly, and has a lot of hands-on programming assignments (CS4410, in contrast, actually has very little coding unless you take CS4411 at the same time). CS4414 is absolutely not the place to develop basic programming and object oriented computing skills. You will fall behind quickly if you lack that sort of prior background and experience. To ensure that everyone is at the right level, there will be a coding assignment on the very first day of the class -- a kind of "readiness test" (it will be pass/fail). People unable to complete this test shouldn't enroll in CS4414.
Some practical considerations: Among our practical goals will to learn to leverage existing Linux tools, to learn how to write correct code in C++, and how to achieve performance and efficiency. Like any programming language, you really teach yourself by doing, but we will present C++ and Linux in the required section. Assigned readings and homeworks will help you build up hands-on proficiency. C++ and Linux are easy to learn if you are comfortable in some other object oriented programming language like Java, so we will move quickly (this is not a course for people who struggle with programming or who have never seen object-oriented code and learned about data structures). You'll also be reading a famous C++ self-teaching textbook, written by the inventor of the language. This will begin early in the semester, so be ready to work hard in the first few weeks!
CS4414 thinks of coding as a skill and a tool, but this is really not a programming course, or a Linux course. The core intellectual material focuses on the way that modern applications are often created by combining two or more programs, which talk to one-another over some mixture of pipes, files, mapped files (shared memory), networking (messages sent over tcp), etc. We will discuss and security abstractions for isolation and authorization, and the best ways of building applications that use these technologies in correct ways. All of these are concepts you'll find valuable in your work, no matter where computing might lead you.
Modern computers are based on NUMA processors (chips with multiple CPUs in the single machine), and leveraging NUMA sometimes entails writing programs with multiple threads running in parallel while sharing memory. NUMA computers have a variety of interesting features that include hardware support for parallelism (such as for image processing, computer vision tasks, machine learning), multiple levels of hardware caching (important for performance), and can support many styles of locking and synchronization. We'll focus on monitors, an approach that is highly flexible, nicely supported in C++, and promotes correctness. Late in the semester, we will also look at some distributed systems abstractions that extend the idea of correct synchronization to cover applications spanning more than one computer, specifically state machine replication, leader election and crash-failure tolerance.
Although there is some overlap between CS4414 and other CS courses, such as CS3410 (computer architecture), ECE3400 (computer architecture and embedded systems) and CS4410 (operating systems), most material in CS4414 isn't covered in any other existing class, and this course is not really intended as a replacement for any of those, nor do we assume you have taken any of them. In fact, as noted above, many CS4414 students take CS3410 and CS4410 before deciding to take CS4414 -- a good sequence for a person who really enjoys systems.
Prerequisites: B- or better in CS3410, or equivalent with instructor permission. You also need to be proficient in an object-oriented programming language such as Java or Python (no exceptions). This is quite an important expectation. If you lack experience really writing code in Java or OO Python, delay taking CS4414 until you have deeply mastered the language and can write substantial programs without much hassle or stress. Otherwise, you will be trying to learn OO programming while everyone else is transitioning to C++, which is a very uncomfortable experience.
CS Major: Satisifies the systems-area course requirement.