Despite the inherent flexibility of software as a material experience has shown that the overall software architecture determines the systems adaptability and evolvability. In order to achieve adaptability und evolvabillity a software architecture has to consist of self-contained building blocks - so-called software components - and explicit description of component connections. In this paper we propose a specific of a software component which requires the description of the provided feature and the requirements to other software components without actually referencing other components. We discuss a language - the "Pi-language" - which supports the specification of such software components. In this approach a software system is given by identifying the components needed and explicitly defining the connections between them. The resulting component configuration itself forms a component which can be used in other contexts as well. This approach enforces by construction the notion of an independent and self-contained component. We show the various elements of the Pi-language which allow the expression of important properties of software components. Finally, method and existing and envisaged tool support is discussed.