Describir: Guidelines for Designing and Teaching an Effective Object-Oriented Design and Programming Course