Can you define #3? Meaning going from easy to difficult? Or starting with a difficult task and trying to solve it (at the beginning everything seems difficult, but yeah :).
I meant choosing a project that is not too difficult, but is interesting. Solve a real problem, even if it's small. One advantage you have is that instead of being a programmer, you have expertise in something else. Are their any problems in your own field that you can solve with software?
I implemented a lot of statistics functions to learn how to program in a language. Some of the things I've learned on include:
* moving averages
* linear regression
* matrix operations
* matrix lu factorization
* polynomial interpolation.
* multiple linear regression
* cubic spline interpolation
* variance, covariance, correlation
* gamma function
* t-test, t-value calculations
One limitation of the above is that it doesn't explore all of a language's features. The above are mostly interested in array processing. There aren't any classes or generic types or what-have-you.