Andrew Neth (L01/05)
Office Hours: Friday 11:35AM-3:35PM (Discord)
E-mail: aneth [at] hawk [dot] iit [dot] edu
Grace Arnold (L02/03)
Office Hours: TTR 7PM-9PM (Zoom)
E-mail: garnold [at] hawk [dot] iit [dot] edu
Yuezhi Che (L04)
Office Hours: W 2PM-4PM (Zoom)
E-mail: yche3 [at] hawk [dot] iit [dot] edu
Course number: CS 350
Semester: Spring 2021
Lecture Time: TTR 3:35PM - 4:50PM
Lab 01 Time: Fri 3:35PM - 4:25PM
Lab 01 Location:Stuart 112J
Lab 02 Time: Fri 3:35PM - 4:25PM
Lab 02 Location:SB 112E
Lab 03 Time: Fri 3:35PM - 4:25PM
Lab 03 Location:SB 112F
Lab 04 Time: Fri 3:35PM - 4:25PM
Lab 04 Location:SB 108
Lab 05 Time: TBD
Lab 05 Location:TBD
This course will be your entry into the world of computer systems. This is where you will begin to see the "nuts and bolts" of computers—how they're designed, how they're implemented, how they're programmed at the lowest levels, and how the whole system fits together. As such, this is a "bottom-up" course. By the end, when you write your high-level programs, whether they're in C, Python, Ruby, Node.js, or brainfuck, you should be able to reason about how the code you write turns into low-level operations on the hardware. You will be able to cut through levels of abstraction to gain a deeper understanding of how computer systems work. After finishing this course, you will no longer take for granted the mesmerizing array of languages and tools that "just work." The path will be open for you to become a practitioner of the dark arts of systems programming who shuns Clarke's third law and who, when in need of a Linux machine, writes it in C.
Note that CS 350 is a required core course for both the CS and CIS undergraduate curriculums
Please do not hesitate to interact with the instructor, the TAs, and your classmates. Do not wait until the last minute to come see your instructor! We will be primarily using Diderot as a course communication mechanism. The lecture schedule, slides, homeworks, quizzes, and exams will be administered through Diderot. In addition, we will be using it as a course communication mechanism.
The following book is the only required textbook for this course. Note that it is also available in a cheaper, e-book form.
A classic book on introductory computer architecture. If you'd like to learn more about processor architecture, and would like to learn how to design your own control and datapaths (this book uses MIPS), this is a great resource:
A good book dedicated to logic design, which we cover in the first half of this course.
This is also a useful book to have on your shelf. It is a bit newer. It does not go into quite as much detail, but does guide you through building your own virtual computer:
This course takes a "bottom-up" approach to programming, in that we start from the principles of digital logic design and computer organization. You'll soon be taking CS 351, which is closely related and complementary to this course. If you want to get ahead, you should consider purchasing this book (you'll need it anyway) and skimming. There is a good deal of overlap, but from a slightly different perspective:
At this point, you are probably still used to using a Mac or a Windows system. In the CS world however, if you want to have any hope of being productive, you absolutely must learn to work in a UNIX-like environment (e.g. Linux, FreeBSD). I encourage you to use a desktop hypervisor (such as Parallels, VMware, or VirtualBox ), download a Linux distribution of your choice (Ubuntu, Mint, Debian, Fedora, OpenSUSE, and Arch are good choices), and boot it as a VM to get the lay of the land. We will be using Vagrant extensively in this course. You can also get a UNIX environment on Mac and Windows using Docker. These days Windows 10 also incorporates Windows Subsystem for Linux, which is often more usable than Docker in my experience.
Probably the most useful skill you'll need to acquire is navigation at the UNIX command shell. Here is a good tutorial for that. Here is a nice reference that will allow you to look up commands that you encounter but do not know.
Here is a nice overview of UNIX programming, especially the design philosophies and common themes.
Here is a good book on programming in the UNIX environment, from the lowest levels:
For more advanced shell usage and Linux system administration:
This is a list of other resources that you might find useful for this class and for doing work in the systems area in general. Feel free to peruse them at your own convenience.
These books are not all technical, but are broadly applicaable to computer systems, science, engineering, and programming.