Evolving Ispell: A case study of program understanding for reuse