This document discusses the shift towards concurrent programming due to the end of Moore's Law and the rise of multi-core processors. It covers key concepts in concurrent programming like parallelism, concurrency, shared state, synchronization, and message passing. The document recommends using languages and models that avoid shared state through message passing between actors or processes. It introduces several concurrent programming languages - Erlang, Go, Scala, Haskell - that use models like actors or software transactional memory. The goal of the course is to learn concurrent programming idioms using one of these languages.