I suggest implementing the same system using a variety of languages. Each language and system of libraries has some abstractions that can result in the novice having a very incomplete or incorrect mental model of what is actually happening.
In using a variety of frameworks/languages, the learner gets more adept each time since lots of the abstractions are the same, but really jumps forward in the areas where the abstractions are different enough to create some food for thought.
It is that sort of thinking that helps differentiate the designed aspects of a program from the ones that are implementation specific consequences of the design.
Comments
I suggest implementing the same system using a variety of languages. Each language and system of libraries has some abstractions that can result in the novice having a very incomplete or incorrect mental model of what is actually happening.
In using a variety of frameworks/languages, the learner gets more adept each time since lots of the abstractions are the same, but really jumps forward in the areas where the abstractions are different enough to create some food for thought.
It is that sort of thinking that helps differentiate the designed aspects of a program from the ones that are implementation specific consequences of the design.