LOL!
Have you ever (I mean this as a genuine "have you ever" not a snotty "have you ever") talked with the less mathematically inclined about how they approach relatively simple math problems? Let me give you an example:
175/7=?
How do you approach it? In my mind I just know 7*20=140. I then subtract 140 from 175 (actually, I don't - mind just automatically says "35" without any effort). What is 35/7? It's 5, of course. Thus my answer is 25. It's easy for me to hold those numbers in my head.
If I did it the long division (as taught in elementary school) way in my head, I would find it frustrating and, quite frankly, intimidating without a piece of paper and a pencil.
I spent many years in software development. My last boss, a man in his 70s who taught college as well as programmed computers for many moons, and I discussed how to teach programmers to think creatively. We both agreed that either your mind works a certain way or it doesn't. Nobody taught me how to solve the above problem like I did. Likewise, even though you could show programmers all sorts of clever ways to approach problems, some never come up with them on their own. To use a metaphor, they always use the long division method because that's a solid formula that always yields the right answer with a predictable number of steps.
Example: Suppose you had to write a program to determine the value of X given that X was an integer from 0 to 100.
* One guy loops a counter called i from 0 to 100 checking if x=i each time around. When they match, he quits and gives the answer.
* Another guy, who thinks he's being clever because he just read about a function that returns a random integer within a range, sets up an infinite loop generating a random number i and checking if x=1. Yech.
* Still another guy sees the above code and thinks, "Well, since the random number generator might repeat a number, I'm going to keep track of the numbers I've already checked so I don't check them again! I'm so smart!" This is a double-yech.
* The smart programmer writes a program that starts with the number 50 (1/2 of the range). He then checks if x>50. If not, he divides his starting number in half and checks if x>25. With just a few iterations he'll find the value of x.
How do you teach that? I never taught programming, but I did supervise and train a number of programmers. In my experience programmers either came up with that last solution or they didn't.