Answers.Body: <p>I will speak in general terms.  For any given topic or skill, there are going to be people who just can't get it.  You have people who have been expats or immigrants in a country for 30 years, and can't learn a new language; there are people who can't grasp any kind of mathematics beyond arithmetic.  <a href="https://bettermarketing.pub/the-a-w-third-pounder-failed-because-people-didnt-understand-fractions-a86b966a973a" rel="nofollow noreferrer">Heck, at one point people thought they were getting conned because a restaurant was selling a third-pounder.</a></p>
  <p>My guess would be that you are probably bound to find more people who would find programming difficult than people who find programming easy.  Sure, some people would be able to get into the basics, but few people could put together a meaningful project.</p>
  <p>Also: I'm pretty sure that the students you mentioned probably have other learning issues.  I once had a student who was dyslexic.  English was also his second language.  His spelling in his native language was atrocious, and while he could kind of explain how to program something, he would consistently misspell keywords and variables, rendering any program he made pretty useless.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-01T17:38:23.823Z
Answers.Text: Welcome to CSE - feel free to take a look around. I hope we hear more from you!
Answers.UserDisplayName: Ben I.
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-01T18:05:56.903Z
Answers.Text: Hi. In some sense, I agree with everything you said, but in another sense, I don't. That makes me wary. There are a ton of people who can't sing because they were told they couldn't sing when they were 5 years old. There are also a ton of people who suck at math because they were told that they sucked at math when they were 12 years old. So I think the sentence "there are people who just can't get it", while true in a sense, is also false in another sense, and in fact can be extremely dangerous.
Answers.UserDisplayName: Stef
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-03T01:23:44.973Z
Answers.Text: Honestly, after years of pondering this issue I have to humbly say that I don't know, and I am pretty sure the right explanation is not well known. Programming might be *different* in some important way from other things, but the bottom line really is practice. It resembles gymnastics more than scholarship. "*Nevah, nevah, nevah give up!*"
Answers.UserDisplayName: Scott Rowe
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-03T02:12:04.320Z
Answers.Text: @Stef I see where you're coming from with you.  I am sure the average person is able to at least get the basics with some practice, just like the average person would be able to do a variety of tasks - they would be able to do algebra and carry a tune to use your examples.  I am approaching this merely from a statistical point of view: if there are people who are great at math and become mathematicians and if there are people who are great singers and become professional, there are simply going to be people on the opposite end of that spectrum, and even with a lot of help they will struggle.
Answers.UserDisplayName: Dave
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-01T17:23:00.393Z
Answers.LastActivityDate: 2024-02-01T17:23:00.393Z
Answers.UserDisplayName: Dave
Answers.Body: <p>When I was a student I studied math, physics and computer science, and my observation when I was a student was that both in math and in physics, the hardest-working students got the best results, whereas in computer science, you could tell from day 1 which students would get the best result, and no amount of personal work from the students appeared to change that. So indeed there appeared to be some kind of innate abilities of some students to perform much better by immediately grasping the logical aspects of computer science.</p>
  <p>Or maybe it's not about innate ability, but about prior work, as pointed out by Steve in comments:</p>
  <blockquote>
  <p>I suspect this is because there is actually both a hidden curriculum and a set of cognitive skills required for CS, and the difference is between the people who self-learn the curriculum and put in the hard work many years before the course starts, and those who are reliant on actually being taught during the course.</p>
  </blockquote>
  <p>Note that in the previous paragraphs I wrote &quot;computer science&quot; and not &quot;programming&quot;. Programming classes at university were universally terrible and ineffective. I think there were two main issues with programming classes:</p>
  <ul>
  <li>The teachers usually tried to teach something that was halfway between &quot;programming&quot; and &quot;computer science&quot;; they taught programming in a particular programming language, but instead of teaching this language in depth with all of its peculiarities, they tried to only use this language to illustrate general computer science and programming concepts, and the result of all this was a lot of confusion and very imprecise concepts all around. It's not possible to teach language C properly if you insist on talking about &quot;invariables&quot; and &quot;outvariables&quot; instead of explaining what's a pointer and what is the purpose of the <code>const</code> keyword.</li>
  <li>The classes were lesson-driven, with at least as much time spent listening to a teacher standing in front of a blackboard than time spent in front of an actual computer. I believe programming can be learned much more effectively if the student has access to a text-editor and a compiler; the actual programming tasks that the student will work on are a lot more important than any lesson that can be taught at the blackboard.</li>
  </ul>
  <p>Then I went to a school dedicated to programming and there, the hardest-working students got the best result, regardless of their initial ability. But the teaching was completely project-driven and not lesson-driven, which was much better-suited for programming in my opinion. So it's not just the students, it's also the way of teaching.</p>
  <p>Also, in my experience, students whose first programming language is python tend to do a lot worse than students whose first programming language is any of C, Haskell, QBasic, or anything else really. There are several reasons for that.</p>
  <ul>
  <li>Python tries to make everything easy, so that it's possible to write programs that appear to work, without developing any deep understanding of what's going on behind the scene; but python's logic is really weird and different from other programming languages. &quot;What is a variable?&quot; is an easily-answerable question in most programming languages, but a surprisingly hard question in python.</li>
  <li>Python is an interpreted language. Notice how in a previous paragraph I said a student should have access to a compiler. The compiler will help them learn about types, will tell them their errors, etc. But python doesn't have a compiler. Forget the <code>return</code> keyword at the end of a function in any other programming language, the compiler will immediately tell you &quot;Hey! Missing return at the end of function that must return a value!&quot;. Forget the <code>return</code> keyword at the end of a function in python, and the interpreter will silently and happily make your function return <code>None</code> without complaining about your error. Make an obvious error such as mistyping a keyword or variable name, and the interpreter will not even complain until it reaches the particular line that has the error, which might be a while if it's hidden in an else-branch after a for-loop.</li>
  <li>Python sucks for functional programming. Functional programming is actually a lot more natural than imperative programming, since it behaves a lot closer to human logic than to computer logic. But python sucks at it, for a variety of reasons. Recursion is terribly slow and limited to 100 recursive calls, there is no way to write a tail-recursive function, and the mutable/non-mutable distinction between different types of variables behaves well with for-loop but very unintuitively with functional calls, which makes it much harder for student to write correct functional code. An algorithm that was supposed to be O(n) can easily turn out as O(n^2) or O(n^3) in python because of a misunderstanding of how mutable variables behave when they're passed to functions in python. The simple fact that <code>a += b</code> and <code>a = a + b</code> mean two very different things inside a function call in python is a good example of this.</li>
  <li>Variable binding in python is dynamic rather than scoped. This makes it a lot harder to reason mathematically and logically about python programs, and makes it a lot harder for students to apply in a python programming class what they learned in a computer science class.</li>
  </ul>
  <h4>Conclusion</h4>
  <p>Yes, innate ability tends to be more important in computer science than in other topics, but if programming is taught by precise practice more than by theoretical lessons, then this becomes less of an issue.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-01T17:38:38.570Z
Answers.Text: Welcome to CSE - feel free to take a look around. I hope we hear more from you!
Answers.UserDisplayName: Ben I.
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-03T01:19:17.583Z
Answers.Text: Bad languages are a curse on humanity. But what has kept me in the chair slugging it out day after day in what feels at times like a nihilistic programming universe is sheer pig-headedness. I'll sit glued there needing to pee for hours to try to solve the 'problem'. "*A Quitter never wins. A Winner never quits.*" Executive Functioning and stubbornness can do it.
Answers.UserDisplayName: Scott Rowe
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-03-17T13:48:06.603Z
Answers.Text: *"in math and in physics, the hardest-working students got the best results, whereas in computer science, you could tell from day 1 which students would get the best result, and no amount of personal work from the students appeared to change that"* - I suspect this is because there is actually both a hidden curriculum and a set of cognitive skills required for CS, and the difference is between the people who self-learn the curriculum and put in the hard work *many years before the course starts*, and those who are reliant on actually being taught during the course.
Answers.UserDisplayName: Steve
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-03-18T12:54:58.023Z
Answers.Text: @Steve Holy shit you might be right
Answers.UserDisplayName: Stef
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-01T15:42:55.230Z
Answers.LastActivityDate: 2024-03-18T12:54:33.020Z
Answers.LastEditDate: 2024-03-18T12:54:33.020Z
Answers.UserDisplayName: Stef
Body: <p>Just as the title says.  If you're wondering why I'm asking, here's why:</p>
  <p>I've recently started teaching Python programming at a community college.  My class is geared towards non-CS majors.  There are a few STEM people there, and for the most part they do OK.  Some of the students are liberal arts majors or business majors who have a variety of motivations for taking this class.</p>
  <p>I have a certain student, call her Emma, who was basically lost from Day 1.  After the first lecture, she approached me during office hours and said she was &quot;already lost&quot;.  I asked her what she had trouble with, and she said &quot;everything&quot;.  I asked her to show me what she had.</p>
  <p>She turned on her computer to reveal that she had typed out (in Microsoft Word):</p>
  <pre><code>Paint C Hello World D
  </code></pre>
  <p>It turned out that she hadn't even managed to properly install Python or Visual Studio Code.  After about 20 minutes, we finally proceeded to begin programming and I asked her to compare her code to mine.  She spent about 2 minutes looking back and forth between our screens, and was unable to find any mistake.  This lead to me also having to show her how to type parentheses on a keyboard.</p>
  <p>This is an extreme case, but there are a few others in the class like this.  During the second week, we'd moved on to learning about variables.</p>
  <p>We had the code:</p>
  <pre><code>a = 5
  b = 3
  c = a + b
  print(c)
  </code></pre>
  <p>Now I was working with another student, and I posed the question: &quot;If I changed a to 15 and b to 10, but left everything else the same, what would the program print?&quot;  Total look of confusion on the student's face.</p>
  <p>In the past I have certainly had students who struggled with things, say, once we got to things like loops or recursion or even functions.  But those students pulled through and at least were able to pass the class if did enough practice problems to fake it until the final.</p>
  <p>These guys though are something else.  Also, the people in the past who struggled on Day 1 or 2, usually had the self-awareness to drop the course.</p>
  
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2024-02-01T17:42:12.470Z
Comments.Text: In spite of this being duplicate, you are in the right place. Welcome to CSE! Take a look around - I hope we hear more from you.
Comments.UserDisplayName: Ben I.
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2024-02-03T01:08:40.997Z
Comments.Text: A long time ago I was a Teaching Assistant of a course in programming for non-majors. There really was a spread in the rate of learning. Some seemed to grasp things right away with little background, others really struggled. I coached a lot of students through initial problems, but some were still pretty behind at the end (if they didn't drop). It is important to not attribute reasons or give up on people, but try to assist. I always found Math vexing and I never wanted anything to do with it, yet college forced me through lots. I was always one course behind in my understanding. Frustrating.
Comments.UserDisplayName: Scott Rowe
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2024-02-03T01:11:03.000Z
Comments.Text: Research shows that people with better executive functioning do better in schooling and at work. That's an area for effort. You can't succeed if you can't focus or persist through problems. Programming has so frustrated me at times that I used to keep a big rock next to the keyboard and wave it menacingly at the screen sometimes. But here I am making a living at it, 45 years after sitting down at a teletype in 8th grade. Still frustrating - why this sudden Certificate Error out of the blue? Ugh.
Comments.UserDisplayName: Scott Rowe
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2024-02-12T19:37:42.363Z
Comments.Text: *"It turned out that she hadn't even managed to properly install Python or Visual Studio Code"* That isn't necessarily a sign that she won't be able to program. I've been coding for about 25 years now, and all that means is that when something absolutely refuses to install correctly, I have the option to give up and write a clone of it instead.  Once she gets the compiler set up properly, it's entirely possible she'll pick up the rest as quickly as anyone. The kid who either doesn't understand what the assignment operator does or can't add 15 + 8 is the one I'd be worried about.
Comments.UserDisplayName: Ray
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2024-02-16T15:52:27.417Z
Comments.Text: Maybe a class designed for non-computer science students is better suited. Examples include [software carpentry](https://software-carpentry.org/) ([core lessons](https://software-carpentry.org/lessons/)), Al Sweigart's [automate the boring stuff with Python](https://automatetheboringstuff.com/2e/), Chuck Severance's [Python for everybody](https://www.youtube.com/playlist?list=PLlRFEj9H3Oj7Bp8-DfGpfAfDBiblRfl5p). And: there is nothing wrong with you or an other if it does not "click" on the first encounter, nor "never". Sometimes, the mind is better prepared a couple of years later, too.
Comments.UserDisplayName: Buttonwood
Tags: <python><struggling-students>
Title: Are there people who just can't learn to program?
ThreadText: # Are there people who just can't learn to program?
  
  (Asked by: username_0 on 2024-02-01)
  
  Just as the title says. If you're wondering why I'm asking, here's why:
  
  I've recently started teaching Python programming at a community college. My class is geared towards non-CS majors. There are a few STEM people there, and for the most part they do OK. Some of the students are liberal arts majors or business majors who have a variety of motivations for taking this class.
  
  I have a certain student, call her Emma, who was basically lost from Day 1. After the first lecture, she approached me during office hours and said she was "already lost". I asked her what she had trouble with, and she said "everything". I asked her to show me what she had.
  
  She turned on her computer to reveal that she had typed out (in Microsoft Word):
  
  ```
  Paint C Hello World D
  
  ```
  
  It turned out that she hadn't even managed to properly install Python or Visual Studio Code. After about 20 minutes, we finally proceeded to begin programming and I asked her to compare her code to mine. She spent about 2 minutes looking back and forth between our screens, and was unable to find any mistake. This lead to me also having to show her how to type parentheses on a keyboard.
  
  This is an extreme case, but there are a few others in the class like this. During the second week, we'd moved on to learning about variables.
  
  We had the code:
  
  ```
  a = 5
  b = 3
  c = a + b
  print(c)
  
  ```
  
  Now I was working with another student, and I posed the question: "If I changed a to 15 and b to 10, but left everything else the same, what would the program print?" Total look of confusion on the student's face.
  
  In the past I have certainly had students who struggled with things, say, once we got to things like loops or recursion or even functions. But those students pulled through and at least were able to pass the class if did enough practice problems to fake it until the final.
  
  These guys though are something else. Also, the people in the past who struggled on Day 1 or 2, usually had the self-awareness to drop the course.
  
  **Tags:** python, struggling-students
  
  > **Comments:**
  > **username_1**: In spite of this being duplicate, you are in the right place. Welcome to CSE! Take a look around - I hope we hear more from you.  
  > **username_2**: A long time ago I was a Teaching Assistant of a course in programming for non-majors. There really was a spread in the rate of learning. Some seemed to grasp things right away with little background, others really struggled. I coached a lot of students through initial problems, but some were still pretty behind at the end (if they didn't drop). It is important to not attribute reasons or give up on people, but try to assist. I always found Math vexing and I never wanted anything to do with it, yet college forced me through lots. I was always one course behind in my understanding. Frustrating.  
  > **username_2**: Research shows that people with better executive functioning do better in schooling and at work. That's an area for effort. You can't succeed if you can't focus or persist through problems. Programming has so frustrated me at times that I used to keep a big rock next to the keyboard and wave it menacingly at the screen sometimes. But here I am making a living at it, 45 years after sitting down at a teletype in 8th grade. Still frustrating - why this sudden Certificate Error out of the blue? Ugh.  
  > **username_3**: *"It turned out that she hadn't even managed to properly install Python or Visual Studio Code"* That isn't necessarily a sign that she won't be able to program. I've been coding for about 25 years now, and all that means is that when something absolutely refuses to install correctly, I have the option to give up and write a clone of it instead.  Once she gets the compiler set up properly, it's entirely possible she'll pick up the rest as quickly as anyone. The kid who either doesn't understand what the assignment operator does or can't add 15 + 8 is the one I'd be worried about.  
  > **username_4**: Maybe a class designed for non-computer science students is better suited. Examples include [software carpentry](https://software-carpentry.org/) ([core lessons](https://software-carpentry.org/lessons/)), Al Sweigart's [automate the boring stuff with Python](https://automatetheboringstuff.com/2e/), Chuck Severance's [Python for everybody](https://www.youtube.com/playlist?list=PLlRFEj9H3Oj7Bp8-DfGpfAfDBiblRfl5p). And: there is nothing wrong with you or an other if it does not "click" on the first encounter, nor "never". Sometimes, the mind is better prepared a couple of years later, too.  
  
  ---
  
  ## 2 answers
  
  ### Answer by username_5 on 2024-02-01. Score: 1
  
  I will speak in general terms. For any given topic or skill, there are going to be people who just can't get it. You have people who have been expats or immigrants in a country for 30 years, and can't learn a new language; there are people who can't grasp any kind of mathematics beyond arithmetic. [Heck, at one point people thought they were getting conned because a restaurant was selling a third-pounder.](https://bettermarketing.pub/the-a-w-third-pounder-failed-because-people-didnt-understand-fractions-a86b966a973a)
  
  My guess would be that you are probably bound to find more people who would find programming difficult than people who find programming easy. Sure, some people would be able to get into the basics, but few people could put together a meaningful project.
  
  Also: I'm pretty sure that the students you mentioned probably have other learning issues. I once had a student who was dyslexic. English was also his second language. His spelling in his native language was atrocious, and while he could kind of explain how to program something, he would consistently misspell keywords and variables, rendering any program he made pretty useless.
  
  > **Comments:**
  > **username_1**: Welcome to CSE - feel free to take a look around. I hope we hear more from you!  
  > **username_6**: Hi. In some sense, I agree with everything you said, but in another sense, I don't. That makes me wary. There are a ton of people who can't sing because they were told they couldn't sing when they were 5 years old. There are also a ton of people who suck at math because they were told that they sucked at math when they were 12 years old. So I think the sentence "there are people who just can't get it", while true in a sense, is also false in another sense, and in fact can be extremely dangerous.  
  > **username_2**: Honestly, after years of pondering this issue I have to humbly say that I don't know, and I am pretty sure the right explanation is not well known. Programming might be *different* in some important way from other things, but the bottom line really is practice. It resembles gymnastics more than scholarship. "*Nevah, nevah, nevah give up!*"  
  > **username_5**: @username_6 I see where you're coming from with you.  I am sure the average person is able to at least get the basics with some practice, just like the average person would be able to do a variety of tasks - they would be able to do algebra and carry a tune to use your examples.  I am approaching this merely from a statistical point of view: if there are people who are great at math and become mathematicians and if there are people who are great singers and become professional, there are simply going to be people on the opposite end of that spectrum, and even with a lot of help they will struggle.  
  
  ---
  
  ### Answer by username_6 on 2024-02-01. Score: 1
  
  When I was a student I studied math, physics and computer science, and my observation when I was a student was that both in math and in physics, the hardest-working students got the best results, whereas in computer science, you could tell from day 1 which students would get the best result, and no amount of personal work from the students appeared to change that. So indeed there appeared to be some kind of innate abilities of some students to perform much better by immediately grasping the logical aspects of computer science.
  
  Or maybe it's not about innate ability, but about prior work, as pointed out by username_7 in comments:
  
  > I suspect this is because there is actually both a hidden curriculum and a set of cognitive skills required for CS, and the difference is between the people who self-learn the curriculum and put in the hard work many years before the course starts, and those who are reliant on actually being taught during the course.
  
  Note that in the previous paragraphs I wrote "computer science" and not "programming". Programming classes at university were universally terrible and ineffective. I think there were two main issues with programming classes:
  
  * The teachers usually tried to teach something that was halfway between "programming" and "computer science"; they taught programming in a particular programming language, but instead of teaching this language in depth with all of its peculiarities, they tried to only use this language to illustrate general computer science and programming concepts, and the result of all this was a lot of confusion and very imprecise concepts all around. It's not possible to teach language C properly if you insist on talking about "invariables" and "outvariables" instead of explaining what's a pointer and what is the purpose of the `const` keyword.
  * The classes were lesson-driven, with at least as much time spent listening to a teacher standing in front of a blackboard than time spent in front of an actual computer. I believe programming can be learned much more effectively if the student has access to a text-editor and a compiler; the actual programming tasks that the student will work on are a lot more important than any lesson that can be taught at the blackboard.
  
  Then I went to a school dedicated to programming and there, the hardest-working students got the best result, regardless of their initial ability. But the teaching was completely project-driven and not lesson-driven, which was much better-suited for programming in my opinion. So it's not just the students, it's also the way of teaching.
  
  Also, in my experience, students whose first programming language is python tend to do a lot worse than students whose first programming language is any of C, Haskell, QBasic, or anything else really. There are several reasons for that.
  
  * Python tries to make everything easy, so that it's possible to write programs that appear to work, without developing any deep understanding of what's going on behind the scene; but python's logic is really weird and different from other programming languages. "What is a variable?" is an easily-answerable question in most programming languages, but a surprisingly hard question in python.
  * Python is an interpreted language. Notice how in a previous paragraph I said a student should have access to a compiler. The compiler will help them learn about types, will tell them their errors, etc. But python doesn't have a compiler. Forget the `return` keyword at the end of a function in any other programming language, the compiler will immediately tell you "Hey! Missing return at the end of function that must return a value!". Forget the `return` keyword at the end of a function in python, and the interpreter will silently and happily make your function return `None` without complaining about your error. Make an obvious error such as mistyping a keyword or variable name, and the interpreter will not even complain until it reaches the particular line that has the error, which might be a while if it's hidden in an else-branch after a for-loop.
  * Python sucks for functional programming. Functional programming is actually a lot more natural than imperative programming, since it behaves a lot closer to human logic than to computer logic. But python sucks at it, for a variety of reasons. Recursion is terribly slow and limited to 100 recursive calls, there is no way to write a tail-recursive function, and the mutable/non-mutable distinction between different types of variables behaves well with for-loop but very unintuitively with functional calls, which makes it much harder for student to write correct functional code. An algorithm that was supposed to be O(n) can easily turn out as O(n^2) or O(n^3) in python because of a misunderstanding of how mutable variables behave when they're passed to functions in python. The simple fact that `a += b` and `a = a + b` mean two very different things inside a function call in python is a good example of this.
  * Variable binding in python is dynamic rather than scoped. This makes it a lot harder to reason mathematically and logically about python programs, and makes it a lot harder for students to apply in a python programming class what they learned in a computer science class.
  
  #### Conclusion
  
  Yes, innate ability tends to be more important in computer science than in other topics, but if programming is taught by precise practice more than by theoretical lessons, then this becomes less of an issue.
  
  > **Comments:**
  > **username_1**: Welcome to CSE - feel free to take a look around. I hope we hear more from you!  
  > **username_2**: Bad languages are a curse on humanity. But what has kept me in the chair slugging it out day after day in what feels at times like a nihilistic programming universe is sheer pig-headedness. I'll sit glued there needing to pee for hours to try to solve the 'problem'. "*A Quitter never wins. A Winner never quits.*" Executive Functioning and stubbornness can do it.  
  > **username_7**: *"in math and in physics, the hardest-working students got the best results, whereas in computer science, you could tell from day 1 which students would get the best result, and no amount of personal work from the students appeared to change that"* - I suspect this is because there is actually both a hidden curriculum and a set of cognitive skills required for CS, and the difference is between the people who self-learn the curriculum and put in the hard work *many years before the course starts*, and those who are reliant on actually being taught during the course.  
  > **username_6**: @username_7 Holy shit you might be right  
  
  ---
  
  