All processors made today are ‘multicore’. Large amounts of data are routinely analyzed using clusters of machines ‘in the cloud’. Good software designers must know how to effectively use these architectures to solve almost all problems they will encounter and systems of software they will design and build. To prepare you for this reality, this course will enable you to understand different types of architectures, learn common patterns found in software developed by experts, and enable you to master some of these patterns by building parallel and distributed applications.