I'm currently teaching introductory programming to non-engineering majors at a major university in C (yes I know uggh, I would have gone with Python). I've noticed what seems to be the biggest problem is that the computer education that was given to these kids earlier in school didn't teach any independent, critical thought. They struggle when things aren't EXACTLY as they were taught to them (e.g. if the Microsoft Word icon is on a different part of the desktop). I've been trying to teach them to use their brains and to try to understand how to solve a problem without asking me for help. I try to make it clear that I do not have the answers to every question regarding computers...neither does any other person on the planet. It requires deduction, inference, experimenting, lots of Google searches, forum posts, and infinite patience. Turns out they can handle it! You just have to let them believe in themselves and let them struggle with it for a bit. In the end, they appreciate it and enjoy it more! I even show them a lot of things that people feel might be too advanced, such as the command line and interfacing with external libraries. They can get it if you can break it down for them. I think often the problem is that the teachers themselves are not experts in programming and have difficult conveying info to students.