I like games. A lot.

Recently I’ve been hopelessly consumed by the tabletop gaming renaissance that we as a people are currently enjoying (don’t believe me? Have a look at Kickstarter and note how much cardboard appears in the “games” category). Turns out this new-to-no-one-but-me hobby is pretty timely and (I think) very relevant to learning computer science. When I first sat down at a moderately complex modern boardgame I’d never played, I was struck by how tough it was to find a groove (I’m supposed to keep track of my AP, HP, MP, counters, and bonuses AND have contingency plans for whatever your special abilities MIGHT allow this turn?). Computers usually work this stuff out so I don’t have to. Breaking complex systems and problems down and methodically working through the possible scenarios while still keeping an eye on the big picture requires practice and some ….re-wiring.

And that’s one reason why learning computer science on your own is challenging. If you’re not used to thinking methodically and analytically, your first few problems can seem really daunting. A lot of people set out to learn programming by buying a “how to program games in C++ for absolute beginners”-type book or asking “which language should I learn?” on Quora or Stack Overflow. If you search for “coding bootcamp” you’ll find several in just about every part of the country. Books promising a working knowledge of Java in just under a week are out there. And they’re not wrong. A lot of these courses, classes, books, and tutorials are actually pretty good. It’s not that these are bad approaches, it’s just that they might not be really meant for you, the absolute beginner. They might not help you build the foundation you need to adequately learn the concepts.

The issue is that very few of these resources seem to work with you on your thinking and, more specifically, your problem-solving skills. If you haven’t been using these skills you might be in for a difficult journey. For example, I went through a couple of the courses at CodeCademy and Lynda.com (which are great, don’t get me wrong) but I still couldn’t easily or cleanly translate an idea for an app into a working prototype. I believe this is because, though I was able to grasp the programming concepts in a vacuum or applied to specific problems laid out in front of me, I didn’t know how best to use the concepts to solve my own problems (and feel confident in my implementation of the techniques I’d learned). The focus of sites like these seem to be on teaching the specific programming language syntax and broad semantics, not how to programmatically design solutions to problems. Cool, I can create an object in Javascript! …But why would I want to do that?

That’s why I’m rethinking my approach a bit. Instead of focusing exclusively on very practical, hands-on lessons, I’m going to try to develop a solid foundation of computational thinking and problem solving skills… and maybe brush up on that math stuff. Though this is potentially a slower road than the “learn Python in 48-hours” or “build a reddit clone with Rails” approach, I think these skills will be more transferable and might make for a more well-rounded engineer. The flip side is that the theory needs support from the practical application. The best programs and courses offer a very precise balance of the two and that’s what I’d like to try and work out here.

It’s worth pointing out also that this is not an original idea or one that I’ve arrived at on my own. One of the most difficult things (for some of us) starting out is the “talking to other people” part. I’m lucky enough to have access to a couple very knowledgeable, very patient friends that have offered guidance at various points along the way and generally been very supportive. One of the toughest things about going it alone is the potential lack of support and community. More thoughts on that later.