A guide to designing, implementing and analyzing distributed algorithms. It covers problems including resource allocation, communication, consensus among distributed processes, data consistency, deadlock detection, leader election and global snapshots.