

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

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?
======
bhousel
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..

~~~
clp16
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.

------
tokenadult
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...](http://www.amazon.com/Approaching-Precalculus-Mathematics-Discretely-
Explorations/dp/0262121387)

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.

------
clp16
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.

------
bartonfink
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.

------
jokermatt999
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!

------
veyron
Power through sedgewick's Algorithms in C++:
[http://www.amazon.com/Algorithms-C-Robert-
Sedgewick/dp/02015...](http://www.amazon.com/Algorithms-C-Robert-
Sedgewick/dp/0201510596)

Although, tbh, the code coverage is kinda weak, so I would supplement it with
a C or C++ discussion (K&R is tough to understand, but I think for younger
kids it's better to start with the fundamentals)

------
mtogo
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.

~~~
clp16
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.

~~~
mtogo
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).

------
walru
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.

~~~
canistr
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.

~~~
stevelosh
> 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>

