So as you read this it is a day or two after Christmas. You may still be full from Christmas dinner and you just want to take it easy. Or it may be that you don't celebrate Christmas and you are struggling to find interesting content to read on the Internet. Well just for you I wrote this post a week in advance so you'd have something to think about.
The CSTA has been asked for feedback about changes to the Advanced Placement Computer Science curriculum and they blogged about it recently. Honestly I'm rather amazed that there are not more comments there. To me this is one of the major issues of high school computer science today. Most of this I left as a comment but I'm not sure it was posted properly. But since I decided to expand on my thoughts here that's ok.
My first thought would be to start with a list of the major/important concepts that people believe should/must be in a first course. These must then be prioritized. Then you can have a discussion about how long it takes to each each and where teachers will run out of time. We'll probably wind up leaving out someone's pet concept but there is limited time available. I've long thought that there was may too much in the curriculum.
Now here is something a lot of people don't know. I think that most people assume that to get a top score on the AP CS exam a student probably gets 90 percent of the questions right. In fact though a student who scores between 60-70 percent correct will usually get a top AP CS score. To me that screams there is too much in the curriculum.
I also think we need to think about basic concepts in a different way. We need to focus on the ones that are most constant. I know that the only real constant in CS is change but to a real extent some things will always be with us - Boolean expressions and decision structures, loops, math operations and their order, and things like that. These are required for a solid base for future training.
We need to should lower the priority on the tricky, fun to have latest fad stuff. How much of object oriented programing really can't wait until a later course?
One thing I struggle with is where does recursion fit in? I think we need a good discussion about that. I love it but is it really core? Arguments can be made either way. We haven't always had it in out mainstream languages.
We also need to revisit the case study. While I love the idea of students reading and knowing a large piece of code is the first course really the place for it? I don't think so. I would rather they spend time reading a lot of shorter (but still well-written) pieces of code.
I think we need to revisit the idea of a mandated language for the exam. Yes I know all the arguments for it. I've been listening to them for years. But at the same time it just seems like it fosters an attitude where we look at the language for things to test rather than looking for things to test and then look for what languages to use. Concepts first is what we should be doing but it easy to look at the tool (the language) and ask "how can we use this?"
Now the really controversial suggestion. The AP team should involve industry in the discussion. Not to mandate things and not the create a test designed to make students into professional programmers. And certainly not to specify a language or a development environment. That would be wrong. But industry can talk about what the basic skills and concepts they see a need for. What are the basic white board questions they ask on interviews? What are the building blocks they need to start a new hires professional development? Sure let teachers and university faculty make the final decisions but at least give industry a seat at the table.
I think I fundamentally disagree with at least two of the things you think need to be "fixed" about the AP Curriculum. You may not actually disagree, it depends on how one reads the tone of your leading questions. And actually, I could care less about the AP curriculum -- this is about a first course in programming, and programming in an OO language in particular.
1. The longer I teach, the more I find myself teaching object oriented design philosophy and patterns earlier and earlier. When taught with the right mindset, it actually makes programming much more accessible to kids - by teaching some design patterns (i.e. the GoF Patterns) my students can much more readily relate larger pieces of software to their everyday lives. Gone for me are the days of spending the first few weeks of school in public static void main. Kids just get locked into that early on and it's a very difficult mold to break - they don't think in abstractions as well. Also, using OO design concepts you can make very large programs without data structures -- the objects themselves become the data receptacles.
2. The longer I teach, the earlier and earlier I find myself teaching recursion. Students do naturally think recursively if that's all they know. Since recursion is harder and more abstract it benefits them greatly to experience it early in programming life. I teach loops as an afterthought, about 10 weeks into the course, here's the lecture: "Okay, a loop is a block of code that repeats. A "while" loop works like an if-statement that repeats...Here's how you write it...Any questions?" Of course I have to spend a little more time explaining the purpose and uses of nested loops, but loops are so trivially easy after recursion, students seem to have no trouble with it at all. It also leads to great philosophical questions early on like when and why it's appropriate to use recursion vs. loops and vice-versa.
I use Karel J. Robot to achieve all this - early OO patterns and recursion -- but it could easily be done using Greenfoot or your own subset of the case study. Karel J. Robot is great because Bergin was among the first to use the canonical OO design patterns in a text for school children. My kids love it.
Since all of the Java API data structures rely heavily on the GoF language of OO design, teaching those data structures and their associated interfaces is SO MUCH easier and natural if the kids come in with a strong understanding of it - i.e. having designed their own programs with interfaces, abstract classes, polymorphism, etc. Having done recursion early makes teaching the recursive algorithms (and their associated data structures) much easier as well.
My $0.02. Happy new year!
Addendum re: recursion. Sorry, I drifted a bit. I would like to argue that recursion is at the core of a CS1 course. I was trying to say, albeit in a roundabout way, that recursive thinking is actually a very natural act for H.S. students in my experience. Certainly, recursion is at the core on the mathematical side of the field. Thus, I think it should be at the core of intro. CS.
I go back and forth on recursion. Sometimes I agree with you that it is pretty natural - I've had students "discover" it accidently several times. OOP also I go back and forth with. Perhaps it is because I spent so many years programming before it was invented. :-)
Mainly in this post I want to see discussion and get thoughts from others. SO I really appreciate yours Baker. Thanks!
Well I must confess that I am struggling to get back into the whole "doing work" thing after taking the
The very first course in computer science at UC Berkeley in 1995 put a lot of emphasis on recusion. If a passing grade on the AP test should allow you to skip this course, then it would have to include recursion.