Let me explain how I learn first.
Generally once or twice a year I make a sorted list of technologies or topics I'm interested in learning. The topics are sorted by priority and how hard are they to learn. And then I start learning those technologies by moving from he the first item on the list to the last.
When I've picked up a technology to learn I usually by a book or two about it and then I start reading the book while sitting on my computer and working all code examples. This takes a lot of time since I work full time and also have a family but it gives me hand on experience with all aspects of a technology. Unfortunatelly this only gives me some experience, not true proficiency. True proficiency comes form working six months or more in a technology solving real life problems and learning how the technology works in the field, what are its problems and what are the best patters for its utilization.
Projects are really good at being proficient with common tasks in a technology, but do not delve deep in all use cases and technological aspectes of a specific software solution being applied. In some cases I relied only on my project learning to get a grasp on a technology and came completely stack when faced with something new and different for which I didn't have the necessary theoretical background which I would had if I took the time to learn the technology properly.
With book learning I get a real good foundation in a technology but lots of it I don't get to use during the technology life time, so the learning effort is kinda wasted since I don't get to use directly that knowledge practically. On the other side the wide knowledge base usually gets me pretty fast out of tight spots others find impossible to surpass.
In my opinion in order to be a good sofware developer one must do both types of learning :
- Project learning , learning a technology by doing a project in it.
- Book learning, learning a technology by following a structured learning mechanism such as a book or reference manual.