I recently taught an Introduction to Programming class, and when I was writing up report cards I was surprised to see how well students had done as a whole. One of the most interesting aspects of student performance was how students treated themselves and others. We assess our students on Courtesy and Respect in every class, and these scores were higher overall than I have seen for any other class. I think there are a few significant reasons for this, In short, students start to feel smart and respected in a programming class so they behave differently.
For those who have taught programming classes, have you seen students carry themselves differently in your programming classes? If so, have you been able to identify what it is about programming that makes students act differently?
I've taught numerous programming classes, and I have to agree with you. (Although, I have seen programming classes have poor responses depending on the teacher)
I think a big part of this is something that plagued me through out school, "Why am I learning this." I never enjoyed the classes where we learned to do the work, just to do the work. Easy targets = History, Math, Science, etc... When it was just taught in a hypothetical sense, and never applied practically, it was very boring to me. (no offense to those teachers, some topics are just harder to make entertaining to kids)
Programming classes, on the other hand, are applied immediately. Practically everything *Can* be applied to something interesting right away, to a project with interesting goals. However, it can also be boring like anything else.
Here is a rule of thumb I've learned in the classes.
Teaching a loop by having something count from 1 to 5.
Teaching a loop by having a count down, from 3 to 1, followed by a final message "Boom"
Even though there is relatively little difference, the kids (and adults) will have imagery in their heads going along with the second one. Imaginary explosions, you'll even hear them (even in adult classes) making explosion sound effects.
Not only does it keep the class interested, but you've associated the understanding of loops with other memories &
experiences, making it easier to retain and apply in the future.
Another example, (aside from the entertainment factor) is teaching simple decisions (if statements), by explaining the logic used in many AI's. While this doesn't necessarily create a sense memory like the explosion, this does associate to an interesting target goal, or at least link the knowledge to games that were intelligent vs simple.
Example: AI is typically just turning any problem into a simple yes or no question. Often done with numbers. For instance, should an AI Character move forward? The next space is closer to their destination, +10 points. The next space is in firing range of the Hero's ship, -5 points. The next space is slow moving (sand or swamp) -3 points. etc... Then apply similar questions to standing still, or moving back, or to the left, etc... Then take the value that is greatest and do that. A dumber AI will simply add a random value to each of the answers. (the larger the range of random, the dumber the AI)
- Then ask the kids to come up with an example of AI in a video game they know, then figure out how how it might be turned into a simple yes or no question. ( or a few )
- Then challenge them with this: Have them make a program that asks the user for their name. We want to make sure it seems like a real name, how could we do that? turn it into a yes or no question. (Examples: starts with a capital letter, has both vowels and consonants, is atleast 2 letters 'Al')
- While this this uses a simple "What is your name" type of code sample, it is now something that will clearly lead to making video games that are awesome. everyone is more excited about it.
Thanks for the interesting response. I like your countdown example, I think I will share that with students. I've been making loops interesting by telling students they're going to write a program that will display the numbers from 1 to a million. They love it, and start testing the boundaries of large lists, printing from lists vs. printing inside a loop, etc.
I also taught programming for the last 5 years. You are right, the students do feel that they have somehow conquered something. What seemed to work really well is letting them create their own simple games. I have found greenfoot and alice specifically great for this.
I teach programming through the lego NXT robotics at my middle school and you are right they do feel different once they are done. My best quote for my class was once a kid figured out that using the math to write is code worked better than trial and error he said "Hey guys the teacher is right the math really does work." He then went on to figure out how to use data logging on the robot to make programming even easier. From then on I had him hooked and he as well a others that got to the point wouldn't stop programming and helping others. Often time to the detriment of their other class work.
What I struggle with is those kids who don't make it the point of "getting it" or don't want to try and get it. I had one girl who is obviously smart and gets the programming but hated doing it and hated doing the activities. All she wanted to do was do worksheet after worksheet of math problems and problem solving around programming (ex looking at code and figuring out what the error is. ie troubleshooting). Any thoughts on helping these students or middle school students get over the "hump" of programming?
I have seen the issue of a student's interest in programming becoming a detriment to their other class work. I think I was the same way with science when I was in high school. I think it's a delicate balancing act; you can use their interest in programming to help them stay motivated to do reasonably in all their classes. But there's an ugly temptation that some teachers, administrators, and parents have where as soon as a kid has something they care about, they threaten to take that thing away from kids if they don't do something the adults want them to do. For example, when I taught chess it always hooked many students who were really intelligent had behavior issues. There were always teachers who wanted to keep them out of chess unless students fixed their behavior immediately.
I think the best approach is to nurture their interests, and use that connection as a way to see their overall academic responsibility and behavioral decisions in a different light.
I will give a little thought to the students who don't get it a little later.
It seems to be true of young people and adults, that some people "get" programming and some don't. I think it's like chess. You can teach anyone chess strategies and tactics, and they will improve. But if you can't integrate those strategies and tactics into your games, if you're just looking to blindly apply rules, you can't go far in chess. Programming is similar. Most people can learn simple structures such as loops and if tests, and the use of functions. But not everyone can apply those structures in a way that leads to solving complicated problems.
This is another reason it's interesting to work with young people around programming.There's something about being willing to take risks that blocks some students from doing well. You've got to be willing to fail, and make errors every day, if you are going to do anything interesting at all. Some of the top students are averse to programming for this very reason - they simply don't know how to handle making bugs every day.