You could reimplement little things/libraries that have been done before in other languages. I call it “tracing”, like drawing from a known image.
Even if it’s something you don’t particularly care about, you’ll be forced to translate some concepts between languages and that alone will teach you something. And the main benefit is you already know what the end result should be, so you can judge your solution on something concrete.
Some examples: implement cat, grep, find, small commands like that. Reimplement a logging library from one language to another. Create a tiny static site generator (with few features).
You’ll actually accomplish something tangible and you don’t have to suffer the weight of thinking up a new technique or tackling large unknown problems.
This is an excellent idea. I assign such problems to new engineers in my team, to help them develop good taste, capacity to persist, and to learn from good examples from around the world. The confidence boost after some new joiner completes a project is palpable.
Even if it’s something you don’t particularly care about, you’ll be forced to translate some concepts between languages and that alone will teach you something. And the main benefit is you already know what the end result should be, so you can judge your solution on something concrete.
Some examples: implement cat, grep, find, small commands like that. Reimplement a logging library from one language to another. Create a tiny static site generator (with few features).
You’ll actually accomplish something tangible and you don’t have to suffer the weight of thinking up a new technique or tackling large unknown problems.