Additional profile information on Alfred Thompson at Google+
I get asked questions like this a lot “can you share how you would construct a 3 year programming sequence, preceded by IC-3 type course, and culminating in AP JAVA. What would be your first two CS courses?” You’d think I’d have a great answer on the tip of my tongue by now. But I don’t. There are lots of reasons for this but they boil down to “the answer depends.”
What do you mean by computer science? Probably you don’t mean applications because while they are really important (in my opinion) they are general knowledge skills not computer science. Do you include web development? And if you do is that as a parallel track to programming heavy courses or as an introduction to CS with more programming heavy work later? And then there is the whole question of the AP Java course (technically I think it is still called AP CS A but I’m not sure.
Should AP CS be the last course in the sequence, the next to last with a senior capstone sort of course last, or should it not be in the rotation at all? It gets more complicated with the advent of AP CS Principles! Do you offer both courses and if you do are their separate options or does one probably APCS Principles) come before the other like we often did previously when there were two APCS courses? And where does hardware and networking fit into the mix? Arg, so much to think about!
I like web development. I think it is a great thing to learn. I don’t see it as a way to start computer science but as a goal of its own. There is some good web design curriculum at http://expression.microsoft.com/education and the DreamSpark program makes the software easy to get and to use with students at school and at home. Good stuff for sure.
I think about computer science as having a real programming component to it. That means I tend to think about a first course that covers basic principles of CS and of programming. So for example (not all inclusive)
The goal behind this course is learning some basic concepts of programming, problem analysis and solving skills, and some interest building success. traditionally I have used Visual Basic for a course like this but there are other options. People could use Small Basic, C#, Python or even C++ or Java. Personally I like something that lets students create some cool UIs or graphics and that seems harder with C++ and Java.
For a second course I see things as getting deeper. Designing with and creating objects for sure. Some real data structures like stacks, queues, linked lists and the like. And get deeper into algorithms with a little sorting and searching for example. I see this as a possible course to add some interesting domain specific programming. Games perhaps or maybe Kinect programming or mobile development. This gives students a deeper appreciation for the use (and creation ultimately) of APIs and sharable code. It also opens up more larger team projects. To say nothing of the fact that it gives students interesting projects involving things that they care about. (We’ve got free curriculum for all of that at the Faculty Connection BTW)
OK now your students are in great shape for AP Java. If you used C# for the second course they’ll ease almost seamlessly into Java. If you stuck with Visual Basic or used something thing else for the second course the concepts should still map nicely and the syntax is the only hitch. I found that students jumped from one syntax to a new one much easier than us more mature individuals. A reminder of how things were done in a previous language opens doors for really covering concepts independently from syntax as well.
Now maybe you made those first two courses a semester each (doable in many cases) and you are looking for something for after AP CS. Or maybe you took longer with the first two courses (a full year each even) and want something in place of APCS. What then?
Well there are lots of options including independent study courses. Or survey courses. Perhaps involving things like cryptography or robotics or advanced simulations. Or perhaps a project class with an eye towards community service! I know of teachers who have students take on projects for local non-profits for example. Or build projects around the Imagine Cup. I know several high schools that have a game development course that creates teams to enter the game design competition. One of these days a high school course is going to take aim at the Software Design Invitational and do a great mix of hardware and software in a real world changing way. I can’t wait for that.
Besides CS concepts the students learn project management deadlines HAVE to be met and the teacher can’t extend them), team work planning and communication and other “soft skills” that are very important today. A chance to win prizes and trips is one incentive but the building of a project portfolio that can be shared with university admissions people or potential internship employers is a pretty solid incentive as well.
That is just one possible scenario. I can think of others but I’d prefer to use this as an opportunity for others to share what they do in their schools. Is there only room in the curriculum for one course? Well then what does that look like? Or two courses? Or perhaps you have a more involved set of offerings with multiple paths. What does that look like? What is your school doing that works or perhaps what is it your ideal curriculum would look like? It’s getting to the end of the year and I know a lot of you are getting ready for the summer. Let’s give everyone some things to think about over the summer so that next year’s planning can get rolling early.
I am a late convert to the idea of computer science education for everyone. Or pretty close to everyone. A lot of people still don’t see it as valuable for more than a few people with some sort of natural predisposition for programming. I think there are many reasons for this. One is that they equate computer science with programming. And that’s not quite right. Second is that they see the only reason to learn computer science is to do it professionally. Inspired by Jeff Atwood’s Please Don’t Learn to Code I did a search on Bing for “don’t learn to code.” Bing came back with 224,000,000 hits. That seems like a lot. I can’t address all of what showed up but I would like to address some of what I read in the post by Jeff. He basically uses a bit of a straw man argument comparing coding to plumbing. This is largely the idea of coding as a trade skill.
I would argue that a more realistic comparison would be to compare computer science to math or reading. Computer science, of which coding is but a part, is part of the liberal arts of the twenty first century. You wouldn’t say “don’t learn math because you are not going to be a professional mathematician” now would you? Of course not!
But it gets worse with still more straw men about the move to teach CS and programming to more people.
Actually it assumes no such thing. Rather it assumes that having a better understanding of what the computer can and cannot do will lead to better decision making and a greater openness to new algorithms and to software is a desirable thing. It assumes that people can benefit from a better understanding of computer science, algorithmic (or computational if you will) thinking. It’s not about “more code” at all. I would also suggest that a better understanding of
Again, no, the assumption is that there will be better understanding of what code is all about. The idea is not to turn everyone into a programmer but to give more people knowledge and understanding. Being able to produce code is a tool toward understanding with understanding being the goal.
Backwards here. I believe most people pushing for more computer science and programming see it as a means to teach the tools for understanding problems. It’s a tool for understanding problems far more so than solving them. Will some people code their own problem solutions? Of course they will but the goal is to help them understand problems first.
No, not really. Again the people who are promoting more computer science see it not as a vocational training but as a liberal art that helps people understand the world around them. Coding is the language of computers which has in a real way a culture of its own. By learning the language of a culture we gain understanding of that culture. This is the main reason we teach “world languages” is school. Not to turn out professional translator but to give people a greater understanding of a people’s culture and the way they think.
I don’t think too many people, except for self absorbed teenagers, who really believes that. The line is more permeable than it has been in years but still not an easy path. But since vocational training is not the goal so what?
I would say that learning computer science is for everyone. Coding is just a tool to help you get there. It is about concepts, ideas, ways of looking at and solving problems, and much more than just coding to make a living. Don’t fall into the trap of seeing the field too narrowly.
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.
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:
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?