Friday, February 01, 2013

Do We Need Radical Change in Computer Science Education?

Everyone seems to be getting into the game of “fixing” computer science education. From Khan Academy to online programs seem to be popping up weekly. Some of these programs have been started by people with teaching experience while some appear to be entrepreneurs with aspirations of changing the world with some “new” idea of how to teach. Some are from major universities as part of a move to MOOCs (Massive Open Online Courses). Many of these are getting lots of attention in the popular or the tech media. Some even in the education media. They seem to be focused on two ideas:
  1. Students don’t have enough opportunities to learn computer science in school (k12)
  2. Current K12 computer science programs are doing it all wrong.
I’m in total agreement with the first assumption. I doubt that more than one in ten American high schools offer a real computer science course. The number who offer something as advanced at Advanced Placement computer science is even smaller. As bad as it is in general it is far worse in low income or majority minority areas.
The second item I’m not as sure about. Oh I do understand that there are a lot of computer science programs out there that are not going a very good job but there are also some amazing and wonderful CS programs out there. So that is a mixed bag. The solutions being offered are not always that radical or even different. The online component is the largest difference and that in my opinion is not a magic bullet by any stretch of the imagination.
Ajit Jaokar co-founder of feynlabs (similar to Khan Academy in that it was started in response to an adult wanting to help a child learn) has two interesting articles in Edutopia about how to radically transform how we teach computer science.
There are some great ideas in those posts but radical? I’m not so sure. Many of them are things I have learned from other CS teachers over the last few years or even (gasp) figured out on my own. I’ve listed his 10 points below (in bold) with my own comments. Is that a rebuttal? Not really. More like a conversation or a set of observations.
  1. Co-Relate the Teaching of Programming Languages to Real-Life Examples in Other Scientific Domains I think that most successful computer science teachers these days are trying hard to bring in more real-life examples especially in their projects. Projects that are too artificial and forced tend to turn students off. On the other hand finding ways to co-relate projects to other subjects and other fields of interest build enthusiasm for computer science.
  2. Prepare Kids for the Next Wave of Computing The next wave of computing includes mobile and cloud computing. Many CS teachers find themselves overwhelmed with too much to teach in too little time as it is. This makes fitting in cloud and/or mobile development tricky at best. When you add in that few teachers have training in these areas and it’s a tough situation. That being said, students need to be made aware of these topics. These are great discussion points and fit very well into discussion of computing on society which should flow all though CS education. These are areas where we need more professional development and available resources. There are some good things available for mobile (App Inventor for Android and some Windows Phone resources from Microsoft) but not much for cloud. And least not much for cloud that is appropriate for the high school audience. (Hint to my friends at Microsoft)
  3. Clarify for Kids the Economic Value of Learning Programming This is important for any subject being taught at school today. For CS it has to be more about just a job in computing though. It has to be about the value of understanding the tool that is central to almost every business and industry in the developed world.
  4. Delay Coding I have mixed feelings about this one.  I know there is a lot of thinking these days about teaching concepts apart from coding. I think that early success with coding is encouraging but doesn’t over do it. I also think that instructors can do enough set up to make starting with code easy. Plus there is increasingly the option of programming using graphical tools like Alice, Scratch, App Inventor and Kodu that really take syntax (a frustration point for many) out of the early doing picture.
  5. Discuss the Big Picture and Introduce Systems Thinking With an undergraduate degree in Systems systems thinking is never far from central in the way I do things. I think that object oriented program leads directly to systems thinking which is a plus. When teaching about objects I try to show the relationships between objects and how things like inheritance and polymorphism help a system to fit together more smoothly.
  6. Use Hacking as a Fundamental Teaching Tool I don’t like the phrasing of this. I might use the term mashup or just say “start with code and have students modify it.” I’m working on a number of curriculum resources where I supply working code either just the user interface or with some active code and then ask students to add to it or modify it. I didn’t always do this but I’ve talked to enough people who have seen good results with this that I’m doing it now. My hope is that this actually encourages more experimentation with code as opposed to too much playing with the user interface.
  7. Start with One Programming Language But Don’t Limit Yourself I’ve long been a believer that students should leave school knowing more than one programming language. I like to compare languages even without formally teaching multiple languages. I feel this gives students some sider insight that is helpful in their careers. In high school I think that if there are multiple courses there should be multiple languages taught. Kids at this age learn multiple programming languages quite easily as long as they are comfortable and confident in the teaching.
  8. Use Multimedia for Learning and for Content Creation Increasingly most teachers are using media for learning. Of course even when I was a student 40 years ago we had and used media in class but today YouTube and similar options make a lot more available. To me programming is creative but is it creative media? Not always. Media Computation is a great idea out of Georgia Tech but it is only one way to use media for content creation. The visual programming tools like Alice, Scratch and Kodu do let students create what are essentially programmed “movies.” These are great opportunities to mix programming, media and other areas of study. Over all I think I need to think more about creative media in CS.
  9. Separate the Exceptions from the Rules I think most of us do this. We present methods (or functions/subroutines) first in a simple fashion. Once students get the basic concepts of methods we introduce the differences between passing by reference and value. Doesn’t seem so radical to me.
  10. Discuss Learning About Learning I’m not sure I understand what Joakar is talking about in this point. I do know that my focus on teaching computer science is to help students learn how to learn more. They need an understanding of the basic concepts of course but the best thing we can do is help them learn how to learn on their own. I encourage experimentation and supplemental research. I emphasize that we are preparing for a world (of computer science) that is one of constant change and that students will never stop learning new things. The ones who get excited by this are the ones who really enjoy CS.
I’m not sure CS education needs radical change. I think there is a lot we can do better and a lot we can learn from people in education for other disciplines. I think we need more (and perhaps more frequent) professional development opportunities for teachers. And I believe that we need to share ideas about what works so that as a community we can improve the state of CS education. I’m just not sure that industry professionals with no experience beyond teaching their highly motivated children or other relatives are going to be the ones to “fix” everything.

1 comment:

Garth said...

I have to say K12 Computer Science programs are doing it all wrong. If it were done right the local public school would not have only 30 out of 3000 kids taking CS courses. I do not think CS is being taught wrong (it may be but I am not convinced of that, too small a sample space for me to make a conclusion) but the problem is how CS is treated in K12. A low priority elective is not going to do the trick. Oh well, my school is offering Chinese as a language elective. I think the US is going to need it.