I first experienced the magic of Google when I was trapped on the 2nd puzzle in Myst: a few quick keyboard strokes and I had the solution to that damnable clock puzzle that thwarted me for hours. My nine year old self was astounded that someone out there had an answer to the exact question I typed in. The only thing that recaptures the magic for me is StackOverflow.
While it primarily serves as a knowledge base — one of the best if not the best — StackOverflow can also be used as a powerful tool in the apprentice developer's kit. Taking a cue from the invaluable Apprenticeship Patterns, i've developed a few patterns of my own that I use to get the most out of Stack Overflow:
I've always found flashcards and quizzes to be the most helfpul ways to retain things. When I was studying language in Primary school, I always made it a point to have a friend (or my mom, thanks mom!) quiz me on a list of topics or vocabulary words. This practice of quizzing allowed me to rediscover words/topics that had fallen out of my memory, and get a better understanding on ones I already knew. I use SO in a simlar way.
- Look for low to no answer questions in the discipline you are interested (
- give the question a quick scan, to see if you know the answer
- if so, give a clear and concise answer. Otherwise, make a note of the question for later, and then go back to step 1.
The key here is to not get bogged down researching the answer to a question that is beyond your quick-acccess memory (thats for the next pattern). I find this much more stimulating than making my own flashcards, and the variety of questions help me look at what I know from a different perspective, or reveal holes in my own knowledge. Keeping a log of questions that I do not know gives me research projects for later.
2. Deep Dive
There are a lot of questions on SO (usually by inexperienced users) that can be solved with a simple google search, or a cursory examination of documentation. It's easy to pick up some quick reputation points by answering these — i've definetely done so — but it's easy to fall prey to using surface level knowledge instead of deepening your understanding of a topic.
To get around this, I will set aside certain times where I only answer questions by referring to the source code of the technology in question. This forces me to really understand the fundamentals at play in solving the question. Often, I won't be able to figure out what is going on in time to get the right answer (or maybe at all), but the end result is that I gain a much much better understanding of how the technology functions, and a better grasp of how to read code. If I do happen to get the right answer, it's all the more rewarding.
3. Reduce, Reuse, Recycle
SO has a wealth of "canonized" questions and answers, and i've found it helpful to keep a list of the ones that I find the most helpful. Combining and reviewing these has allowed me to get a much better handle on complex concepts like OO, Prototypical Inheritance in JS, and what the hell MVC is.
I've found it helpful to collect several similar answers in a blog post or entry in my private wiki. This creates a rich "super answer", and the act of synthesizing helps me better understand the topic.
A second benefit of these "canonized" answers is battle bewtween various schools of thought on what the best way to solve a problem really is. Being able to see one of the creators of Python argue with another advanced user over the performance of Arrays is a wonderful gift to an apprentice programmer. I've found it useful to mark these answers, and then explore the reasoning behind each one.
Onward and Upward
StackOverflow has aided me incredibly, and I hope some of these patterns can help you as well. If you have any thoughts, @mention me or leave a comment.