What should the High School CS curriculum look like?

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
  • arrays
  • 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.

Comments (6)

  1. Bryan says:

    Wow. This should generate as many comments as how soon to start programming. I model my program using the C++:CS1 full year. Java(For the test)/C#:CS2 1st semester this is a survey class, 2nd semester long term software development – can be games for contests (Imagine Cup/BPA Software Engineering) or customer needed software – both in school and real world. CS3 is long term development with special interest topics – This allows for continued learning over new topics or advanced work on something the student finds interesting – say data base, AI, or 3D graphic work.. Both CS2 and CS3 end 2nd semester with presentations in front of the New Project Overview Committee (Alumni, University Professors, Local Computer Science and EE professionals, and local business leaders/professionals).

    I am very lucky in that the AP test does not drive my program which allows for my students having more/better experience, more flexibility in advanced topics and greater interest when they move on to the college level.

    OH and if the student want to they can take the AP test – some do and score 5's. Most have to study just a couple of hours a day or two before – that's what they tell me anyway.

  2. Mike says:

    Disclaimer: My only teaching experience is tutoring others while I was doing my undergrad. . .

    My high school offered four years of computer science courses (at least they did back in the '90s).  The first course was an introduction and used Scheme, the second was Pascal, the third was AP (in Pascal back then), and the fourth year was in C++.  I had prior experience with BASIC and Logo, so the Scheme course wasn't my first experience, but I thought it very useful.  I like how it focused on base principles; we'd flowchart and create pseudocode, we discussed algorithms and general data structures at a high, broad level.

    If I were designing a curriculum, I would probably favor a language that just gets out of the way for the introductory course, allowing the instructor to focus on general program design and flow.  For the second year I would probably use the AP language and delve further into algorithms and data structures.  The third year I would continue to build upon the second class, allowing students to develop some mastery of the AP language while continuing their instruction of the core principles.  The last year I would probably do something completely different, just to broaden horizons – maybe have it be a “practical” and talk about design patterns, best practices and whatnot since the students would have a solid foundation.

    @Bryan: I like that setup and I’m glad there are still places that don’t feel a need to “teach to the test.”  Our high school classes did a bunch of small projects, with one bigger one at the end, but nothing long-term like you mention.  Kudos!

  3. Garth says:

    This question also depends on the knowledge level of the teacher.  I do not know a linked list from linked sausage so I am not qualified to go in that direction.  Our CS program does include an apps course primarily because some have a need to categorize it and CS was an obvious choice at the time.  We also offer a tech course that is the basics of building, fixing, purchasing, networking, installing, safeguarding, and whatever seems appropriate at the time.  We are basically trying to wean the kids from constantly asking for help when something funky happens to their own laptop.  We try to convince them that it is not “magic” in the little box.  This is usually our freshman year.  Programming I is Scratch and Small Basic.  Programming II is primarily Corona but we look at VB and some other odds and ends.  

    My ideal curriculum would require a teacher that has the ability to teach anything and everything in the CS field.  Not very realistic but it is important to have dreams.  This is definitely not me so our curriculum is restricted to the knowledge of the teacher and the time available to the teacher to learn new “stuff”.  If I had the knowledge I would continue with what we presently do but the third year would be C#, XNA and Kinect with more iOS, Droid and WinPhone programming in there somewhere.  I believe there is a large paradigm shift right now and coding for large desktop based apps will start to fade away.  I/O devices like the Kinect and handheld computing devices will be the future.  The kids do not need what was popular in programming in the last decade, they need what will be required for the next decade.

  4. Doug says:

    Part of the goal of a high school level program is simply to get kids interested in Computer Science. We have to target not just the kids who will be Cmp Sci, but all the other majors who’s kids  also have a tech edge to them…who might blend their passion for another subject area with a rock solid understanding of Computer Science. We have a 4 year program starting in 9th grade (but that follows a middle school program in our school which introduces Computer Science concepts and skills through simpler programs like Scratch, Alice, Small Basic, Lego, and Python). We spend the first year simply introducing students to Computer Science through a variety of contexts and in a dynamic and engaging way…bringing in video, reading books, writing stories, online discussions, blogging, chat, and of course rock solid programming, problem solving, and collaboration. We explore  robotics, game design, hardware, and 3D modeling (Maya).  Students who respond to that course and the style of a project-based class are invited to join our program. Over the last few years, we’ve tripled the number of students in our program(and almost 4x increase in percentage of females as well).  In year 2, we study Windows Phone programming, AppInventor Android app design, and  e-commerce using HTML, Javascript, PHP, and MySql.  Year 3 focuses on Xbox (XNA) game design and programming using DancePads and Xbox controllers as students spend 1 semester on a single game, simulation, or activity based on a passion of theirs. In year 4, we do a variety of business simulations in a series of progressively more complex capstone projects using OOP in JAVA and C# (we are also looking at Python as well). That class is a dual credit college course. You’ll notice that AP is not part of our program.  After years of using it, we finally decided our goals were very different than the goals of the AP program, and the focus of evaluation in AP was dramatically different than what we were trying to do.  

    Anyway,  I am sure there are some other great programs out there that are seeing similar success…I’d love to connect with you and share ideas! Contact me if you think we speak the same language.


  5. I would try to be more holistic than just programming. How about forensics and security? Understanding IP V6 seems to be a future skill as well as directory and SQL skills. Virtualization and cloud technologies will undoubtedly be important skills for youngsters to have good grasp on in any future carrier that uses technology whether in IT, engineering or entrepreneurial endeavors. Teach powers hell and Linux (oh my!) scripting, SAN technologies, programming apps for tablet devices and html5… DreamSpark was OK but not enough to keep my kids interested. They want to know how apps on a phone work. Source to consumer.

  6. Dan Kasun says:

    Personally, I think the way to start CS education is *NOT* with programming (which might be a bit contrarian).  In my opinion, too many folks have a direct correlation between computer science and programming… when computer science is much, much more than programming.  It's like saying that hammering nails is the same thing as Architecture.

    The goal should be to get students excited and inspired by technology and its possibilities – and programming languages, even the most simple environments, can be frustrating to students who don't already have a strong passion.  Thus, too many very qualified and appropriate students opt out before they even get started.

    So "year one" starts with finding ways to map student interests into a passion for technology. Highlight the applications of computing that would interest them, discuss the interesting history of computing and software, discuss the heros and role models that will inspire them, let them play games they enjoy – and then discuss how they work, give them datacenter tours that will blow their minds, have them envision the apps they'd make (without requiring them to build them).  It's all about getting them to envision (and dream of) a future for themselves in computing.  Year one goal: Inspire them, make it fun, solidify their interest.

    Year two would be centered around computational thinking with a little applied programming. At this point, students need to build competencies in exactly how computers and software work – and they need to do it in the context of a real project.  High-level programming focused on discrete tasks (vs. complex CS topics such as algorithms, OOP, and all of the other joyful things that we wonks love, but aren't needed for simple applications)… just get the students to start building – which will expose them to the issues that they will need to learn and consider as they mature.  Year two goal – Make it real: Establish a baseline of core understanding, start building skills for them to be productive, let them experiment and build so foster their passion and grow their curiosity.

    Year three is when you now get down into the platform details that allow them to really stretch their wings.  This will include CS theory and languages and also infrastructure, hardware, security, etc (perhaps have a few different disciplines that form at this age).  By then, the kids are fully engaged and will want to know more of the details on how things work and how to optimize… and that'll prepare them to excel at the higher education level.