My background is in computer engineering. At the time I was making such decisions, my naive young mind associated "computer engineering" with hardware, and "computer science" with software. I thought the interesting stuff would be in hardware. The software would just kind of happen along the way.
Of course, it's not that simple. While I did have a couple of programming courses as part of my ECE curriculum, when it came to actually having to write software as part of my graduate work I came to realize I still had a lot to learn. And yes, there was a lot of interesting stuff going on in software.
Also, during this time, purely by accident I found myself teaching a programming course in a required sequence of programming courses for the computer engineering majors. It is widely regarded that the best way to learn something, is to teach it, and this experience was no exception. In addition to the many nuances of programming itself, I learned that teaching programming is rather difficult. Some of the challenges I faced:
- handing the wide variation of prior-experience that entered by sophomore-level course,
- how to balance limited course time across abstract concepts, philosophy, and design thinking, professional tools, and the coding process,
- how to answer the question 'why is this important if I don't plan to become a software developer?'
Along with these questions was the more meta-level question: is this just me, or are others facing similar challenges teaching programming?
It is all the more critical that we wrestle with these questions now in light of the continuing trend to make programming education available to a wider audience. Recently, President Obama announced the CS for all initiative which aims to "to empower all American students from kindergarten through high school to learn computer science and be equipped with the computational thinking skills they need to be creators in the digital economy..." While the intent seems commendable, what do we actually mean by "learn computer science" and "computational thinking skills" in this context? We probably do not expect "all American students" to become software developers, so what is it about computer science and computational thinking skills that we feel are so important for all students to learn? And if we can pinpoint that, what can we learn from existing efforts to teach programming that might inform how we approach "computer science for all"?
Problem solving with programming
One possible way to frame why we might want "computer science for all" is to look at the process involved in problem solving through programming.