1. Introduction
As society increasingly depends on software, the size and complexity of software systems continues to grow making them more difficult to understand and evolve. Manifold dependencies between critical elements of software now drive software architectures and increasingly influence the system architecture [28]. The development and maintenance life cycles entail traceability relationship dependencies that extend from early requirements to architecture, design, implementation, and all stages of testing. Source code has data and control dependencies that form program dependency graphs employed in software analysis. Managing the evolution of these systems still entails configuration and version dependencies. And now with the growth of packaged applications and component-based development, interoperability between components must also be incorporated into the dependency network used to understand software.