The wrong question: “I want to learn to code, what should I do?”
495west.com
495west.com
If you ask someone you know for advice, you aren't going to get the same thing you get if you ask Google, and you aren't even necessarily looking for the same thing. I was in exactly this situation earlier in the summer, when my brother asked me, after taking MIT's intro to programming class using Python, "What language should I learn next?". When he asked me that, he wasn't looking for the best possible answer from the best engineers who are posting to Stack Overflow, he was asking his brother, who might be able to help him when he stumbles, since I would likely recommend languages I know. I also know that he's not a CS student, he's studying urban planning, so I could reply with that understanding, and say that he might not need to learn another language at all, but instead could branch out with Python to hack on stuff he didn't get to work on in his CS and GIS classes, like web programming or games.
So no, don't just point them at Google. Tell them YOUR story about how you learned to program, and tell them what YOU would do differently. Tell them to learn a language that you know, so you can help them. Or a language you want to learn, so you can learn with them. I know that teaching yourself via Google can be extremely gratifying, and I think it works great for some people, myself included. However it doesn't work for everyone, and sometimes it's nice to have a personal connection like this: "I learned to program when X helped me to do Y."
edit
as I was writing this I was itching to reach for something I'd read before, and I remembered now that it was probably Norvig's "Teach Yourself Programming in Ten Years". There he suggests a way to choose a language: "Use your friends."
> Use your friends
These are good bits of advice. I would also encourage folks here to realize just how far programming is from what most people do all day. When you live in Windows XP all day, grew up with Windows, and spend your time talking with people about, in my case, medicine, and family in the evenings, programming isn't even on the periphery. It's on the other side of a freaking ocean. In the few occasions I've actually met a programmer and talked with them, it is a fantastically rare luxury, and I have learned to try and ask the best questions I can when I have those moments. Most don't want to "talk about work".
It can be a long (years) slog. In my case I had to figure out enough networking to be given an old CPU in exchange for setting up a router. Then figuring out how to burn and load a SuSE on it (10.3, with a very broken Zypper -- imagine suffering with that as your first distro when you don't even know if it's your fault and don't know anyone who can help). Then I had to figure out enough command line stuff to not be totally lost (and forget huge numbers of one-liners, not sure if they would be useful in the future). Then try about 10 different languages trying to find what works. Oh, did I mention learning Vi and Emacs with nothing but Google?
To anyone out there alone in the woods, trying to learn this on their own, I definitely recommend buying Lutz's Learning Python and read what of it you need to while working through Zed Shaw's Learn Python the Hard Way. And have questions ready in case you ever find yourself sitting next to a professional programmer on a bus in Okinawa.
I don't get a lot of chance to code, but I do enjoy scripting. Google is fantastic at answering questions when I know what it is I want to do. But it's terrible at preventing bad habits. "But this guy on this website said do -foo- and it works perfectly!", to which my mentor says "yuk yuk yuk yuk. do not do that. It does not scale. It relies on -bar-. And most importantly, it's revealed that you do not understand the concepts behind why you are doing -foo- and what it is you actually want to achieve".
I'm extremely fortunate in that I have access to a very good mentor who loves chewing the tech fat with me and genuinely loves sharing tech info with anyone at any level. I don't take enough time to take advantage of him, but I recognise that it's really rare to have someone who is both highly skilled, a good teacher, and motivated.
Google is great for the things that google is great at. But it does not take the place of a good mentor. I've read code sample after code sample and made a script do -foo-, but my mentor has picked up some subtely as to why I should be doing -bar- instead.
To some extent, it's reflected in the "RTFM" ideology. Man pages are great... if you already know what you're doing. If you're new to a concept, they vary from 'great' to 'fucking abysmal', as they take all sorts of knowledge for granted. Telling someone "just go learn from the documentation" is slightly evil, in my opinion. Yes, absolutely, there must be a culture where you go for the documentation early and often, but guidance and direction from experts is extremely important.
> Use your friends
These are good bits of advice. I would also encourage folks here to realize just how far programming is from what most people do all day.
It's interesting for me to read this thread because you could find/replace programming insert any number of other activities, like writing (the one I'm closest too), but music, photography, cooking, and many others probably apply too.
Theoretically, you could be a steppenwolfe and teach yourself how to write without any direct interaction from others, or others from the Internet hordes. But it would be so damn difficult and time consuming that you'd be better off finding a friend—any friend—who is already at least moderately proficient and getting her to read your stuff.
I'm a grad student in English lit, so when I tell people I spend a lot of time writing and they reply by saying, "I write" or "I want to write better" and are curious about what's going on, I'll talk about my experience and what I've done and so on. If they want me to read their stuff I will, provided they pass the (very low) barriers described here: http://jseliger.com/2010/10/02/how-to-get-your-professors%E2... .
The mentor / mentee or teacher / student paradigm exists for a reason. Yeah, a lot of its official manifestations in the school system don't work real well, but there's a reason it's there.
The answer to every question is out there. Engineers know that better than anyone. Even the best engineers ask Google questions all the time. The biggest difference between you and an engineer is the mindset.
After you have the right mindset, here is how the execution will go:
You start asking Google questions, which leads you to all sorts of resources on StackExchange and Quora and a million blogs and other websites. You find twelve tutorials on HTML and nine on CSS, and you bounce around between them to find the best ones
Unless you're a pretty amazing auto-didact this is terrible advice. The author posits his advice as learning how to learn on your own (which is good to a certain degree), but what this advice requires is to first become an expert in querying Google and not only sorting results but going through all the different recommendations? How would someone without programming experience effectively evaluate which are 'the best ones' from the spam and the outright wrong articles?
Over the last few years < 10 people have asked me "how would i become a programmer" or "what's the best way to learn SQL", or something similar. The first questions I ask are 'what do you want to do' and 'why do you want to be a programmer'.
I'd never really considered "go google some keywords, read everything on the first page, and let me know how that works out for you"
Be honest why you want to get out of it make a plan/schedule for achievables, get focused and get started! =)
Suppose the person hasn't already asked this question to google:
Take the opportunity to provide them some good resources. Teach them some basics. Teach them how to use google well to find their own resources. Here's the kicker - when people ask questions like this, maybe they aren't autodidacts, maybe they just need some support getting over the fear of the unknown, maybe they just want feedback from someone who actually knows (something JFGI doesn't provide too well...)
Now suppose they have:
The course of action is surprisingly similar, but ask them what they've already learned and what the confusion is before showing them stuff. Perhaps the person asking has done this but doesn't know where to start -- there is a lot of conflicting and bad advice on the web. Perhaps they don't have the framework to filter things that are and aren't related. Maybe they don't even know what they actually want to do -- there have been plenty of times I've asked someone how to $X only to discover that I really wanted to do $Y that I didn't even know about (even though Google will happily provide 100000 how to $X guides).
Half of understanding anything is understanding the vocabulary surrounding it. If a person doesn't know the vocabulary, they can't just google it. (Also, those of us who spend all day programming and basically live in front of the computer at places like HN have a surprisingly deep understanding of who to trust and who not to trust and apply these filters without even realizing it when scouring google results, as well as a good social network of chatrooms and twitter etc to ask for pointers at, which a noob may well be trying to establish when asking the question).
Having a personal tutor can accelerate the learning process dramatically. Even if you can teach yourself, you can learn faster if someone just tells you the answer. But, you can also just do it. And, the process will teach you the benefits of being precise with your searches and that if you know to use the work "toggle" rather than "switch back and forth", you'll get to the answer faster next time (though, you'll get to it both ways and you'll learn a lot while you're reading).
I was fortunate enough to have great engineers accelerate my learning but I also did a lot on my own and that process gave me a deeper understanding and taught me the right mindset to now continue improving on my own forever.
To get to a point where googling and reading can be really effective (for most people... there are some who can just naturally pick something up) it helps to have someone work one-on-one with the confusion that may otherwise be insurmountable. Not just accelerate learning, but in fact, enable it at all.
There is a very real problem in teaching at all levels where research will show that using new methods and alternate course progressions help students get it faster, but the experts in the subject matter will veto it because it is not the way they learned or presents things in a way that seems too round-about from the expert point of view -- ignoring the difference between those who have the framework and those who need to get the framework.
Get started and build something. Stumbling and not knowing already but figuring it out are part of the process and are valuable skills.
Also the whole buy a mac thing. It never ceases to amaze me how many people completely fail to realize how much privilege it takes to have the money to purchase a mac. Or the time it can take to save the money. When someone can get started on things that are a fraction of the cost.
You can get a cheap office depot or walmart laptop and an entire year of linode or whatever vps you like for the cost of a used mac
Please tell me where I can get a $350 mac. I want one, seriously. And not a mini.
You're going to want a laptop/notebook so you can go to hackdays / meetups to get to know like minded people and learn.
"You buy a Mac because you’re embarrassed that you ever used anything else."
The assumption there is that using a Mac will make you orders of magnitude more productive as an engineer. Possibly, if you're comparing it to Windows, but that's a real stretch for Linux, particularly given the level of support online and cost (likely $0, if you can snag an old PC).Although there's the argument that that's likely what they're already used to, and trying to learn two things at once is probably going to stunt their growth.
A pity, since most of the rest of the article was spot-on.
The idea of cultivating a self starter, motivated to research mindset is good, for people halfway through the beginner stage. The idea that a complete beginner even knows how to "bounce around between [different search results] to find the best ones" is silly, even starting with generally high quality content like quora and stack overflow. It leads people to learn the easiest things rather than walking the line between motivation through fast results and pushing themselves to learn good techniques and challenging subjects. There is a reason that good educators, who design curricula walking this line, are respected.
This type of "ignore the so called 'experts' and absorb the lowest common denominator crap soup of online programming advice" learning plan is doomed. The best case is that it wastes the persons time and saps their motivation. The probable case is that they end up learning a large number of bad habits, do things like reimplement a bubble sort based on advice from the comments on the php documentation site and forever end up as hack intermediate coders.
People asking for this kind of advice want some guidelines from people who've done this before and have perspective on good paths to learning and how to avoid mistakes that no one needs to repeat.
I am a proponent of branching out early in your programming career to learn different languages, toolsets and problem domains because it makes you a better programmer. But only once you've got a base level of knowledge as to how coding works and even then they will need advice on what other paths to take to help the most.
Agree though that learning best practices is difficult without some guidance and working with others.
Just not at the beginning.
Maybe that's because I'm a CS major and have dealt with so many smart people who's learning paths were derailed by the self taught plan advocated here. They found a local maxima (in my experience it's often procedural php or eclipse driven java) and won't move off of it because it seems impossible and the benefit is intangible and by definition difficult for them to understand. Pretty perfectly described by PG's Blub Paradox essay.
There's a reason the "standing on the shoulders of giants" metaphor is so prevalent in the programming world.
This article promotes introversion more than its own point of "don't ask, do", asking Mr. Computer isn't much different than asking a person. If I ask someone how to get started doing X; I'm not fucking asking permission. I'm looking for some resources, a knowledgeable person is a much better at steering a beginner than a search engine.
For some reason, you're equating drive with choice of resource. You're answering "RTFM" when the question is "Wheres the manual?" I get that your point centers on leaning on others vs figuring it out on your own, but you thoroughly overshot.
Bad answers can be ad-ridden, no-content crap, bikeshedding pundits, obsolete documentation, overkill solutions, corporate labyrinth websites selling overkill solutions, incomplete fragmented mailing list archives, or material way too dense and advanced to be consumed without guidance. But they lead to frustration and often to more bad questions.
Sometimes the answers aren't bad, they're just decidedly suboptimal. If your friend wanted to make a website, and you left it up to them to go google the answer, there's a good chance they'll end up using GoDaddy.
Chances are if you see this question, it means someone thinks you, either individually or as part of some community, will give them better answers than a machine will.
You can give them a huge leg up by giving them a programming vocabulary to help them on their way.
There's that famous saying about once you have a name for something the problem is pretty much solved...
You can also help them heaps by telling them what's important and what is not important. Most books on programming languages etc start with a whole bunch of stuff they should probably put into the basket of "computer trivia I don't need to know yet"...
1) Dreamers. They have something that nobody will do for them, so they're going to see how easy it is to do for themselves. They won't make it.
2) Doers. They don't have a single project. They have multiple projects. The projects are swimming in their head and they need to get them out. They just need a nudge in the right direction, but more help is almost always better.
Notice that neither of them are asking the wrong question. It's just a matter of follow-through. Given even a tiny bit of direction, the doers will make it there... But you can't start walking until you have some idea where the destination is. That's all they want.
The aptitude of a programmer is also the same that allows him to self-learn much of the art of programming by himself.
If they have an answer to the first question, I can work backwards with them to narrow it down to tools and languages that possibly make sense. Going with Python is a generic and common choice because there aren't many things you can't do in Python.
If they don't have an answer, it might not be a case lost. Some people truly need just about anything to work on, in order to impose a reason to start tinkering with programming. However, usually it's about overcoming fear for programming but in that case they probably won't make it, either.
For the rest 99% of people I just mumble something and point vaguely to teaching yourself to program in ten years.
As a person who has just recently undertaken the skill of programming, I (personally) feel that Google isn't much help in the beginning. As someone mentioned below, you can't ask what you don't know. Nor can you trust every bit of advice dished out in Google search results. If you rely on Google, you'll likely get 100 competing views on everything under the sun, which often leads to analysis paralysis or just sheer overwhelm.
As much as some people might tire of hearing "I want to learn to code, what should I do?", it's a question that I'd hope people aren't ashamed to ask, because It's an honest question. Pointing them to Google and advising them to figure it out just doesn't help them in any concrete way. I'm new to programming, but I'll never get sick of helping people learn the things that I already know- in fact I LOVE doing just that.
As a beginner, it's comforting to know that a real person is helping you along and not just an anonymous page picked out of the SERPs.
Often, we would have issues with client servers, and i would spend hours trying to find the root cause of the problem, with not too much luck. When i would pass the job onto him, he'd figure out the cause of the problem in a much shorter amount of time, and therefore come to conclusion for a possible solution very quickly and with some conviction.
I always thought he was a complete genius, and wish that i was as clever and intelligent as him, and felt a little cheated by the universe that i hadnt been blessed with such great IT skills, especially since i had great passion for IT.
Its only after much frustration, that i learned that the only thing that differed between he and i was his approach. Whereas i would check the virus state, and processor usage and look for anything suspect on the desktop, he would check the event logs and then look up the error codes at the microsoft knowledgebase.
One i started taking the same approach as he, i found myself fixing problems even faster than him and coming up with even better solutions to the problem (all the while experiencing much lesser stress).
When i decided to learn programming , i observed the same thing. His approach to attacking programming problems was different to mine, and now i am learning to assess the problems in the same way as him.
I've also seen this in my cousin. He starts a project, and takes one step at a time, and breaks the larger problem done, all the while telling himself that there is an answer for each component problem he faces.
I am trying to foster the same mindset now, and this blog post is an inspiration for that. Bottom line is, the approach is more important than existing skill set.
What I took away from the experience is to jump right in to the most advanced stage possible and work your way back to understanding. Baby steps only serve to hide the big picture and ultimately hinder your ability to understand. This is something I have applied to all of my learning since that day and I feel it has served me well. I always struggled in a formal education setting and I found out why: They teach backwards.
When you are learning to cook you don't mix flour and water together and look at the scientific properties that cause them to interact the way they do. No, you find a delicious recipe and prepare the entire dish. Each time you subsequently make it you add a twist to see how it affects the overall taste. Eventually you start to increase your understanding how the pieces fit together and can begin to come up with new combinations of your own. You will probably want to know why flour and water behave the way they do, but that comes later.
In my opinion, the way to learn how to program is to start with a recipe (i.e. source code). The rise of open source makes that easy. Make some small changes of your own. Break it down to understand why the original author did what he did. Once you are armed with the basics, you can start to apply that knowledge to meaningful Google searches.
If someone asks for help and this is the first thing you say, you're already thinking about it the wrong way.
What is their background? Their aptitude? Why do they want to learn? How do they learn best? Are their expectations reasonable? In short, what would be the smartest way to help this individual? One suboptimal way is to post essentially a multi-paragraph lmgtfy and assume that everybody will hound down the knowledge they need with the same geeky obsessiveness you would.
Edit: I meant to mention that remark about getting a Mac. "Embarrassed" to have considered anything else? I'm a big Mac fan (Cocoa developer) but that is ridiculous enough that I'm tempted to see the whole post as a joke.
I wrote about this last month, in fact:
http://blog.codelesson.com/why-learn-by-google-is-a-mistake/
Also as a beginner it is often very difficult to separate good from bad advice, so it can make a lot of sense to ask even simple questions in e.g. an IRC channel even if you could find an answer with Google.
If you can't teach yourself and 'self start' - you're not going to be able to get very far.
The author presumes that everyone interested in coding should have a high level of confidence already. I disagree, and feel that if someone wants to learn about a subject, asking questions about that subject is exactly what they should be doing.
There are so many different paths you could take when you set out on this quest that without a little guidance, you could waste a lot of time. Save learning to be an independent hacker for lesson two.
I've learnt to program long before Google existed and I never had this question. I was just learning, whenever I had a chance: reading articles, buying books.
Programming is one of the few subjects where it is possible to learn so much of it simply by searching online and practicing by yourself.
Anyone used http://twitter.github.com/bootstrap/? Seems like a good starting point for someone wanting to get going without creating your own CSS classes.
Nice, clean design and code. Think it will be perfect for mockups and user flow design. Going to give it bash, will report back if anyone is interested.