Something to think about...coding well takes a certain type of mind that most people don't have. Code is, as Fred Brooks says, "pure thought-stuff." You need to be able to build and understand multiple layers of abstract stuff all at the same time.
Coding is like having a vivid dream in that you're occupied with something entirely mental and disconnected from your physical reality. But unlike real dreams, it's coherent and rigidly structured, and fits in your conscious mind.
Some people can think this way. Most people can't, even if their mind is advanced in other ways.
I don't think most people, even the ones who are interested in Codeacademy, realize this.
(That said, I think it's useful for people to try to learn to code to understand the basics. And surely lots of people out there could code, but haven't learned yet. But most people will not be able to build complicated "apps and websites.")
I used to think exactly like this -- that coding well required some inherent differences in thought structure -- but not since I really started watching the progress of those I taught. As you learn, you're not just picking up information, the way you think changes. I'm now quite convinced that effectively everyone can pick up these odd thought processes, whether they're the ones required for programming, reverse-engineering, or otherwise; it just may take more work for some.
I don't know - you read blog posts like the Spolsky one discussing this issue, and they claim that CS lecturers see a definate split between people that understand programming and people that don't, no matter how they try teaching the concept.
I personally believe that many people just can't grasp the ideas behind programming. But I would say that this is just because programming is hard - so hard that even those of us that are good enough at it to program for a living still struggle. It seems to me that the really good programmers are the ones that recognise just how rubbish they actually are at programming and try to do everything to make their code as easy to understand as possible. Functions that take up less than one screen, files that never have more than a thousand lines of code or so, using interfaces so that you don't have to understand implementation details, unit tests so that you can have confidence in a block of code and not have to doubt details when debugging, checking input values for functions. These are all things that you see in code written by those recognised as being good programmers, and yet they are all techniques that aim to reduce cognitive load when reading code. I don't think this is a coincidence.
So, if those of us that are good at this only just manage to get over the bar of adequecy, it stands to reason that there must be a lot of people that just don't make the grade, assuming a normal distribution of programming skill.
There are a great many people out there who are intimidated by exactly this type of mindset. While this may be true for solving extremely complicated problems or building massive applications, the reality is that people across a vast number of professions outside of programming could benefit greatly from basic coding knowledge to solve simple problems. You may not be able build a software company on basic coding knowledge, but you also dont need to have some higher order of thinking or skill to be able to benefit from the basics.
I find it very distasteful whenever anyone suggests that certain people have or don't have certain types of minds. Down this slippery slope lies the path to elitism and snobbery, and gender and ethnic stereotyping.
Minds are plastic, and people choose to fill them however they like. If you practice musical performance, you become more musical no matter how much "natural talent" you start out with. Though there are people with physical limitations and true tone deafness, they are few and far between.
Becoming better with practice holds for the development of problem solving strategies and heuristics as well; all anecdotal evidence aside, improving visualization ability and learning from experience is the formula for making "those who code well". What we lack in our education process today is teaching the ability to think critically and logically and the process of breaking larger problems into smaller, manageable ones - and this is why we have people who think they can't code, or simply won't code even if they have the honed mental tools to do the job well. The fact is, it is very hard to think in the abstract for extended periods and most people just don't want to do it.
You don't think there are any genetic differences between people?
The mind is plastic, but there's a strong genetic component too...and this all has been debated soooo much...
I find it natural - not hard at all - to think in the abstract for extended periods. Most people don't.
Also I agree with you that it's a slippery slope. But only if you choose the wrong ski lift: The ski lift of assholeness. (How's this analogy going?) The truth is, there are plenty of facts out there that you could use to become an asshole with. Like the fact that your little brother is physically weaker than you. But that doesn't mean that you should beat him up. And it doesn't change the truth.
Thank you for articulating this so crisply. I realize that I have the same idea as well that "most people can't".
Where did we get this idea come from? I'm genuinely curious.
I've recently taken a huge bet in the opposite direction of this assumption that not everybody can learn coding, and I'm very interested in what (if any) evidence exists on both sides of the argument.
It's a paper that focuses on some strange patterns that came out of a statistical analysis of the 1988 Computer Science AP test. It turns out that there are a few questions that end up being a great indicator towards someone's natural programming ability.
Great article. Thanks. This in particular blew my mind:
"“Educators of computer science have repeatedly observed that
only about 2 out of every 100 students enrolling in introductory
programming classes really resonate with the subject and seem
to be natural-born computer scientists…I conclude that roughly
2% of all people ‘think algorithmically,’ in the sense that they
can reason rapidly about algorithmic processes."
But that is a quote from Knuth based on an older unpublished study, and seems to be a conjecture with weak evidence. Not sure it is actually mind blowing.
This might be more inspiring if you had quotes from programmers who changed the world for the better through their programming rather than people who make boatloads of money off programmers.
I mention Codecademy & Khan Academy in this post on the 'Learn it Yourself movement' http://bit.ly/sReK6m
It seems to me that making educational material free & widely available is the first step. That's the equivalent of putting textbooks in anyone's hands.
The next (massively exciting!) step will be when online learning becomes measurable and demonstrable. See the Khan Academy tools video [http://bit.ly/rVFlsE] for a peek at how much is possible on that front.
In the case of teaching people to program, I'd like to see lessons, videos, and exercises become the onramp to a system where students can connect/collaborate (think GitHub + StackOverflow for beginner/intermediate coders). I know from my own experience that there's nothing like a little positive peer pressure to keep you on track and that sharing your progress with peers is fun and keeps you motivated.
I wish the hundreds (or even thousands) of hours from all those people wouldn't be wasted solving the same didactically useful but rather useless results of manual work. Why can't the manual labour put in result into something great or useful like a working program, framework, bugfix, codechallenge (I surely am fantasizing a bit here but you get the idea)? That was always something that bugged me about doing CS as an undergrad (and grad): all those hours of brainpower are wasted solving the same problem instead of looking at the final result from all the lessons and picking the best out of each assignment and having that at least run against last year's class.
Education surely is ripe for disruption and this would be one way to make use of the larger scale of having a larger number of people work on problem sets.
This is largely because the beginning hours of work in any field--coding in general or some specialist programming--are remarkably inefficient. At the very start, everybody inevitably writes poor code slowly. It is more efficient to optimize the learning and try to get people productive quickly than trying to keep them productive throughout.
All the undergrad courses--as far as I can tell--are just introductions to some field or other. Once you get to grad school--and some during undergrad too--you start doing research. This is productive while being didactic; however, I doubt it would be nearly as efficient without the useless classes before it.
In short, while learning you're just solving known problems poorly (that compiler you wrote for your class was probably not comparable to GCC :). The stuff that actually needs to get done and the things you need to do while starting learning are unfortunately different.
This is great, but rather than making a resolution to learn programming for the sake of programming, I'd recommend newcomers to programming to have (or come up with) a particular app they want to build right from the beginning and just learn what they need to in the process of building it.
As it happens, setting out to learn an app right away is typically not a great way to learn how to code for beginners. It's too easy to get stuck on the implementation details of your application-development objective ("why won't my blogging system display italics?") at the expense of the fundamentals ("what is CSS good for?")
Remember the target market is full of people who don't code at all. Just getting their feet wet and realizing they can do it is the important part. The focus can come later and will probably happen organically.
This is such a great marketing site for Codecademy. I think if you can more people to think like coders that is a massive win. Since I got into ruby in a big way I have started to notice that I think more logically, more rationally, more clearly. For instance, here is some code I wrote to work out if I should text a girl back or not:
if text.response_time < 5
puts "She digs me!"
elsif text.response_time < 60
puts "She is vaguely interested."
elsif text.response_time < (24 * 60)
puts "Delete her number and move on :("
end
You may think it is pathetic (because it is!) but it is surprisingly effective.
For lesson 7, question 4 [It's time to make your own! Let's do what we did before and bring i down from 2 to 0. This time, fill in the conditions in the for loop using what you learned before.], when I run into infinite loop, my browser gets stuck.
Just of curiosity, I would like to know whether that event affects the server badly, if I keep my browser open?
A Firebug like prompt is the plan i.e. "Script is taking too long to finish, do you want to stop it..." maybe every (n * X) time interval for n is every time the msg is shown for a specific peace of code.
arguably, every computer still came with a few programming languages included (e.g. all browsers with javascript, scripting host/powershell on windows, shell/perl/python/ruby on *nix).
Sadly the extension of the computer concept to tablets and smart phones does not seem to carry such a legacy.
Something to think about...coding well takes a certain type of mind that most people don't have. Code is, as Fred Brooks says, "pure thought-stuff." You need to be able to build and understand multiple layers of abstract stuff all at the same time.
Coding is like having a vivid dream in that you're occupied with something entirely mental and disconnected from your physical reality. But unlike real dreams, it's coherent and rigidly structured, and fits in your conscious mind.
Some people can think this way. Most people can't, even if their mind is advanced in other ways.
I don't think most people, even the ones who are interested in Codeacademy, realize this.
(That said, I think it's useful for people to try to learn to code to understand the basics. And surely lots of people out there could code, but haven't learned yet. But most people will not be able to build complicated "apps and websites.")