There is a theory which is gaining a pretty good amount of traction in education which basically states that you should start with something pretty hard, and work your way down from that. For instance, when learning arithmetic, you might start with division, then learn multiplication, subtraction, and addition. It's counter-intuitive, not only because you think "you should ease into stuff" but also because you think "you need this first thing to understand this second thing"
However, when appropriately executed, it has pretty good results.
Learning C++ first is a little bit like starting to learn arithmetic with division. Yes, it's the hardest. Yes, it's the most dangerous. Yes, there are some really arcane parts of the language due to C. However, not only is it an incredibly useful language to learn from a skillset point of view, but it also has within it almost every capability you'll need to know for other modern languages.
Hmm, I don't think I buy that. At least not in that arithmetic example. Addition is pretty fundamental to understanding multiplication. I will agree that avoiding negative numbers and fractions is likely counter-productive.
I remember a conversation like this on the bus in elementary school. With dramatic license
O_o was basically me until I got to high school. I went to a math magnet for high school and that's what it took for teachers to stop acting dumb about things you learn in the next year up.
Yeah I got told, to my face, that negative numbers didn't exist when I asked what happens if you take a bigger number from a smaller one back when we were doing simple subtraction.
It was also around this time when I got told that I couldn't use a comma to adjust the metre in a line of verse because it wasn't grammatically correct.
I wish seven year-old me had known that you can complain about bullshit teachers back then.
Yeah, proper environments with source controlls should be something that is taught in college, I didnt get it, where I work doesnt use it, and after reading like 2 sentences I feel like I'm working with 1 arm.
Hmm, I don't think I buy that. At least not in that arithmetic example. Addition is pretty fundamental to understanding multiplication. I will agree that avoiding negative numbers and fractions is likely counter-productive.
The example I stated was directly from the study, so, it was not my paraphrased example. Take from that what you will.
Remember that the whole point of this idea is that when you encounter an idea more simple than the one you have already learned, you intuitively think to yourself "oh, so it's kind of like this but easier then?"
I don't see how you can teach multiplication without either addition or just making kids memorize multiplication tables.
And I thought we had established that mindless memorization is bad?
There is a theory which is gaining a pretty good amount of traction in education which basically states that you should start with something pretty hard, and work your way down from that. For instance, when learning arithmetic, you might start with division, then learn multiplication, subtraction, and addition. It's counter-intuitive, not only because you think "you should ease into stuff" but also because you think "you need this first thing to understand this second thing"
However, when appropriately executed, it has pretty good results.
Learning C++ first is a little bit like starting to learn arithmetic with division. Yes, it's the hardest. Yes, it's the most dangerous. Yes, there are some really arcane parts of the language due to C. However, not only is it an incredibly useful language to learn from a skillset point of view, but it also has within it almost every capability you'll need to know for other modern languages.
Hmm, I don't think I buy that. At least not in that arithmetic example. Addition is pretty fundamental to understanding multiplication. I will agree that avoiding negative numbers and fractions is likely counter-productive.
I remember a conversation like this on the bus in elementary school. With dramatic license
O_o was basically me until I got to high school. I went to a math magnet for high school and that's what it took for teachers to stop acting dumb about things you learn in the next year up.
Yeah I got told, to my face, that negative numbers didn't exist when I asked what happens if you take a bigger number from a smaller one back when we were doing simple subtraction.
It was also around this time when I got told that I couldn't use a comma to adjust the metre in a line of verse because it wasn't grammatically correct.
I wish seven year-old me had known that you can complain about bullshit teachers back then.
This is kinda an example (that probably a lot of us went through, given our profession/hobby we likely have above average understanding of math early on) of why starting slow isn't necessarily the best education method.
If you teach the "truth" first thing, the foundations don't need time wasted on them. You taught them implicitly and you didn't do so in a way that falls apart when you get to the "real stuff" because you were there to begin with.
"Do it this way, it works for now and we'll get into the hard stuff later" can easily lead to misunderstandings and confusion that are detrimental to learning later concepts. You have to unlearn, which is usually said to be difficult.
Hmm, I don't think I buy that. At least not in that arithmetic example. Addition is pretty fundamental to understanding multiplication. I will agree that avoiding negative numbers and fractions is likely counter-productive.
The example I stated was directly from the study, so, it was not my paraphrased example. Take from that what you will.
Remember that the whole point of this idea is that when you encounter an idea more simple than the one you have already learned, you intuitively think to yourself "oh, so it's kind of like this but easier then?"
I don't see how you can teach multiplication without either addition or just making kids memorize multiplication tables.
And I thought we had established that mindless memorization is bad?
I am literally just regurgitating to you the information I learned from this study.
The results were a statistically significant increase not only in speed at which the arithmetic was learned, but depth at which it was learned, so I am guessing it was not simply memorization of multiplication tables.
Remember, again, the entire point of the idea is that you teach simpler ideas via more difficult ones. In this example it is likely (but again I don't know, because I am literally just telling you what I learned from this study) that addition was learned through the context of multiplication, and then the students were given a section on addition to formalize the knowledge they already had.
But regardless of whether this was or was not the case, this was at least one, if not more academic studies done. So, whether or not either of us can conceive of how it can work is largely irrelevant.
Hmm, I don't think I buy that. At least not in that arithmetic example. Addition is pretty fundamental to understanding multiplication. I will agree that avoiding negative numbers and fractions is likely counter-productive.
The example I stated was directly from the study, so, it was not my paraphrased example. Take from that what you will.
Remember that the whole point of this idea is that when you encounter an idea more simple than the one you have already learned, you intuitively think to yourself "oh, so it's kind of like this but easier then?"
I don't see how you can teach multiplication without either addition or just making kids memorize multiplication tables.
And I thought we had established that mindless memorization is bad?
I am literally just regurgitating to you the information I learned from this study.
The results were a statistically significant increase not only in speed at which the arithmetic was learned, but depth at which it was learned, so I am guessing it was not simply memorization of multiplication tables.
Remember, again, the entire point of the idea is that you teach simpler ideas via more difficult ones. In this example it is likely (but again I don't know, because I am literally just telling you what I learned from this study) that addition was learned through the context of multiplication, and then the students were given a section on addition to formalize the knowledge they already had.
But regardless of whether this was or was not the case, this was at least one, if not more academic studies done. So, whether or not either of us can conceive of how it can work is largely irrelevant.
If they were teaching addition simultaneously with multiplication, that actually makes sense.
You wouldn't happen to have a link to this study would you?
If they were teaching addition simultaneously with multiplication, that actually makes sense.
You wouldn't happen to have a link to this study would you?
No, I got my information on it through my wife, who was doing research in the field at the time as a grad student.
But, remember, the idea of this is unintuitive precisely because it seems like you can't learn advanced concepts without a foundation in the basics. If multiplication is repeated addition, how can you learn multiplication first?
C++ was infinitely easier at taking user input though. Why is it so easy in C++ and not in Java?
Probably because of the JVM abstraction layer, if I had to guess. I have lamented the very same thing though.
Here's where you get into issues with "Java is totally easier" because it is, in fact, more complicated.
Well, not really complicated. Just Java. It's really asinine and stupid and retarded.
I just... anyone who says Java is better than anything is literally insane. Like, man, I'll help you check into a mental hospital for a bit so you can straighten your shit out.
not a doctor, not a lawyer, examples I use may not be fully researched so don't take out of context plz, don't @ me
This also reminds me of when I was super young and in the car on a family drive.
me: Hey mom, I can count by 7!
mom: Oh? (parent voice)
me: 7, 14, 21, 28, ...
mom: Wow, good job! (parent voice)
me: ... 84, 91, ...
dad: ... (driving and I like to imagine annoyed as fuck by now)
They stopped me after I was in three digits and at that point were a little confused since that was well past the multiplication charts. Yet another point in my history of "what is wrong with this boy" of brain discovery! (There are a lot of old stories that eventually make sense with an OCD diagnosis. Also speech therapy.)
int num = 0;
Console console = System.console();
String input = console.readLine("Enter input:");
num = Integer.parseInt(input);
Your Java code is slightly more typesafe than your C++ code there. This is why Java is beneficial for newbies, but doesn't really address the problem to them. It keeps them safe thinking it's important they do things they don't understand what they're doing.
not a doctor, not a lawyer, examples I use may not be fully researched so don't take out of context plz, don't @ me
This also reminds me of when I was super young and in the car on a family drive.
me: Hey mom, I can count by 7!
mom: Oh? (parent voice)
me: 7, 14, 21, 28, ...
mom: Wow, good job! (parent voice)
me: ... 84, 91, ...
dad: ... (driving and I like to imagine annoyed as fuck by now)
They stopped me after I was in three digits and at that point were a little confused since that was well past the multiplication charts. Yet another point in my history of "what is wrong with this boy" of brain discovery! (There are a lot of old stories that eventually make sense with an OCD diagnosis. Also speech therapy.)
Sounds like Aspergers. Savantism is a pretty common trait of someone with autism.
not a doctor, not a lawyer, examples I use may not be fully researched so don't take out of context plz, don't @ me
Your Java code is slightly more typesafe than your C++ code there. This is why Java is beneficial for newbies, but doesn't really address the problem to them. It keeps them safe thinking it's important they do things they don't understand what they're doing.
To be fair, though "knowing what they're doing" doesn't really come for a couple years regardless.
Like, I would contend that I didn't really have a very good idea of what was actually happening until after I had taken both assembly language and computer architecture. At that point, I knew how circuits worked, what memory was, how it was pulled, and what actual machine language did to manipulate it. Then I started thinking in terms of that, and things started making a lot of sense.
I had a pretty good grasp of the fundamentals of OOP before that, and I knew what I was doing as far as the higher level language abstraction was concerned, but if we're talking about really knowing what you're doing in such a way where java and c++ are fundamentally different, well, that's at least a few years down the road for a new student.
This also reminds me of when I was super young and in the car on a family drive.
me: Hey mom, I can count by 7!
mom: Oh? (parent voice)
me: 7, 14, 21, 28, ...
mom: Wow, good job! (parent voice)
me: ... 84, 91, ...
dad: ... (driving and I like to imagine annoyed as fuck by now)
They stopped me after I was in three digits and at that point were a little confused since that was well past the multiplication charts. Yet another point in my history of "what is wrong with this boy" of brain discovery! (There are a lot of old stories that eventually make sense with an OCD diagnosis. Also speech therapy.)
Sounds like Aspergers. Savantism is a pretty common trait of someone with autism.
Nah, I was exactly the same way and I don't have Aspergers.
Oh, and @Infidel hi-5 for speech therapy! (Assuming that's something you hi-5 for)
Maybe not so much savant as ability to focus on an interest to be able to do that.
Autism is a social/communication issue, there wasn't any of that. Or not significant anyways.
The savant stuff is a common occurrence in autism, it doesn't make it autism though.
Speech therapy though!
Just kidding. Most aspergers people you won't even notice they have it until you bring up something they're even remotely interested in. Then bam, talk your head off for hours if you let them.
not a doctor, not a lawyer, examples I use may not be fully researched so don't take out of context plz, don't @ me
I had therapy because I had trouble articulating my words. My mind would totally know what I was trying to say but my mouth wouldn't keep up, and I was slow at picking up certain sounds.
Now I am mostly fine but I talk super fast still. The problem is something else altogether now, when I'm talking with you I probably have a completely different dialogue going on in my head. It is probably super vulgar, you could think of it sorta like internal Tourette's. This is a pretty basic OCD thing.
Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at test.Test.main(Test.java:12)
I had therapy because I had trouble articulating my words. My mind would totally know what I was trying to say but my mouth wouldn't keep up, and I was slow at picking up certain sounds.
Now I am mostly fine but I talk super fast still. The problem is something else altogether now, when I'm talking with you I probably have a completely different dialogue going on in my head. It is probably super vulgar, you could think of it sorta like internal Tourette's. This is a pretty basic OCD thing.
Yep, same issue for me. I knew what I wanted to say, but couldn't make my mouth do it. Another story from 7-year old gjaustin! (I may have actually been 5 or 6, but DRAMATIC LICENSE!)
Why do I discourage teaching C++ in the context of intro? Here is a paraphrased email I sent to a colleague about the subject:
Good C++ is "all or nothing". That is, all the language features of C++ bleed together to create a cohesive whole. There is little-to-no separation of programming concepts that allow a student to incrementally build up programs. To build a "good" C++ program (read: idiomatic, type-safe, memory-safe), you need to pull together many concepts.
For example, to discuss dynamic dispatch, we need to:
(1) Talk about pointers and references because dynamic dispatch only occurs through pointers and references.
(2) With pointers, we need to talk about lifetime management. Who "owns" a pointer? And who is responsible for cleaning up that memory?
(3) Combining pointers and classes, we need to discuss lifetime management within classes. The destructor is responsible for this.
(4) However, this is insufficient to guarantee memory safety because the destructor is not the only special member function that deals with lifetime management. We must also introduce the copy constructor and the copy assignment operator to ensure that students author classes that are memory safe. In the process, we will need to discuss references (if we haven't done so already), copying vs. reference semantics in C++ (i.e., when the copy constructor is invoked), const, and operator overloading. This is known as the rule of three.
(5) Finally, if we talk about dynamic dispatch, we will need to also to mention virtual destructors and when they are necessary.
If you skip any one of these steps, then you run the risk of your students going out into the wild and writing memory unsafe code. This is what makes C++ a complicated language, but also a powerful language because C++ objects can act just like primitive types wrt functionality, esp. memory management. But this is why C++ is not a good beginning language. There's a lot of cruft you must go through in order to do things right.
@TwitchTV, @Youtube: master-level zerg ladder/customs, commentary, and random miscellany.
On the topic of things programmers should learn in college....
1. How to test.
Seriously, like a semester class on the subject. So many kids out of school are way, way too optimistic when developing applications, to the point where breathing on the application causes it to fail. At the very least, I want to see assert style input checking that could be compiled away. Better yet would be knowing how to write junit or doctest style code, something with at least 50% code coverage that could be used as a nightly test.
2. Build systems.
Another aspect that is overlooked during college is build systems, which is pretty much a requirement in the workplace. No need to be an expert, but damn, I just want enough of a clue that you can create a build system for your part of the puzzle, one that can at least handle nightly tests and can be integrated into the rest of the build system without too much pain. Saying that Eclipse is your build system is not acceptable.
Why do I discourage teaching C++ in the context of intro? Here is a paraphrased email I sent to a colleague about the subject:
Good C++ is "all or nothing". That is, all the language features of C++ bleed together to create a cohesive whole. There is little-to-no separation of programming concepts that allow a student to incrementally build up programs. To build a "good" C++ program (read: idiomatic, type-safe, memory-safe), you need to pull together many concepts.
For example, to discuss dynamic dispatch, we need to:
(1) Talk about pointers and references because dynamic dispatch only occurs through pointers and references.
(2) With pointers, we need to talk about lifetime management. Who "owns" a pointer? And who is responsible for cleaning up that memory?
(3) Combining pointers and classes, we need to discuss lifetime management within classes. The destructor is responsible for this.
(4) However, this is insufficient to guarantee memory safety because the destructor is not the only special member function that deals with lifetime management. We must also introduce the copy constructor and the copy assignment operator to ensure that students author classes that are memory safe. In the process, we will need to discuss references (if we haven't done so already), copying vs. reference semantics in C++ (i.e., when the copy constructor is invoked), const, and operator overloading. This is known as the rule of three.
(5) Finally, if we talk about dynamic dispatch, we will need to also to mention virtual destructors and when they are necessary.
If you skip any one of these steps, then you run the risk of your students going out into the wild and writing memory unsafe code. This is what makes C++ a complicated language, but also a powerful language because C++ objects can act just like primitive types wrt functionality, esp. memory management. But this is why C++ is not a good beginning language. There's a lot of cruft you must go through in order to do things right.
Unless you need to teach C++11 and now you have to cover the rule of five and all the move semantics.
Pretending students getting in to the real world are going to make apps with Java that doesn't use some unsafe JNI is just as ignorant as needing to figure out the basics of memory management which should be covered as a precursor to data structures.
not a doctor, not a lawyer, examples I use may not be fully researched so don't take out of context plz, don't @ me
Seriously, like a semester class on the subject. So many kids out of school are way, way too optimistic when developing applications, to the point where breathing on the application causes it to fail. At the very least, I want to see assert style input checking that could be compiled away. Better yet would be knowing how to write junit or doctest style code, something with at least 50% code coverage that could be used as a nightly test.
A thousand times this.
I had this conversation so many times as a TA:
Me: "Alright, so you finally cleared up the null pointer exception, but the solution your program is coming up with is wrong. Well, the best way to solve this problem is to make up a data set that is fairly simple, but not trivial. For instance, maybe ten numbers. Then, on paper, do the sorting algorithm step by step yourself, the same way your program does it.
Write down each step. Then, make your program print out the entire string of numbers as it sorts them, every step. Compare your steps to the ones in your program, see where they go wrong. That will give you some information about where to look. Debugging is all about information. It's all about knowing where to look for your error."
Them: "That sounds like a lot of work."
Me: "..."
0
mightyjongyoSour CrrmEast Bay, CaliforniaRegistered Userregular
To me an intro course is all about basic structures and problem solving by thinking programmatically. In that context any language works fine; its perfectly okay to write functional c++ code without worrying about dynamic dispatch.
In that same vein, its an intro. They're not going to get a job after one class.
+4
gavindelThe reason all your softwareis brokenRegistered Userregular
Wait, you mean Google isn't getting ready to hire me? But I got an A in C last semester! My life is ruined!
(At my internship, the average workplace age was about 40, and we sat through several agonizing meetings about 'how to deal with millenials in the workplace'. They literally gave us trophies at the end. Trophies. For coming to work for 10 weeks.)
Angels, innovations, and the hubris of tiny things: my book now free on Royal Road! Seraphim
Posts
int num = 0; Console console = System.console(); String input = console.readLine("Enter input:"); num = Integer.parseInt(input);Yeah I got told, to my face, that negative numbers didn't exist when I asked what happens if you take a bigger number from a smaller one back when we were doing simple subtraction.
It was also around this time when I got told that I couldn't use a comma to adjust the metre in a line of verse because it wasn't grammatically correct.
I wish seven year-old me had known that you can complain about bullshit teachers back then.
Nintendo Network ID: AzraelRose
DropBox invite link - get 500MB extra free.
I don't see how you can teach multiplication without either addition or just making kids memorize multiplication tables.
And I thought we had established that mindless memorization is bad?
This is kinda an example (that probably a lot of us went through, given our profession/hobby we likely have above average understanding of math early on) of why starting slow isn't necessarily the best education method.
If you teach the "truth" first thing, the foundations don't need time wasted on them. You taught them implicitly and you didn't do so in a way that falls apart when you get to the "real stuff" because you were there to begin with.
"Do it this way, it works for now and we'll get into the hard stuff later" can easily lead to misunderstandings and confusion that are detrimental to learning later concepts. You have to unlearn, which is usually said to be difficult.
I am literally just regurgitating to you the information I learned from this study.
The results were a statistically significant increase not only in speed at which the arithmetic was learned, but depth at which it was learned, so I am guessing it was not simply memorization of multiplication tables.
Remember, again, the entire point of the idea is that you teach simpler ideas via more difficult ones. In this example it is likely (but again I don't know, because I am literally just telling you what I learned from this study) that addition was learned through the context of multiplication, and then the students were given a section on addition to formalize the knowledge they already had.
But regardless of whether this was or was not the case, this was at least one, if not more academic studies done. So, whether or not either of us can conceive of how it can work is largely irrelevant.
If they were teaching addition simultaneously with multiplication, that actually makes sense.
You wouldn't happen to have a link to this study would you?
No, I got my information on it through my wife, who was doing research in the field at the time as a grad student.
But, remember, the idea of this is unintuitive precisely because it seems like you can't learn advanced concepts without a foundation in the basics. If multiplication is repeated addition, how can you learn multiplication first?
Well, turns out it is actually more effective.
Here's where you get into issues with "Java is totally easier" because it is, in fact, more complicated.
Well, not really complicated. Just Java. It's really asinine and stupid and retarded.
I just... anyone who says Java is better than anything is literally insane. Like, man, I'll help you check into a mental hospital for a bit so you can straighten your shit out.
me: Hey mom, I can count by 7!
mom: Oh? (parent voice)
me: 7, 14, 21, 28, ...
mom: Wow, good job! (parent voice)
me: ... 84, 91, ...
dad: ... (driving and I like to imagine annoyed as fuck by now)
They stopped me after I was in three digits and at that point were a little confused since that was well past the multiplication charts. Yet another point in my history of "what is wrong with this boy" of brain discovery!
Your Java code is slightly more typesafe than your C++ code there. This is why Java is beneficial for newbies, but doesn't really address the problem to them. It keeps them safe thinking it's important they do things they don't understand what they're doing.
Sounds like Aspergers. Savantism is a pretty common trait of someone with autism.
To be fair, though "knowing what they're doing" doesn't really come for a couple years regardless.
Like, I would contend that I didn't really have a very good idea of what was actually happening until after I had taken both assembly language and computer architecture. At that point, I knew how circuits worked, what memory was, how it was pulled, and what actual machine language did to manipulate it. Then I started thinking in terms of that, and things started making a lot of sense.
I had a pretty good grasp of the fundamentals of OOP before that, and I knew what I was doing as far as the higher level language abstraction was concerned, but if we're talking about really knowing what you're doing in such a way where java and c++ are fundamentally different, well, that's at least a few years down the road for a new student.
Are you sure?
Autism is a social/communication issue, there wasn't any of that. Or not significant anyways.
The savant stuff is a common occurrence in autism, it doesn't make it autism though.
Nah, I was exactly the same way and I don't have Aspergers.
Oh, and @Infidel hi-5 for speech therapy! (Assuming that's something you hi-5 for)
Speech therapy though!
Just kidding. Most aspergers people you won't even notice they have it until you bring up something they're even remotely interested in. Then bam, talk your head off for hours if you let them.
I had therapy because I had trouble articulating my words. My mind would totally know what I was trying to say but my mouth wouldn't keep up, and I was slow at picking up certain sounds.
Now I am mostly fine but I talk super fast still. The problem is something else altogether now, when I'm talking with you I probably have a completely different dialogue going on in my head. It is probably super vulgar, you could think of it sorta like internal Tourette's. This is a pretty basic OCD thing.
Yep, same issue for me. I knew what I wanted to say, but couldn't make my mouth do it. Another story from 7-year old gjaustin! (I may have actually been 5 or 6, but DRAMATIC LICENSE!)
Spelling your name when it has two letters you can't pronounce is super awkward. I don't talk super fast anymore though.
Good C++ is "all or nothing". That is, all the language features of C++ bleed together to create a cohesive whole. There is little-to-no separation of programming concepts that allow a student to incrementally build up programs. To build a "good" C++ program (read: idiomatic, type-safe, memory-safe), you need to pull together many concepts.
For example, to discuss dynamic dispatch, we need to:
(1) Talk about pointers and references because dynamic dispatch only occurs through pointers and references.
(2) With pointers, we need to talk about lifetime management. Who "owns" a pointer? And who is responsible for cleaning up that memory?
(3) Combining pointers and classes, we need to discuss lifetime management within classes. The destructor is responsible for this.
(4) However, this is insufficient to guarantee memory safety because the destructor is not the only special member function that deals with lifetime management. We must also introduce the copy constructor and the copy assignment operator to ensure that students author classes that are memory safe. In the process, we will need to discuss references (if we haven't done so already), copying vs. reference semantics in C++ (i.e., when the copy constructor is invoked), const, and operator overloading. This is known as the rule of three.
(5) Finally, if we talk about dynamic dispatch, we will need to also to mention virtual destructors and when they are necessary.
If you skip any one of these steps, then you run the risk of your students going out into the wild and writing memory unsafe code. This is what makes C++ a complicated language, but also a powerful language because C++ objects can act just like primitive types wrt functionality, esp. memory management. But this is why C++ is not a good beginning language. There's a lot of cruft you must go through in order to do things right.
1. How to test.
Seriously, like a semester class on the subject. So many kids out of school are way, way too optimistic when developing applications, to the point where breathing on the application causes it to fail. At the very least, I want to see assert style input checking that could be compiled away. Better yet would be knowing how to write junit or doctest style code, something with at least 50% code coverage that could be used as a nightly test.
2. Build systems.
Another aspect that is overlooked during college is build systems, which is pretty much a requirement in the workplace. No need to be an expert, but damn, I just want enough of a clue that you can create a build system for your part of the puzzle, one that can at least handle nightly tests and can be integrated into the rest of the build system without too much pain. Saying that Eclipse is your build system is not acceptable.
Unless you need to teach C++11 and now you have to cover the rule of five and all the move semantics.
A thousand times this.
I had this conversation so many times as a TA:
Me: "Alright, so you finally cleared up the null pointer exception, but the solution your program is coming up with is wrong. Well, the best way to solve this problem is to make up a data set that is fairly simple, but not trivial. For instance, maybe ten numbers. Then, on paper, do the sorting algorithm step by step yourself, the same way your program does it.
Write down each step. Then, make your program print out the entire string of numbers as it sorts them, every step. Compare your steps to the ones in your program, see where they go wrong. That will give you some information about where to look. Debugging is all about information. It's all about knowing where to look for your error."
Them: "That sounds like a lot of work."
Me: "..."
In that same vein, its an intro. They're not going to get a job after one class.
(At my internship, the average workplace age was about 40, and we sat through several agonizing meetings about 'how to deal with millenials in the workplace'. They literally gave us trophies at the end. Trophies. For coming to work for 10 weeks.)
I barely make it 4 weeks without having to take a 3 day weekend. The beginning of the year is rough in the at we have almost no holidays.
Hallmark needs to get on that.