Eliciting design requirements for maintenance-oriented IDEs: a detailed study of corrective and perfective maintenance tasks