Program dependency analysis is a fundamental approach to code-based impact prediction which underlies change planning and management, as well as a range of other dependency-based client analyses such as testing, debugging, and comprehension, all of which are crucial for reliable software evolution. However, existing such approaches suffer from difficult cost-effectiveness balancing: Fine-grained analyses offer detailed but large results at prohibitive costs, whereas coarser analyses achieve better efficiency at the cost of great imprecision. In addition, current techniques have little utility when applied to distributed systems consisting of decoupled components. This dissertation addresses these challenges via three novel approaches to cost-effective dependency analysis, followed by a comprehensive study of prior alternatives. First, a quantitative semantic-dependency analysis is presented to separate program entities by relevance so as to prioritize impact prediction at statement level. The second approach exploits a diverse set of hybrid techniques that combine static and dynamic dependency analysis to offer not only improved but variable cost-effectiveness to fit varying budgets and task scenarios for impact prediction at method level. Finally, an efficient dynamic analysis is developed to discover method-level runtime dependencies both within and across multiple concurrent processes, which is shown instrumental in evolving distributed systems.