A concurrent program must combine several independent computations to achieve its purpose. Concurrency arises for numerous reasons, such as logical (combining semi-independent tasks) or performance (leveraging available computational resources).

Concurrent programming is pervasive: GUIs, web applications, embedded systems, etc. However, it also introduces additional challenges to the already tricky proposition of implementing correct, well-designed programs. This course will introduce several approaches to creating and managing concurrency, including multi-threaded programming with synchronization mechanisms and event-driven architectures.

The goal of the course is to teach these concepts while reinforcing the principles from the prerequisites, such as systematic design, testing, and pair programming.