This is such a hard thing to teach, especially to people who are used to doing quite well — I include myself here on programming and my daughter on some things as well as any number of students I have encountered over the years: the importance of just trying and trying. And trying.
In response to a question about being “clever enough” to do higher math, two responses in particular caught my attention, one from a mathematician:
> I’m not very clever but have managed to end up doing a PhD in higher order PDEs. The way I’ve come to approach problems is by something akin to echolocation. Rather than using sound to see the shape of things, though, my preferred output is idiocy. If I throw enough idiocy at a problem from enough different directions, the way it bounces back will (eventually, with some luck and feelings of shame) guide me to what I can do to solve it.
and one from a software developer:
> I run into so many people who want to solve an entire problem in their head before they try anything. I tell them they have to start wiggling, and if that doesn’t work, try thrashing. I solve so many problems I have no business solving just by generating randomness to try. You probably aren’t going to break the computer, and you definitely aren’t going to break math.
The image of “breaking math” is worth the read alone: here’s the [thread on Reddit](http://www.reddit.com/r/math/comments/1sazhk/i_dont_feel_clever_enough_to_do_higher_level/cdvrygv).