CSE 351, “The Hardware-Software Interface,” is a required course for all CSE majors – and for good reason. It bridges the gap between the high-level languages we’re accustomed to working with and the low-level representation and manipulation of data in real-world systems. Though we used specific tools and systems in the class (e.g. writing code for the popular x86-64 architecture), the principles and larger lessons extended far beyond that.
This class showed me aspects of computer science that I haven’t had much experience with in the past. From performing bit-level manipulations, to writing assembly code for a buffer overflow attack, to tracing the steps in virtual address translation, to implementing a memory allocator, each assignment explored a core component of the inner workings of a modern computer.
The topics are fascinating. I’m amazed by how much of caching can be done entirely with hardware, and I’m amazed at the finely tuned sophistication of the MMU software. I now have tools to understand low-level data representation and leverage it in my programs, and I have a much greater appreciation for the air traffic control that the OS performs behind the scenes to enable multiprocessing. Even though I don’t have occasion to think about these things on a daily basis, I consider myself to be a much better computer scientist by having an awareness and understanding of what goes on under the hood. CSE 351 made a significant contribution to my overarching goal of gaining a comprehensive understanding of computer systems.
Below is a list of ten things I learned from this class that will help me be a better programmer, which I submitted for a small extra credit opportunity. They summarize for me the highlights of the course from a programming perspective, and they underscore the tremendous benefit of knowing things at a deeper level than one usually needs to.