(Note to LWers: This post was written for a general audience at my blog, but I think it's particularly applicable to Less Wrong, as many here are already interested in programming. Programming is also an important route into two of the main paths to get rich, entrepreneurship and angel investing. Many of the leading donors to the Singularity Institute are professional programmers.)
You’ve already graduated college and found a job, but aren’t making the money you’d like. Or you live in the middle of nowhere. (Or, your job just sucks.) You’re pretty smart, and want to do something about this. What should you do?
One option is working as a computer programmer. Programming has a lot going for it: people tend to enjoy it, software companies have great perks, the work is usually in a laid-back atmosphere, and of course there’s no manual labor. Programming salaries generally range from high five figures (just out of college) to mid six figures (for senior people, and quants at Wall Street banks). This assumes you live in a major city, so be sure to factor that into cost-of-living math. (If you aren’t in a major city, seriously consider moving – most of the best jobs are there.)
Before you apply, you’ll need to learn how to program. To get started, there are lots of books on introductory programming – just search for “Introduction to C”, “Introduction to Python”, “Introduction to Haskell” and stuff like that. It’s good to know at least one language well, and also have experience with a few others, preferably ones that differ in important ways. Once you’ve learned the basics, there are lots of problems online to practice on. If you’re into math, Project Euler has a big, well-curated collection of them. You’ll also want to know your way around Linux, since it’s the main operating system of web servers; try installing it, and using it as your main OS for a few months.
To actually get a programming job, you’ll mainly need to demonstrate a) programming experience, and b) knowledge of computer science. For the first one, the most important thing is to build lots of real software that people use, since this teaches some vital practical skills you won’t learn in books or college classes. Working on open source projects is an excellent way to build experience – check out the list of Debian packages for stuff people are currently doing. You should also get an account on Github, browse some of the projects, and pay attention to the issues; notice how programmers talk about bugs and ideas for fixing them. It’s sort of like being an artist – you want to have a portfolio of past work to show employers.
As you learn to program, you’ll discover that a majority of programming is debugging – discovering errors, and figuring out how to fix them. When you get an error (and you will get errors constantly), Google, Google, Google. Especially when working with open source software, just about any concrete problem you encounter has been dealt with before. If there’s anything you want to learn to do, or an error message you don’t understand, Googling should be a reflex.
For the second part, a lot of interview questions ask about computer science concepts like linked lists, sorting, standard search algorithms, and so on. To learn these, you can usually read a standard freshman comp sci textbook all the way through, and do a few of each chapter’s problems. It might be helpful to write out code on paper, as practice for job interviews where you might not have a computer.
For most smart people, learning programming won’t be terribly difficult… but it does require sitting down at a desk every day, and putting in the hours. If you aren’t disciplined enough to work without a boss or a formal structure, you’ll have to figure out how to solve that problem first. Try working on problems you care about, ones that inspire you. It can be really helpful to work with a more experienced programmer, especially in person – they’ll review your work, correct your mistakes, and (more importantly) it’ll make you feel like you have to get things done on time.
Practicing programming isn’t like studying for a test – anything that requires flash cards or lots of memorization is likely a waste of time. “The best way to learn to program is by doing it.” Don’t memorize; build. If you have any task you find boring, annoying, or repetitive, see if you can write a program to do it instead. (This may require using other people’s software. Eg. if a website makes you type in the same number ten thousand times, Selenium is your best friend.)
A college degree isn’t necessary, but it can be very useful, since a lot of larger companies will only hire people with degrees (especially if you lack previous experience). If you don’t have a degree, try applying to smaller companies and startups, which have more flexible hiring procedures. Majoring in computer science and having a high GPA may help, but it won’t get you a job by itself, and a lot of places don’t care much. A lot of job postings will say things like “X years experience in languages A, B and C required” – ignore these, apply anyway. (Famously, one HR department once posted “ten years of experience required” for a language invented eight years ago.)
Some words of caution: Don’t work for anyone who offers you a full-time job without a decent salary (generally, at least $50,000) because you’ll be “paid in equity”. This is almost certainly a scam. If you want to get experience or learn skills, and someone is working on a cool project but doesn’t have money to pay you, do it on a volunteer basis so you won’t be tempted to see it as a job.
Also, don’t quit your current job to be a programmer, unless you either a) have lots of professional programming experience, or b) have some other way to pay rent. Generally, finding programming jobs in a major city is fast and easy (1-2 months), but a lot of people overestimate their skills, and you don’t want to run out of cash while discovering you aren’t as good as you hoped. It isn’t an overnight project; getting basic competence will take months, and true skill takes years.
Lastly, like most fields, don’t be afraid to apply to a zillion different jobs, and network, network, network. If you’ve been working with any other programmers for a while, ask (once, politely) if they know where you can get a job; they’ll likely have some ideas. Also, you might want to check out the Who’s Hiring thread on Hacker News. Go forth, and build the future!
(Disclaimer: This is based on my and my friends’ personal experiences. It isn’t applicable to everyone, and the reader must be responsible for the consequences of any decisions they make.)
This post was co-authored with Mike Blume, who went from having little programming knowledge as a physics grad student to being a software engineer at Loggly.