This course covers distributed systems, both small and large: understanding, designing, and programming them.  The first half of the course covers small and static distributed systems, with the fundamental algorithms they use:

  1. Formal models and time
  2. Specifications, events, and failures
  3. Failure detectors
  4. Reliable broadcast
  5. Causal broadcast
  6. Shared state
  7. Consensus and its applications
  8. Group membership
  9. Byzantine algorithms

The second half of the course covers large and dynamic distributed systems of various kinds:

  1. Structured and unstructured peer-to-peer networks
  2. Super-peer architectures and Skype
  3. Cloud hardware and software
  4. Self stabilization
  5. Gossip algorithms
  6. Content distribution and BitTorrent
  7. Synchronization-free sharing

We will not have the time to see all the above topics; I will make a selection during the course depending on opportunities and your interest.

The course book for the first half is:

  • Introduction to Reliable Distributed Programming, by Rachid Guerraoui and Luis Rodrigues

There is no fixed course book for the second half; I will distribute slides and papers depending on the topics that we will cover.