I think the assumption here is that if someone asks you, “I want to learn to code, what should I do?” they know you already, since if they were asking the anonymous internet hordes, they're already basically doing what this post suggests.
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."
Exactly. This is the worst advice I have seen on entering coding, maybe ever:
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"
> don't just point them at Google. Tell them YOUR story ... and .. what YOU would do differently ...
> 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.
Absolutely, there is a major difference between 'ask Google' and 'ask a mentor'.
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.
> don't just point them at Google. Tell them YOUR story ... and .. what YOU would do differently ...
> 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.
I feel I routinely go the extra mile to make friends who know what I'm interested in. I go to meetups, I moved to a city where there are a lot of hackers, I participate in forums like this. I've kept myself engaged in the few software-related projects I've had to opportunity to be involved in, and those are some of my closest friends. I try to ask good questions. But there are no programmers in either of the buildings I work in. I couldn't make lunch buddies or work-out buddies with a hacker if I tried. Dentist? Doctor? Sure. Hacker, not so much. Don't get me wrong, I've got great work-out buddies, and by the Stallman definition, they're hackers, but not the computational sort.
It is a question of character and what the person wants to get out of next learned language. Sometimes people want to impress peers, get a raise - reasons can be many. Honesty is important factor here. Sometimes there's the superior coder in the peer group, it may worth the time to ask him/her whatever is the neat language to learn, so in process there is someone to discuss peculiar bits of whatever the person is learning.
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).
That is the point of this post, to get them over the fear, to give them the confidence to do it.
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.
I propose that we are running into a very studied phenomenon in teaching: expert knowledge vs novice knowledge. The expert sees stuff as simple and straight-forward that causes confusion in the novice -- because the novice doesn't fully have the framework with which to understand in place yet.
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.
Agree with most of it except its not that thats the wrong question its just that the answer is to try.
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
"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.
It doesn't take that much privilege to save $350 within a reasonable amount of time. It's probably unreasonable if you're in poverty, but even much of the lower class in America has things like TVs that cost in excess of the price of a Mac.
I just looked on Craigslist and found a few Mac laptops for under $400. Most were lousy in some way, but a few were legitimately just older models that people didn't want anymore (e.g. white MacBooks). But I wouldn't recommend a laptop if you're just this side of destitute. They're generally not as good a value on the low end.
The only difference between the advice given and the strawman argued against is giving the urls of search engines to find tutorials and answer questions rather than giving specific resources.
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.
That process of drinking the soup and learning what to swallow and what to spit out is an incredible learning experience. That is a skill and comes from trial and error, reading everything, and trying things. And you are training yourself in that process and mindset of learning on your own.
Agree though that learning best practices is difficult without some guidance and working with others.
I agree, I think it's an absolutely necessary learning experience.
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.
I don't get it. Is your point Don't ask a person, ask google?
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.
The problem with using google to answer an open-ended question like this is that it's very hard to sort the results. And it's not just the first question, that question will lead to more questions and you will waste an enormous amount of time asking lots of wrong questions and getting lots of bad answers.
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.
Something I've found in getting people started in this direction is that they don't know what words to use when googling for their problem.
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"...
If someone asks that question, they're in 1 of 2 categories:
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.
I always answer this question by asking back what it is that they want to make, and also if they're willing to dig for most of the answers themselves because programming is, essentially, solving for an unknown alone.
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.
While I get the gist of this post, it seems to exit the gate by contradicting itself. Asking Google is no different than asking "someone". After all, Google results are just a bunch of "someones" competing for your attention.
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.
I found this advice to be useful and inspiring. It reminds me of when i first started out in my present business. We originally started as an IT support company. My IT skills were just average while my business partner was very highly skilled in IT.
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.
I love this post and really identify with it, especially, "That mindset separates people who do from people who don’t." I've always been a person to do, but find it's more common to come across people who allow fear to prevent them from doing. They see the obstacles, the worst case scenarios, never the potential, the opportunities or if they see them, they seem too difficult to reach. I agree that it's mindset that distinguishes the leaders from the followers. Keep on leadin'!
As someone who has always wanted to learn to code, but never set the time aside to teach myself I resonated with this kick in the pants. At some point you have to stop making excuses and do it. I might not agree that google will teach everyone, but there are enough resources out there (friends, family, iTunes U, tutorials etc) that the real deciding factor is whether you dive in or spend your time asking everyone in the pool if the water is cold.
I learned to program when a misconfigured web server spit out the source code to the web application I was trying to use. At first it all looked like gobbledygook (it was written in Perl), but I was ultimately intrigued. The more I observed it, the more it started to make sense. I started by making modifications and testing their results and eventually had enough knowledge to build my own, albeit simple, application. It all snowballed from there.
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 you want to learn to code and build stuff and you’re starting by asking someone else what you should do, you’re already thinking about it the wrong way.
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.
While this advice makes sense in most cases it is just as important to learn where, how, whom and when to ask.
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.
You can learn to code on your own, but it will probably take you a lot longer then going and hiring a tutor or even just taking a class. This "Teach yourself whatever the hell you want on Google" advice is about the worst advice I have ever read. I guess I could tell my cousin that he can teach himself how to be a doctor by watching Youtube videos and playing Operation, But I wouldn't let him be my doctor.
Actually, I think that is the perfect question to ask. Knowing what you want to learn about is a huge step in the right direction.
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.
Asking questions is good. Showing initiative is good. Getting perceptive is good. These are the qualities you want to see in people. Embrace them. Encourage it.
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.
Google for answers, patch stuff together from tutorials and apply for "engineering" jobs? Are you fucking kidding me. Do the world a favor and stop calling yourself an engineer. And do yourself a favor and "google" what engineering is and why reading blogs and tutorials doesn't make you one.
Am I alone thinking that person asking this question may be not exactly the coder material?
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.
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.
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."