This document provides an introduction to concurrent programming and components. It begins by explaining why concurrent programming is important and providing a working definition of a concurrent program as one containing two or more asynchronous activities that synchronize at some point. It then defines asynchronous activities and uses this to formally define concurrency as the presence of two or more asynchronous activities. The document distinguishes between competitive and cooperative synchronization and gives examples. It concludes by defining components as special objects that coordinate between asynchronous activities and discussing some of the characteristics that must be considered when implementing components.