How to design a CS curriculum for middle/high school?

6 points by clp16 ↗ HN
I want to help my hometown high school develop a CS course, because I want to give something back and as a fun side project. The main challenge I see is delivering the message that CS can be fun, useful, and allow one to build incredible things. I took my first true CS class at Harvard's Summer School when I was in high school, and it was this really fun, mixed up collection of programming, history, cryptography, design, GUIs, algorithms, etc. It was weak in the department of giving me tools to do something myself, but that was probably it because it was the first in a series of courses. However, it equipped me with the interest to actually pursue the subject, and I also believe strongly, especially for CS, in learning how to learn and loving curiosity. I think showing the breadth of CS will both appeal to cynical teenagers and also engender a feeling of unity with the other subjects and teachers. Does anyone have any leads or ideas on some really good curriculum ideas?

13 comments

[ 2.7 ms ] story [ 34.8 ms ] thread
Sadly I don't know about a curriculum, but if you were interested in getting them to learn logic, perhaps you could try using GameSalad (gamesalad.com). It's surprisingly easy to get things up and running for just about anyone, and it's free.
I would also highly recommend either Python or Flash. Back in my high school days, the biggest motivation for kids to learn programming was really so that we could design our own games since we had no concept of what the programming industry was all about. Flash was a great tool because it gave us the flexibility to be creative artistically but the power to learn some applications of programming. Learning reasons to use IFs and FOR loops for the purpose of making certain events in our game occur were more helpful in allowing us to grasp the programming concepts instead of presenting the dry material.

Python would be another great alternative to introducing programming games for kids particularly if you use PyGame. We used Turing in high school, but I think it would be a better service to the kids that they learn a language used in the real world and that has some capabilities. If you can teach Turing to students, you can certainly teach Python.

> Back in my high school days, the biggest motivation for kids to learn programming was really so that we could design our own games since we had no concept of what the programming industry was all about.

+1 on this -- my first attempts at programming were with ZZT and it got me hooked.

http://en.wikipedia.org/wiki/ZZT

How well do you know the Alice project?

http://www.alice.org/

I know programmers in my town who have used that for learners in the same age range you are considering.

My son had a distance learning course (which, alas, seems no longer to be offered) based on the book Approaching Precalculus Mathematics Discretely

http://www.amazon.com/Approaching-Precalculus-Mathematics-Di...

that was a good example of using functional programming (in Logo) to investigate mathematics. The book appears to not be in print anymore, but still available from some booksellers, and is a good glimpse at what some high schoolers can learn if they have enough mathematical background.

The local programmers I know who teach classes for that age group are now mostly doing Python courses, as there seem to be quite a few good introductory texts on Python, or else teaching Ruby.

I see no reason why an interested high schooler couldn't make it through a CS 101 course that introduced them to programming and gave them a base level of skill in a language. If you want to add breadth, you could either assign presentations from a list of topics (e.g. compilers, operating systems, AI) or you could take the bull by the horns and do these presentations yourself as part of the instruction.

I think it's a good idea, and if I ever came into a situation where that would be possible, I'd gladly teach high school CS.

Please, don't start them off in Visual Basic or Java. I learned those 2 back when I was in high school, and when I taught myself Python, I was overjoyed at how much less annoying bits there were to deal with. I'm not that great of a programmer, but Python just felt so much easier to just pick up and go.

As for actual course material, I'm not quite sure. Python does include a turtle module, and that's pretty classic for teaching programming at least.

Good luck!

Thanks for the pointers, but the language issue isn't really a concern for me or is getting involved kids who like to game. It's more of how to explain all the other wonderful things CS has to offer. College really helped me understand that there were so many interesting questions in designing fun interfaces and gamification techniques that delve closer to psychology. Graph theory was really fun because it seemed so exotic from lame calculus and geometry, and the fact that basics could be taught visually was intriguing. Learning that I could explore places like stack overflow and read APIs made it less intimidating to learn even more. Seeing that technology could better the lives of the less fortunate and that is was an important leveling force appealed to my pinko caring heart ;) These are the messages I'm concerned with sending.
I'd probably just use Zed Shaw's Learn Python The Hard Way as a model: http://learnpythonthehardway.org/ at least for the programming parts.

Ruby For Kids is interesting too, but I think it's a little too advanced for an intro course: http://ruby4kids.com

I agree that history is important too. Some of the more applied CS can be interesting (graphics) but I wouldn't delve too deeply into the more difficult stuff (crypto, algorithms) if this is just an introductory course for kids.

Every year, I speak to local middle school kids (7th or 8th grade) at their "career day". They are all totally fascinated with what I do, because kids nowadays (yes I know I sound old) live their whole lives online and surrounded by technology.

The school where I visit is really average, some rich kids some poor kids, all kinds of backgrounds. The format of this career day is that each class period somebody will come and talk to the class that is somewhat related to the subject - so I usually end up speaking to a math or computer class. In a class of 25, there are probably one or two kids who already know some limited programming (or have made a website). Almost everybody that age is online (all Facebook, a handful of Twitter and MySpace) and plays console video games. Probably about half have cell phones.

When they ask me questions, it's usually about how to steal their friends' Facebook passwords, conceal their browsing history, or build their own video game. I do spend some time talking about privacy, reminding them that their behavior online can stay around forever and that they should be careful who they are talking to online.

Good luck with your class, I'm sure it will be a rewarding experience for both you and the kids..

That anecdote is really helpful. It's good to know that kids already think that technology is going to benefit them in the social zoo of school! I am interested to know if anyone approaches CS from this more holistic point of view that I want to express. It's like English class where those few kids that are obsessed with it become writers or what not. These kids in my class would be the developers or what not, but at least everyone else would be interested enough to understand how tech affects their lives, much like how English class allows one to better understand pop culture. I want to capture the attention of that broader audience, but also show kids they can nerd out about the other parts of CS, like the math, design, science, or psych sides, not just coding.
The best way to teach programming to middle/high school students is to teach them programming. Forget things like alice and scratch. Just hand them a python prompt and a book or tutorial, or perhaps Hackety Hack. Middle school students are a lot more intelligent than those programs give them credit for and are completely capable of learning actual computer science.

+1 for bhousel's suggestion for LPTHW.

The problem is that you couched this in teaching kids programming, but I what I really want to teach is computer science. It's really more about answering the "why" question for the kids and showing something that stimulates curiosity. Granted for some people this is programming, but for others it's about showing the effect of computer science and how to be a part of that effect.
I see, i read your question too fast. Using scratch/alice/nxt/what-have-you as a tool to show what compsci is and how it can be exciting is fantastic, i just wouldn't use it as a method for teaching programming. My bad.

Another thing to look at is the Lego NXT robot, which uses very Scratch-like software (drag and drop action and control flow elements) to control a real robot that they can put together with Lego pieces.

I wouldn't downplay the importance of having a python prompt or a c compiler available, though. It may not seem as exciting as drag and drop programs, but to some kids it is more exciting (it was to me when i started programming, certainly).