In this tutorial we present the basic concepts that underlie object oriented and component based software engineering and their semantic justifications. We start with the basic concepts such as abstract data types and inheritance, as used in the object oriented paradigm to enhance reuse, modularity, and maintenance of software. We show how the concept of component supports and generalizes similar concerns in the engineering of large, heterogeneous, loosely-coupled, distributed software systems. The current component technology regards components as extended objects. We describe an alternative approach that starts with the concept of components as abstract behavioral types. We show how this new interpretation makes components amenable to explicit exogenous coordination, supports compositionality, and provides a clear separation between computation and communication concerns. This leads to a new model of component composition that is based on a calculus of connectors for algebraic construction of component glue code.