Joe Conway (Big Nerd Ranch):
I ask mentors how to solve problems, but only after I’ve tried every solution I can think of. Exhausting my knowledge before asking a question serves two purposes: I don’t waste their time with frivolous or ambiguous questions and I now know all of the wrong ways to solve the problem. Knowing all of the wrong ways to solve a problem is just as important as knowing the right way, by the way.
However, I don’t accept everything I learn without challenging it. However, how I challenge it is important. Sometimes, a mentor will say something and I will think, “That can’t be right, because A, B and C.” Instead of arguing with my A, B and C arsenal, I try to find out if there is a D that I don’t know about. When there is a D, I have successfully avoided looking like a jerk and I have learned something new. When there isn’t a D, both the mentor and I have learned something.
The final piece of learning is simply experimentation. I try some stuff. Sometimes it’s trivial, sometimes it is ambitious. I know that for every line of code I write in this new platform, I’m going to have to rewrite it three times; then I forget that fact because it is makes me want to go back to the warm embrace of Xcode. I share what I’ve done. I write about it. I read about it.
I don't really have much to say here because the post speaks for itself. These are fundamentals that I try to live most of my life by, and I think everyone could benefit by at least trying them out.
However, Joe does mention at the end of his post that he thinks watching videos is not an effective way to learn because they become outdated. I think this is somewhat true, but I would argue that if I need to learn about a specific programming topic, watching current and older WWDC videos will certainly help. At some point, though, actually experimenting and failing and working through problems is where the bulk of learning happens.
And this applies to so much more than just programming.