Best Practices for introductory teaching Literature states that there are particularly difficult issues with introducing programming, and that many of the issues are still not well understood. But some results indicate that these are some effective methods:


Presenting worked-out examples in lecture
Providing partially worked programs for lab exercise
Asking for an explanation of a complete example in tests


These methods reduce cognitive load, so that the students can focus on the relevant ('germane') details while learning or demonstrating proficiency. Other details and distractions cause 'noise' which make the cognitive load too high. Another factor is that methods that work for beginners are inappropriate or hindering to more advanced students, and in a classroom with varying abilities it can become difficult to structure material or present it properly.

Perhaps the biggest variation is in student's predispositions towards problems solving. This quote points to a major obstacle to most programming learning:


  A weakness of worked-out examples is that they may not engage the
  learner enough to induce germane load. The effectiveness of the
  examples is negated if the learner does not study them attentively and
  explain the given solution to themselves. The literature suggests that
  many learners are not naturally inclined towards effective spontaneous
  self-explanation of worked-out examples.


Self-explanation is a skill or tendency which is thinly distributed in the population. Can it be promoted somehow?

What methods have you found most effective with beginner programming students for showing new material and having students practice it?
I think you have left out two essential elements here. Your first two points leave the students passive consumers. The last is about testing. But there is no guarantee of any learning in between. 

In some ways, the two most important pedagogical ideas are 


Active Student
Constant Feedback


You need to ask your students to create things and you need to give them individual feedback on how they did. The fraction of students who learn by listening to lecture is actually quite small. Taking notes (by hand) makes them more active, but using the face-to-face time to work with them in artifact creation is much-much better. 

But students are unlikely to get everything right the first time and each student will need individual direction, whether they are struggling or excelling. 

Note that teamwork is an attempt to combine these two things. The team creates something and give each other feedback as they go along. 

My constant mantra while teaching was "It isn't important what I (the teacher) do. It is only important what you (the student) do."  Focus on their activities, not yours. Perfect their exercises, not your lectures. 



I'm not sure how relevant this is to CS, but one of the most important and memorable courses I had in my first year of college was a writing course. The prof never talked about the process of writing, but pointed us to a lot of good writing. However, the crux of the course was that we wrote a theme for every class (3 per week). We spent quite a lot of the time in class reading these aloud and getting feedback. His particular trick was to pick out the best ones in his judgement for review, not the ones that needed the most work. We also got detailed feedback in writing. No lecture at all. Lots of activity, lots of feedback. He did his job.