So you want to become a programmer, huh?

Maybe it’s because President Obama told you to learn computer science, and you’re not gonna argue with the President.

Or maybe it’s because you hunger to make something – a product other people use – and you’re tired of a job where, at the end of the day, you wonder what exactly you did or why it even mattered. And hey, making software is easier and cleaner than making furniture.

But realistically it’s probably because of the money. Glassdoor claims that software engineers make a median salary of $85,000, which is nothing to sneeze at. Even the lowliest programmers can look forward to taking home about $60k, and if you have a talent and drive for programming, then the only limit to your salary is your ambition.

All well and good. But how do you go from a casual smartphone owner and recreational computer user to actually making software? And then how do you turn making software into real money that appears in your wallet and bank account?

After my article on consulting in Rails, easily the most-asked question I received was: “How do I become a programmer, and what do I do when I get there?” No one is born with a keyboard strapped to their hands: every programmer you know learned how to do it. I did too. Here I’ll describe what I found most helpful for getting into programming, how I’d do it again if I had to, and what you should keep in mind if you decide to set off on the programmer’s path.

This post is extremely long. But hopefully by the end of it, you’ll have some clear ideas and inspirations for how to turn yourself into a real, honest-to-goodness programmer.

Before You Start

To become a programmer, you don’t need a computer science degree, hipster glasses, youth, or even beauty. (You also don’t need a particularly strong math background, in case you’re concerned.) That said, there are some things you really do need – if you can’t put a check-mark next to these prerequisites, you might want to seriously reconsider a journey into the realms of computer science.

A love for computers. If you can’t see yourself working in front of a computer 8+ hours a day, happy as a clam, then I appreciate you reading this far, but this career path probably isn’t for you. Sacrifice. Most software, tools, and books to learn computer programming are free. Some of the best ones, unfortunately, aren’t. You won’t have to spend thousands of dollars (unless you need to buy a computer), but it’s probably reasonable to expect an outlay of a couple hundred to purchase books and software. And that doesn’t even factor your time into it – you have to put in the work to get out the results, so expect late nights and early mornings. Drive. The going will likely get tough – really tough. When doing something outside of your comfort zone, it’s easy to get disheartened and lose your way. How long you can stick it out and keep coming back will determine whether you end up with programming as a hobby, a mediocre skill, or a mastery. Unfortunately there’s no shortcuts here. You just have to do it.

The Finish Line

Still with me? Good.

Before you even set off on this journey, we should consider the end goal. Specifically, what do you need to know in order for a potential employer to consider you a viable candidate for a programming job?

This prospective employer will look for three things when evaluating you for a programming job:

Actual knowledge of the programming language. Your employer will vet your technical competency by examining your existing code and asking you specific technical questions: for Ruby, the classic chestnut is “what’s the difference between a block, a proc, and a lambda?” Though you’ll get bonus points for knowing everything 100%, no one expects you to have your language memorized offhand or even know the minute details of its operation. They’re looking for breadth of knowledge, where you’d go to look stuff up if you didn’t know it, and a general feeling you’ve been around the block at least once or twice. In your code samples, they’ll want to see competence and fluency in the language in question. Having used programming in a professional capacity. Even if you know your language, you’re no good to anyone if you can’t apply your skills and complete projects. An empty resume with a note at the top that you love to code won’t get you hired anywhere. The unfortunate reality of the labor market is that everyone only wants to hire proven winners. You have to establish you are one if you want to be employable. That said, you needn’t have created enterprise-level software as part of a twenty-person team – personal projects hosted on GitHub or Bitbucket are more than sufficient to get hired. Demonstrated ability to work with other human begins. Yes, you want to be a computer programmer, not a diplomat, and yes, your job is to code: but you’ll probably end up talking a lot to your boss, coworkers, and possibly even customers. You have to be able to put people at ease and make them like and trust you, or else your career won’t go anywhere at all – and you certainly won’t make it past even a casual interview.

What Language Should I Learn?

Well, I like Ruby. It’s beautiful, functional, easy for beginners and powerful for experts. Professionally you’ll use it either to create web and mobile applications (with Ruby on Rails or RubyMotion, respectively). Python is also great for many of the reasons that Ruby is, and generally more popular for non-web purposes, so you can’t go wrong with either.

Lots of people swear by Java, and if you’re in a big company it’s probably much easier for you to get buy-in for a language backed by Oracle than one created by a bunch of people on the Internet.

If you want to create graphically intensive computer games, you’ll want to brush up your math a little bit and check out the grand-daddy of programming languages, C (and its offshoots and derivatives, C++, Objective-C, and C#, depending on your platform). C is hard to start with, though, and has a lot of complicated concepts – if you’re just beginning, a language slightly friendlier to humans would smooth the learning curve.

It’s hard to go wrong with any language, though, since most of the skills you’ll learn in one will be more or less portable to another.

Ready, Set, Go!

With no further ado, a step-by-step list to go from zero to hero! If some steps are too remedial for you, just skip ahead until you get to a point where you think it’s reasonable to follow along.

1. Learn about computers

Yes, you might use one every day and carry one around with you in your pocket. But what do you really know about these mysterious machines that make your life easier? Probably all too little!

Even the computer languages that look very much like English require you to know something about the interior operations of a computer: you don’t have to be an expert, but a generalized idea of how things work will be necessary for you to get into programming. For example, if you don’t know what files are, what memory is, or how to find your IP address, you should start doing a little research. I suggest Computers for Beginners, which can be dry at times but covers a lot of ground very efficiently.

It would probably also be helpful to learn a little bit about the structure of the Internet if you intend to do web programming of any sort… and these days, almost everything seems to involve a little bit of web programming. HowStuffWorks has a good explanation of the general structure of the Internet that isn’t too technical.

2. Learn about computer programming

Programming languages can be very different indeed; but at their heart, they’re just instructions for telling a computer what to do. Since computers are quite similar, most programming languages rely on many of the same concepts.

This is where programmers start spouting jargon like recursion, iteration, and conditionals. Though those are relatively big words, the concepts underlying them are quite simple and learnable. There are a lot of great places to start learning the basics, but I have a soft spot for code.org’s basics lessons. It might seem more like a game than programming… and that’s a good thing.

Or, if you’d prefer disconnecting from the computer for awhile, I would recommend taking a look at the fabulously fun RoboRally. It gives players an idea of how computers actually process instructions – and how instructions that might initially seem perfectly reasonable can lead to horrible results.

3. Start learning your programming language

Now that you have a solid foundation, it’s time to start learning your programming language!

There are likely a lot of extremely good resources out there already to help you. I learned from some of the classic books of Ruby programming: Agile Web Development with Rails and Programming Ruby.

Remember to consult the documentation! Almost every modern programming language has extremely extensive documentation, and probably a dedicated online following that love making those docs easier to read and understand. A little bit of Googling on even the silliest questions will probably yield a treasure trove of information… some useful, some not. (Try, for example, “why is Ruby named Ruby?”.)

And while you’re learning programming…

4. Start using it

It’s never too early to apply your skills, even if you feel you have no skills at all! Having a project in mind is great and will help direct and guide your learning. There’s no such thing as “too ambitious” when it comes to a personal project – want to create the next Facebook, manually process credit cards, or keep track of millions of items in a warehouse? Well guess what, computers are great at almost every task imaginable and you’re learning how to apply their incredible power to the problems of your choice. Go to it!

Yes, your code will be completely terrible. Yes, you’ll probably grow bored or frustrated with the project and abandon it. Yes, the mere thought of these first steps will cause you great embarrassment in the future (or possibly present).

But using your code in a project will reveal aspects of your chosen language you’d probably never discover through a book or a tutorial. This is the sort of battle-hardening that you only really get on the field: you have to be in the trenches to know this stuff. For a Ruby example, you might have to figure out asynchronous jobs or how to create QR codes.

Again, Google is your best friend here. One of the greatest triumphs and most unfortunate realities about programming is that someone else has already done what you’re trying to do. You can learn quite a lot from their experiences and whatever code they’ve created. Don’t steal, that’s incredibly unethical. But feel free to fork!

Finally, always keep in mind your goals. You need to prove that you know your language, you have to have a track-record of using it in the real world, and you have to show you can work reasonably and responsibly with people. This is where you start building your resume for your future career, so keep in mind your objectives and work towards them.

5. Use it personally

You might find yourself doing this as you get even slightly proficient: the adage that when you have a hammer, everything looks like a nail is very true. But that’s not necessarily a bad thing!

When you create a program for yourself, don’t hoard it. Release it on GitHub and include excellent documentation and concise tests. This is true even for what you’d consider really minor pieces of code – it’d probably help someone, and having open-source code allows potential employers (and potential clients) to see what you do, what your code looks like, and your process for creating it. More than anything else, GitHub has become my go-to tool for evaluating potential candidates for a position.

I don’t mean to scare you away if you intend only to work on closed software, but having code out in the wild lets people get to know you and how you work. It speaks directly to the three objectives I mentioned at the beginning of this piece. You need to establish your bona fides, and using programming personally – and releasing the result into the world – will prove you know what you’re talking about

6. Use it professionally

At this point your code still probably isn’t anywhere near professional-caliber. Guess what? That’s fine! As long as you can still use it to do things – even if it takes you awhile, or the result is unpleasant, or there are a lot of “gotchas” for your poor users – you’re already a programmer. If you have a job, start trying to work coding into it.

When I was in college I had an internship where I was expected to go over huge CSV files by hand. It was a ridiculously unpleasant job… but a small amount of Ruby and a really ugly regular expression saved me an enormous amount of manual parsing and let me drill down to the problem spots immediately. When I gave the company my program, they in turn gave me a really stellar recommendation that started my career.

Unfortunately, right out of college, all that recommendation landed me was a job doing tech support, but I managed to use my bad programming abilities there, too! The company I was doing support for had a terrible process for dealing with data files – really big ones, gigabytes large. We’d go on-site, burn the files we needed to a DVD, take them back to the office, analyze them there to find out what was wrong, load the fixed files back onto another DVD, then go all the way back to the client.

I wasn’t a great programmer: in fact, I wouldn’t even say I was a particularly good one. But I made a little Rails site that accepted enormous file uploads, so we could just upload the file and someone at the home office would download it. It crashed all the time, it took an eternity to upload, and it had the jankiest login system you’d ever seen. But it saved me and all my coworkers a trip back and forth to the office… and it looked great on my resume when I decided to switch jobs.

7. Turn it into your profession

As your skills wax, you’ll likely want to start finding real, professional opportunities to exercise them. It might be time to start interviewing for a new job – or, at the very least, changing your existing role to officially incorporate more of your hard-won programming abilities.

Once you get to this point, the only way to improve more is to shift programming from a side-project to your full-time gig. Your resume will likely be fairly scant for an engineering position. This is okay. You aren’t looking to be a senior systems architect (yet): most likely you’ll get something at the bottom of the coding totem pole. But this is your first step into the real world of employable programming skills! Be proud that you’ve made it this far.

At this point in my career I worked at a very small Rails consultancy in Chicago’s River North neighborhood. The pay was low but the coworkers were extremely friendly, and some were even minor Rails celebrities. It was a great lily pad for a year.

Take the opportunity to learn from your coworkers. Many of them probably won’t be much better than you, which is also okay. Learn from their mistakes just as you learn from yours and always strive to better yourself. Keep reading books on programming, both your chosen language and general practice. For example, Smalltalk Best Practice Patterns is an invaluable programming resource even though you’re likely to never use Smalltalk.

And always keep in mind your goals: knowledge of your language, proof of having used it professionally, and demonstrated ability to work in a team. Consider how your work will look on your resume or what ammunition it will give you during an interview. And aalways be on the look-out for excellent opportunities for yourself. You’re the only one looking out for your own professional development, so take it seriously.

8. Move up in the world

One of the unfortunate realities of the job market is you’re much more likely to get a raise and better responsibilities by switching jobs. (It’s depressing but true.) Once you’ve put in your time as a beginner programmer, it’s time to spread your wings and fly to a company that has more challenges, better opportunities, and hopefully higher pay.

Briefly, I’d like to mention that you’ll probably experience some imposter syndrome as you interview around. Your new skills are likely to feel fairly unfinished, so doubting yourself as you look around – and wondering whether or not you can accomplish what prospective employers ask of you – is natural.

Here’s a little life pro tip: almost everyone suffers from the belief that they aren’t as competent as they are. A good attitude, great ability to learn, and accomplished programming skills will get you much further than you think. Don’t be afraid to take a chance on yourself. The likelihood you’ll fail is very tiny, and the probability you’ll succeed and learn a lot makes such a small risk worth it.

9. Challenge yourself

At this point this list is likely to become less useful for you, since, congratulations! You’re pretty well a programmer. But, if you’d like one piece of career advice from one programmer to another: continue to seek new and exciting challenges. Never rest on your laurels.

I mean this in a very practical way. As I mentioned, switching jobs is a great way to get a raise, but also it’ll give you new problems to tackle. Never stop building your resume and you’ll always have job security. More than that, continuing to grow your programming skills will provide a solid foundation for whatever you want to do with your life and provide intellectual stimulation for years to come.

And from here, your path is yours to follow. I’d love to know how it goes though, so drop me a line as you progress!