I’ve been getting some emails from young developers wanting to “level up” as programmers. I’m definitely not the first to write about this topic, so I’m not sure how much I have to add. Still, for what it’s worth here are a few points off the top of my head:

Work with other developers. We are at a wonderful time in the history of technology when for the first time, it doesn’t really matter where you are or who you are working for. So long as you have a decent internet connection, you can pair up with another developer anywhere in the world and work on some code together. More and more experienced developers I know are offering their time for this kind of knowledge sharing. My friend Evan Light holds open office hours, and is developing a site to help Rubyists pair up. I’ve been doing this for a while as well. Want to work on some FLOSS code? Email me and we’ll set something up.

Read the classics. Code Complete, The Pragmatic Programmer, The Practice of Programming, Design Patterns. Etc.

Read WikiWiki (sometimes known as WardsWiki). I can’t stress this enough. Sometimes I think I learned everything I really needed to know about programming from surfing WikiWiki on slow days.

Read other people’s code. Hooray for GitHub! If you want to start with a more curated collection and you know some Ruby, try Best of Ruby Quiz.

Get involved in your local user’s groups. If they don’t exist, start one. And submit talks . I don’t care how much of a n00b you think you are. There is nothing better than committing to a talk to force you to to learn all about a topic.

. I don’t care how much of a n00b you think you are. There is nothing better than committing to a talk to force you to to learn all about a topic. Write a blog. Don’t worry about being original. Some of the most useful blogs out there are a largely a chronicle of a programmer’s experiments and mistakes, and how they overcame problems. Reflection is one of the most important parts of learning, and writing helps you reflect. And sooner than you think you’ll be getting feedback from other programmers.

I’m sure you’ve heard this one before: submit patches to an Open Source project.

Flip a coin. Heads pick Vim, tails pick Emacs. Start learning to use the editor that came up. Either one will grow with you for the rest of your programming career. Strong, flexible tools make good coders even better.

Learn more than one language. But first learn one language well. You need a go-to language where you can get an idea and bang out a first version in a day, without spending a lot of time learning about bits of the language you’d missed or forgotten. But once you have that one, you need new languages to challenge all the assumptions that first language taught you. Pick languages that are widely divergent in styles. From what I’ve seen Seven Languages in Seven Weeks does a good job of covering a wide array of programming paradigms.

Get on the mailing lists for the languages and platforms you use. People sometimes forget that there’s a whole world of great discussion beyond blogs, Hacker News, and Twitter. Mailing lists are often very civil and helpful places compared to those other venues.

StackOverflow is your friend.

Don’t spend too much time researching the “best” tool for something. I used to badly hobble my productivity by spending days or weeks trying to find the very best obscure framework for the project I was about to start. Don’t fall into this trap. When you’re a relatively inexperienced developer, pick languages and frameworks that have lots of users to start with. It’s more important that you know where to go when you run into a roadblock, then that you pick the perfect tool.

Look for apprenticeship opportunities.

And of course: practice, practice, practice. Write code at work. Write code at home. Practice code katas. Programming is no different from any other skill: in the end, it all comes down to practice.