I took a graduate-level bioinformatics course at UC Davis, which had a lab component in which we learned basic Unix and Perl programming skills. This was a great lab, which incorporated aspects of learning principles #3 and #4. We worked though a series of problems in a lab manual, at our own pace, while receiving feedback and help from both our classmates and the instructors. This arrangement allowed us to practice solving increasingly difficult programming problems, with access to instant feedback if we got bogged down. Allowing students to move at their own pace created a positive atmosphere where slower students didn't feel abandoned and quicker students were free to push ahead and challenge themselves. This variable pacing also addressed different motivations - some students were taking the course to meet a requirement, while others were taking to develop skills needed for their research.