When it comes to software, one approach that has worked really well for me is "Build your own X". Re-implement a tool from scratch (minimal feature set, not production-quality code) and learn how it works under the hood.
I've done this myself for Git, Docker, Redis, SQLite, Shell and more - it requires patience, but I've found the approach very effective.
I've done this myself for Git, Docker, Redis, SQLite, Shell and more - it requires patience, but I've found the approach very effective.
There's a GitHub repository with a huge list of similar tutorials that you can follow: https://github.com/danistefanovic/build-your-own-x.
I'm building a programming challenges platform based on this format, if you'd like to check it out: https://codecrafters.io/.