One of the most dangerous things I’ve seen happen to people who are just starting to code is being told that it’s easy.
Here’s what your brain does:
Most programming doesn’t require a special brain, but it’s more frustrating and messier than anyone lets on. There are thousands of enthusiastic blog posts, classes and apps that aim to entice you with the promise of a slick, unequivocal procedure for learning to code. They rarely mention the tedium of getting your environment set up (which, trust me, even the nicest of your programmer friends don’t want to help you with, because that stuff is mad frustrating and nobody remembers how they did it).
They don’t tell you that a lot of programming skill is about developing a knack for asking the right questions on Google and knowing which code is best to copy-paste. And they don’t let you in on a big secret: that there is no mastery, there is no final level. The anxiety of feeling lost and stupid is not something you learn to conquer, but something you learn to live with.
This winter I decided to learn iOS. I’d taught myself how to code the summer after college, so I was pretty cocky about my ability to pick up a new language. I forgot how hard it is. After getting over my resentment of Xcode (this “Storyboard” thing looks like it’s for babies, this isn’t real programming), I launched into a series of projects that were too advanced for me. iOS turns out to be different from web development; everything I expected to be hard was easy and everything that should have been easy was hard. I was impatient and annoyed with myself.
What I forgot is that the most common state for a programmer is a sense of inadequacy. As a programmer, there is a limitless amount of stuff to learn. You can become a specialist in one language or framework, but if your job is to build things efficiently, you will constantly need to be learning new tools and constantly feel out of your depth. It helps to be mentally prepared for feeling stupid.
The psychologist Mihaly Csikszentmihalyi came up with an insightful way of visualizing the learning process (for any discipline):
I’ve found my experience to follow that line closely, and came up with this Recursive Recipe for Learning to Program:
- Follow a tutorial step-by-step even if you don’t always understand what you’re doing. I like to think of Hunter S. Thompson copying the books of the Great Masters on his typewriter. You’re getting a feel for how things are done in your new language/framework. This part should be easy, if boring, because you’re just doing what you’re told. [Incline of Optimism]
- Rebuild the thing you just made or a slight variation of it. Try not to use the tutorial too much. Realize just how little you understood of what you were doing. [Fear tugs, slowing your ascent]
- Try to build something simple that you actually want to make. Discover that you have absolutely no idea what you’re doing. [Sea of Despair]
- Find a new tutorial related to your new project. (Hopefully your tutorials are providing you with increasing background on the language.) Follow the steps. [Slight sense of understanding, rise in self-worth]
- Rebuild the thing yourself. [Fear]
- Start a new project. [Despair]
- Repeat steps 1 through 6.
I’m a big fan of tutorials. During this process, I made an app for collecting the best tutorials recommended by programmers who’ve used them. Hopefully it will shorten the stumbling-around period before you get into the groove of learning and help you find the good stuff faster.
As long as you learn to grind through the frustration, you’ll come out on the hillsides and get a good view of your progress. Be okay with not understanding everything, trust that you are getting better even when you can’t see your progress, and don’t rush. Good luck.
Huge thanks to the Shuttleworth Foundation, whose amazing Flash Grant prompted me to go down this path of learning new things and gave me time to work on Teach Yourself To Code. And to Cody Brown, for his help on this post.