01 March 2016

So, You're Thinking About Programming

Advice from another adult beginner who is only slightly ahead of you in the Suzuki violin books, but who is enjoying her adult music lessons over at the YMCA just fine.

It almost feels cliché to say it at this point, but it seems like everyone has been doing software these days. (Everyone has been doing emails.) As someone who not so unrecently took the plunge into software development, I’ve been getting a lot of questions from people who are considering doing the same. If that’s you, this is my advice.

So yes, you’re thinking about programming. That’s awesome! It’s really a great gig. It can be super satisfying and creative and interesting and lucrative. Lots of opportunity in that sector. Yada yada. You should definitely do it. (Seriously though, do eet!) That is, if you really want to do it – which brings me to my first piece of advice:

Do not decide that you’re going to do this right now.

Especially if you don’t have any experience programming in college/whatever, you owe it to yourself to like give yourself a little breathing room here to figure out if this is really the right move for you. And like, also a little room for the possibility that this is not at all the right move for you. I think a lot of people come to programming these days from something else that they hate. Bootcamps’ marketing departments do a great job of encouraging this escapist, everything-will-be-awesome-if-you-just-give-us-money-and-come-here-for-eight-weeks mentality around their programs. But the truth is, programming could turn out to be a terrible career choice for you if your heart’s not in it; like possibly worse than that boring job you have now.

“Why is that?” you ask. Well for one thing, it’s hard. And, at least in my limited experience, it keeps being hard. My co-worker recently pointed out that the “development” in “software development” implies that you’re always developing something that never existed before, meaning that you’re always reaching into new conceptual territory. So the idea isn’t that you’re going to acquire a skillset and use it to build things over and over again, rather it’s that you’re going to acquire the skillset of acquiring new skillsets, and use that to continually do stuff you’ve never done before. You get me?

So it’s way more about continually dealing with not knowing stuff (i.e. humility, learning), than about knowing stuff and being like, “Wow, so cool, rad, this is awesome, I’m awesome.”

I was a musician before I was a programmer, so I kind of tend to see starting out in programming in relation to starting a new musical instrument — just like there are crazy virtuoso musicians who’ve been at it since birth, so too are there crazy virtuoso programmers who have been at it since Apple’s logo had a raindow on it. And there’s like a similar amount of ground to cover between not being good at [violin|programming] and being good at [violin|programming].

So let’s actually just run with this comparison and reframe this discussion a little bit — imagine you woke up tomorrow morning and decided that you wanted to become a professional violinist. That’s awesome! Really cool. But making that happen means that you’re going to have to go through a long period where you really suck at playing the violin. Like really suck. And probably in your lifetime you might not really make it to the level of someone who’s been doing it since they were like 4 or 5.

I think starting programming is a lot like being an adult beginner in music lessons. Except the only difference is that there is no surplus of talented violinist roles in our economy, but there is such a surplus of programming roles for the time being. So the playing field is advantageous for people who want to pick up a laptop and start screeching out their first little Odes to Code.

So but musical analogies aside, at the end of the day, if it turns out that programming is not very interesting to you in the first place, then you might be talking about trading a boring and (maybe) manageable job for a boring and very difficult one that you’re necessarily going to suck at for a very long time and will have to work and stuggle constantly to get better at. Maybe not the best trade.

So but the point is, for now, just have an open mind and see how much serotonin gets released in your brain when you get your first tic-tac-toe game to run. The pressure’s off – have some fun with it!

And here’s how I suggest having that fun:

1. Pick a programming language to focus on. Unless you have a pretty clear picture of what you want to do/where you want to work, this will be a pretty arbitrary decision. Try not to get too hung up on trying to pick the right language. I think it’s helpful to limit yourself to one language while you’re getting your bearings, but all of the concepts you’ll be learning are transferable between languages, so in no way will you be like locking yourself into anything. Actually, the opposite is true – learning your first programming language will make learning a second one way easier. If you’re having trouble deciding, let the following Harry Potter Sorting Hat Quiz™ guide your decision:

With which of the following Hogwarts houses do you most closely identify?

a) Slytherin

b) Hufflepuff

c) Ravenclaw

d) What’s that?

Results

You answered… Go with:
a. Javascript
b. Ruby
c. Python
d. PHP

2. Create a free account over at Codecademy. Complete the tracks for the following topics:

There are also some fun activities on Codecademy, so feel free to take detours. Remember, the goal here is to have fun. Try to commit an hour or two to this each day until you’re finished if you can.

3. Create an account over at meetup.com. Join some groups for the language you chose in Step 1, as well as any others that interest you. Start going to meetups every week. Force yourself to talk to people, even if that’s not your thing. This is an opportunity to take the temperature of the community you’re thinking about joining. Ask around about learning resources, get peoples’ takes on bootcamps in your area (if that’s something you’re considering), etc. Also, if you’re super stuck on something (e.g. installing Rails), there’s a good chance that someone here can help you.


*** Pause. Ask yourself: “Do I like this? Am I having fun?” ***


If you answered yes, then the fun is over!

No, I keed you. However…

4. The next step is to turn up the resistence a little bit on your self study. I would suggest getting a paid subscription to either Treehouse or Codeschool, or both. Whereas codecademy’s a great way to hit the ground running, these sites provide a slightly more in-depth combination of video lectures and exercises. After signing up, go through the course material offered for the language you’ve chosen, as well as all of the topics listed in Step 2. There will be some redundancy here, but that’s actually a good thing. Really binge on these resources.

5. The next step is to tackle a framework. “What’s a framework?” you ask. If a programming language is like a big bin of general-purpose lego pieces, a framework is like a specific lego set that is intended to build a specific thing, e.g. a website.

lego-kwik-e-mart

So, now that you have a basic grasp of a programming language under your belt, you’re going to start learning the corresponding web framework, which is a collection of tools written in that language that is used to build websites. Follow the appropriate link below to get started.

Language Framework More info
Javascript Meteor.js Start here
Ruby Rails Start here
Python Django Start here
PHP Laravel(?) Start here

Definitely also start going to meetups for the framework you’re learning. Getting a framework installed can be a nightmare, so do your best to figure things out yourself (Google is your friend), but limit the amount of time you spend chasing around configuration errors (to like a few hours). If you’re really stuck on something, take a break. Ask the internet (e.g. post on a forum), or go to a meetup and ask someone there. While you’re waiting for help, you can always work on something else. Oh, and the website you subscribed to in Step 4 probably has some content related to your framework, so definitely go through those lectures as well.

By the end of this stage, you should have a framework installed on your computer and should have made some basic website (following a tutorial) that can save and delete stuff from a database (like a microblog or a todo list). Again, redundancy is your friend, so if you find a second “Getting Started” tutorial for your framework, do it! Having multiple authors’ commentaries will help reenforce all of the new concepts you’re learning.


*** Pause. Ask yourself: “Even though this is frustrating sometimes and stuff’s often broken, can I still see myself making a career out of perpetually dealing with stuff being broken like this?” ***


If your answered yes, then shit’s about to get real. I suggest you…

6. Partially quit your job. If you’re digging into Codeschool/Treehouse, going to meetups, and messing around with a framework and you’re still completely stoked on this idea, then you need to think about freeing up some more time in your schedule to stare blankly at stack traces in the console.

If it’s at all possible to cover your expenses working part time, that’s a great option. Start to treat programming like a second job – go to a coffeeshop and do it for four hours/day, every day. You shouldn’t have any trouble coming up with topics to study – figure out how the unix file system works, chose a text editor and start trying to master all its hotkeys, set up a cute bash prompt. :snail:

This step (not enrolling in a bootcamp) should be where the dramatic leap of faith takes place. Free up time for this by letting some other things go. Start thinking of yourself as a programmer and working on this all the time. Remember, even when you’re stuck, you’re learning. Even when it feels like you’re not moving, you are. Don’t get frustrated – you’ve got this!

7. Decide whether to take the bootcamp route or to go it alone.

Let’s start this section off with a simple fact: Bootcamps are businesses. That means that no matter how approachable they seem, or much eye contact they make, or how often they tell you that they love you, they don’t necessarily have your best interests in mind. So just keep that filed away under “corporate realness” in the back of your head.

That said, what bootcamps do have going for them is that they can help you cover a ton of ground quickly. They do this by taking care of the parts of programming that would be the costliest/least beneficial to you at this point in your programming career (i.e. setting up your environment and dealing with configuration problems) and then by force feeding you a ton of material about a specific language and framework in a short period of time, all with convenient, 24-hour roadside assistance. You’re paying for the benefit of not getting stuck for too long on anything. And also for a nice big buffet of curated curriculum (so that you never have to stop and wonder, “Is this what I should be reading? Is this what I should be doing?”)

Another way they function is that they can help you place a significant wager on your own success as a programmer. Once you quit your job and give them a big old chunk of your savings account, it’s sort of imperitive that you slog through it and make it out the other end.

As much as they will try to appeal to your imagination with romanticized notions of progress and success whilst cloaking some very real risks with placement guarantees, deciding to enroll in a bootcamp should be a cold, precise, financial decision. You’re paying for a service. Be skeptical of job promises — you’re going to have to hustle to find (and keep) a job, and you’re going to be putting a ton of time and money on the line until you do. This proposition is anything but riskless. Proceed intelligently. (Oh, and just remember, if you do get a placement through a bootcamp, they usually take a big old bite out of your first year’s salary as a thank you to themselves.)

So be skeptical, ask for a tours, kick the tires. Remember that this is just a vehicle to transport you from point A to point B at lightning speed. You can actually cover a lot of ground just fine on your own – in fact, you’ll be able to make the most out of the performance boost offered by a bootcamp if you spend three to six months mastering the basics on your own beforehand. Expect that when you reach point B, you will still more or less be on your own, and that you will have assumed a ton of of risk along the way.

Oh, and although this might relate particularly to the program attended, I think it’s probably generalizable, and bears mentioning – namely, the intensity was unlike anything I’d experienced kindergarten through college. It was 12-hour days, six to seven days/week, working your brain to the bone. (Stem?) Whatever. The point is, it felt like having finals week for twice the usual number of courses for two months straight. This isn’t meant to discourage you – some people thrive in intense situations – but intense it will be.

And maybe you decide the bootcamp thing is not for you. Maybe you’d rather take your time, maybe you’d rather save your money. It’s totally possible to get into programming without a bootcamp. It’s just maybe a little harder and less supported. And it might take longer. (I’m guessing.) But people do it every day. (Everyone has been doing software.)

The point is, in the absense of a large cash deposit, you may need to perform a little extra legwork to keep your dream tethered to reality. But if you can keep your cool when things break, and find some support when you’re really stuck, and stick to a super strict part-time (or even full-time) treat-it-like-a-job schedule, then there are free resources available to help you learn almost anything tech-related under the sun. (The internet sun.) (Under the sun of the internet.)

That’s all I’ve got. If anyone’s still reading this, get out there and make some noise!

:violin: