Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

Possible Duplicate:
How can I teach a bright person, with no programming experience, how to program?

I was recently asked by an older friend working on the city council if I would be willing to teach a summer programming course, targeting middle school to high school aged students with either minimal or no prior programming experience.

I'm a senior in high school, but I've been programming since a young age, and I've worked locally with my city on various projects requiring programming.

The first thing is, I don't want to teach something that can easily be learned anywhere online. If I spent all day over two weeks teaching only basic HTML with bits of CSS, I'd feel like I'm ripping them off (since the class is planned to be $30.00 per person, although I won't receive any of the money). Furthermore, there's actually already a web design class being taught, and I got the impression that I wasn't meant to focus on web development.

If it was all up to me (which it's not, I have to create a plan and present it in front of the summer programs board for approval), I would spend the first week teaching Haskell, and the second week using it to solve math problems (like those seen on Project Euler). Unfortunately, I'm probably the only one who would be interested in taking such a class, and I should probably focus more on programming rather than mathematics.

I've seen in this thread that Java was not well liked, and I've seen in virtually any other thread that people loved Lisp dialects (especially Scheme, and I suspect this is somewhat related to the love of books like SICP).

I have the problem of trying to make the course interesting and engaging, while educational. I don't necessarily need to "sell" programming to them, since they should be somewhat self-motivated applicants, but I also don't want to bore them and "ruin" programming for them.

What should I do? What should I teach?

share|improve this question

marked as duplicate by Mark Trapp Feb 20 '12 at 23:16

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

4 Answers 4

Expect to be humbled. There's a lot more to teaching than knowing the subject matter.

I taught intro C.S. for four years to college students who (mostly) had no prior experience programming. We had a one-semester intro course. We used GW-BASIC, not because it is a good language for the long haul, but because it is very beginner-friendly.

The first hard lesson I learned is that what is obvious to the teacher is not obvious to the students. I had been assuming I could just start writing little programs on the board and start talking about them, and I was afraid there wouldn't be much to say. Wrong.

Here are some of the things that have to be put into students' heads before they can tackle much of a program:

  • Programs execute one step at a time. They don't begin to execute each statement until the prior statement finishes. To you, this is obvious, but not to them. Computers are so fast that, to them, it looks like they do everything at once.

  • Programs do not understand you - they don't read your mind. Just because they contain words like "IF", "INPUT", "PRINT", "GO TO", that doesn't mean they understand English.

  • There is a huge difference between the time at which you write a program, and the time at which it runs. So if I say "Write a program to input your name and then say hello to you." I see students writing "INPUT BILLY" and "HELLO BILLY" and not really understanding what "INPUT" is for.

  • Variables are a concept they are not used to. A variable is like a hole in the wall where you can store a number or a string, and it has a name. The name and the value are different - they are not the same. This has to do with the distinction between write-time and run-time.

The way I would get these concepts across is we would write a simple program on the board, and then "play computer". That is, point to the current statement, "execute" it, and then point to the next, and so on. Variables would be named rectangles on the board where we would write the current value.

Then, it's essential that students write little programs like this on their own. They have to learn by doing, including making mistakes.

It would take me about 3 weeks to build up enough skills so they could begin to consider doing some interesting projects of their own (with guidance of course). That's really important - self-driven projects, because programming is not inherently interesting except to the exent that you can make it serve you.

share|improve this answer
    
I would not be surprised if some adults and college students might start with more incorrect preconceptions and interpretations than would many middle school students. –  hotpaw2 Feb 20 '12 at 22:39
    
@hotpaw2: They could, but I recently taught a very bright 12-year-old and hit mostly the same issues. –  Mike Dunlavey Feb 20 '12 at 23:21

I taught a class like the one you are describing, but it was targeted at 4th - 6th grade children. We used Scratch to teach them basic programming ideas, gave some examples of different kinds of programs (games, a story book thing) and then let them build their own program. Scratch might be a bit cartoony for high school students, but if you can make something before hand that grabs their attention, it should work (we had a simple Galaga style game). After going through Scratch, then maybe you can move on to another language to show how the concepts from Scratch get turned into "real" code.

share|improve this answer
    
At what point should I start turning Scratch into "real" code? And what should I choose as the transitioning language? Also, how can I make what they learn more practical? –  BBB Feb 20 '12 at 20:22
    
@Jack Personally, I would use Scratch to teach them the basics like loops, conditionals, basic I/O (mouse and keyboard input), etc. After doing that, I would let them play with it for a bit so they can learn by doing. The transition language should be a language you know very well (because they will ask hard questions, usually ones that aren't easy to explain because they are things you probably haven't thought of before). As others have said, I would pick a language with simple syntax and where you can avoid problematic language features (ie. pointers). –  Becuzz Feb 21 '12 at 15:04
    
@Jack Practicality wise, I would try to show them things they have already done on a computer. A simple game (either a guess-the-number text game or something in Scratch), a four function calculator, etc. would be some good starting ideas. I would also ask them at the beginning of the class what they might like to do. Then try to take any feasible ideas and either try to do an example program with them or try to show them what would go into such a program (ie. make a calculator, don't make Halo). They will get more out of it if they can see things that interest them instead of a qsort. –  Becuzz Feb 21 '12 at 15:14

I would pick an interpretive language (or two) (python, javascript, et.al.) with a goal that many kids can relate to and might find interesting, such as building some simple games. To make it accessible, you could pre-build most of a few games, and start the class with something simple, such as modifying the path of just one object or character, and go from there to more advanced programming concepts.

Don't worry about whether the subject can be learned online. The value of the class will be your teaching the subject personally (answering question, etc.), and the potential of a group learning situation.

share|improve this answer

Make it fun...teach programming with Lego Mindstorms. You can get an educational kit for cheap. Seeing a visible effect of programming (like LOGO for me back in the 80's) encourages further exploration.

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.