This could possibly be opinion-based, but I've found the best way to learning software and also the best way towards teaching software has two facets. There is the technical ability required to move throughout the software and there is the functional ability to use the software as tool for your creativity.
Often times, I've found people immediately jump in to tutorials without having a base ability to understand what exactly it is they are doing and why. When this happens it hinders the ability to build upon knowledge. On the opposite end of the spectrum there are people who want to learn everything about the software even though there isn't practicality in using all of it.
The balance between the technical and functional is the key to having expertise in any software.
Once you have a solid knowledge base you can build upon that knowledge and connect the dots easier. Then, I feel it is a matter of experimentation. Find things you want to create and learn the process involved in doing it; whether it be tutorials, asking questions, or tinkering by yourself. Then as you figure out a technique, streamline your process and incorporate it into your workflow. Repeat.
I've always thought of learning technical skills as adding arrows to your quiver. Each time you learn a technique or create something new, you have yet another way to attack a problem.