Answers.Body: <p>I am very confused. There are some fundamental hurdles that I need to cover before I can consider learning anything. Also my learning style is visual/kinesthetic. Watching and having the ability to ask questions while internally analysing why things are done the way they are.</p>
  <p>If lessons are being taught in the hypothetical, it's easier for the focus to get bogged down on the &quot;story&quot; rather than what it means. Also while you are seeing the lesson from the first floor of the building (with all other floors out of sight/mind) the mentee could be viewing the lesson from floor 5, acutely aware of the happenings on all other floors. Making the lesson on floor 1 that seems pointedly obvious, seemingly hard to distinguish and apply to relevant examples.</p>
  <p>Suggestion: have a clear conversation, set some boundaries/define some reality so as to give the student a solid point to work backwards from. It sounds like the student is eager to learn, just needs less analogies and more real time information to analyse.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2024-02-03T03:07:36.810Z
Answers.LastActivityDate: 2024-02-17T21:16:31.570Z
Answers.LastEditDate: 2024-02-17T21:16:31.570Z
Answers.UserDisplayName: WantsToLearn
Answers.Body: <p>Maybe you are stressing things of minor importance. You gave us two examples.</p>
  <pre><code>vector&lt;int&gt; copy;
  for (int i = 0; i &lt; my_vec.size(); i++)
      copy.push_back(my_vec[i]);
  </code></pre>
  <p>sure is lengthy, and probably also a bit slower than the C++ expert version of</p>
  <pre><code>vector&lt;int&gt; copy = my_vec;
  </code></pre>
  <p>But it does its job and is readable (while e.g. to me as a Java guy, I'd struggle to remember that the assignment operator here does a copy of the data structure). And, regarding performance, we all know that in at least 90% of all cases, it doesn't matter. And if it matters, I'd search for a solution where the vector doesn't have to be copied at all.</p>
  <p>Regarding Hill Climbing: During 40 years of software development, I rarely ever needed hill climbing, and I've been working in algorithm-sensitive areas. So, unless your students' jobs need things like hill climbing regularly, think of exercises better matching their everyday needs.</p>
  <p>To summarize it: You're not preparing that guy for a PhD in computer science (which most probably isn't needed for his job and out of scope for him as well), but giving him some tools to improve the software engineering aspects of his work.</p>
  <p>With this guy, I'd switch from a fixed curriculum to practical reviews of production code, concentrating on readability, robustness and structure, looking at code written by different developers. If he struggles there as well, then have a nice, deep talk with him.</p>
  <p>EDIT, as requested by OP</p>
  <p>Regarding the &quot;nice, deep talk&quot;: If that guy really struggles hard with basic concepts of software engineering, then he'll probably never catch up with the others. That mindset of specifically-structured thinking is not given to everybody. So, he should understand that his talents might be somewhere else.</p>
  <p>He can choose whether he wants to pursue his career as a software engineer, with the risk of always staying behind all the others. Or he can find a different role in the team where his talents shine. It might be he is good at understanding the customers' way of thinking, or at hardware development and interfacing, or UI design, or management, or quality assurance, or whatever. Software development teams need so many roles besides coding, there might well be tasks where he can shine.</p>
  <p>That's what I'd talk about with him. You should try to make this a positive experience for him. Maybe you already observed some of his talents, so you can suggest some migration path. For that talk, interpersonal skills are most important.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-22T06:08:22.967Z
Answers.Text: We are already working with every single person on a case-by-case basis. We switched to this method from the moment it was clear that there were large skill gaps. Fortunately there is 2 of us and 6 of them so it is possible to give everyone ample time for code reviews but even this has had limited to minimal effect.
Answers.UserDisplayName: Rares Dima
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-22T06:12:05.487Z
Answers.Text: As for Hill Climbing. In much less than 40 years of software development one of the largest projects I spearheaded used Hill Climbing as one of its integral parts. This project gave me at least 2 salary increases and a sizeable promotion. But aside from that, HillClimbing is an insanely simple algorithm. It's not much harder than sorting a bunch of numbers. And in engineering... complicated control flow is an everyday occurrence so a small degree of algorithmic thinking is required for the job. A degree that is a bit above HillClimbing.
Answers.UserDisplayName: Rares Dima
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-22T06:18:29.283Z
Answers.Text: All in all, thank you for the reply! 1st: After noticing skill differences we have moved to personal tutoring pretty fast. 2nd: Also we have focused more on clean code and only rudimentary functions so there is almost no algorithmic thinking to be done. 3rd: The everyday tasks are engineering-related and unlike most jobs there is a bit of physics and math involved for everyone, so a HillClimbing seems a reasonable standard. I am however open to other ideas of "projects". 4th: Can you elaborate the deep talk please?
Answers.UserDisplayName: Rares Dima
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-21T13:09:57.557Z
Answers.LastActivityDate: 2020-09-22T13:42:28.437Z
Answers.LastEditDate: 2020-09-22T13:42:28.437Z
Answers.UserDisplayName: Ralf Kleberhoff
Answers.Body: <p>It's rather easy to observe that there is a pretty significant proportion of people who simply cannot ever program, do algebra-level math, etc. See also the following SE questions:</p>
  <ul>
  <li><a href="https://cseducators.stackexchange.com/questions/3881/is-there-some-meaningful-percentage-of-students-who-cant-learn-to-program/6112#6112">Is there some meaningful percentage of students who can&#39;t learn to program?</a></li>
  <li><a href="https://matheducators.stackexchange.com/questions/11396/what-fraction-of-the-population-is-incapable-of-learning-algebra/">https://matheducators.stackexchange.com/questions/11396/what-fraction-of-the-population-is-incapable-of-learning-algebra/</a></li>
  </ul>
  <p>Trying for a zero-tolerance &quot;no one can fail to do this&quot; is counter-productive and a waste of resources. Some of us (e.g., U.S. community college) teach in a situation where that describes the majority of our students. After 3 tries in your case you're basically wasting your company's time.</p>
  <p>Lay out the situation to you manager, with time spent on the task, and see if they want you to continue pursuing this.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-02-12T16:07:54.193Z
Answers.Text: Equality of Opportunity good, Equality of Outcome ungood. Wrong Expectations doubleplusungood.
Answers.UserDisplayName: Scott Rowe
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-02-07T08:53:43.753Z
Answers.LastActivityDate: 2021-02-07T08:53:43.753Z
Answers.UserDisplayName: Daniel R. Collins
Answers.Body: <h1>Some ideas</h1>
  <p>Order of teaching may be a problem. Teach the specialised easy to use method before the general hard to use one.</p>
  <p>Re-consider the choice language, you are trying to teach programming at the same time as teaching a very hard language, this puts a very high cognitive load on the student.</p>
  <p>Teach test-driven programming. See PRIMM for how to do this in teaching.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-20T20:51:49.183Z
Answers.Text: Everything you said we have already done in several ways.
Answers.UserDisplayName: Rares Dima
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-25T08:11:40.160Z
Answers.Text: @raresdima: What language-change did you try?  I can tell you (a) You can teach C++ (b) You can teach programming (c)... Or even CS. But I've never known teaching/learning of programming still less CS **via** C++. People's brains come in a vast variety. If it really matters to you/your employer to pick up this person I'd try Excel, or vba for the Office-app he's good at or...  Millions of possibilities
Answers.UserDisplayName: Rushi
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-25T08:16:44.893Z
Answers.Text: @Rusi you comment seems to be part a comment about the question (not this answer), and part an answer. If you move the answer part to an answer, then you may get some reputation.
Answers.UserDisplayName: ctrl-alt-delor
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-27T04:21:24.833Z
Answers.Text: All true! 
  I was just latching onto the snippet: «You: .... re-consider the choice language, — a very hard language,  with very high cognitive load.. @RaresDima: We've tried...»
  I recognize that you've (probably!) +1ed my comment and are saying you'll +1 my answer — thanks for that.
  As some general rules: If I answer I try to do it so the *questioner* is helped.
  I try to avoid polemics!
  My views on this are extreme : Imperative prog is a mistake; OOP is a scam; C++ is among the worst — if this view would help the OP can do... But until then I'd not like to heat up. (this is a nice SE!)
Answers.UserDisplayName: Rushi
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-27T04:41:10.370Z
Answers.Text: Other eg [this question](https://cseducators.stackexchange.com/q/6563/8837) : I'd say «recursion is easy; it's assignment (as the atomic unit) that makes it hard; mutable data structures even worse.» I could answer along the lines: «Switch to a language not usually needing assignment/mutation — scheme — or even better a language that doesnt have these — haskell — and see your problem vanish.» However the last line of the question — C a given — strongly suggests that this answer would be a non-answer... So I refrain .
Answers.UserDisplayName: Rushi
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-28T17:02:01.903Z
Answers.Text: @Rusi I struggle to understand your comment. Is it commenting on this answer or on the question? What is it saying? (I grok the no mutation bit, but the rest is lost on me).
Answers.UserDisplayName: ctrl-alt-delor
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-28T17:12:33.470Z
Answers.Text: Well some water has flowed under the bridge. I did try to answer the other [question](https://cseducators.stackexchange.com/a/6568/8837) and seem to have ruffled some feathers (see comments there to see how things get heated and polemical). Which part do you not get? (there are already 3 comments above)  If you quote some lines/phrases I'll certainly try to clarify
Answers.UserDisplayName: Rushi
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-29T05:48:09.090Z
Answers.Text: @Rusi I just read the other answer, and other comments. I agree on a lot of what you say, but you are hard to understand. You keep chopping between ideas, and talking in fragments. Also I think OOP is a good idea, I would like to see some OOP languages become main stream, and be used in teaching. Alas so far I only see (in the main stream) mock OOP languages OOP is a framework for hanging functional code, and in the 1% to 5% of cases a little procedural (but only when it makes the code better).
Answers.UserDisplayName: ctrl-alt-delor
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-29T07:31:41.080Z
Answers.Text: Umm... That's a serious problem! I'll try to see how I may smoothen the arguments /presentation. (yeah it's months since my git answer. Believe me I have more material for that... But not a clear story line unfortunately)
Answers.UserDisplayName: Rushi
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-09-19T21:49:14.310Z
Answers.LastActivityDate: 2020-09-19T21:49:14.310Z
Answers.UserDisplayName: ctrl-alt-delor
Answers.Body: <p>Ah, this is a tricky one and you’re clearly dedicated to helping this person so I imagine you’re finding this hard.</p>
  <p>I read the core issue as being that the person you’re trying to help is not giving you honest feedback. I.e. they repeatedly indicate that they understand some thing or some explanation when in fact they do not.</p>
  <p>If this is true, there’s likely to be some quite fundamental stuff which they’re yet to grasp that is blocking them from making progress on the task/s in hand but, because they’re not open about (or aware of?) what that is, you’re focussed on the wrong things.</p>
  <p>I’d start by trying to reveal their current mental model of something simple - by that I mean simple to them, not simple to you. They may feel quite vulnerable during this exercise and it’s important that they do not fear reprisal. You could consider asking another member of staff, who is just a few steps ahead of this person, to be a mentor. This might create a space where the latter feels safe.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-02-12T16:10:23.050Z
Answers.Text: There is some material available on the concept of "Notional Machine", which is the idea that someone has of how the machine works. When you say "some fundamental stuff they have yet to grasp", it seems similar. This is why I like to stress teaching how computers actually work, rather than starting at a more abstract level. But then I get a storm about transistors and electrons from people. Good luck.
Answers.UserDisplayName: Scott Rowe
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-02-06T11:15:54.260Z
Answers.LastActivityDate: 2021-02-06T11:15:54.260Z
Answers.UserDisplayName: Eddie
Body: <p>I am working for a company, and a target for this year is to increase the level of CS knowledge among the staff.</p>
  <p>The company does mostly engineering stuff so the people come from an engineering background, they might have some knowledge of programming, such as what is a variable, control flow, etc. but classes are virgin territory. That is kind of the average level there.</p>
  <p>Me and a few others with knowledge (formal CS background, working in the AI team of the company) were assigned to increase the level of knowledge in the office. Basically each mentor was assigned a handful of mentees and the mentor decided what to teach and what exercises to give etc. to improve the algorithmic thinking and C++ competency.</p>
  <p>I paired up with a colleague and we pooled our mentees. For some people it worked great. People went from variable names like <code>a</code>, <code>b</code>, <code>ok</code>, <code>x</code> and thousands of lines of copy-pasted code in <code>main()</code> to actually nice variable names, class hierarchies with abstract classes/interfaces, clean code to the point where (almost) no comments were needed, etc.</p>
  <p>I tend to think that we are doing something right, especially since my colleague and I also teach at our university (which is among the top3 in the country), create training materials, held multiple training sessions on different subjects, regularly mentor interns with great success and also did volunteer work tutoring middle school children in introductory programming, with parents at the end asking us to continue the tutoring for money. So we are not exactly new to teaching, and our experiences seem to indicate that we are not bad at it either.</p>
  <p>However I have a student that doesn't seem to grasp some concepts at all even after multiple (&gt;5) explanations using different methods and analogies. Will also forget basic techniques in the span of hours.</p>
  <p>For example he needs a copy of a <code>vector&lt;int&gt;</code> (C++). He will do the old song and dance:</p>
  <pre class="lang-cpp prettyprint-override"><code>vector&lt;int&gt; copy;
  for (int i = 0; i &lt; my_vec.size(); i++)
      copy.push_back(my_vec[i]);
  </code></pre>
  <p>We told him several times and explained why it was better, faster, prettier to just do:</p>
  <pre class="lang-cpp prettyprint-override"><code>vector&lt;int&gt; copy = my_vec;
  </code></pre>
  <p>He always forgot to do this for his homework until we made his homework to clean up his code and implement a single utility function.</p>
  <p>He cleaned up the code, then in that utility function went right back to the <code>for</code> method. And when we pointed this out it took a couple of minutes and helping questions for him to realize what he did wrong.</p>
  <p>Another example is that as a first project the mentees have to implement a basic Hill Climbing algorithm.  This project has been given in June. We have people who will begin implementing Genetic Algorithms this week and it won't even be hard for them. People who have started from variable names like <code>a</code>, <code>b</code>, <code>ok</code>, <code>x</code> and thousands of lines of copy-pasted code in <code>main()</code>.</p>
  <p>Without precise instructions he's barely able to create functions like with 1-2 rounds of review &quot;you get a vector of vectors as an argument. compute <code>f</code> on each of the vectors and return the index of the first vector where the value of <code>f</code> is above some threshold <code>x</code>&quot;.</p>
  <p>The hill climbing algorithm was explained exactly 7 times to him in different ways, with both me and my colleague actually spending time to come up with new analogies. Every time this mentee will enthusiastically say that this time he understood better than all the other times and then do something like just compute the best neighbor of the starting point and return that neighbor, and then name the function <code>firstImprovement</code>.</p>
  <p>The problem is that this person does not appear disinterested. When we explain things he nods and looks like he is concentrating and that makes us try again and again because it looks like he's trying too, but the issues above have been a thing for months. On a problem as simple as Hill Climbing.</p>
  <p>Has anyone ever had such experiences? Any advice? Or any other site where this question would be appropriate?</p>
  
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-17T11:31:17.400Z
Comments.Text: Not a duplicate, but your question reminds me of [this question](https://cseducators.stackexchange.com/questions/3881/is-there-some-meaningful-percentage-of-students-who-cant-learn-to-program).
Comments.UserDisplayName: Ben I.
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-18T08:02:32.923Z
Comments.Text: We had a guy just like this. Tried super hard, but just could not recall stuff. Turned out he had gotten part of his brain removed (labotomy). In the end we had to let him go.
Comments.UserDisplayName: Vaccano
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-21T12:24:27.347Z
Comments.Text: Not everybody is talented equally. Maybe he'll never become a top software engineer, but is an outstanding electronics hardware expert. So, at some time, he, you and the company should decide if and how to go on.
Comments.UserDisplayName: Ralf Kleberhoff
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-21T12:29:11.343Z
Comments.Text: How relevant are the two topics you mentioned (vector copying and hill climbing) to their jobs' everyday tasks?
Comments.UserDisplayName: Ralf Kleberhoff
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-22T05:54:01.520Z
Comments.Text: @RalfKleberhoff STL (at least `vector` and `array`) are directly related to their everyday tasks since they are used in the company projects (it is an automotive company). One of the things that prompted this program was that they were constantly needed but not many of the team were C++ people, but rather C people.
Comments.UserDisplayName: Rares Dima
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-22T05:59:56.333Z
Comments.Text: @RalfKleberhoff And I realize nobody is completely equal, you're 100% right. The requirement is not "have them be able to write a MSc project in C++ by the end of the year" but rather "know basic OOP, inheritance, etc. and some good practices, also some STL since there were times when people were stuck on their tasks because of no OOP/STL knowledge". So no high-level stuff, but rather pretty simple stuff.
Comments.UserDisplayName: Rares Dima
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-09-23T23:59:01.180Z
Comments.Text: It sounds like you are doing very well at teaching, keep up the great work! Yes, I have seen students who reached a high-water mark early on and were never able to move past it, despite two instructors pouring out great effort. The interesting thing was that in one or two cases, these students did as you said: repeatedly assert that they have finally got it. It started to seem a bit like H.M., and we had to say that we felt it was not a good use of their time to stay in the program of study (a vocational training program). I was a T.A. for a Basic course long ago and saw something similar.
Comments.UserDisplayName: Scott Rowe
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2021-02-07T08:47:04.917Z
Comments.Text: I feel like the bit about the "People went from variable names like a, b, ok, x and thousands of lines of copy-pasted code in main()" being copy-pasted in there twice is confusing? Maybe remove one of those?
Comments.UserDisplayName: Daniel R. Collins
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2024-02-03T07:54:54.337Z
Comments.Text: The example you give with `vector<int> copy = my_vec;` vs. `for (int i = 0; i < my_vec.size(); i++) copy.push_back(my_vec[i]);` makes it look like your colleague has a good understanding of how memory works under things, but only a vague knowledge of how `vector` works, and so the colleague is uncomfortable with `vector<int> copy = my_vec;` because they're not sure whether this makes a copy, or not. Imagine if you had a `int[]` instead of a `vector<int>`: then your colleague would be right. They don't trust the `vector`, so they're doing it in a way that they can trust.
Comments.UserDisplayName: Stef
Tags: <struggling-students>
Title: Student not understanding explanation the 1st, 2nd... and 8th time
ThreadText: # Student not understanding explanation the 1st, 2nd... and 8th time
  
  (Asked by: username_0 on 2020-09-17)
  
  I am working for a company, and a target for this year is to increase the level of CS knowledge among the staff.
  
  The company does mostly engineering stuff so the people come from an engineering background, they might have some knowledge of programming, such as what is a variable, control flow, etc. but classes are virgin territory. That is kind of the average level there.
  
  Me and a few others with knowledge (formal CS background, working in the AI team of the company) were assigned to increase the level of knowledge in the office. Basically each mentor was assigned a handful of mentees and the mentor decided what to teach and what exercises to give etc. to improve the algorithmic thinking and C++ competency.
  
  I paired up with a colleague and we pooled our mentees. For some people it worked great. People went from variable names like `a`, `b`, `ok`, `x` and thousands of lines of copy-pasted code in `main()` to actually nice variable names, class hierarchies with abstract classes/interfaces, clean code to the point where (almost) no comments were needed, etc.
  
  I tend to think that we are doing something right, especially since my colleague and I also teach at our university (which is among the top3 in the country), create training materials, held multiple training sessions on different subjects, regularly mentor interns with great success and also did volunteer work tutoring middle school children in introductory programming, with parents at the end asking us to continue the tutoring for money. So we are not exactly new to teaching, and our experiences seem to indicate that we are not bad at it either.
  
  However I have a student that doesn't seem to grasp some concepts at all even after multiple (>5) explanations using different methods and analogies. Will also forget basic techniques in the span of hours.
  
  For example he needs a copy of a `vector<int>` (C++). He will do the old song and dance:
  
  ```cpp
  vector<int> copy;
  for (int i = 0; i < my_vec.size(); i++)
      copy.push_back(my_vec[i]);
  
  ```
  
  We told him several times and explained why it was better, faster, prettier to just do:
  
  ```cpp
  vector<int> copy = my_vec;
  
  ```
  
  He always forgot to do this for his homework until we made his homework to clean up his code and implement a single utility function.
  
  He cleaned up the code, then in that utility function went right back to the `for` method. And when we pointed this out it took a couple of minutes and helping questions for him to realize what he did wrong.
  
  Another example is that as a first project the mentees have to implement a basic Hill Climbing algorithm. This project has been given in June. We have people who will begin implementing Genetic Algorithms this week and it won't even be hard for them. People who have started from variable names like `a`, `b`, `ok`, `x` and thousands of lines of copy-pasted code in `main()`.
  
  Without precise instructions he's barely able to create functions like with 1-2 rounds of review "you get a vector of vectors as an argument. compute `f` on each of the vectors and return the index of the first vector where the value of `f` is above some threshold `x`".
  
  The hill climbing algorithm was explained exactly 7 times to him in different ways, with both me and my colleague actually spending time to come up with new analogies. Every time this mentee will enthusiastically say that this time he understood better than all the other times and then do something like just compute the best neighbor of the starting point and return that neighbor, and then name the function `firstImprovement`.
  
  The problem is that this person does not appear disinterested. When we explain things he nods and looks like he is concentrating and that makes us try again and again because it looks like he's trying too, but the issues above have been a thing for months. On a problem as simple as Hill Climbing.
  
  Has anyone ever had such experiences? Any advice? Or any other site where this question would be appropriate?
  
  **Tags:** struggling-students
  
  > **Comments:**
  > **username_1**: Not a duplicate, but your question reminds me of [this question](https://cseducators.stackexchange.com/questions/3881/is-there-some-meaningful-percentage-of-students-who-cant-learn-to-program).  
  > **username_2**: We had a guy just like this. Tried super hard, but just could not recall stuff. Turned out he had gotten part of his brain removed (labotomy). In the end we had to let him go.  
  > **username_3**: Not everybody is talented equally. Maybe he'll never become a top software engineer, but is an outstanding electronics hardware expert. So, at some time, he, you and the company should decide if and how to go on.  
  > **username_3**: How relevant are the two topics you mentioned (vector copying and hill climbing) to their jobs' everyday tasks?  
  > **username_0**: @username_3 STL (at least `vector` and `array`) are directly related to their everyday tasks since they are used in the company projects (it is an automotive company). One of the things that prompted this program was that they were constantly needed but not many of the team were C++ people, but rather C people.  
  > **username_0**: @username_3 And I realize nobody is completely equal, you're 100% right. The requirement is not "have them be able to write a MSc project in C++ by the end of the year" but rather "know basic OOP, inheritance, etc. and some good practices, also some STL since there were times when people were stuck on their tasks because of no OOP/STL knowledge". So no high-level stuff, but rather pretty simple stuff.  
  > **username_4**: It sounds like you are doing very well at teaching, keep up the great work! Yes, I have seen students who reached a high-water mark early on and were never able to move past it, despite two instructors pouring out great effort. The interesting thing was that in one or two cases, these students did as you said: repeatedly assert that they have finally got it. It started to seem a bit like H.M., and we had to say that we felt it was not a good use of their time to stay in the program of study (a vocational training program). I was a T.A. for a Basic course long ago and saw something similar.  
  > **username_5**: I feel like the bit about the "People went from variable names like a, b, ok, x and thousands of lines of copy-pasted code in main()" being copy-pasted in there twice is confusing? Maybe remove one of those?  
  > **username_6**: The example you give with `vector<int> copy = my_vec;` vs. `for (int i = 0; i < my_vec.size(); i++) copy.push_back(my_vec[i]);` makes it look like your colleague has a good understanding of how memory works under things, but only a vague knowledge of how `vector` works, and so the colleague is uncomfortable with `vector<int> copy = my_vec;` because they're not sure whether this makes a copy, or not. Imagine if you had a `int[]` instead of a `vector<int>`: then your colleague would be right. They don't trust the `vector`, so they're doing it in a way that they can trust.  
  
  ---
  
  ## 5 answers
  
  ### Answer by username_3 on 2020-09-21. Score: 7
  
  Maybe you are stressing things of minor importance. You gave us two examples.
  
  ```
  vector<int> copy;
  for (int i = 0; i < my_vec.size(); i++)
      copy.push_back(my_vec[i]);
  
  ```
  
  sure is lengthy, and probably also a bit slower than the C++ expert version of
  
  ```
  vector<int> copy = my_vec;
  
  ```
  
  But it does its job and is readable (while e.g. to me as a Java guy, I'd struggle to remember that the assignment operator here does a copy of the data structure). And, regarding performance, we all know that in at least 90% of all cases, it doesn't matter. And if it matters, I'd search for a solution where the vector doesn't have to be copied at all.
  
  Regarding Hill Climbing: During 40 years of software development, I rarely ever needed hill climbing, and I've been working in algorithm-sensitive areas. So, unless your students' jobs need things like hill climbing regularly, think of exercises better matching their everyday needs.
  
  To summarize it: You're not preparing that guy for a PhD in computer science (which most probably isn't needed for his job and out of scope for him as well), but giving him some tools to improve the software engineering aspects of his work.
  
  With this guy, I'd switch from a fixed curriculum to practical reviews of production code, concentrating on readability, robustness and structure, looking at code written by different developers. If he struggles there as well, then have a nice, deep talk with him.
  
  EDIT, as requested by OP
  
  Regarding the "nice, deep talk": If that guy really struggles hard with basic concepts of software engineering, then he'll probably never catch up with the others. That mindset of specifically-structured thinking is not given to everybody. So, he should understand that his talents might be somewhere else.
  
  He can choose whether he wants to pursue his career as a software engineer, with the risk of always staying behind all the others. Or he can find a different role in the team where his talents shine. It might be he is good at understanding the customers' way of thinking, or at hardware development and interfacing, or UI design, or management, or quality assurance, or whatever. Software development teams need so many roles besides coding, there might well be tasks where he can shine.
  
  That's what I'd talk about with him. You should try to make this a positive experience for him. Maybe you already observed some of his talents, so you can suggest some migration path. For that talk, interpersonal skills are most important.
  
  > **Comments:**
  > **username_0**: We are already working with every single person on a case-by-case basis. We switched to this method from the moment it was clear that there were large skill gaps. Fortunately there is 2 of us and 6 of them so it is possible to give everyone ample time for code reviews but even this has had limited to minimal effect.  
  > **username_0**: As for Hill Climbing. In much less than 40 years of software development one of the largest projects I spearheaded used Hill Climbing as one of its integral parts. This project gave me at least 2 salary increases and a sizeable promotion. But aside from that, HillClimbing is an insanely simple algorithm. It's not much harder than sorting a bunch of numbers. And in engineering... complicated control flow is an everyday occurrence so a small degree of algorithmic thinking is required for the job. A degree that is a bit above HillClimbing.  
  > **username_0**: All in all, thank you for the reply! 1st: After noticing skill differences we have moved to personal tutoring pretty fast. 2nd: Also we have focused more on clean code and only rudimentary functions so there is almost no algorithmic thinking to be done. 3rd: The everyday tasks are engineering-related and unlike most jobs there is a bit of physics and math involved for everyone, so a HillClimbing seems a reasonable standard. I am however open to other ideas of "projects". 4th: Can you elaborate the deep talk please?  
  
  ---
  
  ### Answer by username_5 on 2021-02-07. Score: 3
  
  It's rather easy to observe that there is a pretty significant proportion of people who simply cannot ever program, do algebra-level math, etc. See also the following SE questions:
  
  * [Is there some meaningful percentage of students who can't learn to program?](https://cseducators.stackexchange.com/questions/3881/is-there-some-meaningful-percentage-of-students-who-cant-learn-to-program/6112#6112)
  * <https://matheducators.stackexchange.com/questions/11396/what-fraction-of-the-population-is-incapable-of-learning-algebra/>
  
  Trying for a zero-tolerance "no one can fail to do this" is counter-productive and a waste of resources. Some of us (e.g., U.S. community college) teach in a situation where that describes the majority of our students. After 3 tries in your case you're basically wasting your company's time.
  
  Lay out the situation to you manager, with time spent on the task, and see if they want you to continue pursuing this.
  
  > **Comments:**
  > **username_4**: Equality of Opportunity good, Equality of Outcome ungood. Wrong Expectations doubleplusungood.  
  
  ---
  
  ### Answer by username_8 on 2020-09-19. Score: 2
  
  # Some ideas
  
  Order of teaching may be a problem. Teach the specialised easy to use method before the general hard to use one.
  
  Re-consider the choice language, you are trying to teach programming at the same time as teaching a very hard language, this puts a very high cognitive load on the student.
  
  Teach test-driven programming. See PRIMM for how to do this in teaching.
  
  > **Comments:**
  > **username_0**: Everything you said we have already done in several ways.  
  > **username_9**: @username_0: What language-change did you try?  I can tell you (a) You can teach C++ (b) You can teach programming (c)... Or even CS. But I've never known teaching/learning of programming still less CS **via** C++. People's brains come in a vast variety. If it really matters to you/your employer to pick up this person I'd try Excel, or vba for the Office-app he's good at or...  Millions of possibilities  
  > **username_8**: @Rusi you comment seems to be part a comment about the question (not this answer), and part an answer. If you move the answer part to an answer, then you may get some reputation.  
  > **username_9**: All true!  I was just latching onto the snippet: «You: .... re-consider the choice language, — a very hard language,  with very high cognitive load.. @username_0: We've tried...» I recognize that you've (probably!) +1ed my comment and are saying you'll +1 my answer — thanks for that. As some general rules: If I answer I try to do it so the *questioner* is helped. I try to avoid polemics! My views on this are extreme : Imperative prog is a mistake; OOP is a scam; C++ is among the worst — if this view would help the OP can do... But until then I'd not like to heat up. (this is a nice SE!)  
  > **username_9**: Other eg [this question](https://cseducators.stackexchange.com/q/6563/8837) : I'd say «recursion is easy; it's assignment (as the atomic unit) that makes it hard; mutable data structures even worse.» I could answer along the lines: «Switch to a language not usually needing assignment/mutation — scheme — or even better a language that doesnt have these — haskell — and see your problem vanish.» However the last line of the question — C a given — strongly suggests that this answer would be a non-answer... So I refrain .  
  > **username_8**: @Rusi I struggle to understand your comment. Is it commenting on this answer or on the question? What is it saying? (I grok the no mutation bit, but the rest is lost on me).  
  > **username_9**: Well some water has flowed under the bridge. I did try to answer the other [question](https://cseducators.stackexchange.com/a/6568/8837) and seem to have ruffled some feathers (see comments there to see how things get heated and polemical). Which part do you not get? (there are already 3 comments above)  If you quote some lines/phrases I'll certainly try to clarify  
  > **username_8**: @Rusi I just read the other answer, and other comments. I agree on a lot of what you say, but you are hard to understand. You keep chopping between ideas, and talking in fragments. Also I think OOP is a good idea, I would like to see some OOP languages become main stream, and be used in teaching. Alas so far I only see (in the main stream) mock OOP languages OOP is a framework for hanging functional code, and in the 1% to 5% of cases a little procedural (but only when it makes the code better).  
  > **username_9**: Umm... That's a serious problem! I'll try to see how I may smoothen the arguments /presentation. (yeah it's months since my git answer. Believe me I have more material for that... But not a clear story line unfortunately)  
  
  ---
  
  ### Answer by username_10 on 2021-02-06. Score: 2
  
  Ah, this is a tricky one and you’re clearly dedicated to helping this person so I imagine you’re finding this hard.
  
  I read the core issue as being that the person you’re trying to help is not giving you honest feedback. I.e. they repeatedly indicate that they understand some thing or some explanation when in fact they do not.
  
  If this is true, there’s likely to be some quite fundamental stuff which they’re yet to grasp that is blocking them from making progress on the task/s in hand but, because they’re not open about (or aware of?) what that is, you’re focussed on the wrong things.
  
  I’d start by trying to reveal their current mental model of something simple - by that I mean simple to them, not simple to you. They may feel quite vulnerable during this exercise and it’s important that they do not fear reprisal. You could consider asking another member of staff, who is just a few steps ahead of this person, to be a mentor. This might create a space where the latter feels safe.
  
  > **Comments:**
  > **username_4**: There is some material available on the concept of "Notional Machine", which is the idea that someone has of how the machine works. When you say "some fundamental stuff they have yet to grasp", it seems similar. This is why I like to stress teaching how computers actually work, rather than starting at a more abstract level. But then I get a storm about transistors and electrons from people. Good luck.  
  
  ---
  
  ### Answer by username_7 on 2024-02-03. Score: 0
  
  I am very confused. There are some fundamental hurdles that I need to cover before I can consider learning anything. Also my learning style is visual/kinesthetic. Watching and having the ability to ask questions while internally analysing why things are done the way they are.
  
  If lessons are being taught in the hypothetical, it's easier for the focus to get bogged down on the "story" rather than what it means. Also while you are seeing the lesson from the first floor of the building (with all other floors out of sight/mind) the mentee could be viewing the lesson from floor 5, acutely aware of the happenings on all other floors. Making the lesson on floor 1 that seems pointedly obvious, seemingly hard to distinguish and apply to relevant examples.
  
  Suggestion: have a clear conversation, set some boundaries/define some reality so as to give the student a solid point to work backwards from. It sounds like the student is eager to learn, just needs less analogies and more real time information to analyse.
  
  
  ---
  
  