CS4414: Systems Programming (Spring 2023)
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. This pair of technologies 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.
We aim at two groups of students. One group will have already taken CS4410 and CS3410 and will be 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 with a language like Java. 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 "hard core" programming and gaining some experience programming on Linux in C or C++.
CS4414 can be challenging for student 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 before enrolling in the course -- 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.
CS4414 may also be of interest to students exploring embedded device programming in robotics, digital agriculture, Internet of Things, or other settings where sensors and actuators are deployed. However, none of those are topics we will cover in CS4414 itself: We'll be learning a technical skill set valuable in those settings, but you would need to take follow-on courses or join project teams to take that next step of applying these skills.
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, and we do teach you the subtleties of C++ programming, but we assume everyone is already a comfortable programmer (mostly in some other language). 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: CS4414 has no explicit course prerequisites, but you do need to be proficient in an object-oriented programming language such as Java or Python. 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.
Grading: We compute a weighted curve (a ranking) based on your scores, and assign letter grades based on this ranking. Grades generally range from B- to A, with half or more of the students receiving A or A- grades. At the instructor's discretion a few A+ grades are also awarded, but these are not purely based on the score ranking (attendance and participation are also considered, and prelim performance is given a slightly higher weighting).