I’d fallen a bit behind in my blog reading lately. Over the long weekend I tried to catch up some and came across a post by Leigh Ann DeLyser called Lets just blame the Intro CS… That post was a response in part to an article about the struggle to plug the embedded programming gap. It seems as though people want to blame the first programing course for all the ills in the field of computer science. At times it feels like people want everything covered in a first course. As Leigh Ann suggests we in the computer science field really need some conversations about what the purpose of the first course (and perhaps the whole curriculum) should be. Then we should make the course fit the goals.

I’ve been honored to be a part of the CS 2013 ACM/IEEE-CS Joint Task Force for the the last year or so.  This project is designed to make recommendations for what the undergraduate computer science curriculum should look like going forward. And there are recommendations for embedded system development as part of the curriculum. But that doesn’t mean it has to be done in the first course.  Depending on the people I am talking to though almost everything gets suggested as belonging in a first course. Sometimes I think people only expect students to have one course in computer science. Unfortunately, in high schools that is often the case.  The reality is that a single course has a limited amount of time to cover what has to be a limited amount of material.

The first question most people ask is “what should we cover?” but I like the point in Leigh Ann’s blog – the first question should be more along the lines of “what is the purpose of this course?”

Let’s start with some things you probably don’t want to be the result of a first programming course.

  • Turn out professional developers – seriously people it takes a lot more than that. Sure a few kids will get internships and do quite well. If the course was down right they will have to tools to learn a lot. They will not know enough – even if they think they do.
  • Prepare students for operating system development. To do that they need to know a lot more than C programming and some simple pointers. They’ll need serious data structures. They’ll also need to really understand what a OS does because really most people don’t. This takes a couple of courses or a whole lot of hands on learning. (A whole lot == years)

So forget the assembly language programming for a first course – you’ll scare all but the crazy away. Forget the detailed OS interactions – they’re not ready for it. The first job of the first course is to get students ready for more. What you want is:

  • A solid understanding of programming basic concepts (Note I said BASIC not all not deep technical hacker stuff – basic concepts)
  • Interest in learning more – this usually means some success. Not fake success but real success. They need to have finished projects that were both challenging and interesting. Hitting one of those is easy but you need to hit both of them for real success.

If a student finishes a course with interest in learning more and the basics they need to learn the next steps they’ll do fine. They can learn assembly language and hard code C in later courses. They can learn a little about limited resources doing mobile programming and from their to the fun stuff of embedded systems. Or they can get to embedded by way of robots. They don’t need to learn it all in the first course.

of course a complete curriculum should cover multiple programming languages and multiple programming paradigms. Sticking with one language throughout is harmful and limiting. High school and college kids pick up new languages very quickly and the sooner they do the better in my view. Bout let’s not try to cram four years of education into the first programming course ok?