Computer Systems: A Programmer's Perspective, 2/E (CS:APP2e)
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 and Spring: 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: 15122 (Principles of Imperative Programming)15-213 (also cross-listed as 18-213) is the course we refer to as ICS+ in the CS:APP2e Preface. Over 1000 undergraduate and graduate students in CS, ECE, and other departments take 15-213 each year. The 15-213 course serves several different purposes in our curriculum: