A recent Facebook post suggested changing the language for Advanced Placement Computer Science A (what some of us annoy others by calling AP Java). This comes up regularly with lots of people suggesting their favorite language. Changing the programming languages means changing a lot more than the language though.
Different programming languages have their own idioms. Their own way of doing things. Programming languages and the concepts one can teach with them are closely related.The change to Java (and to some extent C++ before it) was based on a desire to teach more object oriented programming and design. The language was picked after the concepts to teach were chosen.
I wonder how often we (CS teachers) pick a language first though. DO we pick the concepts to teach based on the languages and the programming idiom we are familiar with or do we think wider?
My honors programming course is largely a warm up for AP CS A and preparing students with the concepts they’ll need is a goal. I use C# rather than Java though because it seems to me (without the sort of research based evidence I should probably look for) that it has a lower cognitive load than Java. It seems to work for us.
My APCS Principles class is using the curriculum and tools developed by code.org. It uses their block based App Lab with the option to use/view JavaScript. This language and tool does appear to be based on the concepts rather than fitting the concepts in after the fact. So I’m happy with that.
One thing I will be pondering over the summer is what concepts should I teach. Am I teaching the right concepts or should I change them? What about cognitive load? I was re-reading How to choose programming languages for learners: Reviewing JavaScript and Ready by Mark Guzdial and his points about cognitive load really resonate with me.
Block languages do seem, based on evidence, to have lower cognitive load for beginners. I’m less comfortable with them; probably because I’m so old school. Student attitudes towards them are mixed with some really loving the low cognitive load and some having trouble taking them seriously. I have to keep in mind the concepts I want to teach as well.
No matter how I look at it though it is never as easy as “just teach the same things the same way but with a different programming language.”
I believe the language is pretty irrelevant. It is the teacher's skill at teaching that language which is the big factor. The cognitive load is important but that can be greatly reduced by good teaching methods. And deciding what concepts to teach at the high school level is going to affect that language. Scratch and other block languages work just fine for teaching the fundamentals of programming but that is pretty much it. They sort of hit a usability wall. Small Basic can be a next step but it hits a wall pretty quickly. SB does not survive complexity. These can be taught by a beginning teacher who has no background in programming. The teacher can develop skills on the fly. Then we get to the big kid languages: Python, Java, C#, VB and so on. Now we are where a teacher better know what they are doing or be willing to spend hours learning. Many people will say "Of course a programming teacher has to know what they are doing. They were hired to teach programming!" My experience is that most high school programming teachers were not hired to teach programming, they either decided to or were told to. Now we are back to the question of the teacher's skill or commitment to learn some skill. From there it is back to what language can they teach (or more likely learn well enough to teach). Changing languages is a major issue when the languages you do know are all sell taught.
ReplyDelete