Software complexity is the degree to which software is difficult to analyze, understand, or explain. As society increasingly depends on software, the size and complexity of software systems continues to grow making them progressively more difficult to understand and evolve. This trend has dramatically accelerated in recent years with the advent of Web services, agent-based systems, autonomic and self-healing systems, reconfigurable computing, and other advances. Software's complexity has compounded in both volume (structure) and interaction (social) as the Internet has enabled delivering software functionality as services. Yet, most technologies that we use to develop, maintain, and evolve software systems do not adequately cope with complexity and change. Traditionally, software engineers respond to complexity by decomposing systems into manageable parts to accommodate the sheer number of elements and their structure. However, the Internet and the emergence of software as services have led to a new kind of complexity.