Computer Systems: A Programmer's Perspective, 3/E (CS:APP3e)
The area of computer systems spans a community of faculty in both Computer Science (CS) and Electrical and Computer Engineering (ECE) departments. While most of us in the systems community are convinced that students need an early introduction to the core ideas in computer systems, there is still some debate about where this introductory core systems course should fit in the CS and ECE curriculums. Here is how we have resolved this issue at Carnegie Mellon. Perhaps it will be a useful model for other schools.
At Carnegie Mellon, CS and ECE are in separate schools, with CS in the School of Computer Science and ECE in the Engineering School. The two departments jointly offer the following core sophomore-level introductory systems course, based on the CS:APP text, for students in both departments:
15-213/18-213 Introduction to Computer Systems. Fall, Spring, and Summer: 12 units. This course provides a programmer's view of how computer systems execute programs, store information, and communicate. It enables students to become more effective programmers, especially in dealing with issues of performance, portability and robustness. It also serves as a foundation for courses on compilers, networks, operating systems, and computer architecture, where a deeper understanding of systems-level issues is required. Topics covered include: machine-level code and its generation by optimizing compilers, performance evaluation and optimization, computer arithmetic, memory organization and management, networking technology and protocols, and supporting concurrent computation. Prerequisite: 15-122 (Principles of Imperative Programming), where students learn C)15-213 (also cross-listed as 18-213, 15-513, and 18-600) is the course we refer to as ICS+ in the CS:APP Preface. Over 1200 undergraduate and graduate students in CS, ECE, and other departments on campus take 15-213 each year. The 15-213 course serves several different purposes in our curriculum:
For humanities, liberal arts, and non-CE (Computer Engineering) students in the engineering school, it is often the terminal course in their systems education.
Establishing 15-213 as a prerequisite for the upper level systems courses helps those instructors offer better courses because they can make assumptions about the general systems maturity of their students. For example, instructors in the ECE computer architecture course can now assume that students know how assembly language, caches, and virtual memory work, and thus they can focus right away on the more interesting and appropriate design issues such as ISA design, cache design, and TLB design.
For our CS and ECE MS students, many of whom have little or no understanding of computer systems when they arrive on campus, it helps them succeed in our systems courses. In fact, we require all MS students across campus to take some version of the ICS course before they can enroll in any systems classes at CMU.
It provides our students with experience in programming C. This is important because many of the upper level CS and CE systems courses require knowledge of C, but the CS intro courses are all based on Java or Python.
It provides a strong foundation in data representations. Courses in computer graphics (CS) and computational photography (CS) have made 15-213 a prerequisite, since they want students to understand floating-point representations and their limitations.