(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.
Further resources: How To Become A Hacker, Get That Job At Google
You should clarify whether "mid six figures" is meant to mean "about $150,000", "about $550,000", "about $316,228", or something else. (In case it's not obvious: those figures are, respectively, the arithmetic mean of 100k and 200k, the arithmetic mean of 100k and 1M, and the geometric mean of 100k and 1M.)
My guess is that for ordinary senior software people, the first (and smallest) of those is the most appropriate, but that for successful Wall Street quants, one of the others might be nearer the mark. (But I am not an expert on software developers' salaries and would be happy to be corrected.)
I also have the impression that if you want to earn six figures as an ordinary software developer (as opposed to in management, as an entrepreneur, etc.) then you really want to be in Silicon Valley or New York, rather than just "in a big city". Again, I am not a salary expert.
(My own background: I do maths and software and a bit of physics in the UK. I have no management responsibilities. I'm about 40. I will not state my exact salary, but if you assume low six figures (in dollars) you will not be far off.)
The paragraph about googling when you find errors might be improved by adding a pointer to Stack Overflow.
Employers offering low salaries plus equities are unlikely to be a good idea, but I don't think they're usually scams.
As long as that salary isn't zero dollars.
Yeah, that would generally be best avoided unless it's your own startup.
I'm an open source driver developer, and I've been involved in the hiring process for our driver team. From my experience in hiring: Participating in any open source project you're interested in is the best way to recommend yourself as a candidate. We get to totally skip the resume and the write-some-code-on-the-whiteboard BS, because we've already googled you and looked through the actual patches you've made and how you interacted with other developers on the projects you've tried to work with. The interview process then becomes "let me tell you about our group and what it's like and some things we might be interested in you working on."
 (actually, a bachelor's degree in something is required. CS does not score bonus points)
So my philosophy degree is worth something after all :P
FWIW, this is not my experience. By leaning heavily on the compiler and making liberal use of assertions, I am able to reduce the total amount of time spent debugging to a small fraction of my total effort.
Most of my programming time is spent cycling through designs. I come up with a new design and it takes a while to flesh it out. Then, often, it turns out the design is fatally flawed in a way that was not obvious at the outset. So all the time it took to implement the design was wasted.
You aren't working with your own code most of the time in most programming jobs.
Good point, and thanks for reminding me that I'm lucky to be in a position where I DO work with my own code most of the time.
I did this, starting with a Semitic Philology PhD and a math BA, and next to no knowledge of programming.
I strongly agree, but on the other hand, my "trick" to breakthrough was to offer a friend, who was trying to do a startup, that I would program part-time in exchange for deferred hourly rate, to be paid if and when the venture turned a profit.
I didn't actually expect the startup to take off, and it didn't, but the deal was real. It gave me experience and a genuine referee, it allowed me to get experience with freedom to work independently and for only a few hours a week, and it allowed me to go into subsequent pay negotiations from the base of a very high per-hour rate.
It helps to go into this during a bubble.
I already know how to program (Python, C/C++, web dev, Matlab). I'm a physics undergrad and I intend to remain one, but I'd like either a part-time gig or a short-term one (about a month). Advice?
As a student in a similar situation who wishes I'd picked a different short-term gig than the one I have now: Ask them what your first assignment will be on the job. I think if I'd gotten an accurate answer to that, I would have been able to figure out that this job wouldn't be too great.
Seems there are a lot of crappy programming jobs out there, and I'm still not sure how to filter those out. ("Avoid government contract work" as an algorithm also would have prevented me from taking this job, though I don't know how generalizable it is.)
How I got this job: University jobs postings. My school has a ton.
What don't you like about the job you have now?
1) it's boring, lots of sitting around waiting for my crappy slow computer to do things 2) I don't see much progress on what I'm doing and get a lot of frustrating errors 3) what I'm working on feels trivial and non-meaningful 4) even a half hour commute feels like too much (I took it thinking this job would be fun and worth it compared to other options, though I'm aware of the commuting research - I was wrong) 5) working full time still feels really annoying compared to school, because I don't have any time to work on my own projects. This might be solved by a) having a job that feels meaningful, b) being allowed to work on my own stuff at work, and/or c) getting used to it (seems less desirable than the other options).
Thank you -- this is the scary part, because my reason for asking is that I've become interested in the question of what the best kind of job would be to support a person who wants to work on their own projects (assuming the projects themselves are not job-related --think Einstein in the Swiss patent office). Programming seems at first glance to be a natural candidate (at least if the person is technically inclined, such as a contemporary Einstein would presumably be) and I'd like to find out how correct this assumption is.
So, if I can probe a bit further: is the reason you don't have time to work on your own projects that (a) your job requires an exorbitant amount of time (more than 40 hours per week, say); (b) it is so stressful or unpleasant that "recovery" uses up all your leisure hours; or (c) your non-job time is otherwise committed ( e.g. a second job, school, family responsibilities, etc.) so that any projects could only be done during job time?
I work for 8 hours a day, but am at work 8.5 hours (to eat lunch). I prefer to sleep 9 hours a night. It takes me 1 hour to get ready for work in the morning, and 30 minutes to get ready for bed and fall asleep. I typically commute for 1.5 hours per day. After that, I have 3.5 hours left, about 1.5 of which are devoted to chores, dinner, and interacting with other human beings. I spend about 0.5-1 hour walking outside (exercise is important), and have an hour, maybe an hour and a half left for working on my own stuff. And that's on the days when I don't have laundry to do.
There are weekends, and I get some stuff done then, but those are also the best opportunity to hang out with other people who I don't live with, so they often are half occupied already.
I'm not really sure if I could find this situation tolerable under other circumstances (not having to do as many chores, shorter commute, etc.). I could probably be using my time at least a little more effectively than I am. It feels like a huge bottleneck in free time compared to college, though. That may also be related to the fact that in college, I can more easily choose when my free time is.
Thanks for the info. So it seems to be mostly a case of (c).
While it's unfortunate that your own specific situation doesn't seem to allow for much free time, it doesn't seem to undermine the general hypothesis that programming is about the best sort of "day job" a prospective independent researcher could hope to get. (Such a person would of course have to be careful about maximizing the use of their non-job hours, but that would be true in any case; the worry would be about jobs that had too many hours, or soaked up all of one's cognitive energy for the day.)
Maybe. There is the time when your code is compiling, for one. But then, my job isn't the most cognitively demanding software job- or even, I would guess, the average- so it might not be the most useful sample.
I have heard, however, that programmers can be quite successful working as part-time consultants. That might be a good avenue for you to look into.
What about some kind of online employment like the one offered by e.g. oDesk? Some time ago I stumbled upon this recommendation that also gave a few tips on how to approach this kind of work.
I haven't yet found the time to try it out, but since I'm also in a similar situation (finishing a CS degree then planning to find a job that'll pay the bills and use my free time for personal projects) I treat it as one of the most promising alternatives...
Interesting tip, seems like it might work out well. That also looks like an interesting thread in general.
(Welcome, just Your posts made me to grab a pen and register here) crappy jobs, yes. Avoid those where your work will be trashed after some months - those are most meaningless ones. Also those works which will ripoff people are no way to go.
If you have great skills then you should focus on more peaceful projects and avoid government (especially military) and commercial sector areas, yes. :)
Well, when reading your other posts here about programming work, it seems that You are dealing on a wrong work if the recovering from the work takes too much time and is not at all fun. Special warning sign is that if you feel it meaningless, not developing, boring, non-inspiring. Its time to take a pause and think -- what I really need just now? But what makes me happy? Pehraps You were distracted in the beginning what made You to apply for the job?
Fortunately, I don't have to make any special effort to stop working here, because it's a short-term job. Mostly I didn't spend enough time on the job application process, and was happy to have found something...
Any advice for software developers that are in a rut? Basically, I have been working my first post-college job the last 3.5 years or so, but honestly what I do is pretty basic web app stuff.
I really want to get into a job where I have a lot more responsibility and more interesting work, but I feel like I have shot myself in the foot by working at such an easy (but decent paying) job for so long.
I am very interested in pretty much all programming related topics and study them for fun, but having not built any super awesome software makes me feel inadequate.
Honestly, I should probably just apply to some places and see if I can get a better job, but for some reason I am afraid I will just get turned down.
Consider it rejection therapy, then. It turns out it's OK to be turned down; and you might at least learn something about the interview experience.
Ludum Dare is awesome because it'll get you into a mindset of developing quickly. Probably best to do that after developing properly for a while, though (test driven development and all).
Thanks for responding, this is a good comment and I have considered some of what you suggest.
I do work in a very large organization, and there is a huge amount of technology in use here. The big problem is that technology is a cost center. They will never (without major changes to how the business works) do anything technologically innovative due to this. That is part of my problem with it.
I am looking at several startup jobs in the area that use more interesting technologies. I'm hoping that my incomplete side projects are enough proof that I don't only know/care about Java.
I use a ton of open source stuff (emacs, rails, countless libs) I just have problems putting myself out there when it comes to contribution.
Complete at least one.
Rejection therapy is just like ignoring the cause, but leaving the cause itself unattended. So, it does more injury than helps. Man should focus instead of reasoning that "what makes that flinch? what is the reason for it?", becouse there is still that cause. Just ignoring the flinch (or even rejection programming) is like kicking the big rock again with bare foot.
It can also be that man is on the totally wrong place or applying on a wrong basis, wrong work... etc.
Also my experience is that in this phase -- writing CV and cover letter, is more or less "beauty contest" for Jack-of-all-trades which has absolutely nothing to do with personality or skills itself if the listener is not in front of You and you have your programs with You on that moment to show. So far my best chances to get work as always been 9 of 10 choices a miss and lost energy. Just making a visit was always the quickest way and through mutual friends.
I think this what most people in IT do.
There are millions of people and organizations who want to have a web page, and you cannot satisfy all of them with one solution.
On the other hand, I'm kind of curious about what it would take to get a job like the one you've currently got. From your description, it sounds like it shouldn't be too hard, but there are some slightly worrying cautionary notes in the post ("It isn’t an overnight project; getting basic competence will take months, and true skill takes years"), and it isn't obvious from the outside what sort of specific skills one would need to demonstrate to impress an employer of this type. (That is, what specific sort of programs one should write at home in order to prepare, as opposed to just going through Project Euler or something.)
Here are a few specific things that either I look for or I have been asked about:
You should know how the web works -- be able to explain, for instance, how cookies work, or what happens from the moment you click a link to the moment a web page appears in front of you. Don't worry about anything below TCP/IP here.
Also, be competent at relational databases -- if someone gives you a problem, be able to correctly design a database for it, quickly. Know what normalization is and when to use it and when not to.
Have read a book on design patterns.
Be able to write code on a whiteboard.
If you list a programming language or technology on your resume, be prepared to answer questions about it.
HOWEVER, an acquaintance of mine with no programming knowledge, no degree, just a passion for technology got a job as some kind of Visual Basic forms programmer (it is an extremely limited subset of the language). He has since taken some night classes to learn programming more formally and has moved to a normal programmer-type position. This place probably hired 3-4 people to do this.
There's a long and well-written article here written by a man who believes using Anki (with flash cards & lots of memorization) is a superior way to learn programming. He claims that using this method "any intelligent and disciplined reader can achieve proficiency in a given field of programming (e.g. web applications, iPhone applications) in less than 12 months."
Note that he also advocates learning by doing ("pick a project") so the two approaches are NOT mutually exclusive.
12 months to proficiency? I'd expect a person to pick up web development, for instance, in six months, just by working full time. (At least, I did.) The article didn't say whether that was working full time or not, though.
I think it depends on what you mean by proficiency. An often quoted figure is 10,000 hours to master any certain domain. Working 8 hours a day non-stop, that would amount to 1,250 days or about 3.5 years if you worked every single day of the year.
It depends on the starting point. Someone who had been developing, say, Windows Forms GUI applications in C# for three years, switching to PHP doing web applications, should not take 3.5 years to be considered proficient. Maybe a week for the language and a passing familiarity with the basic libraries you'll be using, at which point you can make your first useful commit. A month and you'll be reasonably fast. Six and you shouldn't be consulting documentation very often at all. At 3.5 years, you should be an expert.
But if you're starting with no programming knowledge at all, then you'll need those ten thousand hours. Or to put it in more practical terms, college plus three years job experience. But college is inefficient and inconsistent for this purpose.
Saw this on Hacker News; it looks pretty good: http://news.ycombinator.com/item?id=4410805
Any particular reason you recommend Debian over Ubuntu?
If I want to become a system administrator instead of a programmer, which of these advises would still apply? Also, is it feasible to become a system administrator if I don't have a bachelor's in a related area of study?
I recommend to all those programmers and scripters et al read that ESR page ("How To Become A Hacker").
You can do much, but the more skills and powers you have, then the bigger responsibility you have to make choice -- to whom you will work for? With great skills its no point to work in commercial software industry or in military assignments -- becouse the first is fixing problem over again and over, second job is destruction. Logically taking -- if the engineer education is only to build bombs then I wish that it should not exist at all, it should be used instead to more peaceful projects and programs.
"2. No problem should ever have to be solved twice." Remember that rule. But thats exactly what computer and commercial software industry does -- fixes the same problem more than twice. In other words - your energy are wasted, gentlemen. Just to go to grab those jobs are quite blind and yes, meaningless. Do you really want to do something which is meant just for sale and that they will be outdated after some years? The only one who gets satisfaction is only sales department, but no customer, and neither You. There are many other ways to get food and cover while still feeling that you make something which is meaningful.
Many perhaps will go to this job becouse being blinded by salary number but missing the whole point -- those men who work on this area arent motivated only by salary, but becouse its fun. Salary numbers are high only becouse there arent so much specialists on the market. As there will be more who can do the required job, salaries will go low. Also in this field self-learning is most important thing.
There are several negative factors about commercial programming jobs: debuging (90% of the time goes for debuging instead of developing new features), missing or too old documentation and lots of PHBs. I remember that my energy was quite wasted becouse I was put on someones project without documentation to fix bugs. And all that low software was becouse of very low programming moral.
Also, when I program or build something then I want to make it last for years, be compatible, and have small requirements. These were not in company's interests, they set very strict limits.
Well, I had once such workplace where I worked 15 hours in a day and just becouse I liked. But not anymore.
Also 20 years ago programming was considered as a form of art, but now what a heck if I cant even choose how I will place the table to feel more comfortable... I quit. That company as all other similar ones dont exist anymore in such form or any longer.
"In this clip, from June 1995, Jobs says the difference between using good hardware can be a 2:1 difference for a company. But the difference between a company with superb programmers vs. average ones is 25:1, he says, adding, "That's probably … certainly the secret to my success. It's that we've gone to exceptional lengths to hire the best people.""
This productivity speedup is the key observation. Learn the basics from coursera or whatever and then really internalize the idea that your personal productivity varies in orders of magnitude and learn to arrange your environment to avoid diminishing returns. After you have the ability to do this and you can communicate to nontechnical people, finding work is no problem.
I was young and took a job for some $30K per year. Great workplace, terrible pay. Stayed for three years; ended up without any equity. I'd go back in a heartbeat if I could get the same compensation I'm getting now.