The document presents a technique called "fingerprinting" to efficiently detect occurrences of design patterns in software. It involves: 1) Building a repository of past design pattern occurrences with class metrics and roles. 2) Deriving rules to characterize roles based on metrics using a rule learner. 3) Validating rules by cross-validation, removing unreliable roles. 4) Using validated fingerprints to reduce the search space when detecting design pattern occurrences in new programs. This provides a significant speedup over brute force searching.