Systems Programming - Fall 2019


Dec 15: Homework assignment 4 is out (Road Map). Use the assignment package to test your implementation. Due date is Friday, 20 Saturday, 21 December 2019 at 22:00. This is a graded assignment.

Dec 9: Homework assignment 3 is out (Chess Paths). Use the assignment package to test your implementation. Due date is Wednesday, 18 December 2019 at 22:00. This is a graded assignment.

All announcements are available here.

Instructor: Antonio Carzaniga
Assistants: Ali Fattaholmanan Najafabadi, Theodore Jepsen
Type of course: lecture
Lecture Hours: Wednesday 8:30–10:30, Friday 8:30–10:30, room SI-008
Instructors' Office Hours: by appointment
Assistants' Office Hours: by appointment


What is systems programming? In a way it is just programming. But it is also more specific: it means developing programs that interact with other programs or "systems", as opposed to human users. Systems require specific interactions, usually with very specific and sometimes rigid formats. Systems also have non-trivial structures and architectures, with specific performance characteristics that might be crucially important for the programmer. Some systems might also have non-traditional execution models that, effectively, change the way we program. Examples of such systems are database systems, networked systems, operating systems, specialized devices, special purpose processors, or even general purpose architectures with non trivial architectures (e.g., any non-trivial memory structure).

The primary language of systems programming is the C programming language. So, the first objective of this course is to learn C, meaning programming as well as reading and understanding relatively large C programs. Rather than studying the design of the language per-se or its linguistic features, this course is intended to provide a practice-oriented introduction to programming in C. This course does not require any previous knowledge of C, although it requires some elementary notions of computer programming.

The second objective of this course is to learn how to write programs that interact with a non-trivial system. Once again, the approach is pragmatic, and the learning path will be based on examples and direct experimentation.


The course will cover:


Useful documents and material:

Additional information is available on the following pages.

this page is maintained by Antonio Carzaniga and was updated on February 09, 2018