It is well known that modifying software by hand, especially someone else’s, is not only slow and tedious but so notoriously error-prone that we strive for components that never need changing — black-box building blocks. Unfortunately, we lack the omniscience required to engineer such parts, especially when our problem domains are ill-defined. A promising alternative is to make each component adaptive — a simple mark-up language (e.g., frame technology) converts each component’s properties (i.e., granularities that are meaningful within a given domain) into a default value that can be overridden or extended by other components in a rapid yet reliable manner. Adaptive components constitute a gray-box strategy — black when their properties fit the context as is, otherwise white. The approach works by automating the tedious and error-prone aspects of construction and modification, while localizing all the unique properties of an object or program in its root component. Each root exercises complete control over the sructure and content of the code that its hierarchy of components emits. Such custom roots constitute only 5-15% of a typical system. In other words, 85-95% reuse is the norm. Along with the independently gathered statistical evidence of efficacy in constructing and evolving business systems of up to 10 million lines of code, the further implications of adaptive components for software engineering are presented.