Introduction to Computer Systems
“You’ll probably never code in assembly again. But the ability to understand complex computer systems made up of about 20 simply understood lines of code is something you should keep.”
Text: Computer Systems: A Programmer’s Perspective by Randal Bryant
Prof: Dr. Mike Feeley
Feeley is a really hard-working, knowledgeable, helpful and supportive prof. He built a complex simulator to help us understand how assembly works, and his web-page for displaying marks is awesome. It has detailed bar-graphs on how we are performing on key learning outcomes throughout the course. He is really patient during office hours and is really friendly after class. His classes attempt to give us the “big-picture” perspective, so we often have to figure out the details in the lab on our own. He also makes the lab problems quite challenging, to push us further. He does “redemptive grading”, so if you perform better on a learning goal later on in the course, your mark for that learning goal can go up to 80%.
Difficulty
The part of this course that took me the most time was the labs. Some of them were really hard, and we took ages trying to just understand the question because a lot of the concepts were just being introduced and were still new to us. The exam/quiz questions might require a little bit of thinking, because they often have little tricks to them, but are quite doable. Especially since it is clear what concept is being tested in each question, and because the practice material is similar to the real exams. On the midterm, the really challenging question was reading assembly and converting it to C. You only have about 10 minutes to interpret 20 lines of assembly, so I suggest getting a lot of practice for that before the midterm. Following the midterm, the class is less in depth and we blitz through a lot of big topics in computer systems at top speed. Since a lot of this stuff was new to me, it took me awhile to grasp the concepts. However, the way the concepts were assessed on the final was such that if you understood the example on the slides well, you could do quite well. The labs at the end of the course are intense though, so watch out!
Key Concepts
The basic hardware and software architecture of a computer running a single program
Compiling C-code into assembly (and Vice Versa)
Computer bugs at an assembly/hardware level
Event-based programming
Hard Concepts
Reading assembly: Sounds easy, takes time. It might be worthwhile to draw pictures/keep track of variables while reading assembly.
Solving problems of asynchronous programming: Tested in the labs. Quite hard but really rewarding. Suggest testing ideas with TA before rushing to implement them.
Reference counting: A bit painstaking, it is important to understand when exactly something is losing and gaining a reference in a specific program.
Bitwise operations: Come in handy at random places in the course, so try to remember them
Conclusion
Hardest Comp Sci course so far. Probably matured the most as a student of computer science as a result of this class. Realized the limitations of abstractions.