While I do believe anyone can learn programing, thats not really the issue at hand. The question is how fast do most people take to it? I think programming is one of those things that only a certain type of person will take to it reasonably fast. This is important because there's a cost/benefit analysis people do when it comes to what's worth studying.
Abstract thinking, then using those abstractions to build new abstractions is a hard task. Programming at its basic level is simple. But its complexity grows exponentially to the point where managing complexity is the totality of programming. This is what people can't seem to do, even on a trivial level.
>The problem is more that the people who teach programming go at it in a very unfriendly, non-intuitive way for the majority of the population. Programmers aren't user-friendly.
They teach programming by asking you to program. Unfortunately this is impossible for some 60% of the people who take a programming course. We have yet to come up with a better way.
I've never taught programming, but i find your last point hard to believe. Programming is human-made, and it was created to be understood and used by humans -- in contrast to say, math or science where things just are. Maybe you can claim that only a small subset of people can get great at programming, but i think that the vast majority of people can manage to learn the basics given enough time.
> While I do believe anyone can learn programing, thats not really the issue at hand. The question is how fast do most people take to it? I think programming is one of those things that only a certain type of person will take to it reasonably fast. This is important because there's a cost/benefit analysis people do when it comes to what's worth studying.
I can agree with that statement, to some extent. The composer Brian Eno once said of prodigies: "The reason you get child prodigies in chess, arithmetic, and classical composition is that they are all worlds of discontinuous, parceled-up possibilities." Programming fits the "discontinuous possibilities" mold very well.
The question is whether or not you want to keep teaching programming in a way that only clicks with those more prodigious people, or if you want to come up with approaches that let in people who may not have the same instant intuition. And, just as in classical music, if you encourage only the people who have a certain sort of aptitude, you're also encouraging people who will only ever approach programming in one certain way, and the result is that the medium as a whole suffers from lack of diversity.
> They teach programming by asking you to program. Unfortunately this is impossible for some 60% of the people who take a programming course. We have yet to come up with a better way.
It's not that they ask people to program that's problematic. (I'd like to see a citation for that 60%, as well; it sounds fishy.) I've taken several programming classes at several levels and I don't think anybody who gets what they're doing finds programming difficult.
The challenge, rather, and this is not only a challenge that comes up in programming courses, is figuring out how to make people get it. You need to develop a manner of teaching that makes all these actions somehow intuitive; why is it that we program in this particular way? What does each word mean? Why's each language constructed in its particular pattern, and how does that affect coding?
Teaching programming without putting serious thought into creating a comfortable abstraction for students is not really teaching programming at all. It's like teaching a creative writing class without simultaneously teaching literature (and, sadly, many creative writing classes are guilty of this). You can pretend that writing is an obscure, difficult art that only a select few minds can master. But I'm a skilled poet and I teach poetry to middle schoolers and I think it's safe to say that the reason most people can't write a good poem is that they don't understand the reason why they're writing a poem in the first place.
I had a teacher, in a high school Java class, who was actually very good at teaching this; I didn't recognize how good he was at the time. He took a class composed mostly of people who knew literally nothing about anything code-related, and in a year turned them without fail into programmers capable of making competent programs. No student dropped out or switched the class; he worked with what he had and didn't fail a single one of us.
The guy-to-girl ratio was pretty close to 1:1, for what it's worth. We had a surprisingly diverse class. And it was really surprising who ended up really showing a knack for coding and who didn't. Frequently the really good coders struggled for longer than the rest of us did, but when they hit upon how to get something done their approach was a lot better than the rest of the class's.
(And by the way, I'd like to mention that this is the best discussion of gender equality that I've ever read on Hacker News, and that I'm in a way really proud that we're having this conversation right here. Cheers to everybody on both sides for keeping this a relatively civil conversation; this is not an easy subject to discuss politely.)
I agree in spirit, but I no longer believe that anyone can necessarily learn programming, maybe because some of those other elements are missing. That's just based on witnessing people who don't seem to be able reason though even the smallest unit of logic expressed in visual form. I believe that most people probably can though to some extent
I think programming has to be taught just like writing is taught. Its so generally useful. Everyone has something going on in their lives that they can write a script to do, if they only knew they could even do such a thing. Too many people don't realize what these computers can really do for them beyond the four walls of the gui and software made by someone else, and its kinda sad.
From my own personal experience, I believe that most people can learn most things, but they need the motivation to do it. I find that most learning material for programming (especially courses/lectures) don't do a very good job at providing motivation. I also believe that most teachers are simply not that good at teaching, sadly, which makes learning hard. For example, often you're given an example, but not enough information to get from a blank page to the example by yourself. I do believe that its mostly nurture and only a tiny bit nature (the nature is mostly in our tolerance for certain things, especially problems we face, rather than in our ability to tackle them).
People want to build something, not learn to program.
To teach someone to build something, teach them how to use the tools of the trade. No carpenter ever learned the physics behind wood in order to build their first table.
The answers to this question all come from people with a perspective that this is what they would do if they wanted to take a bright person and put them into a developer role at their company. And, they all have the defeatist attitude that unless you read these three theory books, and spend four months of intense study, you cannot be a programmer. What hogwash.
Most people cannot take four months off from work and intensely study programming. But, anyone can learn to tinker on something they care about with the right mentorship and using the right tools. Anyone can learn to use jQuery, Ruby on Rails or HTML if-and-only-if the point of doing so is not to learn jQuery, RoR or HTML but is to build something that inspires them. All you need is a path with baby steps and inspiration.
I agree. It would be nice if everyone was exposed to programming, just to get a feel for what is possible/plausible - plus the benefits of learning how to think through a problem logically.
But just as I don't consider someone fatally unknowledgeable about biology if they can't quite remember what, say, the liver does, I don't consider someone fatally unknowledgeable if they don't know how to write a computer program.
It would be nice if everyone tried programming at some point, but the idea that everyone should know how to is kind of silly.
Are you sure it's not just that you or someone else is not good enough at explaining it? wink
Seriously, though, while I'm of the opinion that people learn different things at different speeds, I have yet to encounter someone who was simply unable to grasp a mathematical concept or a concept in CS (not counting some people I know with debiliating mental illnesses).
The trick is to break it into smaller and smaller chunks of logic until people get it. As long as these people are capable of basic arithmetic, I think it's possible to make them 'get it'. And yes, teaching can be very hard.
Having said all that, I do agree with ^ that programming should not be mandatory.
None of the teaching methods for programming has worked for me if I were to look at it from a fresh perspective (I'm in computers but programming is not my day to day work). After learning the basics (easy/easy/lost) of pretty much several languages, I have ultimately realized that learning to program takes consistent discipline and daily practice.
However, it still takes a certain mindset (brain chemistry perhaps) which makes certain people leapfrog others. May be it has something to do with how a brain sees logic and numbers (I see logic and numbers but not necessarily in proficient manner).
My ultimate conclusion is that if programming doesn't come naturally to you, then you are looking at a whole lot of discipline and consistent practice. The chances of you giving up here is very high. But if programming comes naturally to you, then you can become a programmer irrespective of the kind of teaching pedagogy you follow.
This is exactly what I think. I often rant about how everybody needs to learn to program, but what I mean is not so much being able to write code in a specific language as the mindset of approaching problems, and having an understanding of how a computer works. Today programmers are in a sense the gatekeepers of information and I don't think that's healthy in the long term.
There are several layers to this. In general, I think people older than ~50 approach computers in a totally different way than people younger than ~20, with us in the middle a little spread out. A good friend's father, for instance, used to hit Space in his word processor to center headings. He didn't do this because he didn't find the button for center alignment, he did it because he didn't think to look for it.
Another dad recently bought a new Android phone. He was studying the rather thick manual carefully, while his 10 year old daughter grabbed the phone, snapped a picture and just started using it. Startled, her father asked her how she knew all this stuff, to which she replied that she didn't know how to do it beforehand, she just did what seemed reasonable.
It might be a stretch, but I think that programming is on the same range of using computers (tools in general? I don't know) in this way. Solving problems is basically trying what seems most reasonable first. A well defined API is usable without even consulting the documentation.
I definitely think that teaching basic programming and computer science to everybody would be a huge win to society.
Sometimes I think of myself as a literate monk in medieval times. I imagine that lots of people would request their services, friends and family needing help with writing and reading. This is also one of the biggest reasons for my wanting more people to learn how to program: It's purely selfish, I get awfully stressed by having people come to me with ideas they can't implement, trying to make me do it for them.
I'm sure a lot of people here have similar experiences.
What I think is somewhat particular about the challenge of teaching programming is that there quickly develops two distinct levels or types of thinking it's "difficult". I don't see "programming" as difficult in the same way that I don't see "writing papers" as difficult: it's a piece of cake to get words on the screen that make sense. Of course, writing a paper can be quite hard depending on the ideas you are trying to express. Similarly, I think everyone believes programming to be difficult depending on the underlying problem you are trying to solve (for example, no one thinks its easy to solve NP-Complete problems in NP time or to write fast games on slow devices).
However, what trips teachers up is that with some students the problem is that they can't even get past the first hump: getting meaningful things on the screen in the first place. It would be as frustrating as having a student in a college level writing course that always puts the words in his sentences in random order, and expects the reader to "know" what order to read them. Such a teacher would on the one hand be teaching tone and proper structure to one set of students, and basic rules of semantics to another. I recall many students in my CS classes just rearranging the syntax in their programs hoping the compiler would finally accept it. Clearly these students are having much different problems than the ones who simply get a little confused when they have a hard bug in their programs or find the idea of pointers unintuitive.
The problem I have with the "just learn to code" crowd is that there's a huge gap between being able to write "for" loops and programming.
Take data representation as an example. In school one of my professors used to harp all the time that data representation is, in his view, the most important aspect of programming. He'd say something like: "Pick the wrong data representation representation and you can make a simple project into a nightmare to write, maintain and extend".
Programming is about having an arsenal of non-language-specific concepts come to your fingers as you think about the problems you are trying to solve. Data structures, algorithms, data representation, design patterns, optimization, tool selection, workflow, etc.
This is particularly true today when a programmer might have to be comfortable with half a dozen languages in order to create "a simple website" or a mobile app.
Yes, anyone can learn to code. Programming and building non -trivial products takes time, experience and lots of hours making lots of mistakes while you continue learning.
By all means, go and learn. Anyone can do it given time and dedication. I just don't agree with articles that seem to imply that an art student can go out and buy one of those "learn in 21 days" books and become a programmer. Not how it works.
In my years of mentoring and tutoring, I've run into a number of students of programming (and, indeed, teachers) with the same problem.
Programming is about problem solving first, and teaching programming is about teaching someone to look at a problem analytically, and how to use an abstract flow of logic to solve a problem, and how to diagnose issues with your own logic when things go wrong. It's about critical thinking. It's about attention to detail.
It's about all of these things first, and about slapping keys second. But too many people see learning programming as learning the act of typing code, and focus too much on rote memorization of syntax, or teaching tools instead of thinking. Someone should come out of a course saying that they learned how to think in this new way as programmer, not that they learned a new programming language.
One issue with learning to program,many people think learning the syntax of a particular language is programming.
The one thing all programmers need is a way of thinking about problems and systems.
Hard to teach.
In an average person's day to day life they will read and write things. They will also have the opportunity to perform basic math. Sales, left over change, how much time is left. They may even use a computer. But the average person will never even come close to programming at all. Let alone on a regular basis.
I think it is important to have it available. It might be worth introducing it as a small subject. But programming is not easy, and not useful enough to teach as a basic subject
I agree, programming is easier to learn than so many other things because of the short feedback loop, the available resources, and the willingness of those who are experienced to talk about what they've learned.
I don't believe that some people just can't learn to program. Certain types need a certain type of teaching method. I failed my first programer course in college (Java), and totally left the idea behind. Almost a decade later I learned to program. I taught myself, with the help of the internet. In other words, the internet supplied me a methodology for learning to program.
Abstract thinking, then using those abstractions to build new abstractions is a hard task. Programming at its basic level is simple. But its complexity grows exponentially to the point where managing complexity is the totality of programming. This is what people can't seem to do, even on a trivial level.
>The problem is more that the people who teach programming go at it in a very unfriendly, non-intuitive way for the majority of the population. Programmers aren't user-friendly.
They teach programming by asking you to program. Unfortunately this is impossible for some 60% of the people who take a programming course. We have yet to come up with a better way.
reply