posted by: mcrocker
I have heard the term “algorithmic thinking” tossed around a lot since joining NDeRC. My teaching at Trinity involves teaching computer programming to Juniors in high school. Most of these students have never done any programming before. The final goal of teaching computer programming at Trinity is to give the students the skills needed to create tools in MatLab that can be used to “simulate” kinematics, kinetics, and other physics topics taught at Trinity so the students can try more experiments than are possible in a high school laboratory. (It also has a very beneficial side purpose, which is to expose students to computer programming early, which is a good idea in general.)
In the course of teaching, I wanted to understand how well I was doing. I assumed that this idea of algorithmic thinking was the best way to evaluate how well the students were learning. However, it seems that algorithmic thinking is not the biggest issue when teaching the basics of computer programming. Most students are really good at breaking down the steps of a task. This is similar to explaining how to do something to a child. I found that students would be good at explaining tasks to a computer if the computer knew English. So really, the students just need to understand the computer commands. This is harder, since the things a computer can do easily is not the same as the things that a person can do easily. Computers perform calculations very quickly without error, but computer cannot make assumptions or correct for inexact commands.
So I came to the conclusion that abstraction is the key thing to teach students. Once the student learns how to make a generalized statement in a form that the computer can understand, everything else falls into place. However, students often have a hard time figuring out how to use an index variable in a loop. Even v(i)=v(i-1)+1 is hard for them to come up with. Having the students create and use their own functions, which have different variable scope, is even harder.
It is possible that algorithmic thinking is much more important later on, especially when it comes to more complicated problems (for example, problems that have more general inputs of arbitrary size). However, when first teaching programming to students, the main hurdles seem to be with: (1) understanding what computer commands are likely to be available to them, and (2) understanding how to abstract or generalize commands to apply to any dataset.
Also, the skills that students had before starting programming seem to go away due to frustration. For simple programs, students tended to be willing to step through the programs in their minds. With larger programs, they tend to rely on previous examples, and miss obvious errors that they would easily catch if they went line-by-line through the code. I do that myself, since code can get very long at times. In the end, it seems there is a lot more for me to understand about how first-time programmers understand what they are doing.