Wow - I think that by the time a student is learning programming in a formal school environment it may be too late. You can certainly try I suppose - first is engaging the student - if they are only interested in getting through a required course and getting a grade then your task is even harder.
One thing that seems to work is a really dirty trick that I had pulled on me - give them a problem to solve and too few resources, by a small amount.
Some will flourish - some will become marketing managers.
Out of experience, students in general tend to fear maths and programming. Teaching these topics used to be very challenging to lecturers/tutors. In this sense, a creative method of teaching programming means teaching the topic in a new style that attract students and remove any prejudgments. An example of a creative teaching is by using colorful simulation software that simulates program execution and shows how data moves among different components of Computers systems while execution.
As a student, I was lucky enough to study under Professor Syed Hammad Ahmed at FAST-National University of Computers and Emerging Sciences. Of the many courses he taught us, one was Algorithms. I know that traditionally, teachers simply show their students different famous algorithms and calculate their efficiency and discuss the pros and cons of each one. The teacher is the presenter and explains each algorithm to the students. The teacher occasionally asks students for their ideas and gives feedback.
What our teacher did differently was that he simply presented the PROBLEM to us, and would stand aside and let the students come up with solutions. Then different students would present their algorithms and the others would be allowed to debate about its pros and cons. So it wasn't a teacher-student thing any more. It was like a p2p network, the students teaching each other. He'd occasionally step in to guide the class towards a certain direction, or give us a "building-block" algorithm and ask to create all further algorithms from that building block. As a result, we, the students, derived all the famous algorithms on our own. He'd reveal the names of the algorithms after we had created them ourselves =) as a result, programming creativity generally increased in the whole class.
@Musa - Dr Hammad approach is impressive - this only covers the understanding and algorithmic-ally thinking aspect of programming - the second consideration is about coding and labs and some real world project - there students can really learn practically
I couldn't agree more with some of the comments. In my teaching the emphasis is on problems first, programming second. If you look at the skills set for a good programmer most of it is problem-solving. Why are we teaching programming instructions first and traditional solutions to problems, before allowing people to try it out for themselves first?