This course introduces students to the history and overview of distributed computing, reasons for studying distributed computing, modern trends in distributing computing and application areas.The topics covered include the role of distributed computing in computer engineering. Design, engineering, and evaluation of modern distributed computers. Design: naming, synchronization, latency, and bandwidth. Architectural support: messages versus remote procedure calls versus shared memory models. Structural alternatives: master-slave, client-server, fully distributed, cooperating objects. Coupling: tight versus loose. Distributed filing systems and directory services. Verification, validation, and maintenance issues in distributed computing. Fault tolerance and reliability. Replication and avoidability. Standards and protocols. Temporal concerns. Data coherence. Load balancing and scheduling. Scalability. Parallel programming models.