Instructor: Amit Levy, Alan Kaplan
Description of Course Goals and CurriculumThe stated goal of the COS316 course website is “to teach students to evaluate the performance and study the design choices of existing [computer] systems”, particularly with regards to "modularity, performance, and security”. And having been through the course, I find this to be a broadly apt description of the content of this course. According to Professor Levy, the real motivation behind creating this class was to provide students with a general survey of computer systems, particularly for those who have not taken an in-depth systems course at Princeton yet (such as Operating Systems, Computer Networks, Distributed Systems). You can think of this course as intended to prime your mind with general knowledge of systems, to help you figure out whether or not you would like to further pursue studies in systems. The course is methodologically structured around a five-part framework that is taught to students to help analyze various computer systems. This “framework” can simply be thought as a toolbox with five different analysis tools available for you to breakdown a system and its components. These tools are naming, caching, resource management, virtualization, and access control. The lectures revolve around these tools and introduce many examples of industry-relevant systems that use these concepts in practice. Being a survey course, this curriculum definitely had a lot of content for students to internalize in a short amount of time. But I’d argue that the diversity and relevance of the topics and example systems made the learning both worthwhile and intriguing.
Learning From Classroom InstructionLECTURES As with many COS classes, this course can broadly be divided up into two parts: theory and practice. The theory is introduced in weekly keynote-driven lectures by Professor Levy, where he introduces new concepts each week and elaborates on the slides. I particularly found it helpful to attend all lectures because of two main reasons: (1) interactivity and (2) guest speakers. The interactivity aspect of the lecture is that Professor Levy always weaved in ungraded raise-your-hand MCQ quizzes during his lectures to help us gain a better sense of what we understood and did not. I found this to be helpful for not only helping my metacognition in learning (what don’t I understand and why?) and but also being a good reflection of the type of content he expected us to know for the exams that were to follow. All in all, going to lectures are a huge time-saver in terms of studying for the exams. Also, the guest speakers were really great in the class. Professor Levy invited Professors Freedman, Lloyd, Rexford, Jamieson (who are amazing lecturers in their respective systems domains) to come give lectures on their area of expertise. I found these lectures to be very engaging and a great way to spice up the course, while giving us a good taste of how these professors taught their courses if we were considering them for the future. READINGS Honestly, I never had time for any of the supplementary readings. Thankfully, the lecture content was enough to cover all the materials that were tested on the exams. PRECEPT Precepts were very helpful in guiding us towards progress in the biweekly assignments and problem sets. If the lectures were more theoretical and conceptual, the assignments in Go and problem sets tackling specific applications of the theory were a practical way of consolidating our learning. To save time on assignments and psets, I highly recommend attending precepts.
Learning For and From AssignmentsI was able to learn a lot about systems by coding in GoLang, which deals with important industry-relevant concepts such as concurrent programming and sockets. Having talked to fellow students in the class who’ve had internships in backend programming, I have heard that learning Go is invaluable these days in the industry for solving system-scale problems. In addition to Go, the great part about this class was its relevance to the software industry. The biweekly assignments were structured in such as way that the six assignments were all building blocks to developing an entire web framework (involving sockets, HTTP router, cache, ORM, database connection pool, and access control lists). These assignments really helped me better understand the inner workings of web development, especially how client and servers interact on different layers of the Internet Protocol (IP).
External ResourcesI found that Youtube videos about various concepts in 316 that visually explained and broke down the concepts were indispensable to my understanding of systems at a dumbed-down, intuitive level to complement the lecture slides. In particular, I found Crash Course computer science videos on Youtube extremely helpful to my learning of how the Internet works. To provide some statistics, when I did not use YouTube videos and only studied off lecture slides, I did pretty poorly on the first midterm exam (my score: 68.5/100, mean & median: ~73) when I coupled my study with Youtube videos on concepts and actively recalled those learnings as I studied, I improved my understand dramatically and performed much better on the final exam (my score: 96/100, mean & median: ~79). In terms of first-time GoLang coders, like myself, Go By Example is a great site for understanding how functions work with relevant examples.
What Students Should Know About This Course For Purposes Of Course SelectionWhen taking this course, make sure to understand that this is a survey systems course. Although the class will give you exposure to systems such as distributed systems, IP protocol, and virtual machines. The class will never dig deeper into the weeds of any single system. As a result, I highly recommend this class primarily for those who have not had any initial exposure to systems in the past. A close friend of mine who took this after taking distributed systems said the content was very redundant at times and he felt this class was not the best usage of his time. In terms of balance, this class definitely strikes a good balance between practice and theory. The coursework was very digestible (alternating coding assignments and short problem sets every week) and written exams were a fair assessment of our learning, there were no surprises in both the content and the format of the exams. Also, a huge plus was there was no official final exam besides two written exams that happened before winter break, which was an amazing asset. However, there was a sizable dean’s date paper that prompted us to utilized our analysis learnings and apply them onto existing systems in the industry. I found the paper to be a good way to either (1) explore new systems in the industry or (2) use prior knowledge about familiar systems (such as ReactJS, in my case) to improve my understanding of the class materials.
Principles of Computer System Design