In this course, we will understand how to design and engineer real-world computer systems, covering important concepts cutting across multiple topics such as operating systems, computer networks, computer architecture, virtualization, cloud computing, performance analysis, and distributed systems. The course is accessible to anyone who has a basic introduction to computer programming; no other prior knowledge is assumed.The course concepts will be covered in a bottom-up manner, beginning with a discussion of the building blocks of computer systems, and ending with case studies and examples of end-to-end design of real-world computer systems. We start with an overview of computer systems hardware. We then understand how the operating system manages the hardware, and how user applications are built over the operating system. We will also understand how user applications communicate over the Internet. We will then study how a computer system is assembled from various sub-components, using examples from real life. Next, we will learn how to measure the performance of computer systems, and how to optimize for good performance. Finally, we will study some techniques to improve the fault tolerance and reliability of computer systems. The course will not be tied to any specific programming language or framework, but will focus on the best practices and principles for designing and engineering computer systems. It is expected that by the end of the course, students will get a good understanding of how real-world computer systems work, and will be able to apply the concepts learnt in the course to design systems on their own.PRE-REQUISITE :Introduction to programming. A previous course in operating systems or computer networks can be helpful, but not necessary.INDUSTRY SUPPORT :Computer Systems, Operating Systems, Computer Networking, Distributed SystemsINTENDED AUDIENCE :Senior UG students or PG students in Computer Science. Working professionals.