Like most things, programming is a mix of natural talent and practice. Some people have incredible natural talent and will succeed no mater when they started. Some people will achieve a very productive level of programming with less natural talent because they put in the work to achieve it. There are more than just two archetypes that make up the landscape of developers.
Fast-forward 3 years; both of us in college. He had to take a programming class again. I met him in the 'computer center' (they used to have special buildings for using computers). He asked for help again; he still didn't understand about statement ordering. I smiled and suggested a tutor. There was just nothing I could say that would get through to him.
So no, not everybody will learn to write computer code. Some people are tone-deaf too, and will never sing nor play an instrument.
That's quite a telling statement. Actually, there are very, very few people who are _truly_ tone deaf. Since intonation is used extensively in nearly all human languages, anyone who truly is 'tone deaf' will have quite an issue in communication. Nearly all the time (and tbh I think it probably is just all the time), they actually just have an 'untrained ear'. Like most people in that kind of position, part of the reason they are in it may well be because they were told when they were young that they weren't any good, and decided to put their efforts elsewhere. And like all people in that position, you can get better. Will they be the next Miles Davis? Probably not. Will they be able to play in a band with their mates? Yes.
A century or two ago, around the time literacy started to become a thing most people could attain, people must have had a similar attitude to yours with learning to read. Some people can read, others will just never learn. Their brains aren't designed for it.
This is how stigmas form. Coding is not that much different to other human endeavours.
All I'm saying is, if you plan on becoming a teacher ever (in the widest possible sense), you're really going to have to re-think your attitude there.
I think we may all want to rethink our attitudes.
Sure, some people might have "innate" talent in regards to music, but that just means they'll progress a little more quickly. But they still need to progress. And that takes work.
But it's possible to get better at something with practice and to think or say otherwise is toxic. If you think it's possible for someone to rethink their attitude then you already agree with me.
Talent scouts do a good job finding young people. They pick ball players, runners, divers, gymnasts early. Its not magic - they show early promise. And so many times they pan out. That probably means that talent is real and actionable.
So he had a talent for functional programming, then?
Not really. E.g. there's no ordering in function composition that isn't also in high school math. Also, you shouldn't depend on e.g. maps processing elements in a given order.
My impression is that statement ordering is easier for mediocre but competent programmers than it is for excellent programmers. The reason is that writing correct imperative code is non-trivial, but writing correct-y imperative code is pretty easy. So someone who's carefully thinking things through while learning will have a more difficult time with simple assignments, because -- at least while learning -- they're essentially trying to construct the correctness proof in their head. And that's pretty hard for imperative code.
in all languages? i don't think so.
def x = y where
y = a * b
a = 21
b = xWe eschew languages like BASIC these days, but I wonder how much BASIC, as available on Commodore machines, the Apple II, or even some graphing calculators, helped communicate this concept. I know I didn't have any problem understanding that when moving to languages that don't have line numbers (although, I did have trouble moving from the full-screen interactive editing on the Commodore to editing "files" as "the program" vs files being a "snapshot" of the program), and I've had the same experience with people who couldn't grok statement ordering. BASIC with its line numbers and simple loops with GOTO may continue to be good first programming languages because it helps with these concepts.
That's not an ability issue, just a knowledge issue. Coming from math, you'd assume there is no evaluation order.
I was not there and my opinion on this issue is complex, so I will just step out now.
That said, I was asked to give computer grinds to a friend and the guy could just not grok it. But then again he had zero motivation and interest. Lots of people who say that they are bad at math/programming have no interest in making the effort to becoming even a little bit proficient.
I really really would like to know if there are people out there who want or would like to code but for the life of them they cannot wrap their brains around it. I think this is a very important question because I can imagine future social arrangements and scenarios where not knowing how to code will be highly socially disadvantageous.
I graduated with a degree in Electrical Engineering, and barely did programming until I began my first job out of college. In many people in the programming space, I see contempt that coding was something I didn't start until later in life. When I interviewed for Electrical Engineering positions, no one ever scoffed at me, "you haven't been computing the impulse response of a filter for 4 hours a day since you were 12? There's a massive difference between engineers who have done that and those that haven't."
People always talk about pursuing coding projects just for the fun of it outside of work, but that's a pretty unusual trait for other forms of engineering.
My father has a PhD in Chemical Engineering and has been doing crude assay work for the last twenty years. He obviously enjoys and gets fulfillment out of his job. But if you asked him to analyze crude oil samples on his free time? He'd say you're crazy.
I dunno, I've been in this field for five or so years coming out of other engineering disciplines, and it always surprises me how programmers view their trade as fundamentally different from other forms of engineering.
Read any interview with a novelist, screenwriter, short story writer, etc and most will say it's something they hated doing but were glad to get done.
Pushed further though, I've seen good advice in some of those interviews which is to try to learn to enjoy the process, as what happens with the finish product is usually out of their hands. I think that's pretty applicable to a lot of other fields as well.
Did you ever dream of debugging your children? That if you could only find the right breakpoint to set, you could adjust them and fix something? Then you are truly a programmer.
Or maybe it's a sign that you should take some time off coding and not take your work home and give the other half of your brain some room to wander and explore space and time.
Furthermore, being able to transfer concepts from one activity to another is a clear sign of intelligence: applying an idea to 1-dimensional text and then applying it to social relations isn't a passive activity either, it shows deep understanding of the idea.
Unfortunately you couldn't start "computing the impulse response of a filter" when you were 12 but if you could, and you continued to practice it daily, you would be very capable compared to people who just started in university.
Going further, I would argue that most people I know who've been programming since they were 12 weren't even writing very good code at 22 (or whenever they left college and entered the working world). It's vanishingly rare that people were writing flexible, maintainable code in their teens. It's much more common that they were coding to scratch an itch, and that their code only solves the pieces of the problem they cared about, and probably not very well.
Note: I've been programming since I was 12.
At that age, your code is going to be a mess no matter what tools you use, so you might as well have an excuse.
(Seriously: there's some brain development that doesn't happen until the close of puberty, and I believe that some of that is necessary for most people to plan and write maintainable code)
- Mathematics (at the extreme high levels)
- Musical composition
- Classical music performance
- Painting/Visual arts
- Speaking most languages
- Jedi Knight
On the web and in app development, there's a far greater variety of technical bases to begin building atop, and a lot of web fundamentals that have developed culturally (rather than out of scientific or mathematic bases, where it can be clear your tools are helping).
A sometimes seen result is that those communities of developers that are "well served" by platforms perhaps "shielding" them from the sticky intertwingulated overwhelmingness of choices and protocols and systems often can't relate, don't relate to the wider body of codecrafters.
Ability to harness the best or biggest slices of culture well is a huge part of programming, and that requires more than being really good or really smart: it requires a will and energy to chase, and to always be chasing, keeping yourself unrooted from what you merely know or how you've done it. That doesn't justify a bimodal view, because there are certainly all kinds of ways people come about to programming, but I think in programming it really is different- since everything is made up and abstract, we're still figuring out general shapes. It's all a social milieu, and it requires paying attention to establish and keep authentic roots and identity, roots you'll need to contextualize what it is you do and what's coming down the pipe. Calculating impulse response is a hard task, but it has a mathematical fixity with no compare to the computer arts we use.
It's also been an extremely exciting time watching programming's recent decades. So there is some elitism of simply- why haven't you been here, enjoying the hell out of this? I think it's ok to feel that inside in a general way, I don't think that can be stopped or avoided, but how we reconcile that with the world without falling into the abundant moral hazards, how we still be good- it's doubly hard to reconcile yourself when the feeds are rife with people berating and assaulting tech culture, when you can get lost in these other people fights.
As a programmer, keep an open mind and accept many types of people as peer. As a person in the world, keep an open mind and accept that programmers are still quite high on some cyberspace utopianism and a precambrian-esque explosion of capabilities, and that just as much as you feel alienated by them, they feel alienated that a wider world excuses itself from recursing the depth and breadth of what enraptures the techie. 'The weirdo is just as scared of the normal person as the normal person is scared of the weirdo'
In my experience it's not at all specific to programming. Other domains have their "rock-star" experts: The brain surgeons, the rocket scientists, the literal rock stars (or at least the true masters of one or more instruments, amazing songwriters, gifted vocalists), the Olympic athletes...the masters of their skill who are so good at what they do that they make it look easy. They've put in the metaphorical 10,000 hours of practice and self-improvement. They are awesome, and the rest of us mere mortals by comparison.
Programming is different from many disciplines, though:
* In programming, everyone from the student who is copy-and-pasting JavaScript into an HTML document to the amazing expert is a "programmer." There's no term for the ones at the top of the scale, no "Olympics" label, no "brain surgeon" specialty that distinguishes the top from the rest.
* World-class skill in one domain or language translates to a very short learning curve in just about any other domain. I've hopped between native apps, games, high performance servers, networking, security, drivers, web apps, embedded, IoT and machine learning, for example, and have used just about every mainstream language (and some trendy ones).
* Programming as a discipline has a 10x-20x measured productivity between practitioners with similar experience -- and the real difference can be infinite (there are tasks that I have accomplished that I know would never have been completed by some people I've worked with in the past). Though some will claim it's unique in that respect, it's not: It shares that trait with (for example) the creation of art and music. I can spend 10 hours working on something artistic, and I know artists who can produce a better result in 30-60 minutes.
* Programming can be learned with a computer and 100% free tools. You can start when you're 12 and have access to a computer, and you are limited only by your skill and imagination in what you can create. So those who have an aptitude can spend thousands of hours in practice for only the cost of electricity (after they have a computer).
It may be that Electrical Engineering doesn't have the 10x-20x relative skill effect, or maybe it does. I don't feel qualified to argue one way or another. It does seem like practitioners will specialize in a particular area, though, and tend to stick with it; correct me if I'm wrong?
Also, it's rare for someone at 12 to feel the need to compute Ohm's Law (well, I used Ohm's Law as a 14-year-old, but I'm odd that way), much less the impulse response of a filter, so for most you're learning those equations at the same time, and the difference between the best and worst students isn't measured in thousands of hours of previous experience.
>"you haven't been computing the impulse response of a filter for 4 hours a day since you were 12? There's a massive difference between engineers who have done that and those that haven't."
For the record, if you're one of those people who did start coding at 12 or earlier, it's not hard to spot another "native programmer", any more than, as a native speaker of a language, it's easy to hear when someone has learned a language as an adult. Sometimes late-learners with particular aptitude for languages can speak without an accent, but most of the time it's easy to tell. There are documented brain organization differences (fMRI) between people who learn a language before they're 12 vs after they're 14, and I suspect the same may be (statistically!) true for people who learn programming early vs. late.
I'm teaching my 10-year-old now, just in case. ;)
He does not deny that there are people on the tail of the normal curve. But his point would be that there are more people that started at 12 and programmed a couple of hours on the weekend v. 4 hours a day. And there are still more than that that started at 15. This creates a normal curve, not a bimodal.
I was doing x86 assembly as a teenager and perform terribly compared to at least one person who started in college.
I have no doubt that there is an age, beyond which, your brain has degenerated too much to learn. But, I'm not convinced it's as early as 50's or 60's. Hopefully, with better awareness about nutrition, exercise, and stress, we can see people learning music instruments well into their 80's.
b) Instead of 10 years experience, maybe someone has 10x 1-year experience.
c) To learn theory, data structures, etc maybe university/company provides a better environment than your PSTN connection on the internet (at least that's what we had when I was 12).
d) When you get hired in a new environment, almost certainly you will face a codebase that you were not aware of. What mostly matters is your ability to generalize your experience.
Because of at least (a) - (d), the condition in the first part of your if statement, does not necessarily imply the second part.