Without reguard to fustration/curiosity/knowlege/time ratio:
1) coding practice challenges
* use different languages / paradigms within same language)
2) check out esoteric languages (try doing stuff in #1 in esoteric language)
* http://esoteric.codes/
* http://www.dangermouse.net/esoteric/
3) Research problems language intended to solve / language paradigm.
try solving in language/paradigm that supports the problem vs. one that does not. (aka apl vs. mumps)
* pragmatic programmers has a book series that looks at languages & example problems a given language was inteded to help with [1]
4) Check out old/new language / application change logs [2]
* figure out how to use macros/scripting with an editor
5) Take a look at a decent size program. Figure out how to impliment that from the command line using the ~200 'do one thing well' unix commands.
6) Programming topics of autonoma & of programming grammars tends to be heavily dependent upon theory. Using 1 through 5 above to impliment autonoma & grammars does help with things like [3].
* On simplier side, comparing 'older version' of a language book with current version of language does give hints.
after 1-6, should have a good idea of what type of documentation / coding standards / tools / levels of abstraction want to have/see for a projects source code/deliverable. :-)
[1] : http://github.com/Blackgu/ebooks/blob/master/ebooks/2012-2-1...
[2] : http://peps.python.org
[3] http://medium.com/codex/say-goodbye-to-loops-in-python-and-w...