So here's something I've noticed about my own learning process: I can only learn by example. No matter how complete, precise and accurate an abstract description is, I don't understand something until I see examples. For example, when I try to understand some complicated code, I pick some representative example inputs and work out the corresponding output.
That's exactly why I'm a programmer, and why I've always had trouble with math.
I won't say I only learn by example, but I need something tangible. Something I can pick up, squash, twist and break until I can feel what it's made of. Even if that manipulation occurs only in my head, and even if I've had to synthesise that tangibility from someone else's explanation.
For me, that's the way things really are, and anything else is an intermediate representation.
I never did learn the mathematical definition of bezier curves properly; I just looked at the animations on Wikipedia. This post kinda inspired me, so here's a scrubbing bezier curve: http://samgentle.com/playgrounds/bezier
I'm very inspired by this scrubbing calculator because I think it is the perfect tool to introduce algebra. The abstract concept of a variable is not something that comes easy to everyone. This tool allows you to visualize the idea of a variable and play with it.
I think this would allow the introduction of algebra at an even earlier age for some, and make the transition much smoother for the rest.
No matter how complete, precise and accurate an abstract description is, I don't understand something until I see examples.
I believe this is why spreadsheets are so popular: you're never working with abstraction alone. It's always incarnated in an example. That seems to fit how most people's minds work. By contrast, tools that require users to specify their abstractions first and only then instantiate them with data have a much more limited appeal. It can be hard for programmers to appreciate this because we're on such familiar terms with abstraction.