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)
- Representation of data including binary
- variables and data types
- assignments and equations
- decision structures (if/then, case/select)
- Loops (for, do/while do/until)
- Objects (using but not necessarily creating)
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.