Managing program complexity: Introduction