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.
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."