The tentative schedule (subject to change) is as follows. Please see below the schedule the rationale behind the syllabus.
We will study three building blocks for constructing successful systems that perform complex tasks (these concepts can be found in almost every field of engineering, and are primarily aimed at mitigating complexity):
Abstraction is about turning the otherwise arbitrary behavior of a module (or group of modules) into a set of well understood behaviors; this is typically done by excluding the undesired behaviors. The design of an abstraction dictates both the modularization and the interfaces of each resulting module. Using abstraction enables us to compose modules and reason about the resulting behavior (i.e., executions) of the composition. We will study four attributes of abstractions that have proven useful over time, as well as the inherent trade-off between the benefit of getting a given attribute (e.g., the benefit of reduced inter-module complexity) and its cost (e.g., the cost of increased intra-module complexity):
We will study five system structuring principles (i.e., that govern "where to place what functionality"):
We will study five principles for obtaining good balance of performance and availability, two core system properties that typically have to be traded one against the other (the principles are about "where to place what state" and "when to do what"):
In order to have a productive discussion of these principles, students must be thoroughly familiar with a wide range of systems from the realms of operating systems, databases, networking, programming languages, and computer architecture. Please see the administrivia page for details on the required background.