July 11, 2010

How I Learn

In the 11th episode of the 37signals Podcast, a listener asks a question of Jason Fried and David Heinemeier Hansson (at the 15:30 mark):
Q: Michael Hopkins would like to hear about what your team does to learn.
A: [Jason] Some people go to conferences, other people just pay attention and observe things. I think that's the best way to learn, just to stay focused on your industry in some ways and see what everyone else is doing and pay attention to the right news sources and learn stuff that way, and to just try it out. That's really the best way to learn anything, to try it and to experiment with stuff. 
A: [David] My approach is basically... Whenever I get annoyed about something, that's when I learn. So, I'm annoyed about how a technical process works or something else works, and I don't necessarily know right now how to fix this, so I gotta find out how to fix it. So I gotta learn whatever skills I need to pick up or patterns or whatever else, what have you, to fix things that bug me.
Hearing their answers sparked the question in me ... what do I do to learn?

I really identify with Jason's answer. In many respects, I'm an observer. I like listening, watching, observing, being aware. Taking the time to reason things out. Seeing how others reason. It's how I absorb facts and ideas.

Really learning a topic requires more than one type of observation style, though. Simply reading a book isn't enough. My best learning comes when I combine different observation styles. So, I've developed a multi-pronged learning attack:

Read


There's no shortage of informative, thoughtful, quality reading material out there. Lately I've found myself on a sort of reading renaissance, renewing my childhood love of reading. In the past year or two I've made a concerted effort to maintain a constant reading schedule. I've tried to keep a good mix of fiction and non-fiction, technical and non-technical, purposeful and frivolous. I find that the mere act of reading helps keep the mind engaged. The library is my friend (Remember libraries? Yes, they still exist.)

As for software development, there are a ton of good books out there, from classics like Code Complete, Structure and Interpretation of Computer Programs, and Design Patterns: Elements of Reusable Object-Oriented Software, to new(er) gems like The Pragmatic ProgrammerClean Code: A Handbook of Agile Software Craftsmanship, and The Passionate Programmer: Creating a Remarkable Career in Software Development (Pragmatic Life). For more inspiration, there's a good list of must-read programming books on stackoverflow.

But books aren't the only thing to read. I can't think of a better way to keep up-to-date with the software development industry than a good RSS feed reader and a good list of technical blogs. Develop a reading schedule and maintain some discipline, or else productive reading can quickly turn to wasted time.

Lastly, read source code. There is an abundance of good open-source software out there. Check out Google Code, Codeplex, and GitHub to start.

Listen

I've become a real fan of podcasts. There's no better way for a wallflower like me to listen in on conversations between interesting people discussing interesting topics. Whether it's Scott Hanselman talking about the business of social media or 37signals talking about their design process or Jeff and Joel shooting the breeze about StackOverflow, these are conversations that are going to happen anyway, but we are invited to listen in. You're missing out if you don't. Check out my list of favorite podcasts it you're looking for a place to start. It's a great way to make your commute productive.

Audio books are a good hybrid of the Read and Listen styles. Books that teach programming techniques probably don't translate well to the audio format, but books about the programming industry do. Again, the public library is your friend. There's a ton of content out there that won't cost you a penny to absorb.

Watch

They say sometimes a picture is worth a thousand words. I'm constantly amazed at the amount and quality of video content that's available on the Internet. Sometimes it's one man behind hundreds of video courses (Khan Academy), other times it's an Ivy League university (MIT OpenCourseWare). It might be a mind-opening talk like Seth Godin on quieting the lizard brain or Malcolm Gladwell on spaghetti sauce. There's a ton of vendor-provided how-to videos like ASP.NET MVC Video Tutorials and Ruby on Rails Screencasts. If you can't attend big conferences, many of them record their sessions and provide the content online, like Microsoft Mix and RailsConf.

Paid video learning content can also be very useful. I've recently subscribed to TekPub, which has videos on subjects ranging from ASP.NET MVC2 to Mecurial to Sinatra and more. To get a feel for what the paid content is like, check out their free Coder to Developer series.

Discuss

After reading, hearing, and seeing so much great content, you're bound to have questions and ideas and opinions bounding around in your head. Let them out. Talk about them.

The most obvious place to do so is in your workplace. Strike up a conversation with your development team during your next team meeting or around the water cooler. Set up a "developer day" to get the team together and explore ways of improving processes or integrating new technologies. However you can, the important thing is to get the discussions flowing.

There are plenty of opportunities outside of work, too. Local user groups are an obvious option. But there are also online discussions available on sites like Google Groups, Yahoo! Groups,  and LinkedIn.

A great place to ask programming questions is StackOverflow.

Teach

You never know how much you really understand a subject until you (try to) teach it to somebody else. Sometimes it can be humbling, but it's always rewarding. The very act of preparing to teach will lead to a higher understanding the topic.

It's not hard to get started teaching. Here are a few ideas:

  • Volunteer to give a presentation to your coworkers, or perhaps to a local user group.
  • Lead a design session that integrates a technique or tool you've just learned.
  • Log on to StackOverflow and answer some questions.
  • Teach a child how to make a simple game using Scratch or Alice.
  • Volunteer at your local school or community center to teach a beginner's programming class

Do

Most importantly, use what you learn. Build things. There's no substitute for hands-on experience.