To address computationally challenging problems, ingenious researchers often develop a broad variety of heuristics with which to reason and learn. The integration of such good ideas into a robust, flexible environment presents a variety of difficulties, however. This paper describes how metareasoning that relies upon expertise, bounded rationality, and self-awareness supports a self-adaptive architecture for learning and problem solving. The resultant programs develop considerable skill on problems in three very different domains. They also provide insight into the strengths and pitfalls of metareasoning.