Primeiro começa com o CRUD clássico, depois vai subindo um degrau de cada vez, implementando validações de dados, autenticação com jwt, testes, melhorando a arquitetura das pastas, etc.
Uma técnica que eu utilizava era ter um CRUD padrão de users bem simples, e para cada novo assunto que eu quisesse estudar, eu copiava esse código e implementava algo em cima dele. Exemplo: caso desejasse estudar jwt, eu copiava meu código do CRUD e implementava apenas o jwt nele. Fazia a mesma coisa com testes, docker, etc. Um repo novo, simples e direto para cada tópico de estudo.