I don’t know anything about programming

I’ve been spend­ing a lot of time on Kod­ing late­ly. It’s been called Face­book for pro­gram­mers, because it’s a com­bined activ­i­ty feed and vir­tu­al machine that you can use for devel­op­ment. Out­side of spe­cif­ic ques­tions on how to do X in Y, how to con­nect using SSH and oth­er tech­ni­cal ques­tions, the most com­mon ques­tion is the fol­low­ing:

I don’t know any­thing about pro­gram­ming, where should I start?

It’s always hard to answer that ques­tion. In the end of this arti­cle I’m going to be link­ing to a few resources that I think are good, but the main por­tion is going to be about some­thing almost as impor­tant as resources: The mind­set.

Why do you want to learn?

This is not intend­ed as a way to dis­cour­age you from learn­ing, but the first ques­tion to answer is going to be why, because the why will inform the how and what. First, take your ambi­tions down a step. Don’t think about it as I want to build the next Face­book, or I want to build the next iTunes or even I want to build the next Flap­py Birds (or whatever’s cool in app games right now), think of it in small­er terms:

Face­book
Web programming/developing
iTunes
Most like­ly instal­lable soft­ware
Flap­py Birds
Android or iPhone pro­gram­ming

What

Hav­ing an idea on the scope of the why, you can con­sid­er the what, as I stat­ed above. The lines between web devel­op­ment and “oth­er” devel­op­ment is get­ting fair­ly blurred, where one of the key dif­fer­ences lies in what lan­guages you need to focus on.

If you’re want­i­ng to do soft­ware like Microsoft Office, or Pho­to­shop, or iTunes, you’re going to need to work very close to indi­vid­ual oper­at­ing sys­tems. You’ll need to have more under­stand­ing of the archi­tec­tur­al struc­ture of a com­put­er than the oth­er two. Rec­om­mend­ed lan­guages: Python, C++, Ruby, Java, C#.

If you’re want­i­ng to do apps (dis­claimer, not my forte), it’s both eas­i­er and hard­er than writ­ing soft­ware. You will know the oper­at­ing sys­tem, but it’s going to be dif­fer­ent bases depend­ing on if you’re sup­port­ing iPhones, Androids, or both. Rec­om­mend­ed lan­guages: Objec­tive-C (iPhone), Java (Android).

Web development

Final­ly, web devel­op­ment. You’re not going to need to wor­ry too much about the hard­ware of client’s com­put­ers (though per­for­mance is still an issue), but you are going to need to wor­ry about cross-brows­er com­pat­i­bil­i­ty. As a quick but impor­tant note before I con­tin­ue: a site does not need to look iden­ti­cal in all browsers. It should be func­tion­al, but it does not need to look iden­ti­cal. Web devel­op­ment is also very mul­ti­func­tion­al, in the sense that you’ll most like­ly need to learn sev­er­al lan­guages depend­ing on where in the stack you are. You can read this arti­cle for a deep­er dis­cus­sion of the con­cepts I’m intro­duc­ing here.

Now, a quick dis­claimer: If your thoughts on this is clos­er to “but … I just want to get a page up and run­ning imme­di­ate­ly!”, you’re best off going with Word­Press, either host­ed on WordPress.com or using a web hotel of your choice to host it from WordPress.org. To build themes/plugins for Word­Press, you’ll need the Front-end infor­ma­tion from below and PHP as a serv­er-side lan­guage. This is not to dis­miss peo­ple who wants a quick page up, but rather that if you want some­thing up and run­ning quick, it is bet­ter to use some­thing that works (ish) rather than try­ing to fig­ure out how to build it your­self.

Front-end

To build what is vis­i­ble to users, you’ll need (at a min­i­mum) HTML (Hyper­Text Markup Lan­guage) and CSS (Cas­cad­ing Style Sheets). HTML describes/marks up what indi­vid­ual ele­ments are (this is a link that goes here, that’s a head­er, this is a list), CSS gives direc­tions on how the page should be dis­played (links should be blue, head­ers should be bold Geor­gia, lists should use a square bul­let point). If you’re also want­i­ng it to do things, you need to use JavaScript (if you focus on this link it shows a tooltip, if you acti­vate on this head­er it dis­plays that para­graph, if you acti­vate this list item it shows a sub­list). How­ev­er, all of these things are hard­cod­ed into the sys­tem (in some way) if you don’t com­mu­ni­cate with a serv­er.

Backend

Note: In my arti­cle above I refer to this as Mid­dle­ware, but in this I will use the more com­mon­ly used term Back­end to describe both of them.

Backend/server is where data is trans­formed into a front-end. Even if you aren’t going to touch the front-end, you need to have a work­ing knowl­edge of HTML and CSS, or at least CSS selec­tors. This is because either you will work with some­one who gives you a mock­up in HTML/CSS that your code needs to pro­duce, or you will need to come up with at least part of what is being pro­duced.

You always need to have a work­ing knowl­edge of HTML, CSS and best prac­tices, no mat­ter if you want to do back­end or front-end devel­op­ment.

For back­end pro­gram­ming, what language(s) you focus on is depen­dant on a lot of things. If you’re need­ing to rely on shared host­ing (most com­mon­ly if you’re on a tighter bud­get), the lan­guage you are most like­ly to find sup­port­ed is PHP. If you’re just work­ing for your­self and want mar­ketable skills, prob­a­bly PHP, Python (with Djan­go), Node­JS or Ruby (on Rails). Per­son­al­ly I rec­om­mend against C# or Java for serv­er-side lan­guages for web­pages.

To host things oth­er than PHP (though PHP can be host­ed through it as well — all things but pure HTML-pages can), I rec­om­mend Heroku. If you’re just exper­i­ment­ing but need a devel­op­ment serv­er where you can see progress, I strong­ly rec­om­mend Kod­ing.

Finally, the how

So, now you’re hope­ful­ly hav­ing an idea on what you’re want­i­ng to learn. To recap:

If you want to build …

  • soft­ware that’s on the actu­al com­put­er: learn Python, C++, Ruby, Java or C#
  • apps for smartphones/tablets: learn Objec­tive-C (iPhone) and/or Java (Android)
  • web sites/applications: learn HTML & CSS; JavaScript; PHP, Python (with Djan­go), Node­JS or Ruby (on Rails)
  • noth­ing in par­tic­u­lar right now, just want to learn: learn Python or Node­JS

Final thoughts on how

Find your­self a project. It doesn’t need to be a large one (in fact, in the begin­ning, it’s bet­ter to go small), but it needs to solve a prob­lem. Prob­lems can be any­thing from “I can’t remem­ber who bor­rowed my DVDs”, to “I’d love to con­nect to Google Cal­en­dars API to have reminders in the morn­ing”. I say that it needs to solve a prob­lem because that makes it per­son­al and moti­va­tion­al. In the begin­ning, keep a bit of an eye on best prac­tices, code styles, etc, but more than any­thing: Learn to think.

Resources

CodeAcademy

You can learn …

  • Python
  • HTML/CSS
  • PHP
  • JavaScript
  • Ruby
  • how to use APIs

TutsPlus

Has arti­cles and screen­casts in quite a few dif­fer­ent areas, both pre­mi­um and free.

It’s a good idea to keep an eye on when it was post­ed and if there’s com­ments, since occa­sion­al­ly the infor­ma­tion gets changed, since they often report on very new things.

PythonTurtle

An adorable way to learn Python. It is an inter­ac­tive tuto­r­i­al that’s easy enough for chil­dren to use, and advanced enough that you don’t feel like a child using it.

Rails Girls Tutorials

Cre­at­ed to be a good way to learn Ruby on Rails in work­shops, there’s quite a lot of nice mate­r­i­al to absorb. The Rails Girls App is a good place to start.

Getting started with Github

I did not touch on Git or Github in the arti­cle, but I want to add it here. Git is a way to ver­sion con­trol your code, which gives you a big­ger free­dom to play around with it with­out need­ing to wor­ry as much about los­ing work. Github is a place to host the code, and quite a few open source projects are on Github.


For the moment comments are not enabled, but feel free to reach out on Twitter.