Its a tough problem. You have to find something that you want to exist; like an app or a website or a game. For example, try making a GUI for managing SSH keys. You know, like the ones github makes you create in order to clone and push to a repo. Make a visual representation of those keys (stored in the .ssh folder), and tools to add/delete them.
Along the way you'll find tons of missing things, tools that should exist but don't. Those are the "real" projects that will really expand your capabilities as a developer.
For example, I was coding in python and wanted to make a function that caches the output because the code was inherently slow.
- but to cache an output we need to know the inputs are the same
- hashes are good for this but lists can't be hashed with the built-in python hash function
- we can make our own hash, but hashing a list that contains itself is hard
- there is a solution for lists, but then hashing a set that contains itself is a serious problem (MUCH harder than hashing a list)
- turns out hashing a set is the same problem as the graph-coloring problem (graph isomorphism)
- suddenly I have a really deep understanding of recursive data structures all because I wanted to a function that caches its output.