Ideas for High School Computer Projects?
rcmpcbf asks: "HELP A TEACHER OUT! My Computer Science students often get bored doing stuff that the AP Curriculum or School Board asks us to teach. I would really appreciate the input of Slashdot members on interesting Computer Science projects for high school students. You would be helping other students, just like yourselves, not me." What kinds of computer projects do you feel would be stimulating for the high school age group?
Why not get a CS consulting job on the side, then make the students do your assignments? That way, they can see what CS is like in the real world, and they can get bored, jaded and angry right away, instead of slowly grinding away years of their precious life on this earth in front of a CRT first.
You might even find this arrangement profitable.
If your students are capable of any type of interprocess communications, I would recommend a MUD Client that had multiple servers, one which handled monsters, another which handled world maps, and yet another which stored character information. If this is too much, just do a single player text based role playing game with no servers involved. But bring in monsters every so often to fight with and whatnot. I'd find that entertaining! Gibblets
I think that starting a class MUD would be an awesome project for high school students. It would give them experience with almost every as[ect of programming and some system administration.
here's a novel idea... program something that would allow people to "share" files (like music files) on a "network". I call it... Mapster!
find a good porn site. Make them write reports on the various image compression formats used throughout the site.
Remember all those great demo's from the early 90's (future crew, etc). Those were written largely by 16-18 year old kids.
A good first step is to find a number of cool programs written by high school students. I know when I was in high school I was learning assembly language programming on the Amiga (wrote an asteroids clone), we (the students) got a local graphics company to come in and teach us some stuff about 3D graphics programming, I had friends writting BBS's. Yet in class I got in trouble for adding a graphical interface (and a screensaver) to some lame gradebook program I had to write.
Step 1: is show your students what they are capable of.
Step 2: Be flexable. There are a million different programs that could be written to demonstrate how a hash table works. If you want your students to really understand how to use a hash table, then let them decide what the program is going to do. [You will want to have a list of ideas for the less creative people.]
Step 3: Encourage exceptional work. If a student turns in a program late because they really wanted to add so fancy features to it, then let them. If a student was supposed to demonstrate a program using a hash table and they turn it in 3 days late because they decided to add double linked-lists (or something else that hadn't been covered yet) then they shouldn't be penalized.
Most programming assignments are too strict and leave only one way of doing things. The best programmer and worst programmer in the class will have almost identical programs, it just a matter of who finishes first. But open-ended projects leave room for your students to impress you. Some students will put in an extra effort if it means they can impress you. Other students may enjoy competition and programming contests.
Step 4: Encourage extra credit work. Let students get extra credit for programs they write outside of classwork.
Step 5: Encourage students to read books like "The Cookoo's Egg" and other books about "the good old days" of computing. They is a lot of interesting non-fiction about computer programmers. Kids probably should be reading about the old hackers and crackers. Kids should atleast have an idea of who robert tappin morris and clifford stole (sp?) are.
Basically, don't just teach computer programming -- hash tables just aren't that exciting. I had a multimedia class in high school that had no structure whatsoever. Basically you did whatever you wanted all semester. If you sat around and watched MTV the whole semester (yes, we had a TV with cable in the class room) then you would get a crappy grade. But almost everyone worked hard. People who weren't even in the class would skip other classes to work on projects. The teacher didn't attempt to teach anything or tell anyone what to do. What he did do was make sure that students got what they needed. We had almost no budget but (in 1994) still had top of the line computers with full screen video playback, adobe premiere, photoshop, macromedia director, freehand, painter, digital cameras, the works. Some students did a very nice promotional video for a local hotel. The hotel in turn bought a $3000 full-screen playback/capture card so that the footage could be dumped back to tape. (The video probably would have cost $5000+ if done at a real company). The biggest slacker I ever knew once spent an week solid touching up a wedding photo.
Now, a programming class can not be completely unstructured. There is specific material that needs to be covered, but highly structured classes aren't going to cut it either. If real programmers work late and eat pizza and drink soda, then I say buy pizza and soda for the students who stay late to work.
Good programmers have desire. Once you have desire no problem is too hard.
2. Have the program generate a simple chiper key that simple scrambles the alphabet and does a 1 to 1 replacement (i.e. every letter "e" in the plain text will now be the letter "x"). [random numbers and vector/array manipulation]
Extra points: create and store multiple keys that can be saved to disk and retrieved later [input and output streams]
3. The student then takes another large piece of plain text and encrypts it using the key they generated.
4. Sort the file created in step #1, Make another histogram of the file created in step #3. sort it as well. [teaches sort methods]
5. Swap the letters from the encrypted text with the corrosponding letter from the plain text histogram. If the letter "E" is the most used letter in the plain text histogram and the letter "x" is the most used in the encrypted text then replace every "x" in the encrypted text with an "e". [array/vector/collection manipulation]
6. Let the students decrypt each other's messages. Because of the simple type of key it doesn't matter what the key is or what plain text is used. They should be able to get back a plain text version(without spaces or punctuation) from the encrypted text.
Very meanly. I had a Linux computer going for just over a year before the ban set in. Apparently the head techie thinks it's more hackable/trouble for the NT systems... blah.
Go create a website and write up an article about it: be sure to cite all of the NT exploits (in a neat bullet list, links preferable), talk about closed vs open source systems (in respect to the exploits), talk about companies that use Linux (IBM, Etoys, Deja News, etc..), compare benchmarks (big pretty graphs are a plus), talk about low cost (can Joe Blow HS student afford Microsoft Visual Studio easily?, vs GCC).
If you are a speech student, make a speech about it. If you work for the school newspaper/journalism, write an article for them. If you know other students who share the same opinion, petition the school board. The more fuss you make, the better.
Have you tried RoboCom? http://www.cyty.com/robocom Students can write code for some "virtual robots" and make them compete against each other. You can make very simple robots or very complex ones and it's always nice to watch the results. I was really hooked on this little app for a while.
In 1980, I wrote a simple symbolic integrator and differentiator which handled trig functions, polynomials & mixtures of the above. It also recursively integrated by parts & tried a tree of integration methods & substitutions.
It mostly worked. It was also slow. It was interpreted basic on a PDP/11.
BUT, it combined calculus w/ programming. And it was such a hack. If you gave them some basics in structured programming &/or oo, you could get some interesting results. Even Perl5 would be a good choice, which could then be turned into a cgi script.
Makes a good logic puzzle too. How do you parse and end up with a canonical representation of both input & output? I did a brute force try-everything method for partial integration. Can your kids come up with a more elegant method?
First off, I was in HS during the dark ages, before they taught programming in HS, but my favorite class was honors physics lab. Each lab, we were given a sheet of paper with a list of a dozen or so "physics theories." Like: in an oblique collision, billiard balls always separate at a 90 degree angle. And there was a pile of lab equipment. Groups would pick a theory and devise experiments to prove or disprove it. We got to choose something that interested us, and had a lot of freedom in the experiments we did. When I later taught a first course in programming, I tried to apply the same principles: provide a wide range of projects from which the students could choose, or let them propose their own project. Some of the more interesting projects my students did included: - driver for RARS (robot auto racing simulator) - register level simulator of a CPU. with a GUI that had windows showing the registers, memory, etc. - a token-ring like protocol that ran on 4 PCs connected by their serial ports, and a unix-like 'talk' program that ran over the network
Do you really want to teach them something other than the AP curriculum, or do you want more interesting projects that teach the AP curriculum? I'd hesitate to stray from the suggested curriculum too much because the concepts it teaches are good concepts to know and understand. Learning about the basic structures like stacks, lists, queues, etc. has helped me enormously in my career, and I have worked with people who didn't learn them, and they write worse code.
However, if you want to teach them about the same structures and algorithms, but with more interesting projects, try real world things. One project I did in my AP class (in '88), was working with word processing files. We would read in the files and do things like count words and lines, spell check, and things like that. In other words, some of the stuff an actual word processor would do. In college, I really enjoyed learning about image processing. The main problem with graphics, though, is that you have to tie the class to a specific platform, which bites.
Maybe you could teach some of the concepts and relate them to networking, since the internet is such a big thing these days. I would have loved to do stuff like that in high school.
-D
One of my favorites back in high school was who in the class could write the fastest prime number generator - the key to this was the Sieve of Erastosthenes (sp?) - and even then there were many incarnations (props to Bob Markowicz at Glastonbury HS for that one!!!!!)
And one I thought of just the other day which bit me on a trading system - write a program to convert decimals to fractions...the key there is Euclid's Algorithm, I believe...
And over the course of the project drop little hints pointing the students toward these old formulas and hypothesis, don't just give it all away
Whoever's got the best one in the class gets an extra A or something who knows...these are great for not only programming but critical thinking and scientifically/mathematically thinking...we were coding in GW-Basic...I think some of these concepts are lost in the days of VB where UI's are often the focus of projects
I've seen suggestions here that are just absurd: grabbing something from sourceforge and hurling code at it or hacking the linux kernel (!) If I were a project maintainer I wouldn't want to be assaulted with code from a team of high schoolers whose interest in the project will likely drop once the course is over.
That said, encourage the students to do something in an area where you have some expertise. If the students want to make a search engine but you know nothing about searches and NLP, their project will probably fail. Encourage teamwork -- too many of my college assignments and projects are individual efforts.
And here's an obligatory list of ideas, grouped by area:
AI. Stick to "easy" problems in search and scheduling. Maybe something like a course scheduler to plan times for course sections. Simulations and games are good too.
Theory. Challenge them to write a program that prints its own source code as output. Implement an interpreter for a simple language like LOGO or basic.
Systems. Write your malloc/free (or new/delete) or a garbage collector. Design an instant messenger protocol or chat system.
Graphics. Show them the basics of OpenGL and set them loose. Have them do some basic image filtering stuff ala Photoshop.
Again, it helps to steer the students to an area which you know so you can support them. I'm too lazy to register...
Oh, so that's where they recruited the Mozilla team.
*DUCK*
Hey I just wanted to share some info with the people still in high school that love computers.
If you have AP test in your area they offer a Computer AP test. You don't have to take the class you can ask to just take the test. I found this out 3 weeks after I could have taken it.
AP classes get you COLLEGE CREDIT. Take the Computer Science AP test, it's easy.
I can't tell you people how pissed I am at my guidnence consuler who I aided for didn't tell me about it. I was a fucking aid in guidence for 1 semester. I came in every fucking day with a laptop why the fuck didn't the bitch think to say somthing! (If you can't tell I'm pissed of I missed my chance.)
Nope, differential calculus is not needed, other than the basics so you know why it works. And I did these simulations in grade 12 (ok, in Australia, but .au supposedly ranks behind .us in the education scheme).
Bill - aka taniwha
--
Leave others their otherness. -- Aratak
If high school students haven't covered those basics, there is something very wrong in the education system.
Bill - aka taniwha
--
Leave others their otherness. -- Aratak
As a slightly more complicated to implement chaotic system, simulating a rocket in the vicinity of Earth is also good. This is more complicated because of the need to take the earth's atmosphere into account. Very good for generating interest in aerodynamics.
BTW, I've done both (from a book, "Programming for Scientists and Engineers" iirc). I learnt a lot from that book, including just how a cross product and works :)
Bill - aka taniwha
--
Leave others their otherness. -- Aratak
How do I know? I moved too fast for my instructor. I learned everything he had to teach me in a matter of weeks. So he asked me if there was any project I wanted to work on. I told him and he agreed. The assistant principal came to the class one day and happened to notice first that I was using the expensive laser printer instead of the cheap dot matrix printers (needed to so I could read the result - had permission) and then saw me go straight from reading the printout with a highlighter pen to change three lines of code and start testing out this game ...
I was pulled out of class right then and spent the next forty minutes listening to this dumbass yell at me how I was going to fail the class, be suspended for a week, etc, etc, etc.. After that point, the instructor just happened to overhear the shouting walking down the hall on his way to lunch... It was all resolved by the week, but I wasn't allowed to work on the game again until next monday. I hear the AP got an earfull from the instructor for screwing with his students without talking to him first.
So what did I learn, besides that administration people suck? Arrays, sorting, pointers, linked lists, text processing, simple 2D graphics, 286 macro assembly, high-speed serial port communications, program overlays and later protected mode programming in DOS, the basics of DLLs, and a little OOP. Did I mention this was first semester Intro to Programming class?
Give them something they enjoy working on and watch their productivity soar. I did all of this on a 16MHz 386. What could someone learn with a Pentium, a 3D card, and an API like SDL which takes the OS-specifics out of video, networking, sound, input management, and window handling? They'd learn how to code, that's for damned sure!
LGPL'd multi-platform framebuffer, OpenGL, window housekeeping, input, sound, networking, and multithreading. Embeds nicely as a static library optimized to include exactly what you need and no more instead of a big shared lib.
"A *n?x box of some kind seems to be the best choice for this . . . "
"I realize this is slashdot, where all things MS are evil, but c'mon - the majority of people have to deal with Windows... teach them on the most prevalent platform"
Windows may be the most prevalent platform for people *using* computers, but that doesn't mean that it is the best system for teaching people how to understand computers. Windows is designed so that its complexity and workings are hidden. You *can* peek under the hood to some extent, but it was not by and large put together to allow poking, prodding, and exploration. Unix, on the other hand, was not designed to hide its complexity, and attempts to do so, such as the CDE, KDE, and GNOME, came well after its inception. Config files are plain text. Things that are presented as integrated monoliths in Windows and the Mac are far more separated in Unix; the shell, the login, the low-level basis for the GUI (X), and the GUI widgets, are all separate programs or libraries. It's easier to poke around and figure out what does what.
Yes, I'm talking about something like /bin/sh.
A project I was given in an OS class was to write a simple interpreter, and it was a lot of fun. Don't require any particular syntax, just the ability to launch programs while passing arguements. There are a number of wrinkles to work around, and there is a lot of feedback so it should provide lots of "warm fuzzies". At least it did for me.
A.K Dewdney wrote a fictional account of a rope based computer in an issue of Scientific American. I always thought that it would be a lot of fun and an educational experience to try to implement a simple component, such an Adder, using the ideas in this article.
The difference between Canada and the USA is that in Canada healthcare is a right and gun ownership is a privilege.
I think it's entirely possible to do fun projects and lectures on low-level, hardware-based computing, without having to go into the exhausting detail, or involving the really gritty stuff like Karnough maps.
For example, most digital IC-based circuits use a +5V DC value for a logical "1". The reason why a "1" is +5V DC has to do with the contruction of the transistors used to build the gates. It's sufficient to state something like "transistors can be used as switches, and they switch between 0V and +5 V because of the way they are made" without having to get into the guts of semiconductor theory.
Similarly, one could present a diagram of a 2-bit adder circuit made of logic gates, and demonstrate that it really does add 2 2-bit numbers, even following the states of the gates inside the circuit, without showing the Karnough map that led to the circuit's design.
I envision the hands-on portion of the class using slightly more complex chips than raw logic gates. Shift registers, ALUs, small static RAM chips, and the like can be wired together fairly easily and do fun things without having to get into the undergrad stuff.
But even so, exposing kids to difficult concepts and forcing them to THINK is not a bad thing at all. School should be challenging! I'd rather see kids struggle with difficult material than have them bored with pablum.
Want to learn about race cars? Read my Book
One of the failings (that I see at least) of high school level CS classes is that they don't pay any attention to the real low-level hardware bits, down at the level of individual logic gates.
A lot - and I mean A LOT - of basic understanding of "why computers are built the way they are" comes from wiring up really basic componants, flipping some switches, and watching LEDs flash on and off.
For instance, I remember doing a project where I wired up 2 shift registers and an ALU chip to a rack of switches and 8 LEDs. By flipping the switches, one could input a pair of binary numbers into the shift registers, and then another switch (wired up as the clock) would trigger the ALU, and the resultant sum would show up on the LEDs.
After doing something like this, you gain understanding of such things as: Why do computers work in binary? How do instruction sets work? How do data busses work? What is the signifigance of the clock? And so on.
The only downside to projects like this is that you need some hardware - breadboards, power supplies, a selection of cheap ICs, a bunch of wire, and LEDs. But tinkering with this crap is just soooooo worth it - and it's fun!
Want to learn about race cars? Read my Book
When I started on my computer science degree, the first project in computer science I was to write a series of functions to do basic mathematical calculations. The catch was that we couldn't use any math operators or external math functions, except for two simple functions, one of which added one to a number, the other of which subtracted one from a number. On those building blocks, we had to implement (IIRC) addition, subtraction, multiplication, integer division, modulo division, greatest common denominator, least common multiple, and integer exponentiation. These had to return correct values for all positive integers.
This would probably be a decent project for high school students. If the class is advanced, the parameters can be expanded. Ensure that the functions work for negative integers, too. (Not too hard, and I remember taking this step with my project just to make it slightly more interesting.) Add other mathematical functions, such as factorials or integer roots (square roots of square numbers, etc.). Add, perhaps as an additional project, the requirement of creating a rudimentary calculator with functions. There's a good bit of room for expansion; it depends on how good the students are.
--Phil (I can't remember most of the other projects I did in those classes--they weren't as interesting, I suppose.)
355/113 -- Not the famous irrational number PI, but an incredible simulation!
Depending on how advanced your students are, they could write a rudimentary machine code emulator. I remember writing one of these for one of my computer science courses, and it was quite interesting (to me, at least). We were given a list of opcodes and a description of what each was to do. Our program had to assemble them, creating a file with the binary output, and then run the file.
IIRC, it was a simple assembly language. Each opcode was an int long, as were the opcode's parameters (although some parameters were floats). Space was always reserverd for two parameters, whether they were needed or not (this allowed jumps to specify the number of instructions over which to jump--there were no symbolic labels). IIRC, the main opcodes were mathematical ones. There were also load and save for memory addresses, but the addresses were always immediate--no indirect references. There were two registers.
I beleve the opcodes included
- add registers A and B, put result in A
- subtract A - B, result in A
- multiply
- divide (all numbers were floats)
- load from memory address to register (There was a space of about 16 floats for memory. memory locations were for sequential numbers--the intent was to implement memory locations as subscripts on an array of floats.)
- save to memory address from register
- put literal number in register
- jump N instructions if specified register is zero
- end program, final result (to be reported by the interpreting program) in register A
Those are all I remember. There may have been others, but those are enough to write simple mathematical test programs.This may be a bit advanced for a high school class, but it was certainly an interesting project for me. If the students can handle it, I suspect that they will like it, too.
--Phil (The fun thing is that I'm pretty sure that I did this project before I took assembly.)
355/113 -- Not the famous irrational number PI, but an incredible simulation!
Only I was doing graphing of equations and so forth.
--
Ben Kosse
Remember Ed Curry!
Make it their "final project", but have it really be extra credit.
--
Ben Kosse
Remember Ed Curry!
I was very fortunate to have an excellent AP CS teacher in high school. We moved fairly quickly, and by the end of the year we had studied all the common sorting algorithms, and most of the common data structures. We looked at bubblesort, quicksort, merge sort, stacks, queues, linked lists, doubly linked lists, binary trees, etc. On top of all that we did some GUI projects for kicks, like a calculator, and an application of our choice. I didn't bring away much from the projects, but all the basics- that helped me more than anything.
By the time I hit data structures in college, it was a breeze- I had already learned the stuff a couple years back. The best advice I can give is to nail all of those topics before doing any projects. It was fairly interesting, but I didn't realize the full benefit of the stuff until much later.
I think the best idea is to let them come up with something on their own. Throw out a few proto ideas and let them run with it. Let the kids with the best ideas play project lead.
And if you want a pro programer to play mentor I'm sure a number of us here on
Most importatly make it fun.
The Cure of the ills of Democracy is more Democracy.
Erlang Developer and podcaster
But also the writting a functional specification on their own is a very good expierience for anyone going into any form of technical field.
Ofcourse you can then assign them something more complex and interesting.
The Cure of the ills of Democracy is more Democracy.
Erlang Developer and podcaster
We had a "bot wars" program where you wrote a C/C++ program, and then the arena program uses the resulting executable to represent your bot in a graphical arena. There was a basic command set, and a set of rules. It was great fun. Teaches you how to program and the basics of AI. Does anyone know where I could get this? I've looked all over. I know about redcode... but ASM isn't my forte.
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
When I was in highschool, we decided as a group to write a networked tank game as a class, we learned graphics, event processing, networks, synchronization, and all sorts of data structures to keep things going. We made a few bad decisions that prevented us from getting the game to be even slightly fun. (Like trying to do OOP with C, and using NetBIOS under a Netware network (8 byte packets)), but I don't think college taught me a single data structure that we hadn't messed with, or had tried in that project.
See if you can partner with a small local ISP (do they exist anymore) to help them architect something. Or get an intern type job that the whole class can do. Have them develop something that will be seen in a REAL environment (not just by school teachers, and parents, and on the schools website). That will really get them interested. And definately not boring, when they have deadlines, and requirements, that aren't just for grades! (depending on what grade they're in.. they might get really excited because if they do a good job, the company you partner with, might be more likely to hire them, or help them find a job.. a reference from a real business would be a great start for them!)
-- "I feel a strong disturbance in the for.."\*Segmentation Fault*\ (core dumped)
Along the lines of software that actually does something that a lot of high-school students might be interested in, how about a simple synthesizer? You could start with a basic sine wave oscillator, and add on controls to change the pitch, amplitude, waveform, and so forth. If you were feeling really adventurous, you could even get into envelope and bandpass filters.
Just strikes me as a project that could be within the scope of a HS course, but would hold the interest of students. Anyone know of a good programming reference for this sort of thing?
Causation can cause correlation
I would get them to do something either game related ( think AI ) where they would first create an environment and meta-language and then write bots within the environment to compete for a task.
...you could also just get something like AT -robot wars or the like and have them build robots to compete against each other.
Yeah, that's an awesome idea.
I too got into C because of LP MUDs...it's a good opportunity for the different skills of the group to be used in QA, copy writing, coding and, of course, play testing!
Have them program a video game.
They're probably doing it anyway.
Write a virus and crash the internet!
Download DOS scripts and monopolize your school's computing resources!
Alternatively, analyze existing viruses and scripts, and learn how to find security holes and how to write software that doesn't have them.
TMH
You never know, they might just get patched in!
I know that if I was a high school hacker and I was allowed to hack Linux "on the clock" and was encouraged and had resources made available to me to be successful, I would have been so excited to have had such an opportunity.
Something like that might just make the next Alan Cox!
Send your friends messages of love at fuck-you.org
You could have your students implement an SMTP mail agent, an ftp client, or something more complex like ssh. I played around with doing this in perl and it was really cool. Of course doing these projects in C would be best. Certainly lots of real world benefit.
Oh yeah? Well, I coded it in assembler when I was 3. :-)
--
"You're gonna need a bigger boat." - Chief Brody
I think a real key here is that different students have vastly differing skill levels, so giving an assignment that can be handled meaningfully at all levels is great.
We did this when I was in highschool, and the most interesting (and gratifying) thing was the social impact. Video games were banned from our (and many other) High School computer labs, but games written by students were allowed.
I wrote a 4 player version of light cycles of tron, and it was pretty amazing for me (certainly not the most popular kid in the school) when everybody was playing my game at lunch, after school, between classes - it was crazy. The school had to ban the game when keyboards started getting broken.
Another plus of a game assignment is that it's meaningful for kids of all skill levels. Many kids will write hangman, but someone's going to come in with a rendered first person shooter.
You can use StarLogo to create complex simulations and study neat things like chaotic systems and emergent behavior.
The hard part about programming is thinking in a sufficiently formal manner in order to carefully plan and execute a design project (like a database backed web site).
Learning SQL is a great way to start. It's fairly simple, applicable to a lot of programs (Oracle, Sybase, MS-SQL Server), and is good at teaching somebody how to think formally.
Build a database backed web service (something that would do the school good would be great, but not neccessary), maybe a school calendar. The hard parts are handled by the database program and the web server -- the fun parts can be built in modules.
Break the class into groups, and have them work on individual modules -- what data must go in, what must come out, and how it should be formatted. Then, the groups work together so the modules can talk to each other (this teaches some basic OOP-thinking as well). Then, start building. You can divide the semester into three chunks:
Why rewrite? Well, it's not bad practice to assume that the first go-around will be thrown away as you learn new things after the first build -- you can make up for those mistakes in the rewrite.
I sure do wish something like that was available to me in HS. SQL is easier than basic, and much more useful in teaching concepts.
Potato chips are a by-yourself food.
And for an advanced project, try to implement an algorithm for playing these games. Students will learn what the odds are and may be enticed _not_ to do real gambling. Sounds like an admirible goal.
JET Program: see Japan, meet intere
err...I don't think something like PERL is good until you've already been entrenched in Unix culture. not to mention the horrible code that will be inevitably written...
This last school year, I volunteered at a local high school near where I work teaching Java and Web programming skills to any student who wanted to work with me. What I found excited kids the most were projects where they could interact with other students. Building applets for web sites is one example.
They were excited and driven to work on projects, not for there future marketablility or because it was clever in and of itself. They were excited because they could show their friends and they would say "Wow, that's cool". And then their friends would want to do something like it.
My recomendation, and the type of projects I focus on myself are those that have an interactive feature with others including students or other people. Fan web sites are one example, the ideterod (sp?) sled race example in a previous post was another.
These are the types of projects people, including students of all ages, do on their own because they already have an interest in the subject matter and get a chance to interact with others.
IMHO.
Basically, the book is about computation, fractals, chaos, complex systems, adaptation, and how all of these things relate to one another.
Check out the book's website for more information.
--GWF
The Computational Beauty of Nature
Yuck. How do they get of putting Comp Sci into the buisness department. This is insane. It's almost as if the computer was born of the buisness world.
But I can somehow see why this is the paradigm for some administration. When the curricula of many "Computer SCience" high school courses teach WP, Spreadsheets, and the usual fluff, leaving programming, interfacing with electronics (,etc.. The GOOD STUFF) to the very end, if at all. The only real good CS/Tech courses are at the top, and these are sometimes hindered by either lack of a good Tech teacher (ones willing and able to tinker) or a short time period (Here in Newfoundland, CS/Tech courses are usually one-credit, making them 'half-year' courses.)
--
Quando Omni Flunkus Moritati
-Possum Lodge Motto
Something alittle less adventerous might be writing a client-server app that accepts math formulas and then spools the result back out in a nice 2d/3d graph. Maybe use gnuplot as a backend? That would show that you know networking, advanced math, etc. For bonus points, write both a linux and a windows app to show you know cross-platform stuff. You could use this outside of highschool too - demonstrate it to prospective employers! :)
Okay, moving down towards simpler stuff, how about writing a program that takes all the bus routes in your area and you provide which destinations you want to go that day, and it spits out a route for you. Be sure the routes aren't hardcoded. This is the infamous "Travelling Salesman" problem in CSci. This was done way back in the 70's on the PDP-5 by a few hackers for the subway system in NY. Read Steven Levy's "Hackers - Heroes of the computer revolution" for additional historical information
Hmm.. Another idea might be to write a simple webserver. Or a chat client/server like IRC.
That should get you started.. Cheers!
Before people can make reasonable suggestions they need to know what you have available.
What hardware do you have? How much, performance level, resources.
What environment do you have? What OS, development tools, etc.
Do you have any multimedia tools? Cameras, scanners, microphones, speakers, 2D, 3D packages.
Basic suggestions:
1) wipe clean a few PC's give them the OS and applications CD and make them install everything
2) do a this is my "city", "high-school", "class", "neighborhood" multimedia presentation.
3) C-robots
4) song lyrics data base
5) dating service
code a solution to the traveling salesman problem
... and tell 'em it has to be O(N) complexity! :)
After they've beaten their heads against that for a while, you can tell them about NP-Completeness, "easy" problems versus "hard" problems, and all that other fun stuff.
My
Seniors have taken trig already, right? Maybe they've learned about dot and cross products too, right?
Have them write a simple ray tracer! Some of those kids will be thinking "why do I need to learn trig?" You can show them that they can do fun things with it, and that's a good a reason as any.
If tits were wings it'd be flying around.
Everyone should be exposed to Life at some point. It really stimulates your thinking about emergent behavior and complexity stemming from simplicity and such things.
I lived in Nome up until may of this year, when i got a job working for netscape communications.
Really? Wonder if I know you...
Jay (=
I'm sure many of you have heard of the Iditarod -- the dog race from Anchorage, Alaska to Nome, Alaska over 1100 miles.
High school students in Nome were given an awesome project by their high school CS teacher -- we wrote the program that was used to keep track of the mushers during the race.
This was pre-internet explosion -- I'm talking mid- to late 80's here -- and we wrote the program in BASIC on our trusty Apple IIe's. It was a simple database; the users would enter a musher number, checkpoint number, time entering or leaving, and number of active dogs on the team. Once an hour we had to print off a report that was given out to the media reps sitting in Nome.
The ultimate perk was, once the race actually started, students could sign up for 8-hour shifts manning the computers at the Iditarod HQ in Nome. (Yes, even during school hours, but you had to sign up for 2 non-school shifts for every one school shift.)
About the time I graduated from school, Alascom (Alaska's big telephone corp) was using the data from our program to do the updates on their 800-number voice-messaging number. ("The current leader is Libby Riddles; her last checkpoint was in Ruby" and all that.)
Granted, we re-wrote the program from scratch every year -- not the best model if you want to teach code re-use and modularity (but then again, it was the mid- to late 80's). I suppose it's likely that, should a class totally screw off for the semester, that they'd pull an old copy off of the shelf to use. But it was a project that stimulated the creative drive of the students. Even the ones who weren't in the class; kids also helped out with feeding and caring for the dogs when they got into town. It was a real community effort.
I suspect that, since the Iditarod has become more "professional" a la the Olypmics, that this project isn't being done anymore. It's a pity.
Jay (=
Compilers and VMs are freely available for most platforms.
www.gnelson.demon.co.uk/inform.html
Actually last year was the first year the AP had been switched to C++... So I guess the world is on the last generation of pascal kids...
prosebeforehos.com
How about have them put together a simple resistor ladder Parallel Port DAC? They're easy to make, and the parts are available from Radio Shack (although other places will probably be cheaper). I really don't have any electronics experience (I'm a Biology geek), but I still was able to put one of these together back in high school following a set of instructions that was included with the docs for some .MOD player. I later added a volume control and simple op-amp without too much hassle. And since I put everything on a breadboard, I didn't even have to solder.
The sound quality you can get is surprisingly good. I used mine for playing Star Control II (There's a command line switch for parallel port DAC support, I forget what it is). If this is a more programming related class, perhaps you can then have them write a few little programs that use the device.
I have found that when assigning projects it's easier to just give them a goal and let them decide how to do it.
For example given that one of my professors just wanted us to code something we felt was to our level of programming.
Not a bad idea really since what ended up happening was each student coding a program to their level and then expanding a little on it as they learned. A lot easier to do this then to have some students be bored w/ an assignment and others strugling to finish it
Graphics are a great place to start. It is really easy to demonstrate all the basics of programming in a graphical way. Debugging is easier in many cases as they have a very visual way to see what the program is doing / has done.
Besides, everyone likes graphics, and even modest hardware these days can render enough that they can have a lot of fun. You will get some games each class group also.
Maybe make a template game. Something fun like surround, lunar lander, or maybe a simple level that they can add to.
Blogging because I can...
In my computer science class, ( to give you some back ground I took GCE Computer science which is an english derivitive, used in the west indieas school system. ) We went to local area business and talked to them about how a computer would make there job easier then see if we could address it. my class which wa sonly 5 people worked on an accounting program in basic, which would allow him to set up employee profiles and deductions, then calculate his expenses based on that. it even printed up a fake check. later after moving to the US I took part in a technologies class where we worked with robotics, 3D design and CAD.
I'm sure some of you have seen that robotic arm with sensors that connects to a computer and ou can use a basic type programinglanguage to program it's movements, this worked with a lathe so we could make wax baseball bats all day. We also had student versions of 3DStudio and CAdkey, wit this we combined modelmaking (wood) with cadkey and 3DStudio to design an arched bridge test it and present it.
of the group in the class we spent every lunch break and after school working on it. I think the point is if you let them realize it's a tool then let them design teh project.
I'm sure everyone will desire to do something different so setting a single project will only grab half of yoru students. let them reliase it's a tool, give them flexiility then let them apply it. hoep that helped.
I'd say that you give them a loose set of rules.
It has to use TCP/IP, and it has to be easily portable to multiple OSes.
Wish list features to include download resuming, searching the host for certain file names, a GUI, chat while downloading, and et cetera.
If the program ever happens to make it into widespread use, I'd like to see the RIAA try to sue a bunch of high school kids over their school project.
LK
"Hi. This is my friend, Jack Shit, and you don't know him." - Lord Kano
i once did a project in high school where i wrote (in turbo pascal 6 + BGI) a graphical, event-driven object-oriented calculator. in retrospect, it looks pretty trivial (i think it was 700 or so lines of code), but i prolly learned more from writing it than i had from anything i had done prior; I built my own event-handling and mouse-handling system, wrote a sort of OO GUI toolkit, and learned a lot about object-oriented programming.
of course, in today's environment, parts of that fail to work (why do high school programmers need to know how to create event-driven environments when chances are they already program in/for one? who cares about how to make a mouse work? it's done for you! these are interesting subjects to me, but they're systems, as opposed to applications, programming topics). however, it seems to me that something that laid a bit more emphasis on the the application (maybe an RPN or programmable calculator?) or GUI design could still work in today's environment.
I think the most important things any high school project should concentrate on, at an advanced level, are:
GUI design -- It's obvious from using a lot of proggies today that some people aren't putting a lot of thought into the design of their UI, which is often one of, if not the, most important aspects of modern applications programs. It's also terribly underaddressed, not only in high school but in college. CHI was a senior-level elective so small it was cross-listed as a grad course when i went to school (and this was at TAMU, a 43,000+ student institution with a fairly large CS department, so no excuse there). That's not good.
Reusable code -- world needs more of this, too.
Working in groups -- programmers tend to be a solitary sort, but it's important that they learn to work in groups. That's addressed in college, to some extent, but advanced high school students could almost certainly benefit from working in an environment of two or three coders inna group.
newayz...
-k. ^-^ ^D
Give them a project that has visable results and can be appreciated by there peers. I'd say give them a little web space with perl or php and then teach them how to do a hit counter. Java applets may a better place to start because the language is a little more formal.
If kids don't have some way to show off they will lose interest or resort to writing fire routines over and over.
just my $0.02 cents
Citrix
Leknor
http://Leknor.com
"So many idiots, so few comets"
Hey, and since Daikatana started the naming genre, I propose: Jon Katz's Hellmouth
I get warm fuzzies when I see educators at the high-school level trying to make classes interesting and relevent to students in an immediate sense, as opposed to merely informative. Good luck!
So that year, the AP CompSci test was just ridiculously easy. My entire class got 5's on it (the highest possible score) and a lot of them hadn't used a computer before in their life and couldn't do a lot of the assignments.
For good assignment choices, I would look at some of those programming contests that are all over the web, and definately give the kids the option of coming up with their own project if they have a good idea for one. I asked my teacher if I could skip the regular assignments because I already knew C++ and work on a program that would play Connect 4 against a human instead, and I had a great time of it and came up with a cool program.
"What a waste it is to lose one's mind. Or not to have a mind is being very wasteful. How true that is"
Vidi, Vici, Veni
Simple games are one of the best types of projects I can think of for kids that age. I would think that most kids taking an AP Computer Science course would be interested in computers, and being that they're kids and interested in computers, I would have to think they're interested in games. Perhaps simple stuff like tic-tac-toe or text-based adventure games.
On another thought, providing the option for students to work on a project of their own design might be a path you want to examine. I know when I was in high school, I learned a lot more/spent a lot more time working on my own programming projects than any school work I ever did. I think I may even have a copy of my final project release...SuckMUD 0.0.1a laying around. :)
Ty
So what is the AP Curriculum these days?
I took AP Computer Science in 1986, and it was mostly Pascal programming. I heard that they changed languages at least once since then, and they've probably revised other parts of the curriculum significantly.
And of course, what's so boring about that curriculum?
1) How much time can you spare to commit to this?
2) What is the experience level of the students? (I know the AP CS stuff used to be in Pascal, what is it now?)
3) What resources are available to you? For example, can you get a computer to run Linux on as a server or anything like that?
Ultimately those three questions are going to limit what you can reasonably accomplish.
---
This sig has been temporarily disconnected or is no longer in service
These are stuff I think could be interesting and stimulating for your students and provide some challenge to depending on their level of competence.
- Make them install a webserver and create a small webpage. If you use Linux/Apache the school won't even need to spend money on that one.
- Some small programming project like a small perl script or a small VB program.
- Assembling a computer from scratch.
- Install a small (2 or 3 computers) LAN with different OSes and comparing them.
Those things would have kept me interested when I was in high school and could have convinced me to actually take the computer science courses...
"If liberty means anything at all, it means the right to tell people what they do not want to hear"
Oh what a horrible thought, perverting young minds with the woes of sysadmining. But anyway...
If you have the resources, give each student (or small group of) a newly installed machine (or better yet, let them do it) and then have a few week contest for each team to crack the other boxes. Let them each setup security and such for a few days, and then go at it. The admins can come back and fix any holes they see or exploits that may have made it through, but keep tabs on who's box has been cracked (or cracked worst). It'll either generate a class full of script kiddies, or a set of good, security minded admins.
Or instead on the programming side, fractals. Yeah, they've been done alot, but your students should be able to understand most of the fractal basics, and when they get one going, they make perty images!
There's something inherently pathetic about school projects.. They'll tell you to write a calculator, so that you can look at it and say "how much lamer it is than what already is out there, and it took me a few months.." I much prefer the idea of making something that was not done - even if it's impossible to do at this time. It's all in the process, man. Shock them. Say, I want a complete AI, that can talk for 10 minutes without anyone detecting it's a bot. One advantage here is that there will be no students who do the assignment in 15 minutes and then get bored or play quack or IRC.
-- ATTENTION: do not read this sig. It doesn't say much.
It has been my experience that nothing shows you the road ahead like just turning around and seeing where everybody has been. Teach them the history of the computer, not just the C language. It's like having a partly finished book, then having the student read the last chapter that's complete, and then saying to them "continue the story in a coherent manner" - they're missing a big portion of the picture.
Show them the screwy 20 bit address space on a real 8086, explain to them why Windows 3.1 was such a kludge and how it's screwed up every Windows 9x since, and why they have write 200 lines of error checking code to get a 50 line program to run reliably. Explain how a PC (or Sun or Mac) is architected, and then get them to DO something with that architecture at a low level. You show them the foundations, and they'll learn to build the best buildings.
"Depression is merely anger without enthusiasm." - Anonymous
How about having the students get their Amateur licenses and write programs for things like sending web pages over packet, or using a sound card as a packet or psk31 modem. Not only would they learn about programming, they would learn about communications too. This also tries to make up for the fact that computer science is taught in High School, but not engineering. I bet some of the ham gear makers would donate equipment for a project like this.
If you really want to teach the kids something, try getting them to write something low-level and try to make it cross platform. These days they all use ANSI C and everything that is cross platform, but the low-level stuff isn't. Most people don't /really/ know how the stuff works, and if you try to get them to program at the lower levels then they'll really learn.
-Leo
I'm not in high school anymore (graduated this spring), but second semester Senior year I took an introductory programming course at the university here in Madison (WI, that is--CS302, if you're interested).
If college freshmen can understand it in a semester, HS students can get it in a year, esp. if they're taking an AP CS class anyway. Check out the TA's wepbage (http://www.cs.wisc.edu/~davin/), which used to have the list of class projects, but still has useful information, including sample exams. As the fall semester progresses, he'll be posting information for his own class that you can take a look at for ideas.
Alternately, LOGO is a good language to learn. Before I get yelled at here, it's not practical to use but it's an excellent language to learn because of the way it's structured. It's simple, easy to debug, and will run on just about anything. There are versions that will run on an old Apple ][, a 386, or whatever. My personal favorite is MSWLogo (http://www.softronix.com/logo.html), by George Mills of UC-Berkeley, using the UCBLogo core developed by Brian Harvey. Yes, it's a windows program, but it's excellently done, and incredibly full-featured, and has only crashed on me about 3 times in as many years. It's got a primitive (now--it's under constant development by George Mills' graduate students and was just updated in the last version, 2 weeks ago) GUI toolkit, 3D support (check out the demos!), sound, commands to control serial and parallel ports, open files, read from the game port, etc. The language is interpreted (though compilers exist if you really want one--this defeats the purpose though), but within the constraints of an arbitrarily-sized 'page', your students can do literally anything they want.
I agree with other posters who have said that you should have your students work on their own design documents before they begin coding--this is incredibly helpful, esp. on large projects, or those they'll only be working on in class.
High-speed Road Trip (18.000KPH)
Games!!! It's much easier to keep kids interested if they get to "play" with their creation. I took a few "programming" classes in school (more like scripting, but the concepts are the same) and the coolest projects always came out of the games classes. The people just liked working on those projects more.
There's just as much (if not more) math and core logic in a game than in some lame-o "fake cheese factory inventory application". Games can span pretty much all languages, too. You'd be amazed what you can do even in JavaScript if you're creative enough.
The whole experiance was really interesting and it actually taught me some skills which helped me when I started working for a company controlling external robots based on inputs from digital data acquisition.
Not only that but it got the two of us a trip to SigGRAPH (92 I think) from the company.
I guess that's another thing that might help kids get into something is to get an external source involved. They may not want to market a product developed by HS kids, but as a proof-of-concept project, or maybe a demo, the kids may get oppurtunities that they otherwise wouldn't...
10. How to install Linux/*BSD /. and teach them to hit reload every 2.5 minutes.
9. Show them the proper methods of beard grooming
8. How to dress appropriately for any occassion with only jeans and a t-shirt.
7. Teach them to drink coffee - lots of it.
6. It's never too early to turn them on to cigarettes.
5. Give them a web connection to
4. Get them turned on to Linux and teach them to make inane comments about how much KDE sucks if they like Gnome, and vise versa.
3. Make sure they never get to bed before midnight and make them get up at some ungodly hour.
2. Give all of them pagers and call them every few hours in the middle of the night and say "My computer has a message on it that says 'Press any key to continue.' What do I do now?"
1. Teach them how to be a BOFH!
How about taking some old computers, some old version of Redhat (4.x, 5.x) and letting the kids install it, then upgrade the kernels, ad drivers, etc... Teach them the real inner-workings of a computer instead of the point-click-crash world. They would be doing problem solving, working as a team, could be some programming, networking, etc...
Give them a bunch of flat text files with numbers and such organized in a consistent manner. Have them use Perl or whatever language they wish to process statistics out of them. Then show the most creative solutions in class along with some of the good solutions. The key is to let them be creative with it and not limit them to the way they have to do it. In real world production environments you have to really be creative sometimes and this kind of thing is usually pretty fun especially if they get nuts with the regular expressions.
According to game theory, random choices is the optimal strategy. The best you can do against a random choice strategy is to draw. In the short term, you may win due to statistical fluctuations but in the long term you will draw.
Reason why random bots lose the contest is that there are other bots in the contest that play strategies like always playing stone. Random bots don't take advantage of this and so lose points to bots who do.
"When you sit with a nice girl for two hours, it seems like two minutes. When you sit on a hot stove for two minutes, it
This especially applies to young women, many of whom are turned off by traditional computer games. I have seen this in classes that have used games as projects. Using games to teach young CS students could be damaging to the cause of getting more women into the field!
Erm. So what do you think women prefer? To design a spreadsheet and create data entry software rather then code games? There are many type of games, they don't always have to be first person shooter or gory violent games. There are strategy games, RPG games. One of the classes I consulted implemented a MUD using Scheme, and one of their assignments was to extend it any way they want. I don't see how that can be a turn off for girls.
Actually, one of the classes I had worked for did that, using Scheme. It was extremely fun, the course staff had created the basic objects like a baseroom object. And the students were to inherit and extend it, implement money or make the NPC's more intelligent.
We set it to the theme of 'Clue', and had done 'Star Wars' before. The students couldn't solve the mystery until certain functions were implemented.
I can still somewhat remember some of the room descriptions...
You are in the graduate students lounge. Here you see Professors relaxing, drinking deep from ambrosia and being fed grapes from young smiling undergraduates. Gentle music, accompanied with the soft buzz of NP-completeness fill the air.
When I took AP CS, we had a couple of weeks of class to kill after the AP exam, and our teacher had us all split up into groups and create a battleship game that would play against the other groups' programs. We didn't get graded on it, but had to spend class time working on it, so there wan't any pressure and the whole thing turned out to be a lot of fun.
One of the most important skills we took out of it was experience programming in a group; something which we hadn't really done before. Also, some of the more advanced groups really went all out and added AI to learn the strategy of the opposing program, movies and sounds for hits and sinks, etc.
What about building dynamical web sites.
All you need is a linux server,
with apache, php and a SQL database (Postgresql or Mysql).
It is not that difficult and it is something they can
show there friends.
I totally agree. Your kids will learn about networking, administration, security, etc.
Check out www.beowulf.org and ltsp.org for more info. This is something that they can easily do in a semester (4 months?) and they can get started on parallel programming in C or Fortran. There are a lot of resources available and I'm sure they will have fun.
A suggestion for the program to write would be something that takes the student's class choices and fits them all into a nice schedule.
Alex
Rather than focus on the programming alone, try getting the students to work on a design before they code. This will help them stop bad habbits before they start, every project always starts with a good design.
Justen Stepka
A napster clone (client and server) has a lot of interesting programming problems to solve.
- GUI
- Networking
- Multi-threads
Its large enough that it would probably require a team to complete in a semester, but small enough to actually finish.
In the end, the students will have a real good feel for what its like to write an application that is forming the basis for a whole new industry. It also has the teen-rebel smell to it.
PBL
So - if I was going to teach a high-school class, I would have them make computers out of physical devices - gears, tinkertoys, or even paper.
Good idea. I can't think of a better starting point for researching this kind of exercise than learning about Turing machines. I became most enamored of Turing machines when I learned that, in theory, you could build one entirely out of, say, wood.
It bothers me somewhat that as computers become more and more complex, there are further layers of complexity which hide the dirty details. As computers continue to grow in sophistication, this process is inevitable, but it's a shame that most kids growing up with computers today won't have the same exposure to things at the chip level as was the case 15 or 20 years ago.
Teach them DirectX. I know it's very anti-Linux :-) but they will love you for it. Learning the API will apply a lot of advanced programming techniques far beyond will typically be needed by most IS Departments, and creating something they can actually see: They will love you for it!
Simple CGI programs like a guest book or a message board would probably be a challange for high school students, but not impssible. It would be fun because they could see and use the result.
It would also get them started on a highly marketable skill as well as get them used to programming in network environment without having to learn a whole lot about network and socket programming.
My personal favorite high school coding project (also on TRS-80) consisted of:
10 LPRINT ""
20 GOTO 10
The teacher thought the network printer was stricken with a virus.
Don't forget about the Indian Reservations, New Jersey, or the river boat gambling, much less state lotteries. Nevada is far from the only place gambling is legal.
please don't teach Turing its the worse then basic in my opinion.
How can you say it's best to learn programming on your own?
I think most people are missing the point of HS CS and even college CS. It's not to teach someone Java or Perl or whatever: they're intended to teach logic/cs basics to students, so that no matter what language the future brings, they'll be able to learn it and adapt!
Students need logic and basic CS concepts taught to them by someone who knows what they're doing before they learn programming languages.
This is unrealistic. Most high school CS kids can't even program linked lists correctly!
You all are forgetting that these students are beginners, and that most of them aren't computer dorks!
This is a nice idea for another type of class, maybe say a graphics design class, but html does not teach students CS concepts!
Also, school boards / administrations get very very picky about a school's public image. Every bit of content would have to be approved by umpteen-million people.
I've got a little experience - I've almost been sued over my high school newspaper's website.
Sorry, I didn't mean to flame - I'm just used to beginning CS students. At my school the upper-level people (like you and I) actually helped teach the normal kids in class...
In my second year of CS in HS my instructor and I set up my class on a mozilla qa project. netscape even called the school and was going to give us computers and they were whipping up a press-release.
Then my teacher's father died and he was out of school for a week and we had to spend the rest of the year catching up on class topics - so we never had time to finish the mozilla qa stuff.
I agree. Having a great teacher makes a significant difference. My CS teacher (Calc teacher too) was amazing. He would jump up and down amd preach about the 'feel good feeling' that you get when your program works perfect. I would be much further behind without him.
The best programming project that I have heard of is to write a simple clone of Tetris (with or without the graphics). The challenging parts are controlling the rotating the pieces, figuring out how far each piece should fall, as well as making sure that one piece never overlaps another or goes "out of bounds" It's a challenging program and it's fun to debug :-)
Good luck!!
# They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety. --Fran
I'd say the one thing I was sorely missing during my time with AP CS was graphics. Have them do anything that draws something on the screen. If you want to be really cool, set them up with some sort of way to read in JPGs or something like that and play around with them.
Other things I would have liked to do then:
-Binary Files
-Games
-something USEFUL
If you're running something other than *nix, you could set up REBOL (http://www.rebol.com) for them (they could do it, but it would save time if you did) or something like that so they can easily grab their email to a text file, and then use the same sort of text processing that the AP curriculum calls for, so they can filter their email in some way.
Things I have since realized should have been covered in greater detail in APCS (when I took it):
-How to use an API
-How to handle multiple-file programs (Make, etc.)
-How to understand extend existing code
The latter would be a really good way to get them to do something ambitious like a fairly complex game without having to take too much time to cover the rest of your curriculum.
Hope this helps!
If they are decent programmers, I'd suggest having them program things over the network. (Hopefully your school is more forgiving than mine was. In BASIC Class my classmate got EXPELLED for trying to make a simple computer to computer chat program... which basically typed out the message "Hello World" to every computer on the network.)
;-)
A simple IRC like server and clients should keep them busy for a while. If that doesn't phase them, I'd seriously just give em all A's and let em play Half-Life the rest of the semester. Or try someone elses idea. Good Luck
Sig missing. Reward.
Wow, someone who remembers the Challenge...
Disclaimer: I'm the goofy wonk who wrote the original crypto code project some time ago...
A good place to look for information about potential projects for your class is the prior years' archive. http://www.challenge.nm.org/Archive/
Some of the projects have HTML reports -- let your students read those and see what others have done and it will probably spawn a few ideas for stuff to do.
An alternate solution is to browse through a few CS pages and see what's going on in the introductory CS classes. For quite a few good ideas, check out the assignments for Princeton's infamous COS126 assignments.
-Chris
"No class (to my knowledge) has actually completed the project, but it's the process that's important."
Now that's a telling comment...
--
Linux MAPI Server!
http://www.openone.com/software/MailOne/
(Exchange Migration HOWTO coming soon)
I remember writing a program (on a TRS-80!) that simulated those order-taking consoles at McDonald's. LAME!
Some suggestions:
1) Lego Mindstorms. Get enough of them so your can put 3-5 kids on each and have them compete (cross the room, soccer, whatever).
2) Games games games. Find out what this year's class' favorite game is. Write a (simplified) emulated version of it.
3) Simulation. Have an ongoing "physics simulator" (or something similar) project. The first year the students can do some design and basic coding. The next year they can do more advanced coding. Etc.
4) Simple AI. Do some theorem-proving AIs or ElizaBots or something.
Really, thinking up ideas for a CompSci class is as close as your nearest tech mag.
--
Linux MAPI Server!
http://www.openone.com/software/MailOne/
(Exchange Migration HOWTO coming soon)
I wish someone had pointed me towards the Knuth when I was in high school. It is the ultimate source of CS projects, and the ultimate resource upon their theory.
The Knuth (aka The Art of Computer Programming) is available from all reputable bookstores. You can get the boxed set or just the first book from barnesandnoble.com.
You can also go to Donald E. Knuth's homepage, or to his TAOP page
Please believe, if there is a deep and magic tome of computer science, this is it, and if you will ever truly have the love for CS, then you will love these books NO MATER YOUR SKILL LEVEL! Every chapter is filled with projects ranging from in your head to graduate thesis level, and they are labeled by difficulty and mathematical requirements.
-- Crutcher --
#include <disclaimer.h>
-- Crutcher --
#include <disclaimer.h>
I would suggest you give your students a taste of real life ... get some other instructors act as end users who have specifications (unclear, imprecise, etc). Have the students talk to the end users to clarify & refine the requirements and build a proposal. Have your end users then change their requirements (minor or major), so the students will have to re-work the requirements.
Then have them implement the analysis.
When they are done, have your end-users request additional changes, but have each student work on a different original work.
It might be good to have your students work in teams for this, so they get a taste of what it's like to work with other people and on other peoples code.
The programming projects I enjoyed the most during my days of high school and collegiate computer science classes were making games and artificial intelligence (minimax, basic heuristics, etc...) programs. I've also noticed that high school CS courses seem to dwell on iteration and rarely ever mention recursion. Recursion is one of the most graceful and fun aspects of programming! Why must high school courses leave that out? Do they think its too advanced of a topic for intro-level courses?
It seems a lot of people are suggesting very advanced things for a student's first computer science class. I'm sure there are many here who were bored to tears by their high school CS class because they had been programming for years, but you can't assume that everyone is at that level. Give students the option of doing more advanced projects on their own as a way of getting out of the regular assignments, but don't assume all your students are going to be prepared to execute a big complex project.
I also think it's very important to strongly establish the important fundamental pinciples of CS in a student's first class. You should emphsize the importance of things like recursion, separation of abstraction and implementation, good style, thinking before coding (i.e. writing specs and pseudo-code), objects, etc. It would probably be beneficial to demonstrate these concepts in a few different kinds of languages: Imperative (i.e. C or Pascal), functional (i.e. Lisp or ML), and object oriented (i.e. C++ or Java). I very much agree with the posters who suggested finding programming challenges on the web and using those. However, I think it's important to emphasize the thinking that needs to go into solving problems, as opposed to emphasizing good hacking. Students have plenty of time to learn the tricks that make a good programmer, in their first CS class they should learn the fundamentals of computer science.
cheers,
Ben
We did one of those and its a great project. It teaches about opcode, good program structure, how a computer works, how a a compiler can save cycles, how assembler works etc.
Like, say, tell them to write Carnivore lookalike using freely available libraries (team one) and method for passing data without detection (temat two).
--
The moon is not fully subjugated. I demand a second assault wave preceded by a massive nuclear bombardment.
I've thought about this for a long time, but lack of spare time has kept me from it: build a machine that can learn. Not from any old learning principles though:
A computer controls a Lego Mindstorms robot. The computer makes the robot move around erratically. By rewarding the robot (program it with appropriate reactions to reinforcers and punishers), make it behave in specific ways.
Or maybe I've just reinvented the tamagochi (sp?;)
In a combined psychology/computer science class, this could be extended to making a computer-based maze-running rat. That would be something I wish I did in High School!
-- Rolf Lindgren, cand.psychol
I think microcontrollers are another reasonable vector for early mind-molding:
(0) really pretty much dirt cheap: PIC or 68HC11 + C compiler + programmers + support hardware will run less than $200 / station and will fly even on outdated computers.
(1) Standard C is available; why learn a funky-ass dialect that limits you later? You get plenty of I/O experience, to boot.
(2) Provides understanding at the hardware level, with modest restrictions that tend to encourage creativity and discourage bloatware.
(3) teaches basic electronic skills, always a boon.
(4) projects are sooooo cheap that students can take them home when they are done!
J
Good compiler comparison info, C code, and parts: www.phanderson.com
The way my first college CS tacher handled this was adding extra optional assignments to all the assignments.
TIC-TAC-TOE(experiment with 2d arrays) had the added assignment for producing a computr player for it.
Our sorting assignment for arrays had the optional assignment of replicating it with a linked list.
Our binary tree assignment had the optional assignment of implementing it in C as well as Java.
Basically you can keep the curriculum you have if it fits the low end CS Student and tack on other assignments for the more interested students. Also ask them to produce demos for a walkthrough for open house. Hand them the IEEE former problems from their programming contests.
"Sometimes it's hard to tell the dancer from the dance." --Corwin Of Amber in CoC
I'm a high school computer science teacher. All my daily assignments as well as larger projects (and solutions, in many cases) are available online. Note that these materials will be archived to my personal home page real soon, as the new school year starts one week from today (that is, on Wednesday, August 9).
Many of these assignments I've done for several years, so I know they're suitable for first-year computer science students.
The Daily Handout - high school computer science assignments
Interesting assignments of note:
Graham "Teach" Mitchell, computer science teacher, Leander HS
If this is for a science class,
I saw a great science fair project
which used a Commodore 64 to measure the
speed of sound.. The computer triggered
a noise, and listened for the echo from
a fixed distance. The barometric pressure
was also measured and the experiment
was repeated everyday for a month or two...
-- The Funk, The Whole Funk, And Nothing But The Funk
Assuming you're talking about a coding project, how about a simple airline reservation system?
Give a man a match, you keep him warm for an evening.
Light him on fire, he's warm for the rest of his life
Yorktown High School Linux User's Group in Arlington, Virginia is a good place to get some ideas. Those kids are getting more experience than I do in my programming job! I want to go back to High School!
Check out:
http://www.ics.uci.edu/~eamonn/cosmos.html
I've had a problem with that in our computer science course. Everybody could choose either a game or some library book database, the majority vote would be the project for everyone. I was the only one against the game and one of maybe three persons with advanced programming skills.
The project was a complete disaster -- nobody knew what the heck they were doing or where to start, the teacher couldn't coordinate the thing, I ended writing most of the code with one other guy.
I think it's best if the teacher already does the modulization (so classes in Java, units in Pascal) etc. and simply gives away the tasks. Everything else will probably fail due to inexperience in software engineering.
So - if I was going to teach a high-school class, I would have them make computers out of physical devices - gears, tinkertoys, or even paper. Get a simple CPU (or a simple CPU simulator) and teach machine code. Paper computers (where the person plays the role of the CPU, like the old "cardiac") were great for this. Even very young children can understand paper computers - I've taught my 6 year old daughter this way. And most smart kids (like those you would expect to find in an AP class) enjoy learning the "secrets" of how things really work.
Feel free to contact me if you want more details.
- davevr
Prove or disprove: P = NP
Good luck!
IT
Power corrupts. PowerPoint corrupts absolutely.
- Spaceship physics: have them build a simple simulator for 2-D physics. A simple project would have a ship with a location, a direction and a velocity. The ship could turn and give itself a "kick", i.e., increase its velocity in the direction its pointing by a given amount.
- More Spaceship Physics: you can extend the previous project in a number of ways: gravity (either little planets which act as point-sources, or a downward-gravity model to look more like the earth.) You can easily turn one of these into a simple game, either a shoot-em-up or something more problem-oriented (like Lunar Landar).
- Cat and mouse: This is similar in style to the spaceship ones. The idea here is to have two (or more) creatures where one chases the other. You need to give them different skills to make this interesting. Thus, you can have a mouse that works by sight: it runs always directly away from the cat. The cat is faster but uses the sense of smell: it keeps on walking forwards, but as soon as it sense that it's getting farther away from the mouse, it picks a random direction.
These projects can range from very challenging to not-so-hard depending on how much you do for them and what programming language they're using. Doing any of these from scratch is a seroius project for you average high-schooler. But these are fun and have the advantage of requiring problem solving and teaching simple vector calculations to boot. If you want more info, email me (yminsky@cs.cornell.edu). I've played with all these projects myself, and my father taught a class once for high school teachers on how to integrate such projects into their classes.Such a project would teach them both programming and some basic physics. The main stumbling block for this and all similar projects is the need for 2d graphics. You need a good and simple toolkit for this, because you don't want them to waste lots of time on the graphics, at least not initially.
There are millions of cute variations on this kind of game. You can also have competitions where students have different "senses" and speeds, and need to program the best possible creature with those sense.
So why not do something simpler, yet still interesting. Let them design a web application. Something like a dynamic generated website.
The following things should be considered:
You can make this as simple or complicated as you want. Both good programmers and the clueless can work on this and learn (basicly because most talented high school programmers learn nothing about testing,documentation,interface and interaction design, while these are 60-70% of the struggle).
I never learned you should make a testplan before writing software(and yes I'd rather just start coding, but for industrial strenght applications knowing what to test for is better because it shouldn't depend on your design!), I won't even talk about documentation and interaction design. All because (appart from taking every CS course our university had on offer (we didn't have a CS degree course, so there are not that many and deep)) most is self taught or from courses my employer send me to.
Don't just teach them how to code
If you want your kids to know how programming really works, have them build even a simple compiler. Have it compile to Java Byte code. That would be the best "Computer Science" thing for them to do. Teach more fundamentals that won't go out of style when technology changes. Do project that show how things work, not how to use things.
In my humble opinion, one of the things Linux needs the most is a system registry to replace the anarchic mess of config files scattered all over the friggin' place. From a practical viewpoint it shouldn't be that difficult to do (a simple text file and a parser, even better if the parser is implemented as a kernal API.) From a philosophical point of view the mass of configuration files is a mess -- its uncivilized and I don't care whether Windows already has one or not; just put all of the app necessary info in one place where anyone can get to it easily.
mjs
The core of the cs program at Oberlin, too. Chez Scheme. Although I never liked the bit about writing a scheme interpreter in scheme. It got a little too inside-out...
This would let the students gravitate to the area they may be most interested in (coders, builders, whatever) and will also allow you to share ideas between more than one class (if you have one, or if the other teachers are into it).
As the actual building requires a lot of creative writing, you may want to see if some of the English teachers / students want to participate as well.
I can't speak for eveyone, but this is the sort of thing my freidns and I were doing in our spare time during highschool anyways, so why not comhine the 2?
Just don't make it too much like work =)
--sugarman--
or maybe you could get them involved in a project like wine or mozilla. It would be a riot if a group of high school kids were able to save mozilla...hehe
Students could work together to create their own discussion site. Would teach them HTML, CGI (meaning either PHP or PERL), expose them to using databases and SQL, and whole lots of other things. And when they were done, they would have something they could use.
My biggest pet peeve with my first few computer courses were that the canned coding exercises didn't contribute to anything.
What I would have greatly enjoyed was if the courses had used actual open source projects where the potential would have been there for the code from homework to earn immortality.
Think of the motivation that would result from telling a bunch of sixteen year olds that they have the potential to have their names indelibably stamped onto a product thousands of people will use.
I'd give some specific ideas for projects, but (a) I don't know the skill level of your students and (b) I don't know what territory your curriculum will cover and kernel hacking vs. database hacking vs. network hacking vs. UI hacking have quite a bit of differences.
Having taken a class similar to this one (probably, as he/she references the AP curriculum, etc..) the students probably have at least a basic understanding of C++, and as much as near-guru level knowledge of assembly - this is why they are bored :) We played quake2 a lot, im sure you could come up w/ better ideas.. Our teacher let us choose a final project that ranged from a game to a db-based web page, etc..
You can REALLY get to know the inner workings of a processor and OS by investigating various injection vector options. Of course, if your project escapes to the wild, you can really get to know the inner working of your local penal system.
One of the best things that I've done in school is to choose a project, work on it, and get credit for it.
Work with the class to choose a project that will reinforce the AP curriculum. Then, as a class talk about the design of the application. Once you have a good modular design, create small groups to work on each small, well-defined module. Make them create the stubs so that each group can see exactly what methods they can call and what they can receive from them. Then, implement the darn thing. This teaches good design, good teamwork, and good modularity.
I think that a chat client is a good project. It involves using the network, creating a GUI, interesting data representation questions, and a plethora of different design directions they can choose from.
This was one of the most rewarding things that I did in my Intro. classes at college and it worked out very well. The key for you to remember is that it is the learning process here that is important, not the actual product. YOU are trying to get them to learn the curriculum, not to demonstrate that they already know it. If they do already know it, they will have fun coding anyway!
+-------+ between the wish and the thing lies the world - All the Pretty Horses
Even if they are contributing small amounts of code or insight or peer review or documentation, they are still benefitting themselves AND lots of others in the process.
There is such a wide variety of projects out there - just look at SourceForge and the like - that would allow students to make significant contributions to real-world projects while utilizing the principles and practice of good computer science. You would probably have to be the one enforcing that last part, but I can't emphasize enough the value of real-world experience as a complement to the AP/IEEE curriculum.
You would also have the advantage of having lots of infrastructure already set up - no need to worry about establishing project workspaces, titles, task assignments, etc...many projects will already have these in place.
Go to a local company and ask if there is any automating to do. Divide and conquer if it is a big project. Let them do the real stuff! They can
at least be proud, because it will be used IRL. If
you offer your service for free, then most small shops and companies don't really care about some extra attention that they need. Of course you are going to be the proj. man.
nosig today
v1ru5 wr171n9
I've always found writing Core Wars referee programs to be lots of fun. Then of course, the old standbys cellular automata and the Mandelbrot and Julia sets
I've had people do this as a learning exercise.
There's lots of scope for adding extra features to the UI, "Let me know if my friend comes online" etc. and the underlying network protocols can be explored by anyone who feels adventurous.
I'd certainly recommend writing something that involves a bit of networking. That's far cooler and more satisfying for beginners.
Messages appearing on screen from another machine in another room looks pretty much like magic and should make students feel like they're really doing something pretty clever.
Incidentally, much as I agree with just about every criticism of Microsoft, VB is a good beginner's language.
No waiting around to learn too much before seeing a result.
Just make sure that anyone who shows real promise moves onto C before too long!
Another good exercise is the light cycles game from Tron. Two players on a single machine - easy to do, fun to play.
First, I'm a certified, certifiable cryptogeek, so I'm probably biased here. That being said:
:)
:)
Crypto.
The first rule for teaching (or maybe the second, right after "No matter how much they're the spawn of Lucifer, love the kid anyway") is that you don't have to teach a subject; if you can make the subject something the kid wants to learn, the kid will tear into it with the kind of unholy abandon that only teenagers can muster.
Think about the virtues of crypto, and how you can make your students enjoy it. Make it a point to teach the real stuff, not something watered-down. Emphasize that this is "military-grade" stuff [*], and that nobody--not the NSA, not the CIA, not anyone--can break these ciphers [**].
Tell the kids this, and they'll figure out pretty quickly that there are a lot of things they can do with crypto. Some of them will undoubtedly give your principal gray hair, but hey, that's the price of education. Not as if some of those Satanspawn don't already give him more salt than pepper.
There are a lot of ciphers which are fairly simple to sketch out on the whiteboard. I'd suggest Blowfish or RC4; both of them are exquisitely simple in theory, and straightforward in practice. There exists a lot of source code for Blowfish, at least a dozen different implementations in the public domain or Free Software, and RC4 (also sometimes called "arcfour") is almost as widespread.
You'll wind up teaching them about number theory, groups/sets, Boolean logic, the whole nine yards. You could easily spend most of a quarter writing this, and each day in class you'd cover a different aspect of computer science, along with a surprising amount of mathematics.
Crypto is a surprisingly comprehensive discipline. Good crypto libraries require that the programmer have a master-level knowledge of software engineering principles, advanced knowledge of their programming language, and sophistication in how they think about problems.
And when the kids start sending each other PGP-encrypted email over the school network, plotting the violent overthrow of the school and how to best string up their most-hated teachers from trees, you can sit there with a beatific, immensely satisfied smile and say--"Those are my kids."
If you want to know more about crypto and the classroom, feel free to drop me an email. I've got a C++ library for Blowfish which I wrote to teach some younger friends good software engineering principles--it's well-designed, with a boatload of documentation.
[*] Gloss over the fact that there is no accepted definition for "military grade".
[**] Gloss over the fact that there are easier ways to attack ciphers than by cryptanalysis.
Bill
Bill
Is a game.
It doesn't have to be a great game (don't even attempt to do an FPS - ok, maybe you could do a Battlezone clone), but it should have levels, some sound, and graphics.
Maybe funky 2D vector graphics, ala Asteroids, perhaps? Maybe a maze game, with various levels (a Bolo clone?).
The kids will learn about database creation and management (at a simple level, for the various levels), array handling, graphics (from the sprites or vector stuff), sound (for fx and music), disk handling (need to write the high score table somewhere) - maybe even networking (head to head playing - multi player too, perhaps) and AI (for the enemies, of course).
In fact, I don't think any other project would allow for as many disiplines to come into play as designing and programming a game. Just don't try for the ultimate game - some ideas:
1) Virus Hunter - Guide the nano-ship through the human body, hunting down killer viruses.
2) Dungeon Qwest - Simple 3D style dungeon, done up as line drawings (check out Dungeons of Daggorath for an example)
3) Do an Ultima clone (2d top down tile game).
The list could go on, but these three would be fun to do, and could be completed, to a good extent, by most learning students in a semester (maybe it would be a good reason to come back, and take the class again - just to finish that %$^$!? game!)...
Reason is the Path to God - Anon
At first glance I figured that introducing the kids to robotics would be prohibitively expensive. Who would pay for the materials? The school? In my hometown: "Not bloody likely." However, those Lego Mindstorms are look pretty interesting and aren't that expensive (IMO). Plus, somebody already cracked them so why not delve into how they were made and how they work (after learning how to control them)?
/. readers could expound on whether using Flash in the HSs would be a good idea?
BTW, do HS kids even think Legos (even Mindstorms) are cool? Or would they ever be caught dead with them?
Either way, when I was in HS, I would've killed for something like this.
As for web design, I would have loved to have learned about how to use Macromedia's Flash technology (were it around when I was in HS). Some of the stuff that's out there now is amazing and I know some of it is created by HS kids. Perhaps some of our astute
in conjunction with Los Alamos National Labs called the High School SuperComputer challenge.
Heh...they challenge the students to find the missing hard drives....
Heh. I remember the SCC... man, lots of bad memories. Los Alamos kicked me off their computers for using IRC and visiting #hack. At least I think that's the reason, they never talked to ME about it. My teachers, and the principle, practically made a federal case about it for the rest of my high school years. On the other hand, it was my first exposure to UNIX and the Internet. I was in the 2nd and 3rd annual SCC's. My GF at the time won that year (met her through SCC), but alas she's dead now (suicide)...
Someone mentioned quake mods, which are written in QuakeC. This is an excellent idea. Games Games Games make the world go round.
The question is, Quake 1 or Quake 3?
Quake 1 engine source code is released and free, making it an attractive program to mess with. Gameplay code is also available and since its in QuakeC it's close to C so that they can play with the gameplay pretty easily. Quake 1 is a relatively old game and will run on most hardware (since schoolsght not have the latest and greatest), and has ports to every OS imagineable.
Quake 3 doesn't have the game engine code released, but it DOES have all the gameplay code released. The gameplay code is in straight C this time (not quakeC) which is plus. If you compile up their code into a mod, it will run on Macs, PCs and Linux, which is a nice plus as well. The downside is that students would have to buy a copy for homework, and the school would have to buy copies for the labs (to be legal).
I would vote for Quake 3 since it is the hot ticket at the moment and the most fun to play, but Quake 1 would also be a good choice because the engine is exposed and ready to be tweaked and it can be purchased very cheaply.
-David
There. Now go play some cool javascript games!
It was always my dream to get the whole class to make a huge Beowulf cluster out of the individual computers, it could eb a fun try
The box said windows 95 or better....so do i buy Linux or mac? damn tough choice.....
I know in my case I could never have learned any programming at all if I didn't have some actual projects put in front of me as assignments.
True, however there is quite a difference between "exercise" programs and building applications that could actually benefit someone.
Even having the whole class work on different parts of a program (Like if they were developing Q3 for example: the advanced kids write the engine, some write the AI, some create the graphics, some do the sounds, and rotate as well as communicate with eachother to build a solid understanding of each part of the process).
The language is also a very big part. At least for me, I didn't want to waste my time writing apps in Visual Basic 4 - Perl seemed to grab my interest. While it's understandable that there it would be impossible for a teacher to understand every programming language fluently, a student who wishes to study up on a language himself or perhaps become an apprentince with some perl hackers should be offered.
The biggest part of programming I hated was I felt like I was seriously wasting my time. The teacher didn't know VB, we all had to sit with our faces in a book and go chapter by chapter, doing the program exercises (all he had to do was correct the tests). The programs had no point to them whatsoever - no one would ever had any use for them. My instant-messenging program, however, became incredibly useful and quite popular among the guys in the CS class to communicate back and forth when we weren't allowed to talk.
- Slash
I can remember in High School I became incredibly bored with Computer Science, being I already had advanced knowledge of computers, and took it just to get an "easy grade".
One thing that I had trouble with was keeping busy - the Teacher I had was bright, but not very skillful in computers. He knew I could run the class and that scared him.
I would suggest is asking your students *what* they want to learn - some might want to learn networking, some might want to program, others repair computers. Give them research time to browse the HOWTOs and other more in-depth information.
I got into alot of trouble in my CS class and ended up dropping out because I was at the point of losing my sanity.
If the subject is programming, don't tell them what kind of program to write - just tell them to make one! This is what motivated me. My friend and I spent all of our time writing a instant-messenger over IPX (it was a Novell LAN) while everyone else was writing "exercise programs". We didn't get a grade for it, even though our program was much more advanced than the others'.
Secondly, I would put your IT department to a test. Put $50 on the table and tell them the first one to hack the school's server will get it. This is not only beneficial to your security, it will keep the kids motivated. Make them share how they did it with the class and make a "lesson" out of it. Also, keep the kids busy by having them do computer work in the school. In my school most teachers would have a downtime of over a week before their terminal was fixed. It's free help for the school, and very educational for the student(s). Pair up the smarter kids with some of the not-so-smart-but-able-to-learn kids.
Have a "LAN party" day when everyone who has a computer brings it in and setup a game of "Worms Armageddon" (in this "post-columbine world" as JonKatz would say) Doom or Quake would not be acceptable if you are worried about your job. Have them setup the network and get all the clients configured and have them go at it.
Hope these help... I wish I had these to do in High School...
- Slash
Obviously text processing of a 33MB data stream is pretty intensive. A simple project might just take a subset of the data. A more complex programming exercise might be to make it a beowulf-aware application.
SuperID
Everyone else is giving stuff, that while entertaining, is way out of scope for most high school classes. These guys aren't coders, much less hackers. They've got five hours a week not counting homework time. I say send 'em to play corewars and have class tournaments. Teaches about memory, low level programming concepts, encourages truly creative thought, and brings out the competitive nature. See: htt p://www.ecst.csuchico.edu/~pizza/koth/</ a> for all the info and software you'll need.
at our high school, we had AP (for a while...till we switched to IB), but no computer science. the most we had was a few graphics and web design classes, a spreadsheet class and a basic programming class (taught on mac LC2's) the most intresting project i ever did with my computer (and this was on my own) was to interface to a pic microcontroller thru the parallel port to make some stepper motors move a little car around. it was fun and intresting...i got to build the circuits, write the code for the PIC, and best of all, write code on the computer to move the car around. -james
I think games are a great idea. Depending on the level of interest and skill of the student, 3D games may not be the best choice.
Why not have the whole class devide into groups where each group builds an entire games from the ground up. The game doesn't have to be as hard a 3D, but it does have to be a game that they feel they know intimately. You can't build a game of Bridge if you do not know the rules of Bridge.
If they're are pretty well rehearsed in the world of programming, have them write a card game even one as semmingly simple as Go Fish, or Old Maid. That way they are pretty much sure to know all of the intricacies of the game, ubt it is complex enough to require various coding skills.
I suggested working in groups because if your school year is any where near as short as mine was in high school they won't be able to complete any interesting project in time by themselves. Plus all of the additional reasons for wanting students to work in groups.
Devil Ducky
Devil Ducky
MY peers would get out of jury duty.
Hopefully, somebody will see this even though it is rather late to get mod'ed up.
When I was in computer science, my friend and I were rather experienced in programming so we were able to design our own project. After looking through books and other projects we decided to go for a simple poker game with AI. I know that the project was simple, but it taught us alot about programming teams and modulizing code. Learning to work with other programmers on projects, is a skill that a book can't teach. We learned to divide projects and work with strengths of certain programmers. The concept is applied all over, but for some reasons school systems seem to neglect the fact that people always work with other people on projects.
Hopefully I have been of some help, and realize that there are so many skills that books can't teach, so focus in on those and let the students learn how they want to learn.
Please forgive the lack of structure...writing is not one of my strong points.
See if any of them are interested in neural networks. It's not a beginning project, but some students are likely to have some experience with programming and AP math should be enough to get started. Here's some reasons:
Just some ideas. I don't think it's beyond the scope of some bright high school students.
..don't panic
In most of the languages I've used, network IO is abstracted almost as well as file IO. However, you might still want to give them some canned code to get them started.
A simple search engine is a cool project, but requires some datastructures that you might not have time to expose them to. Another project tht might be cool is an http client that goes out and checks to see if a page has been updated since the last time you checked, but that might be too simple. A bare bones http server might be good. =)
In any event, the nice thing about web projects is that students feel that they're doing something that's relevant.
However, the web is a crazy, and often frustrating programming environment. You might find yourself saying: "don't worry about cases like that" frequently. =)
Hmm. Create a weblog? If database stuff is too complicated you can avoid using a database and just write to flat files on the file system or something. Should be rather interesting and able to be broken up into parts, to teach encapsulation.
I.e., one group of 3 does the file storage/database structure, another does the backend scripting/programming for manipulating user accounts and preferences, and a third group does the web page scripting (jsp, perl), to take use the library provided by the second group to actually serve requests and fill in content.
So you have three layers of abstraction: content layer, logic layer, and finally data layer. Each group has to depend on the good design and encapsulation of the other groups' stuff.
It's 10 PM. Do you know if you're un-American?
I think the most important thing is that it has to be fun. People learn the best when they don't
realize they are learning. You need something that is very involving.
My personal opinion is that you should try something which will give them some insight into
how things work at a low level, along the lines of
- programmable controllers, (basic stamp etc...)
- Fred Martin's (et al) Handyboard
http://el.www.media.mit.edu/projects/handy-board/
- Lego mindstorms
(and use Not Quite C)
There's already alot of teachers using this approach, and you can find alot of material online
which you can use.
These items may be a bit expensive, but if youhave project groups of 4 or so, then the cost of
things like the Basic Stamp isn't too high.
You can find info on all most of these thing at www.robotbooks.com. From there you can find
a massive number of useful links, including clubs and other teachers who are already doing this.
"The best part? I became an ordained minister while not wearing pants." -- CleverNickName
only 2 years ago, my high school had no computer science program and i doubt they do now. We were reduced to learning how to use word processors on an Apple II/gs. Now that I am a college student, working towards a computer science degree, i have one bit of input for all computer science professors and teachers.
I work for a software company and in any software company, you dont work alone! you dont memorize all the functions, and you certainly dont have closed book tests! Have your class work together on a project that everyone can have a part in. Make a game having each student do a different part. Have a graphics group, a music group, a engine group. Or even with any other program, use different groups to do different parts, and have your class decide what they want to do, because i'll tell you, i'm sick as hell of programming things that have no use. Computer science and art can go hand in hand so let your students be creative. I dream of a program that is like this...
-thinkpol
This may not be practical for high school classes, but I just took a class at IU Bloomington called "Computers in Education". It was basically just a class for education majors to familiarize themselves with Macs, but the coolest thing we did as part of our grade was to volunteer our help. We could choose to either serve as a support tech for a local retirement home, or to help some (very needy and poor) grade schoolers set up a LAN at a local school. My friend and I were the only ones to choose to help at the school, so we basically ended up building them a new server (a linux box! yay!), and helping the kids get their LAN up and running for games, file sharing, etc. It seemed like a drag at first, but it ended up being one of the most rewarding things I've done in a long time. Yes, computer science is by nature a technical area of study, but to add the human element and actually gain experience working with people and working on real implementations is priceless. Again, I don't know how well this activity would translate to high schoolers (maturity, experience, time constraints, etc.), but it might be worth a try. There's more to computers than coding for 36 hours straight -- the kids might find it fun and worthwhile to actually help some people out by sharing their skills.
www.poak.net
My teacher had plans to have our class work on a program as a team. It never got past the planning stage, which was limited to exactly what I just told you, so I can't really give you details. But I can give you my ideas.
First you need to come up with an idea for the program. It should be fun or interesting (or both) so you'll keep their attention. You should probably write main() yourself, but:
Have the students write -- individually or in small groups -- the functions that actually make the program work. Each team/individual should only be given information necessary to writing their part of the program, probably limited to what inputs they need to take, and outputs they need to give. You'll probably need to write test programs for each of these functions, too.
The idea is to have everyone work on an independant part of the program, and then watch and see how their part helps out all the rest, even though they weren't involved in those parts, and probably don't even know what they're doing.
It's a great way to show how teamwork in programming can pay off.
--
--
"I personal[ly] think Unix is "superior" because on LSD it tastes like Blue." -- jbarnett
Heh heh...
http://www.claymath.org/prize_pr oblems/p_vs_np.htm
"I'm an old-fashioned type of guy. I worship the Sun and Moon as gods. And fear them."
a friend of mine set up a box that pupils could try and hack into. might be an idea, especially if you can keep it in a controlled environment.
//rdj
No one can understand the truth until he drinks of coffee's frothy goodness.
--Sheikh Abd-Al-Kadir, 1587
I graduated from high school two years ago, and am currently persuing a degree in Computer Engineering. I was by far an exception in my high school in terms of computer knowlege.
The "computer lab" in my high school (around 500 students) consisted of 18 IBM XTs on which a few students typed papers during study hall. It was used for one class...a quarter of Basica programming for accounting class. This lab was just replaced THIS LAST SCHOOLYEAR by 25 Pentium 200s, and they are hoping to add a comptuer class or two to the curriculum.
Now, I find it wonderful that some schools have better computer curriculums. I have to vent a bit of anger that all of our US schools don't have even basic coursework or equipment. If students 'get bored' with the AP CS coursework, send them off for post-secondary at nearby university somewhere. The government will pay for that. I wish they'd pool more money into high schools earmarked for technology and training, and bring them all up to par...not make some elitist while others scrape by. (It is different for private schools, understandably)
I think most small schools are in trouble in this technological age. My small town is still in the grips of the 'athletics is everything' bug as well. I don't have a solution. This is merely my view on the matter.
A preposition is a terrible thing to end a sentence with.
Have the students build and upgrade the computers for the school rather than buying new ones.. It'll save you a buddle in funds.
--Bahamlabs
Haha! Nice. Next time get him to use the easteregg Doom clone as a process manager.
Wah!
Lord knows we need another one of those...
Wah!
More specifically, that rock/paper/scissors contest is great, and you can even rewrite the code for the competition part in perl or python to make things easier for the childrens.
For a more didactic take, instead of R/P/S, you could have them write an MPAA/The Law/Johansen program, which is the same thing, but with an engaging topical lesson.
god is just pretend.
I just loved that "software project" back in high school. And don't forget strafing!
heres an idea, have the school be the last level of the game, and everything before that is like a role playing game, getting all the weapons, hiding it from people, getting drunk a lot, etc...
I took AP Comp Sci last year from one the best teacher ever! He's also been around AP CompSci forever (since 1985). He is an AP Grader too. So we definitly got one of the best AP CompSci teachers there as.
As far as AP curriculum, it's all in C++. Nothing real crazy is involved. First year students need to know basic class structure, arrays, matrices, but nothing even touch pointers or data structures. We're talking VERY basic. The AP Board even makes an easy to us apstring class so that students don't have to deal with pointers in strings either. The focus is on the algorithms.
As for the second year students they get a little bit more. You learn pointers, basic data structures (linked lists, doubly-linked lists, binary trees) and learn new sorting algorithms. You still don't touch any powerful features of C++ such as the STL, class inheritance, polymorphism, etc.
To keep myself busy in that class and not become bored I used to play with the graphics package that we had. It was severely limited but I was still able to create a primitive (VERY primitive) 3d engine that could draw cubes and tetrahedrens and rotate them. Another fun activity that we did was draw fractals with recursion. You can get some unusual results especially add in color.
Well that's what my experience with AP Comp Sci is.
Have them help out on GNU projects or other open source projects. Nothing feels better than to go and say, "Hey, see this feature here , I did that." It shows that one person can make a difference and will improve the student's confidence.
Here's one project I'd give if I were a high school teacher. A lesson in the real world:
Have a simple database project that runs in two phases. Phase I is basic functionality. The project would be to get the thing working. Grade A-F.
Next, take all the B,C and D designs. Assign the D designs to kids who got A's and B's the first time around, C designs to C students, and B designs to the rest of the students. Add some new requirements, like reports that need to be run off of the database, as Phase II.
Students are then graded on how well their program meets both the Phase I and Phase II requirements.
Sadistic? Perhaps. But that would be great training for how programming works in the real world.
The cake is a pie
Let them do a webserver project.
- Install linux
- Install Apache/php/mysql
- Learn PHP/SQL
- Let them think of a cool concept for a database driven website
- Let them build the site and host it on their machine.
---
As an assignment in my computer class, groups of two to three were told to pick a specific market that uses computers, and to design (top to bottom, case and all) a machine tailored to that market. the final was to make a sales pitch to the teacher which included blueprints and specs presentation.
~~~ They call me Little John, but don't let the name fool you...in real life I'm very big.
To see someone caring about this.
/. might be to poll your students, then take the idea that would be most challenging and using that.
Being a sophmore in college, I can remember my APCS class very well. And how utterly bored I was learning just about nothing.
As a student I'd be very interested in developing something I could actually use outside of class. A better idea than asking
However if you dont feel thats the best idea, heres yet another suggestion, its something we did in intro cs at high school (and was more complicated than anything I saw in the AP class). Make a simple cipher\decipher, and build it up more and more depending on wether or not the students are actually interested or not, if not you've taught them something new and you move on. If they are you can get into sooo much stuff!
Something along the lines of putting together a little "Sim Lan" or "Sim Server" and teaching the kids the basics of system security while also giving them a chance to find potential exploits, not necissarly teaching them to crack systems, but to know how to better protect servers as well as their own machines.
My science fair project was a stochastic simulation of the lunchline to determine whether or not a new system (or an additional lunch period) was necessary, given the projected school population increase.
My results proved to be correct, but they were ignored, and I got a B on the project (my physics teacher had no idea what I was doing, and she was the one grading me). I still had a lot of fun, though.
Would you shut up already?
I always though socket programming was fun. Whether it is a tic-tac-toe game, or a chat server/client I enjoy sockets. Ths also opens the door for articifical intelligence and a whole slew of other topics.
"The importance of using technology in the right way has never been more clear."
program 3d games!!! woo hoo!!
This past year I was in a CS class in which we didn't concentrate on the AP exam (we have a separate AP class for that, which I took the year before). For about half of the semester we undertook a simple (relatively) project that consisted of making the game "Battleship" for the computer, making it Multiplayer, and putting it on the Internet for people to play. We only had 7 people in the class, and of those 7 only 3 or so were really interested in the project. The difficulty in the project centered around the fact that 6 of the 7 people were learning java, the language we were coding it in, at the same time. At the end of the project, which was aborted by the teacher since we were wasting too much time, we had a semi-functional server and a workable UI design on top of a fully functional client. This was also the first year the class was taught, so everyone was sort of testing the waters. What stopped us the most (outside of apathy on the part of some students) was that the specifications were changing quite frequently. Primarily because the people programming the server couldn't figure out how to do something, and our instructor would help them, but didn't (understandably) want to do all the coding for them. This lead to the requirements becoming constantly less and less complex.
To sum my experience up; whatever project you decide to do there are a few things that _must_ be done ahead of time. A working knowledge of the language the project is being coded in, a formal specification of the project that is rather difficult to change (unless absolutely necessary) and interest in the project are all very important to the success of the project.
---- Yay! I have a sig!
No that would be id software and metal music my friend. Not this one poster...
you should present a list of cool things and descibe whats involved and what they are used for. personally (i'll be a sophmore and be taking ap comp sci at jordan in north carolina) i like doing games and encryption (games in macos, and crypto in linux) but someone else may like doing tcp/ip stuff. maybe you should have each student do whatever they want for some project, and let them collaborate as they might in the real world.
--- Hey, Jesus is coming! Everyone look busy
The problem with High School, and even now college is that they assume those who are taking the course don't know a thing about computers. Most of the time this is nt the case at all. Especially in high school.
(College tends to be a place of re-learning for those who come into different trades, I know, but that does not mean the rest of us have to suffer.)
I just pasted my first year of Computer Systems Technology, before that I took the first year of Computer Science. It was boring as hell. It was like being back in Grade 11 again, because everyone else had to catch up. They should really design 2 different programs.
Keeping that in mind. One of the things we barely touched on was actually how video is displayed, and how to manipulate it from the most basic levels.
And what about the hardware aspect? (Using Parallel and Serial ports). Why not create a computer controlled robotic arm from scratch? Or some other device.
Show them how computers recognize hardware from the basic levels. Get some bread boards and dip switches, make some devices the computers can recognize that they exist as a hardware component (they don't actally have to do anything however).
I think more teachers should ask the students what they would like to accomplish from the course. My electronics teacher did that this year, but he had to give everyone the same, fair chance. Originally the last project was to build a device that recognized keyboard outputs and display them on a breadboard on a few led bars or numeric display. But instead the last project was a 10 base binary counter, because most people couldn't get there timers to function correctly or kept blowing the components.
I am not saying we should leave people in the dust if they don't know as much, but the course should and can be designed around the individual student, if you plan it right.
"Imagination is the only weapon in the war against reality." -Jules de Gautier
The thing I hated most about my first CS class was trying to figure out all those annoying and useless parts before I could get on to the fun programming. I understand that the annoying problems must be solved in order to be a competent programmer. However, I see an AP class as a time to get the new group hooked, not teach them to churn out flawless code the first time.
. html) might be usefull to this end.
To that end, I would recommend the approach that the first 2 or 3 classes at UC Berkeley take. Have not one, but several projects, but write the hard parts for them. This lets you take on much more complex and interesting projects, while still controlling the difficulty.
Let me give you a few examples.
When we were being taught search algorithms, the instructors wrote a graphical engine with little bars. We wrote the search algorithms themselves (several different ones, bubble, insertion, selection, quick, merge, etc.) and plugged them into this graphical engine. This let us watch the sorting actually happen, which both lent interest and increased understanding.
The third project in CS61a (http://www-inst.eecs.berkeley.edu/~cs61a) was an adventure game. The project is to write a world in which you walk around, pick up stuff, see different people, and so on. A good portion of the code is already written for you so you can concentrate on the more creative sections of programming.
This sort of setup allows the students access to code written by a skilled coder (you, the teacher). It also allows for the more ambitious students to take the project to any level they want (my partner and I implimented a time-based turn system instead of leaving the world static), while still giving the less advanced students a feeling of accomplishment at completing a rather complex program.
Finally, echoing a previous post, Scheme is an incredible language in which to learn programming concepts. It removes you from memory managment, and a couple of other nasties, so as to let you focus on the higher level of abstraction and deal with the concepts of program design more easily. Unfortunately, I realize that the students will be taking the AP exam at the end of the year, and not teaching them C++ or whatever language it is in will be a severe handicap. You can still create an environment that focuses on concept and design by writing an API of some sort that the students can use as an interface. (For example, several people I know and code with have written their own versions of malloc and free that never fail, exiting instead of returning bad values.) The glib(http://developer.gnome.org/doc/GGAD/cha-glib
Now that I have given positive suggestions, a few negative. Every "Teach Yourself C" book I ran across tried to get me to write a CD database library thing. Ok, I know, it's the easiest way to introduce you to structs and so on, but GOD, how I hated those things. They're boring as all hell! There are a bunch of posts here that say Do stuff with databases, or hack the kernel, or simulate a store. Those are BORING!!! Sure, they convey usefull concepts, but there are better ways of doing it. The casino games post souds cool to me, when I was given the task of writing blackjack, the professor provided the deck shuffling code and definition so that we could concentrate on writing the strategy engine. (incidentally, we had to write several different strategys, and then had a playoff. Lots of fun!) But please, for the students sake, stay away from organizers!
Best of luck!
-ben
My favorite beginner's CS assignment was from an intro class in college (might work for high school students too, I don't know what their ability level is). It was a simple program that read in /usr/dict/words and then was supposed to enter a loop in which it would take two 5-letter words from input and produce as output the smallest list of words that were each one letter apart from each other that went from the first input word to the second input word. So, for example:
Input
Word 1: slash
Word 2: troll
Output
slash
flash
flask
flank
blank
bland
blend
bleed
breed
bread
tread
triad
trial
trill
troll
One of the requirements was that it had to be somewhat efficient, so we had to compute the one-letter permutations of a word at most once and preferably not at all (in the case that program never needs to know).
It was a terribly fun project: it was possible for me even when I didn't have much programming experience but it made me stretch my brain a bit, and it was a whole lot of fun to play with.
--
-jacob
-jacob
Plus, can you really call yourself a programmer if you've never written a version of it?
...where the class determines the algorithm(s) behind a bit of code.
I.E., instead of saying "This is [an algorithm], and this is how it works," say "This is code that implements [an algorithm], tell me how it works."
A next step along this line would be to take the same code example and task the class with "improving" the code's implementation of the algorithm, or implementing the algorithm in a larger project (which would also require implementation changes).
You could give them a lesson in "How the old hackers used to do it". Show them how to call crypt() and then let them loose on the school's passwd file.
From the: Betcha-can't-do-that-with-only-a-stick-of-gum dept.
In the course of my education there have been two overriding things that have helped me the best in learning. While these do not always point to the best way to teach, they are certainly something to consider, and many projects can stem from them.
Just my $0.02 as usual. Some good considerations.
Blog,Twitter
I'm on my high school swim team, and we use the local junior college's swimming pool to practice and do home meets. We're in Ft. Pierce so I bet we compete with your wife's team (Don't say it's MCC please...). Anyway, we have a set of touchpads that we use for important meets where the times matter for more than just which team wins (qualifying times and regional meets). These are a pain in the neck to install and clean afterward, but there are software programs which will print the statictics (accuerate to milliseconds) after each event. Mabye your wife's school needs to invest in a similar system instead of re-inventing one. If you need mroe info, email.
From personal experience, the three pieces of software that I have to kick women off to use the computer are:
Microsoft Greetings 99 (creates HallMark-quality cards)
PuzzleMaster (jigsaw puzzles)
Diablo II
IMHO, women generally like software that they can express themselves in a creative, non-violent fashion. My mother and aunt will spend hours, nonstop, making b-day cards on the computer; they just can't get enough of it. And puzzles...don't even get me started...
On the other hand, my girlfriend wants me to teach her Diablo II, and my best friend's wife and him are constantly wrestling to play Diablo II (only one computer; it's horrible. She loved Diablo, BTW). While both games are pretty violent, there are very simple and fast to learn, with an excellent rewards-based system ("leveling up"). Of course, the fact that you can "dress up" your character *may* have something to do with it...
"Don't mind me cutting myself on Occam's Razor"
in 1981 I had a computer instructor (ok, a math teacher) who had us write a program to input a word phrase and then check to see if the input was a palindrome.
That should keep them busy for a while...at least for three minutes or so.
---
Interested in the Colorado Lottery?
Interested in the Colorado Lottery or Powerball games?
check out http://colotto.com
Additionally, what is the make up of your class demographics? It is often said (sorry I can't remember from what source) that CS classes, or programming classes, have a knack for discouraging women when it becomes hardcore gaming.
I would therefore agree with the ideas of having a group project, but have it bounded by it *not* being allowed to be a game. Additionally, it would depend on what they're expected to learn from the AP curriculum. All of these aspects would be necessary.
(remove NOSPAM to send email)
yours,
yours,
kbs
When I was in highschool (Grade 11 computer science) we did this interesting project where we create a hypo-machine. We would develop a quasi-assembly language interpreter with some simple instructions. Then we wrote some programs in this new language to show that it worked. Very simple stuff like adding and multiplying numbers and output to the screen.
It was great in teaching me how memory addresses and instructions work in a CPU. I think it's learning fundamental things like this that really helps the students understand want happens when they run a program.
At an early stage, you want to build the fundamentals of a language, and its understanding, but not get bogged down in the specifics of an already-existing one.
My suggestion:
Give them a program to build, with extremely detailed functionality. By this, I mean things like "Save As" options, and "Print" options. Basically describe a program that everyone is used to, but doesn't know the underpinnings of. A web browser for example.
After that, have them code this program in a pseudo-language...one that they come up with off the top of their head. They need to document all of their functions, and the logic of how the language works.
The students will learn what it takes to think out a design prior to actually coding it, and they will likely also come across functionality on their own, that exists in "real" programming languages already...
Q: What do you think about American Culture?
A: I think it's a good idea.
Q: What do you think about American Culture?
A: I think it's a good idea.
(adapted from Gandhi)
I tried to focus on OO programming rather than straight up proceedural, which is what the AP coursebook for some reason recommends. I mean, the language is C++, but they don't deal explicitly with OO. Hello?
But, to be more practical and (hopefully) more interesting, I kind of based the OO lectures around a central project, which was designing the backend to an online CD store. Of course, it was very simplified; we used static arrays for inventory, etc etc. But even then we got into sorting and other AP-approved topics :)
The thing is, I don't think they were THAT interested. In retrospect, building a store isn't all that engaging, unless you stand to make some serious profits from it. Anyway, what I really wish I'd done is used a platform where they could see their stuff run on-line. I think that's key: all useful apps are network apps now, pretty much, and just typing into codewarrior and then running a console session is not going to cut it much longer.
I'd like to see a kind of invisible CGI gateway, so that students could code their own apps and test/run/enter data over the internet... this could tie in nicely with a course unit on web design, which is also an important thing for the up n coming CS student to know. Of course you don't have to get too deep into it; they're still just high schoolers ;)
http://www.collegeboard.com/ap/com puter-science/
And I don't necessarily mean assigning Design Patterns and making them learn the things one by one :) But there is a movement out there towards making "Elementary Patterns," or "patterns at a level appropriate for students just learning to design and write programs." That quote is from Eugene Wallingford's Elementary Patterns Homepage, which you should check out.
Basically, elementary patterns are just like full fledged design patterns, but a lot simpler. Instead of a pattern for writing a text editor, for instance, you have one for writing a bounded loop. Or other fundamental programming constructs, such as case statements. Then, to make more complicated algorithms, like searches, you can combine a bunch of simpler patterns to get, for example, a Selection Sort pattern.
I don't know what this would do in terms of making the class more "fun," but it could make it a whole lot easier in terms of understanding one building block at a time, and then reusing those blocks to code some kick-ass apps.
First off, have half of the class use KDE and the other half use GNOME. We need another warring set of tribes. Let's set them off as early as is possible. While they're at it, have half use vi and half emacs, half use BSD and half use Linux, half use one indent style and half use another...
But seriously, I think a good, mind-stretching programming excercise is artficial life. Genetic algorithms are really simple to program and can do some amazingly complex things. Have a prisoner's dilemma robot contest. Here is a really fantastic book on the subject.
Show them some of the NP-complete problem's like the traveling salesman and see if you've got any geniuses who can make you famous by solving them in linear time (or better)!
"The best laid plans of mice and men gang oft agley..." - ROBERT BURNS
In high school I was never taught anything about network anything (sockets, mailing protocols, etc.). This may be a bit beyond them (or not, since it's AP . . .), but it would probably be good to ask them to write a text-based chat program, maybe give them some pointers to code specifics when necessary, and let them have fun. Essentially, all it would need to do is open a port and listen for another computer to open the same port, then allow the students to chat (text-formatted page?) sort of like the "talk" program in Unix . . .
Let S_n = {nst+us+vt : s,t in Z \ {0}, u,v in {-1,1}}. For all n in Z where |n| > 2, Z \ S_n is infinite... right?
Why not use their comp sci skills to solve real problems from other classes. It would be great to solve homework with a computer program they wrote. First real easy would be math progames, (or one big one, ala Maple). But also see what ideas they might coime up with for other classes as well.
Add electronic poker to this list ... where it's just a five card draw system with winnings coming from defined odds (you can get these from any poker book). It's a solo game, but still fun.
I made all of the single player casino games in grade 12 in Pascal of all things. Very good experience. Blackjack, poker and craps.
Sometimes the old arcade favourites are more complicated than one thinks. Sure, if a student reads a step-by-step of how the things are made it's easy, but what would be the point?
rLowe
PS. TETRIS is the all-time best to program. It's easy and you can't stop beta-testing it. =)
----- rL
This will take a fair amount of reading up on, as I don't know all the details off hand, but;
:).
Lego makes a product called Mindstorm. It consists of a number of sensors (light sensors, touch sensors, etc...), motors, and other various useful robotic parts that fit together with normal lego blocks. You plug this stuff up to a computer, and write software to control the lego. The software that comes with the kits is fairly simple, and only lets you build some simple behaviour, but someone wrote a special lego operating system called LegOS, and you can write full blown software for it. People have made little minature photocopiers and other interesting projects this way. I believe there are C and Java compilers available, but I'm a little fuzzy on the exact details (I'm saving up for a lego mindstorm kit myself, otherwise I'd know these things
If you're interested in this stuff, I'm sure there's a number of good web resources out there. As well, O'Reilly has an excelent book (I believe it's called "The Lego Mindstorm Unofficial Handbook") which covers a wide range of interesting things you can make Lego's product do. (There was even a slashdot review of the book, check out http://slashdot.org/books/99/11/24/0928207.shtml and http://slashdot.org/books/99/12/23/1419242.shtml, and do a search for "Mindstorm" on slashdot, you'll find some interesting stuff).
I'd recommend doing some rudimentary 3D graphics programming. They'd have to learn about Loops, sorting, arrays, and all the 3D Matrix math. Some good OO principles, structured programming principles, etc.
Depending on how long the course is, you could make each project build on the previous ones until they've ended up building a 1st person simulation. Be even better if you made them build it in modules and then have to trade the modules with another person so they each get exposed to working with code they didn't write, and how to conform to specifications.
Other possibilities include writing their own version of software based around specs. Like for instance a command line based MP3 player, or maybe a simple news reader.
A lot also depends on the language the class is taught in and what OS is used. Some projects lend themselves more to one environment than another.
Database integration is important, as is UI development. Students should get at least a basic understanding in each.
Honestly, the class where I learned the most about computing was probably in my assembly language course in college because you started to understand exactly HOW the computer worked and how to make it do exactly what you wanted and nothing more...
Anyhow, hope this helps.
-----------------------
Nicotine free Amish .sig.
I hope you use these suggestion
-------------
HAL 7000, fewer features than the HAL 9000, but just as homicidal!
People that age, not that I'm really that far from that age still, generally feel a need to define themselves. Such expression can take many forms, from being "good" at attending and participating in parties, dressing up for that sort of thing, to learning to play an instrument, writing material, performing on stage, creating artwork, debating and reasoning well; etc.
My highschool teacher had a very strong emphasis on allowing people to spend most of the time in various classes working on a project of their own creation using certain tools, and demonstrating certain understood concepts. Most of these projects ended up being hypercard stacks, logo or apple-soft basic programs, but they were still fun, expressive, and taught people about programming concepts.
If your students have had a chance to familiarize themselves with working in a Unix environment, then asking them to program in it would probably be appropriate to avoid frustrations involving rebooting, and restoring code.
Personally I would suggest you allow them to design simple games, something with points and scoring. I recall people made programs that played card games, did brick-out, followed some sort of sci-fi plot of chasing aliens using game-paddles and a simple sprite collision thing. At the end of the class, the games could be made available for a class day or two to all the students to play each others games. This puts a friendly amount of pressure to impress and polish while it encourages students to lean over to their neighbor and ask, "If you were using my program, would this interface make sense, or would this one?" We actually did something like this in most of our programming classes.
Breaking out some of the older tech, like paddles and apple-][s with simple, documented, peek/poke interfaces to most things really helped to make it simpler to develop something fun without frustration. While these days it may take a pretty geeky kid to be proud of a program that doesn't have menus or dialogs and doesn't multi-task, they should still have something to point at and say, "I made that."
This brings me to my second point; have them work on this project individually. They won't ask too much about the policy because its just like writing an essay or painting some watercolor paper, it needs to express the creator. Working in groups throws up too many questions when people look back and think, how much of this cool thing can I take credit for? Did I really write much of it, was it my idea? Further problems arise with common high-school lazyness that allows team members to leave the work to one dedicated person.
Recently, if your students are up to a bit of threading or whatever, I've thought that a networking project might engage them more. Perhaps something of a chat program that can handle say 5 users at once in a peer to peer chat with a very simple, specific api to which all the students can write a different program. Perhaps even writing a central server for them and specifying how communication should be handled with it, to let them each write "my-nifty-client" would keep them happy.
Of course, while most of the class time should be dedicated to writing one program of their choice, there should be a few other assigned tasks. Some simple, small, comprehension of concept programs might be nice. Also a writen test is never too bad an idea, but don't take it too seriously there or some students won't care what they write because they'll feel they can't resurect their grade from the test score. Of course encouraging students to have programming time after school may help get most projects actually done, and will help add glitter and glam to the over zealous programmer's projects.
Basically, you want them to think little about common sorts, fifo stacks and such and concentrate more on some arithmetic and random number generating fun, with use of some interface, be it text or graphics. That is if you want them to remain interested in the class. Particularly, if they have a program in mind already, they may get bored as you explain a merge-sort, because it doesn't in anyway apply to their arena gladiator simple RPG.
-Daniel
this was our freshman level project in college - a giant group project, taking customer specs, writing fucntionals, technicals, then building, debugging, and turning in only an EXE.
we used C++ (or VC++ if we wanted) and tools like ErWin and iSQL.
this was for a 'group' grade, so the team was the only important part and we competed among groups.
this was one of the best projects that i was invloved in during school b/c it involved alot of time and alot of work, but the payoff was great.
the project involved a print shop and the need to have a daily printed schedule for employees to use for machine set up. the DB was to have a front end to input jobs and then a master screen to print out the days work. no crystal reports, etc. pure programming work only. print outs had to be able to be tailored to user need, ie sorted by day, by type, by materials needed, etc.
it was the prof's brother's real company and real job that had been done for his shop a couple of years earlier. the prof acted the part of his brother - we set up meetings, showed him milestones, WIP, etc. was alot of fun.
since these are AP highschool kids (my brother was one who just graduated in 2000) this is well within their reach.
/* Half alive and half dead too, work is for suckers and the sucker is you. - "Half-life" by Local H*/
Haven't seen this posted yet: The AWS WeatherBug looks like a nifty project for a high school science class to get involved in. I didn't research it deep enough to determine costs, or whether the students would have to build any interfaces to the system, or even if it's just a turnkey operation.
But, there are installations in schools across the country that are supplying real-time, or near real-time weather data through the internet to desktop clients.
TTYL,
Jim
Remember to take out the trash if you want to send email to me.
APL, the language, was the fastest introduction to computer science I ever experienced. IBM had a workbook of examples which challenged the student to write APL solutions to common problems. Without requiring any of the syntax sugar, rules or semantics, APL is a self teaching program.
Scheme, C, Java offer none of the advantages to getting your hands dirty that APL afforded right away.
Pick a simple board game, or make up a new simple game. Define a way to play, and then let the students play against one another.
The one thing that bored the hell out of me in my highschool programming class (C++) is that all we ever did was math related projects. Making up algorithems and more loops than you can shake a stick at. While these are very very important, it gets very very repetative and needs variety. Teach them how to use ports so they can make anything from 2 player network Battleship to and instant messaging client.
-- From my Best Friend (Written to me over ICQ): "i was gonna go to a party...but i had to reinstall windows"
I wouldn't know, because MY FUCKING TEACHER NEVER TAUGHT ME HOW!! Hell neither did the text book that we used either (I look the second day of class ;)) Anyway, it doesn't matter how long it takes to learn, because it can be used is so many entertaining fashions. Oh well.
-- From my Best Friend (Written to me over ICQ): "i was gonna go to a party...but i had to reinstall windows"
a beowulf of these? Ok seriously. If your high school is anything like mine was, you've got labs upon labs of decently sized pentium boxen that sit unused all day long. Why not set up a beowulf project? You can set up linux to be hidden on the machines when normal classes are going on but when CS class starts, boot them all into linux and explore the world of clustering/multiprocessing. When class is over, reboot and the normal OS/networking stuff comes up so other teachers/classes are unaffected by your project. If I had known about beowulf when I was in HS, I sure would've tried it!
I grep, therefore I am
There is no reasonable defense against an idiot with an agenda
:wq
Seriously, though, I'd offer several choices to get your protonerds going:
* A systems type project - something like process monitoring - who used what files/sockets/CPU time. Gets them right into the guts of an OS.
* A database app. Something like a list of IP addresses, open ports and OS that runs... Actually, scrub that I can see where it's headed. Or maybe an MP3 database. Whatever, but make it relevant to the students.
As a general guide you'd want to include file access, socket access, some basic DB work, memory allocation (pointers/allocation) and user interface.
Strong data typing is for those with weak minds.
Strong data typing is for those with weak minds.
Having taught lab sections before, I can tell you that nothing gets more interest from students than games. (Although network security comes in a close second... but that may be too abstract for most students.) The purpose of games are clear, the concepts are easy to grasp, there is some kind of visual feedback, and in the end the students have something that they can easily show off to others. The tough part is keeping the students from getting in over their heads. I'd suggest pushing for D&D type games since they don't require any kind of high performance graphics (although graphics can be part of it). You can also do Myst type things as well (puzzles).
By breaking the students up into teams, you can get them thinking in an OOP-like way by having each team member spec out their module and API, thus clearly defining how they work with other members of the team while drawing boundaries on whose doing what. (This also makes grading easier when accusations occur of some students not carrying their weight.) You can also encourage them to use other tools to help them make the game more interesting. e.g. sound editors for special effects, graphics editors for visuals, etc.
-Steve
I took AP Computer Science last year, (C++ was the language used) and I did my science fair project making a simple encryption program. This can be done using publically available algorithms like Blowfish. It is not too difficult, and has a practical purpose as well.
Sauer
Have them write a file sharing application similar to napster. It seems that might get their interest.
I might be a strange case, but I had lots of fun programming a "blind date" program in my first year of high school cs...
lots of files, records, UI design. Plus, it's kindof fun.
willis
there is no thing
what else could you want?
Dev tools and information are available online here, here and here.
The hardware's inexpensive (very cheap compared to PCs).
You can introduce abstract concepts like pointers and pipelining without boring them, because they can see where it's leading.
MIPS assembly language is quite sane, and there's an excellent text book which teaches architecture and assembly programming using MIPS.
Splitting up a large project like a game into managable chunks, then sitting down and writing one of them in C/assembler and seeing how your decisions affect the game as a whole will be a much better introduction to OO analysis and design than cramming Java down their throats.
The amount of performance you can get out of 2 Mb of RAM and a 33 MHz processor should make them think a bit about OS bloat.
Last but not least, when they finish their project they'll have something to play with.
(You'll need to fit the Playstations with mod chips if you want to test CDR copies of your game. For simpler/earlier testing a MIPS simulator is available here.)
Just give guidelines. If your class focuses on data structures require an array, hash table, linked list, stack, queue, red-black tree, etc. If your class is on discrete algorithms quick sort, radix sort, random number generator, etc.
If your class is on numerical techniques Romberg integration, Runge-Kutta integration, Monte Carlo integration, or whatever.
If your class is less focused, you could say they must use everything on a list, or you could let them choose one thing from each of several lists.
Also specify what they're allowed to use. For example, if they use STL, implementing a stack doesn't require understanding it. If they use a linear algebra package, finding eigenvalues of a triangular matrix is trivial. However, if they code these things themselves, it will require they understand how the algorithms work, but also require much more of their time. I guess whether you allow things like qsort is a matter of what the point of the class is and your (and their) taste(s).
It gives them experience in working with other programmers, lets them work on a project without implementing something from scratch, lets them do actual meaningful work and allows them to see other coding styles (both good and bad varieties).
It also inspires better work, I feel... since to get patches included they have to "be up to snuff".
Hehe, sounds like you teacher was very capable. I'm in daily touch with (sometimes painful) software projects that have problems so I felt I had to bring up some of the negatives. The negatives are also the entire reason why software engineering exists in the first place so it needed mentioning.
You're right though: CS wasn't just for programmers/geeks and the project makes more sense in that light. (Been too long since I was in HS =)
Fsck cluebie moderators. I'll say what I want, offtopic or not. And fsck having to qualify every bloody statement just
You know, part of doing such a project is to limit it in scope to be manageable in the time allotted. My college software engineering course did basically what you mention except we had teams of 5-6 who bid on projects then had to actually deliver (part of the grade). Part of our job was to figure out which project(s) we were best suited and also to define exactly what we were going to do for the project. Almost always this was less than the original grand plan. We had to estimate the resorces we had, the time allotted, the difficulty of the material, our knowledge level, add in a dose of reality (unforseen delays) and come up with a neat project (usually for elementary students).
Now maybe it's not such a big deal in HS but it seems like somebody needs to notice that you guys never got anything done. That means the scope of the project must be scaled down (a real world skill) and project management has to be more efficient. Being a CS course and not a management course it seems to me that it should have focussed more on programming than managment. This *especially* in light of the huge numbers of people applying to colleges when they are not even remotely capable programmers. (In fact most colleges expect you to be a competent programmer by the time you arrive on campus)
I'm not trying to knock the class but as you progress into college and the real world not completing projects means no passing grade or no food on your plate. Granted it is decent practice for *management* activities but you won't usually be doing that for several years. Seems like your teacher was simulating the 'below average' programming project year after year. I hope (s)he pointed out how much programmers underestimate the time it takes to do a project.
Fsck cluebie moderators. I'll say what I want, offtopic or not. And fsck having to qualify every bloody statement just
BTW: If you pick programming contest do *not* choose timed contests. While they are exciting (I participated in quite a few) they don't really _teach_ you anything useful. Pick a contest that has a meaningful goal in mind like creating the neatest shell features, or smallest byte code, or fastest ray-tracer, coolest fractal algorithms, etc. (ingenuity, size optimization, loop optimization, creativity) but don't do the kind of crud like "write a minimal number of coins algorithm given the amount in cents" where the quickest correct ansmwer wins.
Speed programming turns into typing contests when the programmers are good. They learn shortcuts in proramming which is gerenally a bad habit. They also learn not to plan and think things through, etc. I think you get the picture.
Fsck cluebie moderators. I'll say what I want, offtopic or not. And fsck having to qualify every bloody statement just
First off, our school had no AP CS class. A friend and I took the AB test without much (any?) real knowledge of what was to be on it (quick glimpses the day before). We took the test May, 2000.
The test is insanely easy. The only way to get a number of the multiple choice questions wrong is if you just brease through it without paying attention (easily done), the so-called ''case-study'' doesn't need to be read before hand (though you might want to, I guess).
The ''free-response'' isn't. They tell you exactly what they want you to do, step-by-step, and you just write code. It is basically a C++ test, with little to do with any ''science.''
Both my friend and I finished part II (free response) with well over 30 minutes remaining. The worst part of the test is not that it focuses more on C++ than the underlying concpets at times (I guess it does a decent job over all), but that uses a bastardized version of the STL. They AP library was supposedly written by a grad student who later stated that he really didn't do that good of a job, and that they were not completely compatible with the STL.
Anyway, to the initial question: group project desiging a game. Keeps 'em interested, helps them work in groups. I've never taken any course other than PascalII, where we basically had a study hall (all six of us). Eh.
--
Never trust anyone over 90000.
Maybe you could have them try to program some clones of classic games. Like one of the stories posted a little ways below pointed out, classic games are really fun, and they can't be to hard to use. I've seen a book that teaches prgramming( The Black Art of Java Game Programming) teach how to program a few classic games to people who had just started programming in the language.
Ewige Blumenkraft.
First its usually pretty interesting to kids playing video games. ,spheres, etc) and make simple camera movemens and settings. you could even go into texturing and lighting but that might be more agressive.
Second, with GLUT much of the hardwork is done for you(creating a window, double buffering.. etc)
Third its actually not hard to do some simple stuff(boxes
I would have LOVED to learn a little OpenGL in high school.
go here for examples and tutorials: Opengl.org
"I'm like an opening band for the sun" -Pearl Jam ; Yield ; Push Me , Pull Me
I like OpenGL for graphics and FLTK for GUI because they are cross-platform so that what they learn will be applicable no matter what system they program on.
-krish
Understanding is a lot like sex. It's got a practical purpose, but that's not why people do it normally.
----Frank Oppenheimer
Just to throw a few out (I know there are a lot more), one could model population growth, projectile motion, or even chaotic systems.
A model of a chaotic system can be fairly simple, while still getting across some of the main ideas, such as the high sensitivity of the outcome of the system to tiny changes in the initial conditions.
That would probably be a pretty neat thing for a high schooler to see, and I think it could be easy enough for them to do it mostly on their own.
Yeah, there are some methods that may lend themselves to this type of situation (relaxation, monte carlo, more?) that are both relatively simple to understand yet can yield very interesting results.
It a relatively simple problem is tackled using a simple numerical method, i think a HS sutdent (yes even an American one) could not only understand it, but could get quite a lot out of it.
Maybe some modeling of physical systems would be interesting?
There are many systems in biology and physics that are not too difficult to describe using a computer program.
Of course, I ended up programming a pretty complex graphing program using Apple Pascal and Turtlegraphics there, since the teacher pretty much gave us free rein for the last project of the year. What I came up with wasn't too bad at all and fit in 24 K of RAM.
Of course it really depends on the level of your students and the language they're using. You could do anything from "Do something simple with a GUI" to implementing STL classes to building trees out of XML (Parsing/Compiling is always fun) to writing simple internet servers to writing machine language emulators.
Some of your students will most likely be capable of all of the above while others may have trouble with more than the basics. A certain amount of freedom to choose what interests them is also in order. Ask them what they're interested in. You might be surprised.
I'm trying to teach myself to set people on fire with my mind... Is it hot in here?
This is just my personal experience... but stay away from teamwork, except, perhaps for the final bot war at the end of the project.
I've taken so many courses where they wanted the hands-on work done in teams. I absolutely hated group work. Inevitably, one or two people on the team understand and do the work because they don't want to get a bad grade. The others on the team NEVER learn it and sit back and do nothing.
Anyhow, make each student work on his/her own bot until you are done presenting new material. That way if someone is really having trouble, you can get in there and help them out. Yes there will always be a few inclined to copy the work of others but you'll know who's really learning the material if you have occasional tests or quizzes.
SEAL
I bring it up because that's part of what I do for a living in the "real world" ;)
:)
The instructor could create some sort of networked game arena, or use an existing one. Then let the students create bots to perform specific tasks, fight each other, or whatever.
You bring out a lot of creativity as they get their programs to react to various stimuli. With AI, I usually break their functionality down into a couple categories.
Senses: to detect what's going on around them.
Brain: to select a mood.
Movement: to handle going from A to B and avoiding obstacles
Tasks: each one is a specific goal / objective. Usually activated by the current mood.
Also, since this is an AP class, I wouldn't worry about the students ability -- they'll rise to the challenge. Go into detail, teaching them how to use trees and various algorithms. Pathfinding is a great way to learn different tree traversals and heuristics (A*, etc), without the boredom of your standard theory lecture.
You'll also be able to teach about stacks, queues, priority queues, and that sort of thing. But make sure you start really simple and teach the students a new element every couple days or week (day or 2 to teach, and a day or 2 to let them try implementing it). Then move on to the next algorithm or whatever.
Towards the end of the course, give them a couple weeks to put it all together and make a kickass bot. Then put their bots into a competitive arena and see how they fare
Best regards,
SEAL
A real cool project would be to teach them about computer security. Eg, explain how TCP/IP works (down to the point of SYN and ACKs), then show them common ways systems are compromised and how to secure them. Knowing about computer security is becoming more and more important, and at the same time, the subject will have just enough of a 'forbidden' aspect to it to really involve the students. Just be sure to carefully work the hacker ethic into it so they don't go out and abuse their new knowledge. Who knows, you might even be able to keep a few of them turning into 3l33t h4x0r dud3z!
SIGCSE has a bunch of resources that you might check out:
SIGCSE homepage
bash-2.04$
bash-2.04$yes "Don't you hate dialup connections?"| write USERNAME
One really good idea is to have them program a "perfect match" program, that takes answers from surveys they can pass out and calculates the top 3 or top 10 closest opposite-sex matches for each person. This is certainly doable by people taking an AP CS course, and also has the advantage that you can sell the match lists to students or even sponsor a dance in conjunction with the exercise to raise money to cover AP exam costs. My AP Calculus class did this (as it wasn't AP CS, I got the pleasure of writing the program), and not a one of us paid for the AP exam. Another idea is the often-overlooked world of text-based gaming. Have students write some kind of text-based game...perhaps in groups or individually, or as an entire class, so they get a feel for programming in the large. Maybe even have them make it multiplayer, depending on time and skill restraints. Or perhaps have a competition for the best tic-tac-toe (or checkers if they need even more of a challenge) AI, pitting them against eachother in a class tournament.
It doesn't have to be a complicated game, although it should be something in the public domain (to avoid copyright hassles). Maybe offer the class a choice of which game to do.
For example, my HS project was a clone of the original NES Legend of Zelda game. I never finished it, but I got as far as a user-controllable character (with animation!), the basic tiling engine, and a scrollable map. I used mode x asm routines from Abrash's book, and ripped the keyboard handler out of the then-newly-released Wolfenstein 3d code.
A game covers just about every basic computing problem: file i/o, process synchronization, user i/o, and data processing. Now, Zelda was a little ambitious, but I think I got an impressive amount of it done considering it was me working alone for 8 months or so. If my entire class had been working on the project, we might have gotten the whole thing finished!
And, at the end of the course, your students have something they can have fun with, and take pride that they helped program it.
Nathan
Anyway, just do things that high schoolers like. Parties... rumors... TV... sports... sex/drugs/beer/violence (haha well maybe not). Just take your standard programs and make it fit for high school mindset.
So instead of like a traveling salesmen problem, they're doing a travelling rumor problem. Makes it that much better.
But to be honest, our class was fine with standard "boring" projects -- because the teacher wasn't boring. Maybe you should consider getting crazy with the kids. Scream, throw chairs, have contests -- inspire competition. That's what we AP kids love, competition.
Mike Roberto
- GAIM: MicroBerto
Berto
Why not let your students decide? I'm sure they will have more enthusiasm if they were coding what they truly wanted to code. If I were in your position, I would let the students nominate projects, then vote for them. Separate the students into groups working on the most desired projects, and let them do their thing.
--Drew Vogel
Perhaps you can have your school create a website which will contain sites that the students build, along with a message board that students could use to exchange ideas and tips. each student may put whatever content they would like, along with a short biography they can put on their individual sites for a grade. That would really bring a school together and make it a better place to be.
poop.
Why not let them choose their project? Ask each team to submit a project proposal and check if it's feasable. You won't find a project that will please everyone anyway. You can still have a list of suggestions, from which they can choose, but let them do what they like.
Opus: the Swiss army knife of audio codec
The first project my Comp Sci teacher ever gave us to build was a password cracker. He invented a fairly simple, but not transparent algorithm for encrypting user names and passwords, and made the password list avaliable to us. Programs were scored on cleanness of code, and speed.
It made us all feel good (in an Evil type of way, of course) to be able to "hack" usernames. It also drove home the point of using strong security. Over all, a heck of a lot more fun than 'Hello World'
Get enough motherboards to make a small networked cluster running the SETI@Home software and use these to start a group processing "work units" (WUs) from the SETIatHome project at http://www.setiathome.com . SETI stands for Search for Extra-Terrestrial Intelligence. Basically a group from the University of California is recording radio telescope data nonstop, breaking it up into 30 second chunks, then farming it out to volunteers on the internet for processing that searches for signals from alien civilizations. So far 2.2 million volunteers have signed up and around 150 million work units have been processed. The project is slated to run for 2 more years and result in a major sky survey. The SETI angle provides a legitimate and even important use of otherwise obsolete equipment, will allow competitions among local schools to generate the most processed work units, and provide a "hook" that can lead in to lots of other topics - astronomy, math, technology, networking, whatever. I recommend mounting the motherboards on PVC pipe and using that as an open framework instead of just getting a bunch of boxes. Ebay and www.pcsurplusonline.com are great sources for cheap motherboards and peripherals. I believe that using do-it-yourself motherboards will lead to "hands-on" learning experiences by the school "geeks", who would otherwise never be allowed to tinker with the nice, neat, 20-minutes-per-kid rows of State-bought computers in the library. If gifted students decide to tinker with the memory, tweak the hard disk, modify the program settings, add more motherboards, set up a multi-user networked Quake tournament, then great! They'll have to learn something practical to achieve these goals, and they'll have a platform on which to do it. There is a lot of competitive spirit and teamwork generated by this SETI effort. The central website "keeps score" of who has processed the most WUs and a dedicated high school team could zoom to the top of the rankings. A 486DX2/66 motherboard takes about 5 days to process a single WU, old 100 MHz Pentium motherboards about a day per WU (that compares to about 4 hours non-stop by a $5000 top-of-the-line 1 GHz Athlon system). Fifty Pentium-100 motherboards (think 50 teammembers spending $20 on EBay each for "their" motherboard in the cluster) could process around 20,000 WUs in a year. Currently, a group that processed 20,000 WUs would be in 8th place out of 2.2 million participants, above teams from Silicon Graphics and just below teams from Sun Microsystems and Intel. It would sure be cool to see a group of high school kids in such august company!
Agreed. We did a chat-program project in a VB class, and I was surprised how simple it was. Yet it was one of the more interesting things we did because it's something most people actually use. And it's somewhat enlightening as to how simple the basic parts of AIM, ICQ, et al really are.
"This message is composed of 100% recycled electrons."
I find it interesting that most Law schools provide students with an actual legal situation that is happening at the moment and ask them to analyze that situation. Provide a real-world problem that would be at their level and not only let them think about the problems but help them along to solve the problems. Of course you probably do that anyways, since that is what teaching is :)
Depending on the level of the class ask them to figure out Sub Linear Text Searching. Maybe this is already taught. It is mainly a concept thing so it is not only useful for a programming based class. It should give them a kick to devise a method themselves that caused such an impact when it was first thought of.
We did this when I was teaching programming. Split the class up to groups. Hand out programming contest type questions. Each group solves their problem and then writes a psuedocode solution, including catching all the special cases. They swap with a second group who tries tell the first one what the problem was based on the psuedocode. With inexperienced coders most time the psuedocode will be unclear, almost always uncommented, and the special cases will not clearly be marked. It can be very dificult for the second group. It is good because people get practise at group design, at writing psuedocode and seeing how much of a difference there is between good and bad psuedocode. Since it is supposed to be easier to read than code it people get an idea how difficult bad code will be to read. If you chose more difficult questions expect people to get incomplete solutions. This can take the focus off the psuedocode part which is the more important part.
Have fun. Best of luck.
I've actually been thinking about this for a while. I think one of the best things for people this age to do would be to combine different hardware, ie i386, mac, whatever. Different os's, win98, win2k, linux, macos etc. And create a usable network system. I was thinking along the lines of having the machines apart, no os installed and having the students plan what they wanted each machine to be used for, which os to use, assemble the correct hardware for each choice etc... Basically the idea is take a bunch of parts and various os's and create a usable system. Of course designing the purpose of the network (boewolf cluster, small office system, web server...whatever) would be a part of the whole process. It may not be a year long project, but it's something I would have fun doing
I've read most of the posts... but to tell you the truth they all seem kinda boring. Take it from a programmer who just graduated from a Technical High School that majored in CS.
I do agree with the large amount of people that say you haven't really supplied enough information for some very detailed suggestions. Although the info would help, that doesn't mean much. What our teach used to do would be to assign us a language... once we finished it we had to come up with a final project, usually it was something small that showcased different coding techniques... that changed once two other kids and I finished QBasic.
We didn't want to do cute little, silly programs. The fastest, and hands down best programmer in the shop created a Mad-Libs game... kinda cheesy, but he finished it in two days. The second fastest (me!,) worked for six months on a emulation of Core Rules from Wizards of the Coast, the entire program came as a bet, because version 1.0 was horribly buggy. The third fastest kid ended up coding his own graphics/drawing program.
After the first kid finished C and C++ he designed Pong. I good game, and it worked well... although he'd end up dumping his memory if he scrolled off the screen.
The other kid and myself ended up heading toward VBasic and coded a rip off of electronic battle ship, entitled network fight boat. It was a blast, we ended up learning all about TCP/IP and how to properly use winsock. What you need to do is to have a competition break the group up into at least two teams... give them a deadline and see what they cane come up with.
Make it entertaining... set up some sort of challenge... where each group is a flegdling software company and is competing against one another to get the most sales or whatever.
The bottom line is that coders should have unbelievable imaginations, since they're still in high school they shouldn't have any boundaries in their heads. Tell them they can make anything they want... but since it's a school setting it can't feature sex, drugs, or anything your school department views as being unexceptable for the masses, i.e. loud music, death threats, Christianity.
The kids will have a great time working on the projects because it will teach them how to work in groups, how to learn time management, and they will have pried in the program they end up with because they created it and didn't have you giving them projects to do. The parents will be happy because their kids are enjoying school and are learning new coding techniques. The school board will be happy because they will obviously be covering the basic programming needs, and you'll be happy because the kids will see you as someone who isn't a boring coder/code instructor.
Trust me on this.
God is good! All the time!
2. Write a complete clone of Windows NT, only stable and secure. Special UltimateEvil DLLs optional.
3. Write a fully functional, standards compliant browser that can run on a Commodore PET.
4. Write a compiler that automatically converts COBOL into Java.
5. Redesign RAMBUS memory so it actually runs faster that DDR SDRAM.
Note: Since these projects are a bit challenging, you might want to give your students more than a single class period to complete them, or even form them into small teams.
Lawrence Person (lawrencepersonh@gmailh.com (remove all "h"s to mail)
http://www.lawrenceperson.com/
One of my students (who I had in Chemistry and then Physics, because I won't officially teach computers until this upcoming year) worked with me for most of the school year on setting up an online attendance program using a web server running Linux/Apache and Perl. This student was already good at C++, but he got a lot of sysadmin experience, as well as learning the ins and outs of Perl and good CGI programming. Our online attendance system is now something the principal shows off to teachers and parents visiting from other districts (ie, 'look what we can do because our kids are so smart'), and the student now has real working code that he can pull out at any time for use on his future resume (he just graduated and is going into CS).
A fun side note: once we clean up the code a bit, we're going to open source it under GPL and put the code on our school's web site (http://www.hamiltonhigh.net/) for other districts to use. Nothing like an Open Source project to give students a feeling of real accomplishment if someone else is interested in their code (we've already had some inquiries from neighboring districts).
Anyway, get O'Reilly's Learning Perl book and maybe their CGI Programming book (I think most of the CGI stuff is included in the 2nd edition now, I don't know where my copy is), set up an internal web server in the school, and have them design their own system. Maybe have them collaborate to build a web-based email system a la Yahoo Mail or Hotmail.
-Chris
First they ignore you, then they laugh at you, then they fight you, then you win. -- Gandhi
My class did the same a few years back, and I did an asteroids game. Another group did a Pool Ball simulator, and another did a great parser/calaculator that let you enter real mathematical functions (in real mathematical diction) and then plotted a response chart or answer. These were all cool and much fun. Very educational to write a complete application end to end.
You can laugh without eating a sandwhich, but you can do both if bring one.
Many of the classic arcade games (Asteroids, Defender, Joust, etc) had VERY simple logic.
;) )
If you are teaching in Java (something I'd higlhly recommend) the learnign curve for simple graphics is quite low.
Thats what got ME started-- writing games (though back then theyw er text on a 12cps teletype
The lambda calculus is so beautiful; I wish someone had taught it to me earlier.
It's a little hard to come up with advice, since I really don't know how far and smart your students are, but here's some brainstorms:
1) Obtain donations from your community (or ask all your students to bring in their computer if they have one) and set up a LAN in your classroom. Teach them the basics of networking, TCP/IP, and wiring different OS's to a network. For more fun, make a Linux/BSD server and hook it up. Set up a web page for your class by setting up Apache, and have them create their own webpages w/ HTML (NOT some GUI interface like FrontPage).
2) Teach the students how external prepherials communicate with the system by setting up a Linux machine (you could try it with a Win machine too, but I would think that more people would know how to program in C if you say your class is at the AP level) and building a driver for the joystick. This one might be a little difficult to undertake though, especially if no one has had any programming experience in C or has never learned logic trees for drivers.
3) This one I think everyone would love. Design a new mouse. This one doesn't have too much technology behind it, but you could really teach them some marketing and sales lessons by assigning them to get a whole bunch of different mouses together and go around in their school asking kids what designs they like, which feel better on the hand, and which are easier to use. Gather the results and have the students brainstorm different designs that they think would work based on what they learned. Create a design for a prototype.
Now, if you live in a big city, you might be able to have a company actually design a working prototype for you, and if it's REALLY good (now, I'm not making any promices here...), you could try to market it to some company like Logitech and see what they think. For a big company like Logitech to evaluate (or even better, see if they could participate) in such an event would really give a good experience to the students.
Programming can be rather dry to a highschool student. Show them something flashy, something interesting. Show them how to do some graphics programming and then do some simple game. Pong, pac-man, tetris or something similiar. If your students are not advanced enough to do something as complex as a game. Program a simple game and make it their assignment to alter the program in specific ways. Maybe program a simple pong clone then have them program a second ball, or create a scoring system for the game. That you are trying to get the students interested shows that your a better teacher then I had in highschool. I knew more about computers then any of my computer teachers did, however I was always forced to bring myself down to the same level as the rest of the class when doing assignments. Your going to have to let each student do what their abilities dictate.
Environmentalists are their own worst enemy. ~tricklenews.com
when i took this class in HS a freind of mine wrote a CoreWars style game. Much fun was had. You could try updating it a bit like the Crobots and Probots games. givem cool graphics etc and let them fught to the death!!!
-- Hail Eris
Take all the solutions, and give them a wide range of input sets, and figure out some way of determining the winner. Make sure to promote people working together and bouncing ideas off fellow students. If the prize is something trivial (the class gets to watch a movie of the winner's choice, for example), then hopefully there won't be bad blood. Let people work in teams if the class is large.
Depending on the proficency level of the class, you can assign anything from as simple as sorting an array to combinitorial optimization.
In grade 12, our class made Tetris clones with Turbo C++ 3.0, using Borland's dos-only, 16-colour VGA graphics libraries.
Granted, some of us were a bit more experienced than the others, and weren't wowed by learning such breathtaking new concepts as using bitmapped graphics in a program, but nevertheless, it was still extremely fun. The relatively low-techness of the thing kept it from becoming work to us, as you didn't really have to butt your head up against a wall figuring out how to go about designing the thing so much as it was just straightforward and you spent your time just coding up the details. Many of us even finished early and added all kinds of cool enhancements and new play modes to our programs.
In the same class that we made that Tetris program in, we also had to do a project. I made a nifty little encryption program (command-line or GUI, depending on how you invoked it). It wasn't very secure (replicated your password to fill a buffer, then played the game of life on the bits, then broke it up into 8 seeds to feed on each pass to srand, and then rand was used to successively generate bytes for a one-time-pad that was XORed with the plaintext), but it was pretty cool for high school, and impressed the hell out of the teacher.
I really miss those days... you just don't get to do fun stuff like that in university. Sure, coding up a module that implements a red-black tree for your algorithms class might be intellectually stimulating, but I don't think any of us would really call it "fun." Neither do you ever get to create an entire, stand-alone program, where you actually have to worry about making the thing a good experience for the user (for the most part anyway... HCI courses aside), with error checking and the whole bit. Instead you end up mostly implementing little text proggies that implement some data structures and algorithms, and your TAs run them through some test cases. Interesting though it may be, none of it has ever had the same magic of those days I spent churning out that crappy little Tetris game.
Mechanik
Put them through the things they'll see later in life:
MONDAY: Assign some vague requirements for the project (say a sort program) and make the project due on Friday.
TUESDAY: Answer their questions about the requirements and tell them it's now due on Thursday.
WEDNESDAY: Change the requirements completely.
THURSDAY: Collect the assignments and critique them in front of everyone.
FRIDAY: Make each student add some minor enhancement to the project, but they must modify the code from the person on their left, NOT their own code.
Have each student's grade determined by the student who had to "enhance" the code, not by the teacher, and not even by whether the code worked or not.
Find a way to jam carivore.
First one who does, wins a prize.
Seriously, I'd say give them a basic lesson in cryptography. The history (and math) of the subject is facinating.
You be doing them a favor as citizens, and individuals.
You might start with PGP and work from there....
http://www.pgp.com
Macs? PCs? Do some of them have Linux loaded?
- Blatent linux plug:
- the source code from Linux can make for some good examples to work from.
- Source codes from shell commands varies in size from tiny to huge.
- Linux is also better designed (imho) for collaborative work
- the development environment is free.
As to what to do: I'd agree with the suggestion to ask them. Give them some ideas. Look for some simple (or not-so-simple) projects that the school could use. It could really turn some kids on if they could end the school year having created something that the school is actually using.If it turns out to be so big that it becomes a team project -- all the better. Like was said elsewhere: Most real work these days is team oriented.
Above all: Don't underestimate the kids' abilities. Listen for their power. Even if they reach too far, they can learn from the failed attempt. Chances are that they'll do far more than most people would expect.
Free Software: Like love, it grows best when given away.
I heard about a fun little coding project where you try and write the smallest program that its output is the same as the code, you could give a prize or something for the person who gets the shortest.
The web site has links to previous projects to give you some ideas about the kind of work that some of the teams have done, but overall I will say that the work is of remarkably high quality. This is a school-year-long event, so many of the projects will need to be shortened for semester-long use. They may also need to be made more simple.
As a side note, I should mention that although all of the projects can benefit from supercomputer time, the Challenge is over 10 years old as a program now. As a result, most of the projects run find on mid-range desktops (but are, neverthless, computationally intensive tasks).
Also, network and Internet programming would be interesting. I'm not suggesting programming websites, Perl, CGI, or Php, but messaging, chat, and e-mail programs. The nice thing about such a project is its range of difficulty. With VB, a novice student could easily write an e-mail program and learn about a variety of functions.
Love, Stu
Because database applications are insanly boring :) You'll have a multitude of Video/DVD catalogs, address databases, and maybe the odd image catalog....entirely predictable. Yes, the students would learn the basics of databases, but then promptly ignore most of what they have learnt.
:)
I know this to be true, because a database app is exactly one of the boring projects i had to do in College
Syllable : It's an Operating System
I could probably come up with loads. Except you don't give us a lot of information.
:)
What is the current ability level of the students?
Is there anything in particular that you would like them to learn during the project?
How long will the students have?
One quick thought. Why not define loose parameters for the students, and let them choose something to do (in small groups)? They can learn planning that way themselves at least
Syllable : It's an Operating System
Here is an idea: Have students develop agents to compete for the RoboCup! http://ci.etl.go.jp/~noda/soccer/server/index.html This is very cool. Will
Learn more about Steorn at Free Energy Tracker
We did, and every time we would finish it, he'd throw us another curve. "Make it so you can buy insurance if the dealer has an Ace showing. Instead of randomly picking card types, make it use a real deck. or 2 real decks, so you can count cards."
The project is only the first step. Keep throwing more challenges and curves. If the first project seems too easy, throw a handicap at them.
:wq
Heck, if we learn about matrices by 11th grade, and these kids are going to be polygon-loving gamers and coders... why wait to get to college to re-learn their linear algebra? They can program their first "Rotating 3D Borg Cube?" without much knowledge of a language.
If they don't want to code that, at least they can do a simple CGI-movie with their favorite videogame character, car design, gundam (hmmm, that'd be stepping over the line) or (ugh!) --pokemon!-- and post it on the web.
"Wireless : LAN
why not just do something like created a large database for storing and categorizing things? It teaches object oriented design, database concepts and could give them a useful tool after they finish.
And after they're done they can keep track of all their pr0n...errr...popular science magazines.
Things you think are in the Constitution, but are not.
Simulations are a good idea. You can create a simple framework, and let teams of students fill in the pieces to model. Maybe like an aquarium, where students each create a fish - see how they interact.
Make it a contest. The first programming I ever did was Muse's "Robot War" on my Apple II. It was basically a simple language and compiler for creating robots that would compete with each other in an arena. There are a number of clones out there for this type of game. Lots of fun, and immediate gratification of seeing your code make the robot do something. Good luck!
WWJD -- What Would Jimi Do?
(Smash amp, burn guitar, take home the groupies)
Or was I thinking about another project?
Rich
One project which I believe would be useful (and would be useful in the college curriculum as well) is that a useful skill is the ability to quickly learn a new and different programming language.
One such project would be the following, phrased in the following manner. "Here are some copies of the Adobe blue book (Postscript Language Tutorial and Cookbook) and red book (Postscript language reference). And here is a shape with a set of parameters. Write a postscript function which will draw the shape, given the parameters"
The point of the project is that the skill of learning a new language, with the use of the reference books, is a useful and (imo) necessary skill. The instructor should give assistance, but not teach the language. The exercise is in how to be self taught using the language reference materials.
Nicholas C Weaver
nweaver@cs.berkeley.edu
Test your net with Netalyzr
Start a company
Syllabus: 1] Write code that does nothing - but has buzzwords like "B2B" or "Sharing" in it. 2] Be written up in Slashdot. 3] Get VC funding. 4] Be written up in Slashdot again, with nearly identical commentary to the first. 5] Make the cover of a half dozen clueless magazines. 6] Be ignored by Slashdot. 7] Count stock options worth several billion dollars. 8] Get sued by some equally clueless industry group afraid their fat cash cow is going away. 9] Be written up in Slashdot, with more redundant commentary. 10] Pursue the lawsuit in front of some absurdly clueless judge who slaps a restraining order on the idea of "programming" because it could violate some businesses ability somewhere to make money. 11] Did I mention being written up in Slashdot? 12] Go out of business, because after all, the code did nothing.
Some people in AP CS are only taking course 3. The programming projects are generally simpiler. When I took it, I think the hardest project was to make a 20-questions program that would save the database to disk. Another project I remember was the expression evaluator project, which could evaluate input strings something like: (+ (* 6 3) 4)
I think hash tablers are a standard part of the AP CS AB curriculum.
The AP exam exam switched from Pascal to C++ starting in '99.
My HS AP course was more advanced then the first 3 or 4 semesters of AP courses at my school. This is true for most of the AP exams, first year college courses are generally easier. One thing about CS, is it's really best to learn programming on your own, not in a class. Students should try to take Calculus BC in addition to Computer Science AB. That way they'll have time for more advanced math courses in college to complement their CS major.
One project that might be interesting for HS students would be RSA encryption. It's probably easier to implement in Maple than a low-level languate like C. At least that's what we learned it in this easy course I took, see project #2
Ok, maybe I'm not speaking for most people, but I knew Pascal, C, and assembly, and had written some large multi-thousand-lines-of-code projects before I took AP CS in 10th grade. The largest program I wrote as a hobby was a complete BBS (remember those, before the internet killed them all) software that could do everything all the other BBS softwares could. It's pretty sad that many CS graduates still don't know how to program. For the record, I'm majoring in math and physics.
If you want small problems they can solve in a relatively short amount of time while still giving them a good challenge try giving them a problem from a past programming competition. They have a wide variety of problems ranging in difficulty. ACM Programming Competition problems: http://www.acm.inf.ethz.ch/ProblemSetArchive.html Hope this helps, I've sure enjoyed participating in the programming competitions.
One of the coolest projects I heard of, but was not a part of, involved psedo-AI combat. The premise was to start with an already designed 'combat' arena, where you code a robot (worm, bug, whatever it is) to fight another bot in simulations. Complexity can range from 1 on 1 to teams of bots working together against other teams, depending on the programming level of your class. After the semester / period / whatever was over, the class then shifted into a business style project, and worked as a team of developers to write a new 'arena' program. This program was then used by the next class, as their starting 'arena' to code bots for. Repeat cycle. Since the first term is about the individual, students hone their code ability. The second term is about real-world teamwork to produce an application. And everyone was much more interested, knowing they would have a legacy for the next class.
sononomo@hotmail.com - Has seen the Factory Ass at Comdex
I've seen a lot of ideas for projects for AP and more advanced students, and certainly those projects are probably more interesting than simple ones. What I would also like to hear though are some ideas for projects for kids who are just starting out. I want to make it fun/interesting for them from the beginning, not just after they are more advanced. I know this article is already off the main page, but I hope to get some comments. Any ideas are appreciated!
Why not use one of the speech recognition engines, coupled with a text-to-speech generator, to make a voice-controlled, talking email client. There is enough POP3 code out there and the SDK that comes with ViaVoice on Linux is easy enought to use. This would be a project that the kids would like, and would be fun! (While teaching them non-visual UI skills, Network Programming etc).
- Paul
The subject says it.
-------------------------
Stupid people suck.
Most of the time programming projects are short-lived individual efforts. Instead try making them work as teams, and have them employ some sort of development strategy, so that they learn good project management WHILE learning how to code. Give them vague catagories so that they can design and then code. I know that this makes for a longer project, but it will excercise more than just coding skills, and everyone needs more than just coding skills. --Sheeplet
-- Breaking Windows: Not just for kids anymore KDE
Then have the 2nd semester do the project
Pick something REAL and doable. Something that schools can use. A web based calendar system with administration aspects, user aspects, etc.
Design methods is the one thing I wish school had tought me. Its the most important part of programming and its the one part usually forgotten. and ignored.
Spending 1 month of solid design work can easily save 3 months of testing and debugging in a complex program.
UPS Sucks
Let the students decide on a project that they would like to do, and then have them work in a group to accomplish this. In school, programming classes emphasize too much on the individual programmer. In industry, team work is a requirement. Get them to work together, plan and design, then implement it. This way, they will be more prepared for a proffesional career in programming
------------------------------------------
If God Droppd Acid, Would he see People???
What are we going to do tonight Brain?
1. The user has root/Administrator/SYSTEM privleges.
2. The software can install files wherever it pleases in the filesystem.
3. Everyone has access to the Internet all the time.
4. Documentation is less important than code.
How about having the kids program something non-trivial without making any of the above assumptions?
In fact, it's so simple, here is the description of the protocol from the paper. The paper elaborates on why it works and generalizes it and also includes a proof.
You can learn a lot about cryptography, networking, synchronization, etc... by implementing a basic version of the network.A copy of Chaums paper is located here.
Burris
Here I go dating myself.. look at the little kiddie! I'm 17 and a senior in HS. There. I've admitted it. Trolls, begin!
At my local public school, we have no CS class, but we do have a computer club and a really cool sysadmin. We don't get into any real programming, as we don't have enough time or resources.
As part of our major project last year, however, each student was given a donated computer sans OS (from a Pentium 75 to several K6-2 300s we got from a prison). Everyone ended up installing Win98 (it took us several weeks to get a hold of a Linux CD and by that time we all had Windows installed already). It was old hat to the more advanced of us, but it was a fun exercise in hardware troubleshooting, albeit Windows-based.
After that, we got all the computers on a small LAN and even got them connected to the school's network and the Internet. Don't tell anyone, but we even played Quake (one) at school. It was good practice for what turned out to be a summer full of LAN parties (away from school).
The "tiger team" idea would not work well at all for our club. First off, several of our members had legitimate access anyway, and secondly, the school would NOT like that one bit. It's an NT-based system anyway; the most interesting stuff requires physical access and anything else wouldn't take much skill.
--
see who can make the best bong out of old pcs and macs.
--- Always remember. 99.36% of all statistics are inaccurate.
Parallax makes a pretty good microntroller called the Basic Stamp II that could be used. It does have a really annoying BASIC based language called PBASIC but it is still usable. It's a cross between BASIC and C with the more powerful features ripped away (these things have 32 bytes of RAM and 500 bytes of ROM if I remember correctly). I believe that Parallax does try to support the educational community.
If you really wanted to get involved in real time programming I'd recommend a program like FIRST Robotics although that is much more geared toward the engineering side of it. But the robot that's built does have to have a robot controller (it's based around the Basic Stamp II and sold by InnovationFIRST). There are a lot of interesting problems that creap up in that competition including the fact that there isn't any timing circuit. Another part of the FIRST Competition related to programming this year was that they released specs to a data stream that could be tapped into so I (and several other people independently) wrote interfaces to that information. And for those who can't tell, I am very much into this program still.
Matt Leese
I find the best way is to pick a big, over-reaching project. Then teach by sections. You don't even need to tell the kids that they're doing little bits of a big picture.
One example that I've used, is, and I've seen it below, a physics-accurate space ship modeler. Start out with simple programming techniques. First, hardcode a distance, and a mass, and prints them out. Then it runs them through an acceleration formula, and prints the results. This shows basic flow, variables, and printf. Next, get distance and mass from the keyboard. This teaches, scanf, and equivalents. Next, get distance and mass, and use a loop structure to display velocity at every interval. Go from there. Eventually, you can add all sorts of neat things, until you manage to get what is basically a fairly accurate working simulation of the solar system, and a basic navigation system for ships. Then you add in the networking protocols, ship statistics, and combat models.... The important thing is, though, not to teach concepts. Write programs. From programming, learn concepts.Vintage computer games and RPG books available. Email me if you're interested.
That is actually kind of funny you mention.
I like wrote up a quick Client/Server chat program in VB. It took 3 or 4 days and people were just utterly amazed by it. (really the concept and functionality was done in the first day the rest was just for looks n grins n giggles)
If you think education is expensive, try ignornace
As a Program / Project manager, I beg you: Teach them how to document their work. Image the future programmers of the world knowing how to draw up a schedule, describe their architecture, explain their code base, or god forbid, establish project requirements! Along with that, some basic communication skills would be a wonder...
At the APCS level, most kids should be proficient enough in C++ to attempt a simple recursive descent compiler/interpreter. I recommend Ronald Mak's Writing Compilers and Interpreters: An Applied Approach Using C++. The book is a very gentle (some will say too gentle) introduction to writing compilers and interpreters. Ronald Mak has done a particularly good job of introducing more advanced programming techniques (inheritence, binary file manipulation, etc.) that are not covered in the APCS curriculum. The examples in the book give a strong sense of accomplishment, every chapter has at least one utility so it is easy to see progress. Needless to say, this is not for every student, but there's something very cool about being able to say that you've written your own compiler...
My senior project in high school was to clone the SameGame (aka ksame; Same GNOME). What resulted was Insane Game for Linux, DOS, and Windows.
<O
( \
XGNOME vs. KDE: the game!
Will I retire or break 10K?
Project: Build your own data haven/colocation facility
Make sure you find a good location. The school football field and your back yard do not count. Make sure that the government that controls said location is willing to allow the free flow of all data. Construct your data haven using any materials you wish, construction paper and tape are provided at the back of the classroom. The project is complete when your first client has made use of your facility or you are all killed by RIAA hitmen for having an MP3 of Lars Ulrich singing "Rubber Ducky" in the bathtub.
My other
Once you learned all the basic constructs of procedural programming like loops, conditions ans so on, there are basically two ways:
Learn OO or learn Scheme. While Scheme may not seem useful, it will teach them functional programming, they will gain a second way to attack problems: Divide every big problem in small problems, solve them recursively.
Once they get it, it will lead to a deeper understanding how to solve a problem, which seems to be overwhelming because they can't divide it.
daniel TESKE
One of the biggest areas too many programmers these days lack in is variety of languages. C/C++/Java have become so ubiquitous that everyone forgets all about all the other languages out there, Scheme, Lisp, Eiffel, Smalltalk, Forth, Haskell, Prolog and many many others are often better languages than the usual C/C++/Java contingent. You can learn a lot by using another language for a while, you may even dump your old one completely ;) It would be a terrible shame if your students never learned how much C is flawed, or how poor a hack C++ is. The very thing keeping the C-like languages in use is ignorance of anything else. If you got students accustomed to different ways of looking at problems (ie, functionally) they will have much less trouble later on.
Those who do not know the past are doomed to reimplement it, poorly.
One person was chosen as the "VP" (the Pres was the prof), and had to manage a lot of stuff, as well as do some work
Spoken like a true non-manager.
For all intensive purposes, "whom" is no longer a word. That begs the question, "who cares"?
Buffer Overflows!!! a REAL skill to learn!
that would just serve to confuse the poor little kids, think about the children!
2) Applets. People like to show off. Give them something that they can post on a web page. Game of life, fractals, and other nifty graphics are good beginning projects (when java was in beta, those were what my first few applets were about).
3) A web based MP3 data base. This would be a cgi script type project. A web form would provide access to a music data base, and let people down load the mp3 files they found.
"A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable." -- Leslie Lamport
It's very EASY though. Doesn't require the student to learn too much or think of anything too broad. Very simple to do game theory on.
Eh...
Well, kids start out by studying algorithms. Then, they evaluate run times and such, on paper. A lot of ASM is taught, in several different formats. Also, a lot of programming in functional languages such as ML and SCHEME. Also, students are each required to write an artifical intelligence. If nobody wins the loebner prize, they all lose. At the end of the semester, each student must write a dissertation about how they significantly contributed to the field of computer science. This will help them get advanced college credit towards their PhDs, which they all deserve anyways, by birthright... Or at least that's how some of them acted when I was in HS, this kid was blown away that my program beat his at the science fair since I wasn't in all AP classes (I was for most of HS, but got tired of the extra work, with the rest of my schedule). I think he thought I was dumb.
Eh...
How "interesting" are you going to get for an intro course?
Eh...
1) Robotics. Robotics are cool and fun. Don't make it some complex mechanical beast requiring lots of electronics skills, since this is a computer science and not a computer engineering course, but something that the students can build in a day, and then write programs for, that is always a winner.
:-)
2) AI. Kids can write really simple AIs. It doesn't have to win the Loebner prize or anything, but think about the possibilities. You could have simple games, tic-tac-toe (I did that for a science fair project), and eliza's and word-chaining, and junk like that. People also get a kick out of talking to them. You could also go over different theories. You could go over heuristics and game theory and such, just nothing too deep.
3) Web design. People like flashy things, the web is flashy. It takes 10 mins to write a decent web page, and you can take all day jazzing it up. You could go over perl and CGI and JAVA, kids could post their work to the net. You could even work as a group to write something useful, like a page that gives the school's announcements for the day, weather, does e-mail, shows grades, shows sports schedules, the possibilities can really go wild on this one.
4) Games. Heck, half of the kids in that class probably got into it because they wanted to write a game, everything from the simple to the complex. Try writing a mud, or something graphical in nature. There are LOTS of simple projects and complex ones in this area. Students could use kits and libraries, or roll their own depending on how advanced/serious they are. This is good because the levels of effort and interest can vary, while still allowing for all students to produce good projects.
5) Graphics/3D. Do some rendering/modelling/so forth. Write programs that make cubes and such. If the kids have already had trig, then they can handle the most basic of the 3D algorithms and most of the very basic 2D ones. This is something that can be taught in bits and pieces, and you can really go step by step, if that is the kind of class that you had.
6) A few algorithms. In one of my college classes, we went out into the lawn by our classroom, and ran around forming various data structures. This is something that, depending on the kids in the class, could go over very well or very poorly. Discuss the algorithms in class ahead of time and after. It is MUCH more fun if the kids understand what is going on.
Stuff that I wish that you could go into in such a class, but really, you should stay away from.
1) Truly advanced CS topics. I am guessing that this is an intro class, and these kids have what one would call a "budding interest" in computer science, don't kill it by doing anything too difficult. Big-O notation might be something fun to mention, but evalutating execution times of algorithms really isn't an intro-level thing.
2) Algorithms galore. Teach your kids some algorithms, have fun with it, but I doubt that they are really going to be interested in the fastest way to form a binary search tree.
3) Really heavy topics. Anything that you had real difficulty understanding at first, and doesn't make a good puzzle in a book sold at airports, will probably lose their interest quickly.
Oh yeah, and grade syntax, but don't kill them over it, it's just HS.
Well, I figure that much of that, you could have figured out yourself, being as how you are a teacher and I have relatively limitted experience with kids. Hope I was at least marginally helpful. My ideas sure sound fun to me
Eh...
First, I assume that the AP curriculum hasn't changed in the last 2 years (that's when I took it) and the emphasis is still on data structures, classes, and modularity.
:)
If that's the case, I would say that a good project to actually practice this type of thing on would be a text based game. This avoids the complications/portability problems that arise with graphics programming (and makes it feasable to finish within a month or so).
Since I had a whole year (My teacher was just learning C++ as we went along, and I already knew it, so I could do whatever I wanted), and I like math a lot, I wrote a simple raytracer when I took AP. However, I ran into a lot of the problems assosiated with a graphics project - I worked at home in Linux, and then tried to move the code to school, which was using Borland C++ 3 for win3.1 (I think that was the version - it was old). This failed miserably (and the code was pretty portable--it compiled ok in win98 with VC++). Also, it took me a long time to learn the necessary math (you need some linear algebra, and you have to be very comfortable with trig - most high school students take it, but very few are comfortable before they finish calc).
So, I would recommend a text based RPG. It is by its nature very modular, which makes it easy for them to learn interface/module design and implementation. It also makes it easy to do the project in groups (one person does engines, one does characters/objects, one does maps/navigation, etc... ) and it gives them a chance to use the standard classes (apvector,apmatrix,apstring, etc...).
-Victor Shnayder
edu.princeton@shnayder
(you can figure it out
Overclocking can turn out to be an excellent science project if you include the usage of high-tech cooling through use of TECs (a.k.a. Peltiers) and experiment with submersion in fluids like Opticool and Flourinert to increase cooling and insulate, etc.
"Make it idiot proof, and someone will make a better idiot."
DeCSS -- If kids from Norway can do it, why can't Americans? :)
Because of the DMCA, UCITA, and the MPAA of course.
Wound up trimming it down to joysticks and what is a natural way for users to use them (i.e. - expected controls models and such).
With all the talk that hits the /. boards about interfaces and the good/bad points about them maybe that's something for your students to look at.
A fresh set of eyes on a old problem.
Malk-a-mite
If you have access to the net and a real web server, I'd imagine some of your students would find CGI programming interesting. You could do the usual stuff, message boards, chat rooms, etc, or perhaps other less common things... your students probably use the web daily, and you might find a strong interest in building dynamic content like what they see on-line.
PJRC: Electronic Projects, 8051 Microcontroller Tools
1) Write a program that brute force solves the 12 hole Golf Tee (or peg) mindbender puzzle that you see at restraunts. It should use recursion to discover a solution for any given blank starting hole, and should print out the results in some format that can be read into another program that tests the solutions for correctness (ie. 4>1;6>4;...). Have your students show that the puzzle is solvable from every possible starting position (all 12 peg holes, altough the smart ones will figure out that you only need to test 4) using the software.
2) Have your students write an AI program to play checkers. It should take as an input a player move, then do some lookahead on possible moves, and output a resulting move, while internally updating the board state. Have students test the complexity of lookaheads vs. how often the computer wins.
3) Have students make a graphics program that allows for drag and drop pieces on a game board. Pieces should be bitmaps, and should have the ability to animate under certain conditions, and be added and destroyed (removed from the board). This will teach basic user interface programming, and event handling.
4) (simpler) Have students create a sound playback program that can alter the volume and panning of a sound based on positioning on 2D plane, so that sounds toward the top (rear) of the plane are quieter and the panning is based on the position. Sound playback should be event based, and should be able to be looped, or stopped suddenly. Multiple sounds should mix together currectly.
5) FINAL PROJECT. Have students create a game of Ogres vs. Trolls, a turn based game, where the computer plays one side, and a human plays the other. The game takes place on an arbitrary sized grid, with teams of 16-32 plus a King, and the goal is to kill the King of the other side. Non-King characters should be divided into three classes (for a Rock-Paper-Scissors type effect) and obsticles or special squares should populate the board at random. Each turn, each player has a number of spaces they can move their pieces. Combat is based on two pieces occupying the same square. Sound should be based on the above sound task. Interface should be based on the drag and drop task. The computer should do lookahead and brute force solution finding to mount it's attack, comparing warriors to move against the known rules of battle. Allow up to 5 classmates to work together on this project, and have them divy up the tasks of art, sound, AI, interface, and rules implementation. This should probably take two months to develop, if they work based on their existing code.
Good luck!
-pjf
At a project I've been working on during the summer we've added computers based on the open-source movement to elementary schools. Its never to early to learn and become involved. In fact we have second graders writting pure HTML and running the GIMP with great results. You can check out the results and the culmination of project at Osef.orgI know that as a student of computer science I have learned alot about where linux can be headed in the education world. OH and BTW, the osef.org is of course a not for profit organization. As a teacher I think students should be asked as to what they feel they want to get out of the class. Let the students deside. Perhaps have each of them contribute to a Linux project and report what they accomplished. LinuxLinks.com is a good place to see whats out there and what can be done to help.
You would, of course, need to provide some tasks for their neural nets. Simple character recognition based on 8x8 input matrices may be good. I think I did something like that a while back.
Of course, if this doesn't grab their attention, you can be sure that programming simple games will. Just be very careful to scale back your or their plans for such a game. They'll have too high hopes for such a project and you are far better off making them write a small and simple game.
Oceania has always been at war with Eastasia.
Lego Mindstorm is a programmable robotics kit based on the course developed at MIT. It uses a control board you can program from your PC through an IR port in a language VERY sismlar to C. The robotics you can create with this can become really sofisticated, including temperature, pressure, and light sensitive sensors, just to name a few. It would be great for HS kids to play with. I believe that Lego also has an ongoing contest for creative uses of their product, recent winners being a working "typewriter," and a working scanner. Don't know what your budget is like though, the set wasn't very cheap when I used it 3-4 years ago.
-Tarlyn
10lbc ---not pr0n, Punk Rock!
"The axiom 'An honest man has nothing to fear from the police'
Why is it that the proponents of "one nation under God" are so eager to get rid of "liberty and justice for all"?
My Comp Sci teacher faced a similar problem back when I was in High School. (Actually, her problem was that the cirriculum required that she leave paschal and start teaching C, but she didn't know C.) She had us divide into groups, and entered us in a competition. I don't remember the name, but the jist of it was that we each had to come up with an idea for a program, then develop and impliment it. We did this for six weeks, and there was some great diversity. One group did an HTML editor, one an asteriods game (I did the sound system on that one) and other great ideas same out. It gave us a chance to be creative, do what we liked, and get an idea of what it's like to code as a team...
Well, that's my two cents...
--
Feminism is the wild notion that women are human beings.
These microcontrollers are very easy to interface with, program, and use in small battery operated projects. You can build everything from environmental sensors to light controllers with them.
The cost may be a little high for start up (I think the programming kit runs around $100) but they probably offer educational institution discounts.
Using these devices you can learn digital logic basics, system logic design, simple programming logic, or any combination of skills depending on the application you have in mind for them.
Good Luck!
(Note: There are no x's in my email address.)
An exercise that I have always found useful and interesting (note that I have never been a high school student, but I get accused of be juvenile a lot), is to write code that execises the API of a code library.
There are lots of good ones (code libraries) out there for things like graphics, mapping, networking, etc etc. Many of them have sources available, and many are availble cross-platform. I would reccomend choosing one that is both. Choosing one that implements a standard of some kind is also good, but probably more complex.
Advantages
Other points
"The Internet is made of cats."
I took the AP Computer Science test. Its garbage. Many of the libraries (done in C++) are just half-thought-out versions of libraries already done in plain C.
I strongly suggest against anyone with real computer knowlege (i.e., you don't know everything you do from just one class) to not take the AP Computer Science test.
As an example, last year's AP case study for C++ was a BigInt library. Once they showed a perfectly reasonable solution to a problem, but said they couldn't use it because it wouldn't port to a Cray. So instead of doing the logical thing and using the otherwise-pefectly good system, we add a few hundred lines of code just so it can run on a Cray. As if their crappy code is ever going to be on a Cray.
I don't know about any of the other AP tests (Calc, Foreign Language, etc.), but the CS test needs as much improving as all the CS programs in the US do.
If you really want to have a good CS program, don't focus on the AP tests or on just learning the syntax of a language. From what I have seen of CS programs in the US, their biggest problem is teaching lots of syntax but not tuching the two most important skills of programing: logical problem solving and always looking for a better way.
Heres an example that happend in my CS class: The teacher assigned us to write a program that would keep track of employee hours. We were to store the employees in an array, refranced by employee name. After I started coding, I determined that refrance by name was horribly inelegant and would add significant complexity to the program. Thus, I opted for refrancing by employee numbers (just as similar real-world programs do). I didn't check with my teacher before doing this, but went right ahead. Several of my classmates came to the same conclusion. However, one was adament that he was going to refrance by name. Later, the teacher steped out and said "OK, I think refrance by name is too hard; why don't you just refrance by employee number." I was grinning, because I had already turned into my program and was browsing Slashdot. At the same time, my classmate was letting out some of the most colorful speach I've heard in a long time.
The point is, create programs which challenge the student to come up with a new, innovative solution. As an example, drop hints as to how a binary search works, like showing (offhand) the students a card trick where you figure out their card with only six to eight questions. This way, the student won't reailze what you're teaching them, but they actualy ended up learning how to binary search. You can then easily tell who caught on by their source code. Thats just one example; a good teacher should be able to come up with lots more.
------
Not a typewriter
While there are a few violence undertones, it is entirely text based so not a potential problem like a 3D shooter. But for learning/working with C programming. MUDs - Multi-User domains. They are social, interactive text based games written in C. They provide a good way to demonstrate TCP connections and programming. They are games that can be played and enjoyed by the students. Changes to the code can be seen, and bugs tracked down.
.edu domain sites.
The largest of the MUD "tree" of games is the Diku and derivatives. Diku is the acronym for the Computer Science department at a Danish University in Copenhagen. It was a programming project there. Until 1994 or so, MUDs were almost entirely on
They are basic, but a good place to learn. Programmers for many top companies have learned in MUDs and some continue to work on MUDs in their spare time.
Last I checked, most AP CS courses are all code. Why not delve into the hardware aspect of computers and how they work?
I think that some high schoolers might be a little tired of looking at code for their class, and this might offer a change of venue. Topics could include Overclocking, Network Architecture, Telco systems...
Although this might be hard to serve if you're aiming for a non-lecture sort of approach. Since a lot of this might be over their heads, it might be hard to implement a hands-on curriculum.
When I took OAC (grade 13 Whatever) We had three projects, One I can't remember, the other was a Scorched Earth game (two tanks chucking bombs at eachother given a variable velocity and angle of trajectory). That was really cool, it tied in some physics, and stuff.
They let us use any programming language we wanted, so as I was a pascal guy back in the day, so I used Delphi.
And for the third project, they let us do anything we dang well pleased! As long as we produced a fairly good Specifications Document and Design Document. I did a cool top down multi-car racing game. The chicks loved it. =)
But Honestly, I think that if you let the kids program what they want in the programming language of their choice, some students will really thrive and enjoy themselves.
I am now in college for computer science, so of course high school CS classes were a breeze. But the thing that I realized right off the bat was that, especially in CS classes, not everybody is working on the same level and at the same rate. The key to a great learning experience (in any field for that matter) is something that the student finds interesting and personally challenging. In my class, static, huge, final projects were either cumbersome and boring for the advanced students or cumbersome and difficult for the slower students. Nobody had fun.
The key to a good project, from a teacher's standpoint, is well-guided flexibility. Interest, not assignment, drives good schoolwork.
Fortune cookie is nice and simple. You can use a DB (no joins though). You can do it on the command line and then expand onto a web page. There is even random number generation. The fun part is making up (ripping off) the cookies http://www.rny.com/fun/fortune.cookie.fc gi
Well, the most interesting thing for me when I first got into computers was of course hacking. This is probably the first thing on the mind of any kid starting to use computers is how to unleash all the power a pc can give them, and the most common way to demonstrate that power is to hack some web server and change it's web page into something saying how cool the are or how much someone/thing suckz. So if you could eventually manage to tunnel the interest to hack into how to prevent hacking it might just become and interesting course. It is also going to show your students that securing a system beyond hacking is much harder (if possible) than hacking some insecure machine over the net.
spelling mistakes are in my nature, just accept it.
I know when I was in high school there were two projects I always enjoyed. That was creating games. It was always fun in groups, someone took care of design and graphics, someone ussually did sound, while someone took care of the functionality, or even a bit of all. I think most kids love to get a chance to work with others. If I had a choice I would work in groups, there is always so much other fellow geeks have to offer. Other then games is databases.
I also enjoyed developing programs for departments that would interface with a database. One I remeber was for the yearbook staff. It kept all of their info for sales, adverticements, etc. Not only do you get coding in but you learn a bit about database design. Plus it was always fun learning how different languages interface with databases.
The only other input I could give is that kids love compition, at least I remember my class being that way. When every we got a fun assignment it was always great to have a compition for who could create the best application. That is my two cents
Putting the IT in Sh**
I took AP Comp Sci in 1999 (the first year that the subject matter was C++ I believe), and what a waste of time. I'm not gonna bash the need for introductory programming courses, but we basically spent the entire year reinventing the wheel with BigInt and BigString classes. It just so happens that the following year, being a freshman at the University of Michigan, I took 2 courses that together covered less than AP Comp Sci.
/. programmers regularly use Big-O notation or recursion? I'm sitting here with a copy of David Kruglinski's Inside Visual C++ book in which he says "If you want to learn French, you have to go to France." The AP Comp Sci curriculum does not breed programmers that will make it in the real world.
The bottom line is that you have to keep it real, not theoretical. How many
As a 19 year old computer geek with a sweet summer internship at stamps.com (cheap plug), I haven't put to use anything that I've learned from my high school or college education (well, technologically anyway).
It's all about classes, modular dynamic pieces of code, MFC and windows programming (sorry to say) - or maybe GUI programming is more accurate.. The technology behind programming is -dry-. The only thing that makes it fun is programming something that interests you - so instead of asking us for ideas and getting 400 bitter responses, ask your students what they would like to do! What interests them? Maybe there's even something that they could create that your school could put to some use.
Food for thought...
Like many people in AP cs, I'm sure that a lot of your students know already that they are going into other fields next year in college. Use their interest in other fields (bio, engineering, etc) to help you keep their interest in your class. Tell them to research a problem in their proposed field (should not be hard, there are plenty of books on algorithems in Pascal/C++/Fortan for scientists) of study and solve it with a program. If you're lucky they'll learn several valuable lessons from this such as:
1) computers are NOT fast enough yet to be a sloppy programmer. It's easy for me to overload almost any pc solving even a trivial problem to a few decimal places using efficient code.
2) that precision is an always present struggle. In some programs I have had to keep more than 10 or 12 places to get a solution within 5 sig figs.
3) maybe the field that they want to go into is wrong for them. Better to find that out now than their 2nd or 3rd year in college.
4) it will give them experience reading code in one language (i.e. Fortran or some other non-object orientated language that is commonly used by scientists) and recoding it in another.
5) the final write-up that you have them do will HAVE to be clear since you are not an expert in every field and may not understand what they are trying to achieve, what problem they are solving, why, or how.
6) they may discover a better way to do it. This happened to my roommate and me while writting a simulation and it was very exciting and challenging since we were the only experts on the technique.
One of my most useful and fustrating classes in college was computational physics for all of these reasons and more. I'm sure that they will enjoy it.
A 3d modeling or animation, project would be great for high school students. 3d modeling helps students learn to visualize artistic and geometric ideas. It can also require allot of math, and physics (especially animation). And I know it isn't above anybody's abilities, because I'm 17 and I've been doing it for years, I even taught my 10 year old brother. The problem of expensive software is easily solved, thanks to blender (mesh modeling), rhino 3d (nurbs modeling), and the soon to be released 3ds gMax (mesh, patch, and animation).
--
Get your class some hardware exposure! Have them build a piece of hardware and then write the drivers for it. The specs for ethernet devices can be found on the web.
Yeah, they're covered, but as a tool, and a little bit of implementation details. I found it a lot more interesting to learn about how they work mathematically, how you can implement different collision handling, etc. That's just an example. I mean, we learned sorts, data structures, but it was mostly on the surface, and never all the way down to "how would you impelement this yourself". Although I do have to admit that AP CS AB still prepared me for teh data structures class at a university VERY well. I just wish I learned all this stuff in high school.
-----------------------
Listen, strange women lying in ponds distributing swords is no basis for a system of government
I can still remember clearly my AP computer Science Classes from high school, and what bothered me was that the programs were mostly about text manipulation. Yes there were some more advanced concepts involved in the projects, such as hashes, etc. But they were given to us as tools, and we (almost) did not know how they worked. I found it a lot more interesting when in college I actually learned the implementation of things like hashes, and I dont think it would be too complex to teach in HS to those who are interested. And it would certainly be a lot more interesting than programming yet another "organizer".
-----------------------
Listen, strange women lying in ponds distributing swords is no basis for a system of government
An artificial life project of some sort would be interesting. This has been done before, of course, so they'd could research how it has been done in the past.
Go map a portion, or all, of the school with something. We tried doing it my senior year with Quake. :)
I don't know what exactly you should do - I don't know your students. However, I have, from previous experience in an AP CS class, some suggestions:
;-). We had wrestlers in our class who were only interested in looking at truck websites and had no idea what was going on: get kids like this out of the class.
1. Design is important, but not the entire focus of the class. My teacher last year had us do excruciatingly long design papers: he required a 'problem statement' for "Hello, World" (Really!). When we got into a few hundred lines of code, the design statements would reach 10 pages, and he still wanted more. This simply turned off the kids to design, and led them to extrapolate the design from the code.
2. Make the class fun. If kids are playing games, don't ban those games: they'll just hate you. Instead, show them the source for Doom or Quake. If they're interested only in browsing the Web, show them how to create a Java chatroom or a database in MySQL and Perl/PHP. Above all, keep them interested in computers and CS.
3. If there are kids who seem to be hopelessly lost, help them to question if the class is right for them. It may be they simply have trouble with a certain part of the curriculum, or they may be better suited in an art class
4. Demand working code. In our class, people passed without ever turning in a single working application. When the AP test was over and we went to Windows programming, we were encouraged to design only interfaces! Don't fall into this trap: demand working code if the assignment calls for it.
In case you were wondering, my teacher was a former design consultant. He was actually hired for this reason! (Ugh!) One student passed the AP exam. I left with the same knowledge that I entered with. The class was, quite simply, a waste of time.
That's it. I'm no longer part of Team Sanity.
How about having the students write a small text-based web server? At it's most basic, a web server is a really simple piece of software (if you're just talking about serving static pages).
That would be a pretty fun project, and hey... the web IS pretty darn relevant in today's world, I think. ;-)
If network programming is beyond them, then just have them write a function/method/class/etc that "simulates" a web server...ie, pass a URL string to the function, and the function will return the appropriate http content.
This is also a neat project because you can add to it as their skills progress. "Project #1" could just be a function that simulates a web server and returns a static page (teaches them how to read text streams).
Subsequent projects could add things like more dynamically-generated pages via include files and URL querystring parsing, etc.
This project would give them a good understanding strings, file i/o, text parsing, and a good grasp of how the stateless client-server architecture of the web works. Damn, maybe I should be a teacher! :-)
OtakuBooty.com: Smart, funny, sexy nerds.
I remember that when I was at highschool, I somtimes found it interesting to write programs that did my homework for me. It's hard to work up much enthusiam for a project that doesn't serve much purpose. But something like an equation solver, graph plotter, or differentian/integration engine may have some appeal... and be sort of educational as well.
See King of the Hill for the current state of the game and details. They have a "MARS" engine available for download.
And may the best geek win!
John
John
I think AP Computer Science deals mostly with C++. What about teaching them some other useful languages, like Perl or Java/Javascript?
They might enjoy Visual Basic too [insert sounds of Slashdot readers gasping]. Since most of them are probably using Windows in High school, they might get a kick out of developing some nice, simple GUI applications.
Most people suggest doing games or improving existing ones. My suggestion is to take a relatively simple game and have them develop AI for computer players. The game can be really simple (simple cardgames for instance), but the challenge of having them compete against one another regularly (or constantly) would/could make it very popular. Or maybe AI for checkers? Very simple concept, easy to do basic AI for but really hard to make good AI for. Could teach them all sorts of good programming habits...
Black holes are where God divided by zero
mustn't say it... mustn't provoke my inner troll... GAAAH! HOW ABOUT A BEOWULF OF THOSE?!?!?!
Okay, got that out of my system.
Actually, a Beowulf wouldn't be a terribly good idea because of budget issues, but if you could find a grant you could get away with it.
How about something like a hardware emulator? You could try Knuth's MIX or MMIX systems, or maybe design your own or copy an existing chip.
How about hacking into Minix? The code is under a BSD license now and anyone can do anything with it.
How about getting SCO's Ancient Unix license and porting Unix V6/V7 to modern hardware?
How about some Lego robotics?
Just a few ideas...
/Brian
Hey, we could use another Napster type clone!
1) Try something they can do for pure hack value, i.e., just something that they can impress other Comp. Sci. people in college with. .02.
2) Go to www.sourceforge.net and let them pick out a project to watch/join in. Nothing is more exhilarating than to know that code your writting is going to real use (even if the project justs rejects it as not good enough - but you as the teacher should help them), not just text-book examples on loops and theory.
Just my
You are more than the sum of what you consume.
You are more than the sum of what you consume.
Desire is not an occupation.
I always thought it would be a great project for kids to program AIs for a game, and have them play each other. It could be something simple like rock-paper-scissor, or even something like checkers
Rock-paper-scissor? All that this would require is a simple call to rand(). IMO, choosing a random number from 1 to 3 doesn't really qualify as being "AI." Now checkers, that would be tricky. Given the time they are alloted/will spend on it, a HS CS student might be able to come up with a make-the-first-legal-move-found type of algorithm, but it would take (a lot of) extra time to make a good AI for checkers.
Back in my HS CS class, I wrote an implementation of Pong, complete with AI. This would be something for HS students to work on; it isn't terribly difficult, but there is more to it than is readily apparent. It would also help sharpen their mathematical skills (for example, by having to determine the angle at which the ball bounces off the paddle based on where it strikes the paddle).
=================================
I pledge allegiance to the flag...
of the Corporate States of America...
For that matter, the replication of hardware components, using software, is an interesting exercise, as it teaches computer architecture and programming. For a quick and dirty project, write a binary adder in C++, and componentize it for use with other components. Of course, you can't CHEAT and just add numbers, you have to implement the architecture in code.
This form of emulation is pretty interesting, and can get as complex as you would like...See the emulator thread from earlier.
What'dya mean there's no BLINK tag!?
DeCSS -- If kids from Norway can do it, why can't Americans? :)
I fear that we (as a society) are all forgetting how computers really work. Have them define a simple computer archatecture perhaps like the 8 bitters of the past. Then have them program a simulator for the computer. Finally have them write a simple program for the computer in machine code. I might suggest a 6502 as it's fairly simple. This project could be broken into several subcomponents so all the students would I fear that we (as a society) are all forgetting how computers really work. Have them define a simple computer architecture perhaps like the 8 bitters of the past. Then have them program a simulator for the computer. Finally have them write a simple program for the computer in machine code. I might suggest a 6502 as it's fairly simple. This project could be broken into several subcomponents so all the students would participate and progress through the various phases of design and development. If the design for the system was completed first, then the project could be broken into teams that have to work to the design spec. One could write the simulator, another the assembler and the third could write the actual code to run on the simulator.
Another great idea is the Tech Support team, or the Nerd Squad as I like to call it. We get a lot of free time and rather than waste it on homework...I mean...never mind ^_^ We rush about school fixing all the little problems that happen from day to day. It's a great way to earn suck up points with the teachers, and you get to learn a lot about Windows' many faults, and it sparks interesting new questions like, "How drunk were these guys when they wired this network!?"
Or if you're looking for the painful computer lesson, you could always do what my friend did for his AP CompSci final project, write your own operating system =D Good 'ol MattX. Made to run on the Mattalon processor ;) It even actually ran some stuff, though not very well. Really not much different than a Mac without a GUI ^_~
-VicBond007
------------------------------
I can only show you the door, you must be the one to walk through it.
One problem they had last year involved the volunteer timers and spotters that worked at meets. Spotters would say that the first three finishers were lanes 4-5-3, but the recorded times would have them finish 3-4-5 or something. Obviously, the reaction times of the timers were not good enough to ensure proper scoring of races.
My idea was to build a small computer that would act as a multichannel lap timer. It would need fourteen inputs-- Reset, Start, and two stops for each lane, one at each end, six lanes maximum.
I wanted to use RF links to the different remotely placed inputs to reduce the wiring clutter and raise safety.
My problem was at such a small school it was hard to get the kids interested in a hardware project like this. When I told them we'd be designing computers, they thought I meant buying a motherboard and slapping PCI cards on it; I really intended to choose a microprocessor (68306 was a good choice) and build a little single-board computer. Not everyone thought that this was fun :(
Good luck in your search for interesting projects!
Jeff
If you have the software available (i.e. decent graphics editing/creation such as photoshop or painter, and Dreamweaver or even Microshaft's front-something-or-other) I know I would have appreciated time to design and create a webpage in class. This also allows you to get into some java and possibly PERL as well. Other ideas including creating an online learning/gaming environment (i.e. a MUD or MOO). The core components are all freeware and not to tough to program. Students could create their own room complete with a machine of some type and an automated robot. Just a few thoughts.
-ParadoX-
'What's that?'
'I dunnow... lets hit it with a rock.'
if that was the most interesting project, i'd hate to hear about the others!
Personally as a high school compsci student myself, I've done all of those theory based problems which have no practical use what so ever. I think it's time that schools and teachers start enriching the curriculum by asking students to create something that has some practical use. For example, have them create a graphing program, a program that interacts with a database of some sort or even a mail client. Heck, have them create something as simple as a phone directory...atleast it will have some use!
I was lucky enough to have a high school comp. teacher who let us decide what kind of projects we would take on once we had proven to her that we could handle them. So after just a couple of weeks of the monotonous book stuff she would set us free on our own ideas. At the time my dad had his own business, which I had been working at since 12. He was also very anti-computer but was required to have an IBM by the manufacturer. So I set out to turn it into a useful tool instead of where I would spend my time playing pinball when there were no customers to help. I ended up writing an inventory program and a payroll program. They weren't much but they provided me with a great amount of programming experience in a real world situation. I wish my college professors would have done the same thing. I absolutely hated programming in college. I mean, as an engineering student how many times am I supposed to be interested in converting British and American currency? So many thanks go out to my high school comp teacher who had the foresight and knowledge to let us do things that interested us! She was truly an inspiration that lead to my becoming a software engineer.
I will probably be flamed for saying this, but look to some of the Larger Unix Vendors (SUN/IBM/HP) for hardware and software. Try teaching the students how to install and administrate an industrial strength *Nix system. I know for sure IBM has a good site at http://www.ibm.com/education. If you are looking for a cheaper solution, look at sun's website for solaris x86. Unfortunately at the present time, these would be better real-world preparation than linux
....There is nothing a Cattle Prod and a foot length of 7/8" satellite coaxial can't fix/
The one drawback is that anybody born after 1980 equates computer gaming with high-quality graphics, sound effects, etc. But I'll bet if you dredge up some of the old text and lowres games (Adventure, Zork, Wizardry, Ultima <=3) you'll spark some interest. This low-tech software has a big advantage over modern games: it relies on the player to supply some imagination. And isn't that what you're looking to spark?
Every project we had was independent which is fine for learning the basics of a language, but (as I've found during my internship this summer) completely useless for real world programming. Something I would really have like to have done in class was a program that had to be done in several sections, each done by a different person. This way, students can get experience in how to communicate in a programming project, and how to define and stick to standards.
Freedom's just another word for nothing left to lose
Have them do a Project/Research paper on why linux is better than windows. 'Education will never become as expensive as ignorance.'
You may also want to try this:
Exploring the Link between Real and Virtual Experiences in the Classroom with VRML and 3D Modeling
Hope this help.
============
Mathematics will always come back to hunt you down, in so many ways
Have them choose an open source project they might find interesting like Mozilla or one of the Apache projects, and let them choose extend whatever way they want. Something visual is always good for people learning how to program as then they can see the results of their labor.
Either focus on software development/project skills (have the whole class produce a product, from initial idea to requirements to design/tasks to implementation to testing), or focus on individual programming skills. For the former, pick a very small project idea whose end result might be something that would be interesting to the class (a game, some network utility, or maybe an eggdrop chat robot).
s /pc/mar00/mindmenu.html). This is a variety of the classic "Robot Wars" design contest and would probably be one of the best ways to introduce beginners to the concepts of programming (caveat: I haven't played MindRover, but it seems to be getting good press).
For the latter, consider some form of "gladitorial" programming, where the students write software that competes directly against one another. The old-school example of this is CoreWars (http://www.koth.org/index.html). If this is too abstract to get the juices flowing, maybe consider "MindRover: The Europa Project" (http://www.cognitoy.com) reviewed on GamesDomain (http://www.gamesdomain.com/gdreview/zones/review
-BbT
I think that it's important for students to receive the same rewards through practice programming that people who actually do programming for a living experience. Empowerment is a buzzword used far to often in educational curriculum guidelines, but if you can find a way to make the students feel empowered to do a good job on a project, they will learn more then you can teach them. Reflecting on my programming courses, I remember a teacher who I think demonstrated this very well. He went out to the community surrounding the school and asked if there were any small programming jobs that different businesses required. The response was exceptional; within the first month his classes had 15 different jobs that needed to be done. After teaching basic concepts of programming, students were able to tackle the problems, many of which required different levels of programming knowledge to complete, so he could assign different modules, or parts of the program to different grade levels.
rejected (19) accepted (0)
Is there a psychological term related to getting your stories rejected on slashdot?
I've been using SDL lately for my own project and it has a very clean and easy-to-use API for game programming, so your students wouldn't be overwhelmed by API complexity.
Granted, the kids wouldn't write every last detail of the game. Much of the internal machinery of the aforementioned Pacman was given to us and that was a good thing. But having your kids write something as simple as an object that plays audio using a callback function could work well as an assignment.
This could also be used to teach object-oriented programming habits. For each assignment the kids would get an interface for an object of the game that they have to write the implementation for. The kids' work could be tested by switching their object implementations with the teacher's implementation and seeing if things go wrong. By the end of the class one could theoretically take any combination of object implementations and compile them together to yield the finished game.
make them write a gnutella client. it's an open protocol, so in pass one just write a simple socket, in pass two write a gui, and in pass 3 multi-thread it.
shaolin punk, activist post-industrial
At the beginning of the year, everyone picked a project -- two misguided students teamed up to write an OS, I picked a chess-playing program, someone did a database, someone did a simple BBS, someone did a symbolic math package, and so on. There were few restrictions on what you could pick, although you were encouraged to pick a year-sized chunk of work that was reasonably useful from a real-world perspective. We worked on these out of class for the year; she tried devoting class to status reports, but that was mostly useless -- who wants to hear the status of someone else's project? So she started devoting class to random CS tidbits, in chunks of a week or two. The only tidbits that really stick in my mind are a couple weeks' worth of Lisp (with most of the class being us solving in-class Lisp problems, on paper or in the computer lab) and a basic introduction to hashing. The in-class stuff was basically killing time, though; almost all the grades were from the projects. I think there was the occasional class devoted entirely to question-and-answer, also, although the saintly Ms. Bunn handled most project problems outside of class.
As I said, this was the most amazingly cool CS education I've ever gotten. In the course of finishing a project, you were guaranteed to pick up a whole lot of useful crap, but you also had the sense that you were doing something important (as opposed to the "Todaay, wee willl bee learnning aabout graaph algoorithmms..." style of education), and it was cool as hell once the projects got to the point that they were actually functioning programs ("Holy shit, it's really playing chess!") Most of the projects were structured so that there was no real stopping-place, so there was no risk of running out of work -- when I announced that my chess engine was as good as I could make it, Ms. Bunn smiled and gave me a book that described alpha-beta search, which kept me busy for the next several days continuously until it worked, and then until the end of the year trying to make it better. For the BBS or the symbolic math package, you could just keep adding features. The OS, of course, was barely begun at the end of the year, but what had been written appeared pretty sound, so I think the kids escaped without too bad a grade. I think a couple of people actually managed to "finish;" Ms. Bunn just let them slack for the rest of the year, but I could see you handling this differently.
Anyway, my advice to you is to try to separate the kids who want to take a class on CS from the kids who want to learn about CS, and then do something akin to the above for the ones who want to learn -- some of them will stun you with how much they produce when you let them produce whatever they want. Keep the class pretty small so you can keep track of each student's progress pretty regularly, make sure the students aren't afraid to switch projects if the one they're on is too hard, easy, or unrewarding, and throw good, informative books & websites at them like Mardi Gras beads -- if a student hasn't done any work for a week, it's probably because he doesn't know a certain syscall or file format.
A few more project ideas, somewhat modernized from when I was in HS: An mp3 player ("You're done? Okay, now write the encoder."), a side-scrolling one-player game, a simple web server, a corewars simulator, a packet sniffer (they'll love that), a file compression utility. None of these are completely beyond the reach of a talented HS student with a school year to throw at the problem, but they're all "real" programs, such that when people do start getting them working, they'll feel like gods. They'll also have long since forgotten that they're learning.
Ok, I'll admit that I am still in high school, and I am actually going to be taking AP CS next year (10th grade).
Ok, with that out of the way, I would like to say this: teach them more than one language. I know that at my school, due to the small number of students interested in CS, they only have one small AP CS class that teaches only C++. Now, granted, C++ is a great language, but it would be cool to also know something like Python (for jobs that don't need all the speed and efficiency of C++), or Java, which I hear is very similar in concept to C++. But maybe I am misinformed.
Anyway, here is the link to my school's curricula for the AP Comp Sci course.
Friends don't let friends use multiple inheritance.
I think you should have the kids make a website that IPO's and generates millions of dollars for the school. Of course, that would probably be old-hat to them.
The anti-salmon
A neat project might be to build a client/server network from the ground up. Involving students in the hardware and software side of computing (including cabling) can be a lot more exciting than simply programming. Possibly give them a simple programming assignment to go along with it, along the lines of testing the network or interacting with a database on a remote computer. The first time I crimped my first cable and brought up the interface with a successful ping, I was hooked. I truly believe that programming lacks excitement until the network is brought into the picture.
Ditto plus WARGAMES
I don't know how acceptable this would be in the high schools, but the applications that taught me the most programming theory were casino games.
I managed to pull off Keno and Blackjack. They were a lot harder than they seemed. Keno required a graphical interface with the ncurses library that was probably harder than most menu interfaces you'd see, like pine or capt. Blackjack was a little easier, except programming in things like split, double down, and insurance, which was a headache.
My friend pretty much catapulted himself from novice programmer to experienced programmer in two weeks with Deuces Wild. Now that one was a nightmare. Not only did he become obsessed with randomizing and shuffling the deck, but the algorithm for determining the final hand was incredibly complicated. To make matters worse, he insisted on testing the thing on a 4 megahertz machine from about 1986.
Anyway, I've written a lot of worthless software, but nothing has been as useful later as casino games.
"Beware he who would deny you access to information, for in his heart he deems himself your master."
How about making a web site for the school?
I'm not certain at what level you are at, or what the students are capable of, but developing a web site is only as difficult as you make it. You could start by keeping the site relatively static and with minimal graphics. Afterwards, you could introduce Perl, PHP, mySQL, more detail on Apache or Linux, introduce security to the students. Whats even better is that the project could be linked with other classes and activities. For example, the graphic arts classes could do the graphics for the page, and the school newspaper could provide some content. The possibilities are pretty limitless.
"The words of the prophets are written on the Slashdot walls."
Mozilla could use some help.
"The words of the prophets are written on the Slashdot walls."
Try to get students to use what they're learning in math/physics/etc classes. Also introduce stuff that they might not know but can readily learn and experiment with using their programming expertise.
I recommend Neural Nets, Cellular Automata, Genetic Algorithms, Cryptography, Compression, etc. Basically the stuff you might find in an overview of Cybernetics.
Sound, sight and insight are all excellently rewarding results. (Graphics, music, etc.) Example: a project using a genetic algorithm for optimizing a collage theorem based image compression algorithm.
For exposure to large projects, don't start from scratch, but grab something with free source and modify it.
Congratulations on your eagerness to harness your student's interest! My experience with my High School CS teacher was far from what you mention. The interest for the top students was actually teaching the teacher to teach the class. Of course, it was all for not, and in the end the Grade 12 class was forced into illuminatus and Visual Basic. Not that there is nothing wrong with VB, it's just that three years of sorting programs (all using bubble sorts) and small games can get slightly dull. There was a way out: if we were up to teaching ourselves, and still did the class work, we could do what we wanted. The consequences: those of us who had the drive developed at great rates, the rest fell into spagetti code.
So, the lesson would be: push your students, push yourself, and above all look into what other classes your students are taking, and try to mix them into the work their doing. If there's something familiar in the work, and some goal that relates to real life, you have a good chance at grabbing their attention.
-Medgur
I think that the best incentive to do a project is to know someone will use it. The students and the teachers should identify the needs for the school/community and from there you could assign projects to fulfill those needs. Also keep in mind that you don't have to go and start doing things from scratch, the students could enhance/improve existing projects, like Mozilla, etc. and the project doesn't have to be strictly on programming, the students could design/implement systems for the use of the school.
the APCS site
:always taking a left turn is a fairly easy way of solving the maze. Depending on the system you're using, display may be the difficult part
A lot of these suggestions are great ideas, many of them things I wish I had done in highschool. However, most of the interesting ones are either way outside the curiculum, or too advanced.
The goals of APCS are learning the language (presently, C++, but in the past, Pascal), proper programming methodolgy, common algorithms (sorting, searching), and abstract data types. The intent is to teach a class equivalent to a first year college CS class.
Of all the ideas here, I think the one best suited to the scope and goals of the class is the implimentation of the virtual computer. Not only is it something that can take advantage of some of the idea learned, but it would help prepare them for future classes in computer arcitechure.
A few other interesting ideas:
- a maze navigating program
- the BlackBox: an NxN box with some number of mirrors (at 45 degree angles: / & \) inside it, into which, at any point around the outside, a laser can be shot in, and where it exits is determined. One the lasers are implimented, you can make it a logic game, or an AI test bed...
my sig's at the bottom of the page.
Have the students analyize the components of a modern operating system in depth. Have them each pick a part (C library, display subsystem, etc.) and analyize how it works, and possibly look at applicable GNU source and documentation about these issues. Each one should be able to describe their component(s), how programs interact with them, how they very based upon OS designs (graphics in/out of kernel, net in/out of kernel, etc.), and how they interact with other components. To test them, you should be able to give them a pseudocode program that exercises most portions of the operating system (graphics, sound, net) and have them each pass system "calls" around each other to execute the "program". I think that would be a lot of fun for a class like this.
Free BeOS, runs from a Linux partition
My friends and I used to program virtual robots in a primitive BASIC-like language for an old DOS-based game called 'Warbots'. It was very easy to learn, but complex enough to keep it interesting.
A far more advanced version was called, I believe, 'PC Robots'. It was actually an API that would let you program your robots in just about any language (it provided libraries for C, Pascal, and Assembler, at least) and allowed you to create very complex robots to compete in a large arena. It required a lot of attention to things like power management, navigation, and fire control. The competitive element really served to capture the users' interest, and spawned some pretty creative solutions.
There's always the old corewars type systems, but they're a lot more abstract and for many people not as much fun as watching their robots fight it out on screen.
A quick check of AltaVista returned the following URL that might be of interest. I don't know if it's related to the old PC Robots, but it looks pretty similar.
http://www.necrobones.com/atrobots/
There aren't that many realyl cool projects that can be done over a single semester. However...
I recommend a real-world situation. My high school teacher goes out every year and finds small companies that need a contractor, often dealing with databases. Although this is not very exciting, it does show the real world. Some people even had cool projects.
Another good thing he does is give a month for an independent study for teaching yourself a new language. It not only gives something to students, but he finds that it gets easier and easier with each passing semester as he knows the various languages more.
I know that I would recommend a number of small projects (5 or so) that could be put into a little 'suite' of tools. This can make students happy because they have a whole little slew of programs that are designed to work with each-other and encourages them to add to this once school's out.
However, your best choice is to do what is done in the last year at my HS. Give them a day or two to come up with a cool project. Then look at it and approve for content. Then give a week to 'storyboard' it. A good, concise description with a timeline, format ideas, you name it. This definitely works best. It also leaves less room for cheating (variety of projects) and encourages teamwork because people may have to help each other even if they're working on different programs, simply because one people may have more experience in one area than another.
Independent projects are the way to go. Make sure to give them access to Linux if there's interest. It's banned in my school board and it really limits ME. Don't make that mistake if you can.
This past year was my first at college. Of course, I had taken several years of CS in high school, done the AP stuff, &etc. When I arrived at college, I thought the intro CS course would be below me. I was wrong.
The course was taught in a language new to me called Scheme. Scheme is a variant on LISP. Scheme teaches you to do, really, one thing EXTREMELY well. That is recursion. I never thought too much of recursion, until I tried Scheme. In Scheme, all you can do is things with recursion. A neat project would be to have your class learn scheme, along with yourself. There are many online tutorials available, and Scheme itself is free. Best of luck!
--
Bad spellers of the world, untie!
I'm ashamed to admit it, but what got me interested in programming in C was a little game called LPMud.
I think we'd all enjoy a nice cold beverage. -David Letterman
Then you can teach the kids all about First Posts!
My next Slashdot post will be ready soon, but subscribers can beat the rush and see it early!
Check out this computer science curriculum: /.
http://www.stuy.edu/academics/compsci/ Stuyvesant is a public magnet math/science High School in New York City that's got a very well developed CS department based around the efforts of a guy they call 'Z'. During my short time there I never got the chance to delve into the CS classes but the kids are fanatically devoted to whatever it is that they do. The site hints at a lot of GNU/Linux open source training and developement, and the school is infamous for its hackers. Also, they're the only High School I know of that links to
ACM has a intercollegiate programming contest each year; here's an archive of old problems: Problem Set Archives. Granted that the question is for high school students, but there are still problems easy enough for high school students to do. You could also tweak some of the problems to make the easier. To do the problems, you could either assign them as homework, or better yet, you could run a mock tournament. Make teams of 3 students with one terminal per team and give them a few problems to do. This probably wouldn't work in a single class period, but I think it's fun as a weekend activity. Also, if you look around, some of the colleges nearby might run a programming contest for high schoolers. I know that those of us who go to the ACM programming contest from Miami University of Ohio, also host a contest for high schoolers each spring.
Interesting. I'll bet the administration thought that we were going to filter OUT the porn.
If they're AP, they should have enough Calculus/Algebra etc. to create a Doom like reality engine. Now if I was given that assignment in highschool I'd probably fail everything else just to finish that! But that's me.
Umm, I just wanted to point out that everyone that reads slashdot is not a student...I even graduated, nice one!
Put them to work on the Mozilla release. :)
I'd rather have someone respond than be modded up.
how about a new web browser - one that works well would be a good thing to teach them.
---
One of my favorite programs from schooling was a point of sale program. We had to design, code, test, debug, and sell the program to the others in the class. Mine was 16000 lines of code (including the comments.) It was a lot of fun.
When the bulk of class programs in school are just snippets, it was fun to tackle a large program. We were all given the same specs, yet the programs were vastly different. Some were ugly, some were slick. None were perfect though.
This could have been stretched out over several semesters to better include planning, and testing aspects. We had one semester to do it, and we had to fight to get it all done. I ran out of time on mine, so some obscure defects never got fixed and some reports never got developed.
The scope was the really nice thing. It was great to do a larger project than usual.
Send them over to the InfromIT Free Library and get them to learn one of those programming languages (I would suggest C - Sams Teach Yourself C in 21 Days, Fourth Edition is a good one for that). By letting them read the book themselves, they can learn at their own speed and if they forget something, it's easy to go back.
2. Coming up with different types of inputs. Someone at SIGGRAPH had a laser distance finder being used to emulate the mouse. Cost? $100.00 for the laser distance finder. Use a projector to display the computer's screen onto a wall, have the laser distance finder sitting in the corner. Break the beam and ta-da! Instant mouse positioning! I'm sure there are other ways of doing this too.
3. What about coming up with a new type of browser which decouples the graphics from the rest of the program so when you move from one OS to the next you just have to insert the new commands to do the graphics on it? Of course, this would mean creating a new type of browser also. :-) One which is based on a 3D programming language. 2D is, after all, just 3D with one plane always pointing towards the user/screen. Maybe call it BB for Basic Browser or PB for Perl Browser. Either way, the language should be really easy to use, non-OOP (because you are targeting a largely non-programmer audience), and should be able to support pre-compiled programs. I've been working on a similar thing in my spare time - but if someone else worked on a similar project that would probably get me more motivated than I have been. :-)
Have fun! :-)
Hey,
Do you know what I think would be cool? If my Information Technology class did simething like this. How about some I/O?
I'd go for a burgler alarm. Give the students some resources: computer, Simple IO (Think 'Lego Mindstorms'), and some detectio systems like window alarms. Do it in groups of, say, 4 people, self-organised peer groups. But let the better students bring in thier own resources, and have somewhere secure to store them. You know, things like movement sensors, RS232 to 8-bit converters, webcams, light beams, touch-sensitive floor panels, radio connections, web cameras, UPS, encrypted connection to an outside monitoring station, whatever. Tell them to trigger a big, red light when they detect things.
Give each student one room to protect. Then get the other student groups to try to break in without setting off the alarm.
Oh, and make all documentation optional.
That's my idea of fun. But then, I'm a geek.
Michael Tandy
...another insightless comment from Michael Tandy.
"Goodness me, how unlike the FBI to abuse the trust of the American public." -- The Onion
My recommendation is some form of a game (because that's what most kids that age are interested in if they're into computers). Any use of standard AP data structures or algorithms in a game is a good idea. It should show them how all of this boring stuff is actually applicable to something they love doing.
At that level, I'm guessing they're messing with simple sorting algortihms, stacks, queues, linked-lists...and possibly binary trees. Most typical game ideas won't work for high school students though. Obviously they're not going to have the time to write all of the supporting classes and routines to handle 3D data structures, so the idea behind the game has to be something simple. Unless of course Mr. Teacher wants to take the time to write an API for his students to use. A 2D tile-based game perhaps?
I remember doing a kind of Collosal Cave text-based game in one of my classes. An array kept track of the room data and you could explore the cave, moving from one room to the next, trying to find your way out. Expanding on that idea or doing something similar with the requirement that they have to use a certain data structure or algorithm in their code is probably the best way to get them going on something.
Another great idea is to simply ask them what they'd all like to do. Have them all submit ideas and get the entire class to vote on it. Then do a class project where they have to work as a team. Not only will you be teaching them how to program, but also social skills that they're going to need in the workplace. Let's face it, most geeks are socially inept and we're known to be difficult to deal with in the workplace because we don't have the skills to properly communicate with co-workers.
The USA Computing Olympiad organizes four high school programming contests throughout the year. These are used to select fifteen finalists and eventually a team of four to represent the US at international competitions. Contest problems have a wide range of categories, from graph theory to dynamic programming. You can see some examples of problems from past contests and the training pages, with a series of problems designed to prepare students for these contests at their webpage at http://www.usaco.org/. Even if your students aren't interested in competing, the training pages might be a good source for something to have them do.
I came across The Homework Reporting System on Freshmeat the other day, I forwarded the URL to my mother, she's a teacher and have been asking me whether I could hack up something like that. This one is based on PHP and MySQL. They have a couple of other nice things there as well. Point being, they could contribute to useful Open Source Projects.
Employee of Inrupt, Project Release Manager and Community Manager for Solid
A simple game might be in order.
:)
My second semester College programming course had us make a playable version of Othello (also known as Reversi) in Java that allowed the player to try and beat the computer. Not only was it challenging to get basic game mechanics to work, but the in-depth view of how an AI can work (very basic, just a recursive MinMax style algorithm) was both challenging and rewarding when it finally worked, and quite surprising when your own code beat the pants off of you
-subtraho
It's a great way to learn about a great operating system, learn networking, a bit of programming... heck, you could even get them to install a database after they get it working.
I'm currently building mine on a VMWare virtual machine. VMWare is pricey, but they seem rather liberal in extending their evaluation licences.
Cheers & good luck!
Have them write a program that assigns lockers to the students...or a program that accepts the measurements of band students and matches them to the best-fitting band uniform. That would save a band instructor a TON of work. People will love you....
The first academically useful programs I wrote were more instructive in an algorithmic sense: how to make a coffee machine give back the smallest number of coins, making that ever popular contacts or CDs list, etc. etc.
I think at this stage, writing good algorithms is far more important than learning the details of a specific language.
If you have any measure of electronics skills and a good crop of kids in the classroom (which they probably are, if they're bored), try building something neat with them.
When I was in high school, one of the things I built was a small computer.
Nothing fancy, all you need is an empty piece of Veroboard or some other prototyping bits (even Radio Shack has it), a Z80 processor, some RAM chips, and an EPROM programmer.
The part of the class that is good with their hands can assemble the computer and get the hardware done. (A few chips, none with more than 40 pins, it will take them a few classes, but not too long.) The rest of the class can punch in an assembly language program that you can provide on paper (find it on the 'net, or write something quickly), assemble it, then burn it to an EPROM.
From there, you can plop the EPROM into the hardware department's product, turn it on, and either have it work, or not. <grin>
And then there's other stuff...
When I was in high school, I built a small robot arm. It was controlled by my old TI-99/4A, which used to write information to the parallel port. I used the 4 MSB (most significant bits) of the parallel port's 8 bit byte to select a given motor on the arm, and the 4 LSB (least significant bits) selected the operation: Hold, forward one step, backwards one step.
Of course, used in this manner, I could have controlled a lot more motors, but my technology at that time was primitive!
Feedback to the computer on arm position was done by using the keyboard. When the arm reached one limit or another, a switch was triggered, and that switch was in parallel with a key on the keyboard.
All the programming was in TI-BASIC, loaded into the machine from a cassette. I could make the arm do certain movement by "printing" a character to the parallel port. When the arm reached a limit of motion, the TI-BASIC "CALL KEY" instruction, which would test for key presses, detected it. A loop of printing instructions and then checking the values returned by CALL KEY gave it full feedback and allowed the robot arm to pick up objects without crushing tem, move them precisely, put them down, and even return to pick them up from the same place as it put them down.
Of course, there was no practical use to this setup, but it was cheap and easy to build: a few surplus stepper motors from old printers, a power supply, a homebuilt stepper motor controller. The arm itself was a drawer rail (allowing for in and out movement on one axis) with a piece of picture hanging wire on the shaft of a motor to turn the rail in and out. The gripper was made with Mechano and operated on another stepper motor. And there were pivots for the gripper, the base of the arm and the angle of the arm, all built with junk and stepper motors.
It was fun, and it was thoroughly useless. But it was something that my friends liked to play with when they were at my place, so I think a classroom might enjoy it. I wrote routines for it that would put pepper onto dinner, or ketchup onto a hot dog, even put a battery into a radio. Of course, all those things have to be in exactly the positions where the robot thinks they are, before it can manipulate them.
Of course, today, you could use an XT as a controller; you wouldn't need to worry about waiting for cassette-based programs to load.
Fire and Meat. Yummy.
"Hello World" :
Darn you Amokscience! You saw through my evil plan to hide the bad parts of the idea!
The first thing I guess I should say is that we did do other things in the course. There was an independant research project, a number of guest lecturers, programming assignments, and a lot of studies of other computer science related topics. Plus, AFAIK most classes come close to completing the big project (we needed another week at max). You mentionned this too, but I'm going to stress it again: I think that less than 50% of the class (or so) actually went into computer science related fields. It's high school, people are looking for credits to fill up their diploma. Not everyone's a CS buff.
The reason I talked about it the way I did was because I was trying to help the teacher who asked the question by putting a focus on the organisation of the project to make their job easier. My prof did point out in the closing lecture about how projects take longer than expected.
"Free beer tends to lead to free speech"
My OAC Computer Science course (OAC=Ontario's Grade 13) consisted of, among other things, a term-long project for the entire class, which was learning about how to, and creating, a full-blown application.
At the start of the term, everyone in the class applied to "jobs", with resumes and everything. According to what you applied for, and how you presented yourself (not necessarily your skillset), you got certain jobs. One person was chosen as the "VP" (the Pres was the prof), and had to manage a lot of stuff, as well as do some work. We had three departments: Coding, UI, and QA (whose job it was to make the coders and the UIs co-operate). There were department leaders, and then inside the deparments, if there were special task forces, they had team leaders, and so on. Basically, our prof tried to make it as much like a company as possible. It was a lot of fun. No class (to my knowledge) has actually completed the project, but it's the process that's important.
For me, it was really helpful to learn how to work well in teams, and how the real world operates. It was a lot of fun, and I think you learn more than doing games, or anything like that.
"Free beer tends to lead to free speech"
Anyone remember the Computer Recreations columns that used to run in Scientific American in the 80s? They were written by A.K. Dewdney, and every one had an idea for an interesting project. Sort of like the Amateur Scientist column they run now, but the experiments only require a computer and a compiler. I had lots of fun programming those things...
1st of all i believe slashdot should have an area for this kind of thing Teacher Resources, Computer Education...ect 1) Have the class write/type a small essay on what they believe hacking and hackers is about (Hopefully they don't watch MTV's True Life) After they hand in their assingment have them do some research i will list a few good keywords (no not AOL keywords..you dolt!) (a)Hackers Manifesto (b)Hacking Ethics (c)The Jargon Dictionary - http://www.netmeg.net/jargon/ (d)Hacker News Network (for recent info) (e)(anything else someone might add in a reply that i mmight have missed) The next day have the class write another essay on what they think hacking and hackers are, as you should see (if they did their homework) a dramatic change in the way the feel towards the hacking culture should appear. 2) Though not an original idea a great feeling of accomplisment can be felt be programing your own version of PONG!!! After they are finished with this simple program tell them that for the next (insert time here) the class will be holding a contest to see who can make the most of their flavor of pong, have the judging of games done by students in your other AP courses to rule out voting for themselves. This type of contest should promote some unique innovation and creativity as the contest rages on and progress is made you should be pleased by the individuality shown in each game (if not these students are lacking skills needed to make it in the ranks of programmers, i usually see these are not problems with creativity but an intellectual / emotional burden on that individuals ability to express themselves freely, try asking them whats bothering them politely as possible) I allmost forgot to mention prizes for the winners of each class, i reccomend giving them some free time on the web (a class or so) and possibly stop the e-mail blocks (its invaluble sometimes to be able to access your mail while in school, i also reccomend you do this for your classroom only as it might create a problem with other teachers) To give me a job at slashdot e-mail me at: AthenEternal@netscape.net To send me comments or flames e-mail me at: AthenEternal@netscape.net
This could be a joint project between electronics and Computers. take a cheap radio controlled car, strap a wireless camera to it (X10.com has one cheap), and a video capture card.
you would then need to take apart the remote control transmitter and interface it to the parallel port (pretty easy), with only 4 outputs: forward, reverse, left, right
then, for software, you could write a CGI or a Java applet to view the image from the rover and provide simple controls to move it around..
Boy, if I had a kid they'd be winning the science fair project!!!
Here was my CS experience in HS.
:p )
:p
The teacher was just out of college and had tons of aspirations about how he was going to motivate and pass on all this great stuff he had just learned himself. So here's what he did. It's amazingly ambitious and really difficult to pull off without a good group of students who really want to learn, but it worked really well.
He split the class up into six groups of 4-5 people each. He set up six groups of workstations in the lab, one for the history of computing, one for hardware, one for databases, one for word processing, one for OS admin, and one for programming. The school year was split into six six-week periods. Each group was randomly assigned a number and so was each workstation area. At the beginning of the semester he sat the appropriate group down at their section area and showed all six groups everything he could about each of their areas, but mainly teaching them how to find information about their fields themselves, ie man pages and documentation. So now we have one group which were the "experts" on databases, one group of "experts" in programming, etc.
The next six weeks, we all rotated stations. The group which had been the programmers(and were still the programming "experts") rotated to the history area, database "experts" rotated to the programming area, etc.
Now the cool part began, the teacher just stood back and said, "Now, in addition to learning about the history of computers, you programming 'experts' are responsible for teaching programming to the new group. Likewise the history of computing "experts" will teach the history of computing to the programmers which rotated into the history area while learning about their new area." So for the second six weeks, the people who had learned about area 1 were responsible for learning about area 2 and teaching what they learned about area 1 to a new group of students. You wouldn't believe how this solidified our knowledge of each area. But wait, it get's better. At the end of each six weeks we had tests, and teacher evaluations. The "learning group" at each station would take a test that the "teaching group" made up. And the "learning group" would write evaluations of how well the "teaching group" taught.
I have a feeling this won't come across very clearly, so this may help.
A student may have a cycle like this, each numbered event lasts six weeks.
1. learning Programming, teaching nothing
Take test on Programming
2. learning Database, teaching Programming
Write test on Programming, take test on Database, get evaluated on how you taught Programming
3. learning OS, teaching Database
Write test on Database, take test on OS, get evaluated on how you taught Database
Winter Break
4. learning Hardware, teaching OS
Write test on OS, take test on Hardware, get evaluated on how you taught OS
5. learning History, teaching Hardware
Write test on Hardware, take test on History, get evaluated on how you taught Hardware
6. learning Word Processing, teaching History
Write test on History, take test on Word Processing, get evaluated on how you taught History
So, they wouldn't get a chance to teach Word Processing, but everything else they would have had experience as both a learner and a teacher in. Typically the teacher would step in during the last six weeks and help make that section of the course more comprehensive to make up for the fact that the currently learning groups woudn't get experience teaching that particular area.
In addition, there were all kinds of real world things happening here, real hands-on stuff. If a hard drive failed, turn the machine over to the hardware group and let them fix it. Then give it to the OS group to get re-installed so it's back up and running. If some naughty boy wrote a startup script(autoexec.bat typically, old DOS systems) which taunted the user and locked up the computer, the current OS group were required to clean it up. The history group was required to keep up on current news on the computer front, new hardware/software releases. The more static fields like Databases or Word Processing weren't as hard pressed to keep up with stuff, but they had to as well.
Grades were a function of how well you did on the tests, how well you wrote your tests, and your evaluations. We also did group evaluations for our other group members so we could deal with slackers who never helped make up tests or left all the teaching to the others. It was very fast-paced because of all the stuff we had to do, but I think we rose to the challenge very well. Myself and another student even came up before/after school and helped the teacher build a LAN connecting our lab and the school library so we could do library searches from the lab. This was very useful the next semester since they could read about a reference book online and then check the library for it, reserve it and have it by the next class period to help teach from.(that seems to be the story of my academic career, all the cool stuff happens the semester after I leave, and usually it's me who makes it possible for the cool stuff to happen in the first place. In college I built a couple webservers and a Beowulf cluster that I never got to use and they ran fiber ethernet connections to the dorm I was in the semester after I left
If I were going to do this today? I'd have the following groups
Hardware
Programming(the most current language you can get your hands on, Java, Perl, etc)
OS (seriously, it's sad how many people in CS 101 in college don't know how to use the system)
Networking (both internet and LAN, basics of IP and LAN types Ethernet, Token Ring, etc.)
Office type apps
Databases(RDB theory and SQL at least)
Steven
This post would have been a lot cleaner if stupid slashdot didn't strip all my whitespace down to a single space. I had to completely re-format what was originally a table-like structure about the cycle of a student in a class.
-- I have marked myself unwilling to moderate-- I don't have other accounts to artificially inflate the karma of
Kids always like robotics.
http://www.robotprojects.com
-Scott.
Take what they already like and add the programming part to it.
Cognitoys makes a game called MindRover that is a 3D strategy/programming game. You get to program the intelligence of robotic vehicles.
-Scott
When we had this problem at a school I helped out at I set tasks for the kids to program 'fun-but-useful' CGI programs. This had several advantages: 1.) Kids were interested because they saw it as 'internet' based, althought they were only actually using a small intranet 2.) Kids gained experience using a Linux shell 3.) Kids learnt Perl. I was actually astounded at how quickly basic perl can be learnt, in fact alot of the children had no problems with regular expressions, even getting into contests as to who could write the most subtle reg exp for a task. 4.) Kids could take what they had learnt into a real world job. I have to stress that these were not geeky kids, and this was not a computer club. This was a plain and simple Computing class that was crying out for something different from the usual mix (in the UK at least) of Comal and Vis Basic. The kids of all abilities loved it and many continue to enjoy computing because of this real-life experiance. Some suggested projects are: 1. Online 'statistics' generation pages 2. Online diaries, comments boards etc 3. One student made an online C compiler (see dangray.org The most important thing we found was not to give meaningless tasks. A program has to be something that a pupil wants to write. Hope that this helps Dan. dan@dangray.org SCAR - The Linux / UNIX Script Archive
High Scholl always have a lot of old computer, time to make it work. So you can do a - Linux Cluster - Distributed computing - take a big server (486) and make a X-windows network (with 386 for x-work-station) -
Ceci n'est pas une Signature !
What about starting and administering a school Slashsite? Code available HERE!
Keeping
"Fuck"
"Fuck" does NOT stand for "for unlawful carnal knowledge" or "fornication under consent of the king". It is not an acronym for anything at all.
It is a very old word, recorded in English since the 15th century (few acronyms predate the 20th century), with cognates in other Germanic languages. The Random House Historical Dictionary of American Slang (Random House, 1994, ISBN 0-394-54427-7) cites Middle Dutch fokken = "to thrust, copulate with"; Norwegian dialect fukka = "to copulate"; and Swedish dialect focka = "to strike, push, copulate" and fock = "penis". Although German ficken may enter the picture somehow, it is problematic in having e-grade, or umlaut, where all the others have o-grade or zero-grade of the vowel.
AHD1, following Pokorny, derived "feud", "fey", "fickle", "foe", and "fuck" from an Indo-European root *peig2 = "hostile"; but AHD2 and AHD3 have dropped this connection for "fuck" and give no pre-Germanic etymon for it. Eric Partridge, in the 7th edition of Dictionary of Slang and Unconventional English (Macmillan, 1970), said that "fuck" "almost certainly" comes from the Indo-European root *peuk- = "to prick" (which is the source of the English words "compunction", "expunge", "impugn", "poignant", "point", "pounce", "pugilist", "punctuate", "puncture", "pungent", and "pygmy"). Robert Claiborne, in The Roots of English: A Reader's Handbook of Word Origin (Times, 1989) agrees that this is "probably" the etymon. Problems with such theories include a distribution that suggests a North-Sea Germanic areal form rather than an inherited one; the murkiness of the phonetic relations; and the fact that no alleged cognate outside Germanic has sexual connotations.
AHD = American Heritage Dictionary
Keeping
Or, pick an open source project(s) and get the kids to develop one of the "it would be nice if" features....
"I have been around the world and found that only stupid people are breeding" -- Harvey Danger
Don't let the high school programmers decide what to do, let the student body choose what they want the programmer's to do.
Metal shop could ask for a simple CAD program to aid in designing projects.
AP physics could ask for a RT physical modeling program.
etc........
An Education is the Font of All Liberty
An Ask Slashdot story on the same thing was posted Sunday March 26th.
http://slashdot.org/askslash dot/00/03/17/0023248.shtml
A good project would be to collect junk/unwanted and build a small beowulf cluster. Or build some large enterprise-size web/database application with clustering. have a cluster of web servers (2 or 3) and have it talk to a separate database server. Have the students do all their programming in perl or php.
If you want them to do something helpful to the community, try something from the unmaintained free software project. Or try to create a helpful windows tool.
At the high school level, I think integrating fun with programming will probably help future computer scientists a great deal. If you can pique their interests now, learning operating system design in college might not be so bad.
As for suggesting specific projects, what languages do you use, and what kind of things do your students find boring? That might get the ball rolling.
And on a personal note, I thought that creating a graphical output to the Towers of Hanoi problem was fun (insert geek jokes here), and it helped me to understand recursion.
Still, with a plan, you only get the best you can imagine. I'd always hoped for something better than that. -CP
If the kids are looking for something different, and if they can be trusted to complete work without massive supervision, I would let then loose on any project they wish. Two examples come up quickly. First, many textbooks for math and science have suggestions of problems to code. These can be done in a computer class for credit. Even if there are no explicit coding questions, there are many ideas that will allow the student to learn computer concepts. These problems range from trajectories, to derivatives, to statistical analysis of historical data.
Second, for the student who wants to pursue computer science, introduce other textbooks If a student wants to learn Perl, JAVA, C++, or whatever, a group study program can allow learning to occur. If the teacher does not know the language, group discussions and newsgroup question can introduce the student to the techniques needed to find solutions in the real world. If the student wishes a more abstract education, you can try books like the The Practice of Programming or, for the truly adventurous, The Art of Computer Programming.
Get them to design a new set of protocols for something fairly well-known, such as email, or maybe a new set of file transfer protocols
Then have them write a program in whatever language they wish that will provide basic funtionality for the protocol
A few ideas poped into my head. Being that I'm a computer science major still in college (almost done) maybe I can relate a bit. Most of my classes are still boring :)
:)
Anyway, I always wanted to learn more about the history and how things developed. Like why is Micro$oft so big? Where did linux start?
Aside from history, why don't something simple but has applications as well. Like web pages. These things can get simple and complex. Start off with basic html. Teach some java scripting, maybe some cgi and perl. Maybe even get some slashcode going. Maintain the school's web page and if they don't have one, make one.
If it's more of a coding level, why not make a teaching aid. Like a grade book program or scheduling assistant. It could be graphical (teach graphics, I'm a senior and still never did any graphic programing) or command line. Which ever you think is better for the level of the students.
Of course the real challenge is fitting it in with what the admin says is ok. That's always the hard part eh?
%blow
%blow: No such job
^how did the sex change go?
Modifier failed
if you taught them how to Port an application it might teach them more about the OS and Arch that they are porting from and to. I'm no expert though so don't take my word for it.
== www.FreeBSD.org == The Power To Serve. ==
The project that got me started programming for real was a graphical representation of sorting algorithms:
- bubble sort
- shaker sort
- shell sort
- quick sort
- etc.
The graphics could be student created, if you wish. What I did was plot the element's current list location on the X axis, against the element's value on the Y axis. Initial condition looked like fuzz. When sorted, it looked like a diagonal line.
This gets the kids learning algorithms, has some graphics, has instant gratification, provides insight into the workings of the algorithms...
BTW, the idea was based on an old 35mm movie of such algorithms. I believe it also included the famous "mouse traps and ping-pong balls" demonstration of exponential growth.
Good luck.
How better to get them to really think about the how a computer works?
Browser? I barely know her!
The /. admins would be grateful.
Browser? I barely know her!
It is encouraging to see that there are other computer science teachers out there (other than my own) who care about keeping an interest with students. Some projects we did included card games, puzzle games, and connect-the-dots games similar to tic-tac-toe. The year after I graduated, the CS department added another class which focused on Java and Visual Basic development. One suggestion I have is database interaction, such as SQL integration.
Another is to participate in an open-source project. It doesn't have to be kernel hacking, although that could be offered as an advanced class, but something that they can see in the real world. I still remember the sense of accomplishment I felt when I finished my first REAL project in class, a game called Connect Five. It felt really great to experiment with C++ to learn dynamic memory allocation and pointer handling almost a year ahead of time. I can't think of a better way to encourage that and put your class on the map that by participating in a real project.
One other suggestion is to use real tools. Obviously, most open-source projects are in Linux. I don't know what environment you are currently using, but the Unix environment is what is used at the University level, so I see a real need to familiarize your AP students with it. Get them used to using the GNU compliers, that is what we use at my college. If you are tied to Windows, make use of MFC. The value of being familiar with MFC in today's marketplace in amazing. It is an excellent way to reinforce OOD principles.
Again, I encourage you to seek out anything that will challenge your students and provide them with a real sense of accomplishment.
Free as in speech, free as in beer, or free as in lunch?
WWWPic2 mentioned here a few weeks ago. This would also include building the Picprog Pic programmer.
Or what about building the Flash Carts for Gameboy, mentioned here.
Do the students at your school use TI-8x calculators? If so, there's lots of oppurtunities at Ticalc.org.
I hope you find some of these ideas useful.
When I was in HS, I did a project w/ NCSA and the NSF on using AI (spec. BackProp Neural Nets) and video cameras for lip reading...That was pretty cool. It took like 2 years to do, but it was a lot of fun (and pretty hard, too). Of course, this was a while ago. I'm sure most students in HS today could code some AI w/out a lot of effort...
I made a php/mysql script that updated our daily bulletin... daily.. It wasn't anything too complicated, but it was enough to impress the staff =)
Teach them how to make a good porn site!
I am currently not obliged to divulge that information as it might compromise the agents in the field
If your students are learning easy languages like Visual Basic or delphi, writing an instant messenger would be interesting for them. This is software that they use, but probably regard as being difficult to make. When all they have to do is set a few properties, they will be pleasantly suprised. And considering that they will be programming for the internet in any case ..... -John.
I know several TA's for some of the upper level computer science courses here at my college and I as well am a TA for the introduction course. There are some things I hear them stress over and over. Debugging I don't know much about the AP curriculum. However, one common problem is that many students (at least at my university- which shall remain nameless) do not know how to debug programs effectively. If this seems like it isn't a problem with the class you may still want to stress this finer point with them because information does become forgotten over the summer. This is a skill that they will be able to use with any operating system, language, or programming interface. Effective debugging will also help to save them time as they write larger programs later.
Real men never use microsoft.
Isn't is simple enough to figure out? Linux bites. Windows 2000 RULES THE WORLD!
Long live Microsoft!!!!!! Squash the Penguin!
Mike
Mike
http://www.datalinknet.net
One idea that might be interesting (for a week or so) is a compatibility test in groups. I base this on personal experience: it happened to be the most interesting thing my class did in my senior year. Have groups of three-four students each design their concept of an interpretation program for a popular "compatibility test." For those who haven't had it done to their school, the idea is many surveys (all the same of course) are given out en masse to all students. Whoever wants to, returns the surveys, with their name written and multiple-choice answers circled. The distributor of the test checks the answers (by the program) and returns the best matches (based on same answers) for each person who submitted a survey and paid the fee (oh yes, this can be profitable as well, you budding capitalists ;) ). Some great ideas come up, e.g., ways to handle ties in compatibility (I like the way mine handled that best, see below for link to my C++ source), Top Ten lists, and even incompatibility tests.
;) ;> (but watch out for those 0% results...make sure the survey is big enough.)
All in all, a great exercise in array manipulation and pretty fun to play with too. Can be whatever you make of it.
Go to my homepage at www.markpatrickmccartney.com or just download the source.
Some of the concepts I used that might be fun to suggest, for those who hate scanning source (I'll admit it, my programming style is not what it should be...):
- a random data generator, for testing purely random surveys
- ties for compatibility, i.e., what do you do when everybody is 0% compatible with this poor person, or when there are ten matches at 45%, and you're usually displaying only five...
- Top Ten Most Compatible lists: who are the Computer Class Sweeties (and/or dirty rotten cheaters)
- Incompatibility can be fun!
"I may be quite wrong." - Socrates
If your class is more research-oriented (check my other comment for a more language and programming skills-oriented project), you could go with a project like I did in my senior year. A simulation using basic planetary physics (Newton's Law of Universal Gravitation) of the motion of the planets. Once I constructed this simulation, I tested Kepler's Laws of Planetary Motion against newer methods to see if good ol Kepler was right ;). Of course he passed with flying colors. Check my web page (I'm in the process of adding this) or download the source I used. Or, for those who like to see the results, download this file for the final program (use "Kepler" for the password: extract and run univgrav.exe with the bgi files in the same directory).
Sorry if this was a little obscure: keep checking my web page, this article piqued my interest. I'll put up a page dedicated to my research in my senior year soon (by August 4).
"I may be quite wrong." - Socrates
I took that class my senior year of high school. That was when they were still teaching Pascal, yuck. The teacher was not up with the times or the software we were using and the system administrator was clueless. In a lot of respects, that class was awful, but hopefully yours is better. Since our class was also an IB class me and a friend took the opportunity to do a project in C. We designed a basic 3D engine that could display wire frame models and allow 1st person movement. That was fairly interesting.
Another possibility, and this is from a university course I recently finished, is that you could have a group program a simple AI. It doesn't even have to be able to play a two person game as long as it solves a simple puzzle from a random state.
These projects may seem ambitious, or maybe not. I'm not entirely sure. There are a couple of things I think you should keep in mind though. If your comp sci class is anything like mine, then your students are at greatly varied abilities and so there will be no one project suits all solution. Perhaps you should have students propose ideas. Just try and make sure tasks are delegated according to personal ability. The other thing I think is that people should learn to work in groups. For some reason people still have problems doing groupwork well into their college years.
Whatever you do get as much feedback as possible from your students. Make it as open as possible. You should have input from all parties concerned; after all, it is their education.
A couple parting thoughts... get a book that can serve as a good technical reference, otherwise people will hate it. Also, if there are students whose knowledge is already beyond the scope of a lecture, just let them get straight to work. That'd allow them time to work on larger projects more suited to their abilities.
Fon2d2
Freedom of choice is what it's all about baby. Have each of them pick a programming language they haven't yet worked in. And write a program of sorts which takes advantage of some of that languages unique features. I did this with perl, and made a LaTeX spellchecker, it was actually more fun than it sounds.
"Please, how about a little less love and a little more common decency?" - Kurt Vonnegut jr.
Picture this:
A kid is strapped to a chair. His mouth is being forced open. First he is fed raw ground beef, with the feeder nearly sticking his whole hand in the kids throat, forcing the food down. Then a mouthful of flour, some salt, a piece of lettuce, a piece of tomato, some kethup is squirted in, a little water. "Did you enjoy that hamburger?" Hmmm... he doesn't seem to like it. "Anybody have any ideas what I should feed him? Something he might actually enjoy?"
Well I got news for you. ITS THE WAY YOUR FEEDING HIM THAT HE DOESN'T LIKE!!!! YOUR ACTUALLY TURNING THE KID OFF FOOD!!!
How about a project that is true to life? I have a lot of friends who don't just do their own coding, they have to mess with the code that others long before them wrote. Why not write up (or find) the source for a program youself, and give it to your students. The task would be to add feature X, fix bug Y, and see who can rewrite the code to run fastest/be shortest/have more complete and correct comments. This might be a good way for them to learn how someone a level or two (or more) higher than they are would approach a problem, which could facilitate faster learning.
If you really want to frustrate/challenge them, give them the source code to something in a language they don't know (maybe Perl, or Java) and ask them to figure out what the program does. This would only work for really keen students, not for those who get frustrated easily.
Mr. Ska
In highschool, most of the programming that we did had to deal with databases. I remeber my 10th Grade QBasic final was making a database for a car parts company. We were provided a file that had thousands of parts, prices, and details for a variety of products. We were given 2 Weeks (that's 10 days X 80 minutes per class) to develop the program with a partner. The teacher set goals to accomplish. If you could meet this criteria, you would get X% for you grade. For example, if you could get your program to list the parts in order of part number, you would get like 60 percent. If you can have it break down the products into categories or by price, you would get about 70 percent. 80% if you can add items to the database. It was possible to earn 120% for making a program that had some sort of a GUI , multiple search options (part#, name, description, etc.), and meeting all other requirements. With about 13 hours in class (and a few at home) to work on it, I was able to meet all requirements to get 120%. Doing the database was much more thought provoking than having us make games. With the games, the students would often make something simple, then dress it up with graphics. The database required us to really think how to do things. I think I have a disc laying around somewhere with the program on it, I'll try to find it and post the program somewhere. It is really neat, it supports the mouse (thanks to some guy that wrote a QBasic Mouse Routine) and a keyboard if the mouse doesn't work (the routine will not work with some mouses). Databases management programs are the best things, in my mind, to have students develop because of the creative power that it requires.
--- At my sig, unleash hell.
Nothing wrong with teaching students to write good, relatively clean Perl code before they get corrupted by the macho-ism of obfuscation.
Korinthe (who wishes "machisma" were a word)
I wholly endorse the group-project model... working on a team to do something besides drug-trafficking-in-south-america social studies reports in high school would have been nice. :) i like to think that you learn a different kind of teamwork when coding, too, what with speccing out the interfaces between components. It teaches design-it-right-first pretty quickly.
My high school had a few computer courses: keyboarding, spreadsheets, and something to do with VB, i think. this was only a few years ago... and they also had students for LAN administrators. It was a bit of a shock getting to college and discovering how intensely prepared some other people in the CS dept. were.
So, yeah... learn the basic data structures and algorithms, but do it in a fun way. Eliza is a pretty easy and fun program, and students can make it as "smart" as they wish, without changing the underlying structure of the program too much (and thereby making it take longer to grade).
Good luck!
- Not everyone is interested. Sorry. There will be a good portion of the class who will complain about anything you do.
- Let students do things on their own - those who have some experience, give them some lesser admin rights, let them download and just PLAY with a new compiler. They will be able to guide you to some new things as well.
- Don't teach out of a textbook! Know the stuff better than the students, and guide them yourselves.
- Yes, I have real ideas. Open-ended projects are good. Make a HOMEPAGE for instance, including finding a place to host, and making it as spectacular as you can. If it's a programming-oriented course, perhaps some simple games. Spend half the time each class teaching concepts, then let them try and apply them to a project.
One other note - I know it's hard, but if you have hardware, let some kids with the serious interest do some admin. In my second-to-last year in high school, I rolled out a new lab the school was building (which me, and the teacher, pronounced dead cuz of the recalled hardware, but they transferred him and used it anyways, but by then I'd not associate with the department anyways)What level of comp sci matters a LOT. I'll answer assuming intro classes, because that's probably hardest. While ideally the program should be entertaining to write, one step is to make something that is (at least somewhat) entertaining to use. Programs that play some game are good. In some sense, however, these don't emphasize basic concepts, like sorting an array or whatever, but they can instead emphasize things like algorithm design, which is at least as useful, IMHO. For example, a program that plays tic tac toe, while theoretically simple (we all know how to win this one, right?) can require some thought to implement efficiently. So the assignment becomes, 'write a perfect tic tac toe program'. This requires so little CPU power, it should be a requirement that it run very very fast -- but it won't if you don't put thought into it. Also, some kind of contest is a good idea. There was a piece on Slashdot a while back about a RoShamBo (rock/paper/scissors) contest, but that more emphasizes game theory and the like than programming. perhaps something like battleship or 3D tic tac toe (4x4x4, get 4 in a row). I think interest often has less to do with the program being challenging to write than haveing there be a purpose to the program. No one will be able to convince most students that there is any reason to sort this array using that algorithm; But if it does something, that's interesting. Conway's game of Life is also good, and fun to play with when you're done.
---
One suggestion I have for a VERY complicated programming project is a bot for the hugely popular AOL Instant Messanger (or you could even port it to ICQ...). However, this bot should be able to use AI to intelligently respond to questions and such...I am thinking of a conversation like this:
...
Questioneer: Hello.
AIMBot: Hello. My master is not available at the moment, but feel free to talk to me, an artificial intelligence!
Questioneer: Alright. So where is your master?
AIMBot: My master is using the restroom.
Questioneer: And when will he be back?
AIMBot: He should be back in a few minutes.
This is just a sample of what is available with today's technology. And I know someone who is currently working on something like this...check out the AIM screenname AIMPerlBot, and you will actually be able to talk to the work in progress.
But this is just an idea. Feel free to pick it apart...
Bigginal
go to www.osef.org we are a open source education foundation we teach in several differect schools and might have some ideas for you
How about a hunt the wumpus?
I did that last year in 10th grade in pascal and finished it in a week, because I enjoyed it so much. I spent the rest of the month (when everyone else was scrambling to finish) adding a god mode that let you do all sorts of quick wins, like cruise missiles, jump to any room, and infinite HP.
# debian/rules
Teach them Python! (www.python.org) It's open source, runs on everything (DOS, Windows 3.1/9x/00/NT, Mac OS, *nix, Be - even the IDE is portable), is easy to learn (took me two days, but I knew some C++), and is thoroughly object oriented. Some nice things: - object oriented - free - dynamic typing (no type definitions) - automatic garbage collection (no pointers) - no function prototypes - interpreted (no compile/link steps) - extendable (interfaces with C/C++) - readable (no block markers) - mutable arrays and lists - powerful string manipulation - function arguments are references (takes the place of pointers but easy to use) - integrates with TK for easy GUIs The Tk interface is really great--being able to program easily with GUIs makes programming a lot more fun. Also, = is not an operator so a lot of C/C++ bugs are impossible (ie.: if (value = 3) { dangerous statement; }). There are a lot of good books available now for Python too; not necessarily textbooks, but they could be used as them.
I too took Comp Sci AP in the eighties, and was bored beyond tears. I think a project that is fairly straight forward enough, and goofy enough interesting for that age group, would be to perform SETI like searches on various forms of random data. Of course, this leads to thoughts of encryption and cryptography, which are excellent vehicles for lesson plans. Students could write small but complete programs, that should incorporate all their AP skills in data structures, sorting, array passing, and the like, but not involve a lot of educationally wasteful GUI work. They could search TV static, temperature patterns, or just about any paranoid white noise source..
1. Recompile a Kernel 2. Each student a sysadmin for a day 3. r00t for extra credit ;) 4. Work a SGI into the budget 5. At my school, 5 years ago, I sysop'ed a BBS 6. Have them map OC3's 7. Disect a box (computer remedial class) 8. ascii/ansi art w00!
will work for food
You might also hand them a general problem with not too much details and let them create a solution. That's how it works in my engineering faculty: we have a vague problem and we create a solution ourself with minimal support from the teacher.
Avoid those kinds of "exercices" problem. Think of something that will take longer to do and more interessting. Situation where you have a lot of freedom to design your solutions are always interesting. Plus, you learn a lot in the process.
...was to write a unix shell. That may not sound so exciting but it was a helluva change from all the math problems we got. Mine wasn't too complicated - piping, redirection, job control but not scripting - and totalled about 1700 lines of not-so-streamlined code (although it can be done in considerably fewer lines).
The nice thing about this project is that it teaches the gritty parts of c (system calls and such) but can be easily broken up into smaller parts (parsing, piping control, job structures) that aren't so hard to understand by themselves. This aspect makes it good for a group to work on as well. Just be sure you have some expendable developement machines. FOR loops, fork(), and Murphy's Law don't mix too well. (our server crashed few times right before the deadline from infinite forking loops).
This may sound like dull systems programming but its the only project that kept me interested the whole semester because of the challenge.
No brain, no pain!
These days, if you want to do this sort of thing, you can use the lego Mindstorm. For those who don't know, lego mindstorm is a kit that comes with a programmable brick. The brick which requires a PC to actually develop the code coordinates various motors and sensors. Its a bit pricy, but very fun. The programming language may be a bit too simple for your students, but there is a version of C ( kinda ) that you can get for down load. Slashdot also reviewed a book, "The Unoffical Guide To Lego Mindstorms.." that I would also recogmend. For more information about using lego Mindstorms in the class room, I suggest you contact Dr. R. Belew of UCSD dept of Computer Science. You can find him here: http://www-cse.ucsd.edu/~rik
I took the AP AB C++ course two years ago. I already knew just about everything taught in the course, and was mainly looking for a fun class after the Latin teacher left :(
:)
My feelings on making it "fun" are firstly, be a good teacher!! The teacher I had for AP CS (and also AP Physics, and also network administrator for the entire school system) is one of the coolest teachers I've ever had! With a mixture of puns, other bad jokes, and unbound enthusiasm (at times jumping around the room!) he made that class incredibly fun.
Beyond that though, pick fun projects. The BigInt/LargeInt is required, and isn't really fun unless you like that sort of thing (I do). One project we did that EVERYONE loved was called "animal guesser". Build a tree of questions and answers so you can eventually have "conversations" like
Is it a mammal? N
Is it a reptile? Y
Does it have a shell? Y
Is it a tortoise? N
Is it a painted box turtle? Y
It's a painted box turtle!
then add functionality so you can add questions and animals. etc and then with save/load functionality, some of the guys had trees that were like 30 levels deep. They really got into it.
Another really fun project was the calculator. We built a rudimentary compiler that could perform arithmetic, with variables, largeint's, etc. Very few (if anyone else) fully understood the way the calculator worked (it used a truthtable--I think the approach advocated by Crenshaw would be MUCH better for a high school class), but at the same time everyone was sort of like. "wow..." seeing it come to fruition.
One other thing--at the end of the year he let us do a final project that could be anything. I toyed around with dos mode graphics and asm which was fun, but then wrote a POP e-mail client. OThers wrote a chess game, another wrote a network chat program that borrowed code from Doom for IPX networking.
In short, the teacher got almost everyone motivated. He had a very large number of 5's on the AP exam, and a lot of 4's. People did well because he got them into the course.
of course some people will just never get into it--one girl fell asleep one day, the teacher got everyone quieted, slowly picked up this long and big metal rod and dropped it onto the hard, hard floor. BAM!! hahaha, she jumped up yelling!! It was so funny!! He and the other physics teacher also did that in their respective physics classes often. A truly great teacher
Scott
Not only is this genuinely useful (potentially anyway), but it can cover the whole gamut of techie issues from procurement (begging local companies for unused computers?) on.
Installation and network set up.
Some app development.
Maybe web/internet/intranet development.
User training and education.
System documentation.
You name it, some worthwhile outfit nearby could probably use it.
What's a sig?
I took pre-AP CS last year (pascal, some c++).. the class was composed of about 5 people who understood programming concepts on a high enough level to build that calculator program, and about 4 students with the math background appropriate to create that calculator program.
We had so few people that truly understood the math concepts, that they were stumped when we got to log and root functions in both pascal and C++...
Hopefully, this year in AP CS (pre-AP was a pre-requisite for AP), we'll have some half-way intelligent students, so that maybe we could do some interesting projects... (we had students writing pages of if statements, because they refused to use case of (pascal) )...
knowledge is power... power corrupts.... school is corrupting me.
I always thought it would be a great project for kids to program AIs for a game, and have them play each other. It could be something simple like rock-paper-scissor, or even something like checkers.
Just stay away from stuff like text-alligning, and obscure loops. Let them make games, thats whats fun :) Teach them how to use a database and they'll be able to get summer jobs.
Rattid
Thats the page of the contest.
http://ofb.net/%7Eegnor/iocaine.html
Thats a page written by the person who won last years contest. Random alone is not the best, and the valuable part of this whole project is figuring that out....
For one, lets assume that this is the usual school computer class, which teaches NO programming/computer science, at best it'll teach basic web page design... At worst, all it'll teach them, is how to browse using a Microsoft platform... (1) Since hardware IS relatively cheap, and most students will be able to get by with a Pentium 200 MMX, teach the students to BUILD their own systems, with used parts if need be... That way, even if the kids cannot find immediate computer related work when they graduate, at least they'll have the basic skills for assembling systems to build on... (2) Teach the students to construct systems around Linux... The reason for this is relatively self explainatory... After all, why does Microsoft (and previously Apple) donate hardware to schools? To make students dependent on their OS's...
Just because you can mod me down, doesn't mean you're right. Shoes for industry!
Sure, it won't work. But you'll be able to sell it to the administration easily. Best of all, you'll have no trouble finding kids who want to do research.
The real DunkPonch is user 215121. Everyone else is Bruce Perens.
A good source for concise, challenging programming problems is the archives of past ACM programming contests. Take a look at The Annual Berkeley Programming Contest. While during the contests, the only metric that matters is whether your program generates the correct output for the given (unknown) input, many of the problems raise issues that can be debated in more depth: what is the easiest solution to code? what is the most elegant approach? what is the most efficient? What are the strengths and weaknesses of using C, C++, or Java as the implementation language? etc.
When I was learning to program, my favorite source sof programming inspiration were popular math books, eg The Mathematical Tourist by Ivars Peterson, and the Amateur Scientist and Mathematical Recreations columns of Scientific American. I'd implement simulations of percolation; Conway's game of life in one, two, three dimensions; plot the Mandelbrot and Julia sets; iterated function systems fractals; simulating preditor-prey models; simulating the spread of a disease or forest-fire. Of course, all of that was on DOS using Turbo Pascal. Now that access to networked unix machines is so widely available, there are many new opportunities (eg, for network-related stuff) available.
Good reading material is a very important source of challenges, problems, and insight into computer science as a science. I'm thinking particularly of the famous Structure and Interpretation of Computer Programs, the textbook used in freshman computer science cources at MIT and University of California, Berkeley. The book demonstrates clearly that there are multiple approaches to problem solving, each with its advantages and disadvantages; SICP also convinces the student of the beauty and power of high-level abstraction.
-- TobinThen step them through the software design process.
1. State the goal
2. Decide what components are necessary for the program
3. Define specifications for each component
4. Write code
5. Test
6. Integrate
7. Test
8. Enjoy
Steps 3-5 could be split into different groups and done in parallel. (ie. you do input, you do output, you make a title screen, etc.)
This might be getting a little complicated for HS, and you'd need some functional programming skills as well as a decent language, but it would be a good team project and you'd have something interesting at the end.
If it's a big or competant class, break it up into groups and make several programs. (Competition!) The key is to keep it fairly simple so that you get a finished product.
-jlg
ps. use Debian! www.debian.org
How about a project where the student needs to establish a web based client server relationship. Have them create a message board similar in function to /., including user preference functionality. This could ultimately be beneifical for the school if your school has a internet site.
Power corrupts... absolute power is kinda neat!
One of the neatest projects that I had during my International Bacheloreate program for Computer Science in High School, got me hooked in the subject in College. Our teacher basically told us to write a program in Pascal(...**shiver** **shiver**)that demonstrated a basic knowledge of FILE I/O, Arrays (again..**shiver**), and memory managment. Granted this was a very basic project, it taught us how to use our skills in ways that would benefit our lives and those of others. Okay, so my Aquarium database/journal was not a Nobel Price for Technology winning project (IT SHOULD HAVE BEEN!), it still got me hooked in Comp. Sci and got me a phatty job after college.
Sig it.
Have them figure out and then code up some 'sploits for Microsoft Outlook. From what I understand its a big grade winner in some (here unnamed) schools. Plus it gives the whole world something to freak out about again if they "accidentally" send it on its merry way to the rest of the world.
If you wanna email me (god knows why) then take the money outta my address...just like the IRS
Perhaps the best class project that we did was with the apstack class. After one stack-using project, the teacher had the class take a look at the source for the stack. It was deliberately inefficient. The next project was to reimplement a templated stack class using a linked list. The project was probably the most interesting that year, as it forced the students to take a look at what was underlying their programs and how they could create a reuseable module.
One neat thing I did in my CS classes in high school was 3D graphics - and I mean in software. It's REALLY interesting to make a wireframe 3D renderer, and the matrix math required to turn 3D points into 2D points is not that difficult. We made textual data files, read them into linked-lists, and displayed them using graph.h; if you think they're up for the challenge, I highly recommend it. The other REALLY cool thing I did was neural networks. You can make optical character recognition really easily - the equations for simple backwards-propagation neural networks (an easy NN solution) are on the web, although they are hard to find. My NN was able to recognize 8x8 pixel characters it had never seen before with 98% accuracy after training it for 15 minutes. Cool stuff. Email me, and I might be able to point you in the right direction.
Put Linux on those teens and make a Beowulf cluster out of them.
I can't wait to assemble a Beowulf cluster out of these signatures.
Sam (a prof, for the rest of you) would agree. Our linked-list assignment was intended to be a mere exercise. The larger project, which never got off the ground, would have been more along the lines of what I'm describing...
- Rackham
"You can't protect anyone.... You can only love them."
- Rackham
"You can't protect anyone.... You can only love them."
I don't know about other schools out there, but my HS only taught Pascal, and later added a rudimentary C course. I would vote for teaching something like Perl or Java as well.
#include <sig.h>
Judging by the massive proliferation of IRC clients, `bots, ICQ clones and simple OpenGL FP shooters among entry level programmers, I'd say any of them would be an enjoyable forced project.
Um, uh.. Damn, I'll think of something after the hangover.
I'm a sophomore in high school and the same thing happened to me over the course of the year, even though I had an excellent CS teacher. Having learned all about binary trees, and all the other AP datastructures, I wrote an algebraic expression parser that builds an expression tree while maintaining operator precedence rules, and evaluates the expression. It correctly informs the user of malformed expressions, etc... Once this much worked, I took the project a step further and added variables stored in a hash table. My goal was basically to make a TI-89 emulater on the computer, and the project turned out to be quite challenging and interesting overall. You might try suggesting a similar project to your students near the end of the school year after the necessary data structures have been covered.
Programming is great, but it can also be very boring. What about teaching something with computer hardware/networking. I know some schools give Cisco, Novell, or Microsoft certification classes. Maybe you could have one semester of programming and one for hardware/networking. There are just as many network related jobs out there as there is programming. Plus if you come out of high school certified it would set up great job opportunities, which many students need to pay their way through college.
Well, in addition to technical knowhow, a good programmer needs an active imagination. In my highschool Computer Science AP class(C++), the normal routine was to teach us something painfully easy, then to give us pages of notes, then to assign us a project that was akin to "Hello,World" or "ATMmachine" for whatever we just taught. Well I used to complain about these types of projects all the time, and eventually I got my teacher to do a project my way. My way was that he would teach for a day, give us a lot of notes on it(to be read our selves), and then the project would be "Demonstrate what we just learned". So instead of him saying use a matrix and make a Seat Reservation Program, he would teach us matrices, and then just let us go nuts. Unfortunetly this failed completely, because nobody read the documentation and didn't know what to do. However, with students who actually like to use computers, or a *tad* more direction i think this could work. It would give the student a chance to use their imagination. minusthink.
"when life gets complicated, I like to take a nap in a tree and wait for dinner" - Hobbes.
I like the Java Tutorial. Java is an easy programming language to learn and allows you to do some cool things. The tutorial has some nifty little applets that can be displayed via the students web pages for their family and friends(big plus). Learning the Java language helps in providing a great foundation for computer programming too. The Java Tutorial is located at http://java.sun.com/docs/books/tutorial/
I took the AP ComSci course twice. I took it the course the last year when it was Pascal, and took the AP test that year and got a '5'. Then, the next year when it was C++ I was allowed to take the course over and still got credit becase it was different, and I thought that it would be helpful to me to learn C++. Because no one knew anything about it, and my teacher was also the baseball coach (He spent most days in the back of the room watching tapes of games or calculating stats. Sometimes he would yell short phrases of encouragement to us like "No GOTO's (in the QBasic course) or "Shhh! Fellas!" when we were too noisy.) We were on our own, and my friends and I began thinking of that class as "a dirty, dirty bitch."
But I do have a few ideas for how to handle the projects...
1) "No GOTO's!"
2) If the point of the class is to get you college credit, the projects should be related to what is going to be on the test. Which means no games, graphics or sound. Not that these things couldn't be incorporated in as part of a project, but it takes time to learn the commands and uses of graphics, which will be not used on the AP test. Time was really important for us, because none of us had ever used C++ before.
3) We had to do a lot of stupid programs about billing people at fake pet stores, and selling tickets at a fictional theater. Those were boring. If my CS teacher would have thought about it, he could have had us make a program to track his players' stats. We never did, though because explaining that would have taken more words than he spoke to us in the entire semester. I think anything with a real world application is better than the stuff they give you for exercises in the CS books.
4)The AP tests always came a couple weeks before the end of the semester. You could have the students do the fun things post-test. I think an Instant Messenger or games or AI are great ideas, they just won't be all that valuable on the test, assuming the test is pretty much the same as it was a few years ago. But it would be a very worthwhile and fun way to end the semester.
No GOTO's!
DumbRedGuy
Coming from a communications background into programming, I made what I now know to be a fundamental mistake. I focused on learning specific languages and NOT the fundamentals of programming. I've read that many schools still teach Fortran, not because they think it's going to make a comeback... but because they want students to focus less on the syntax and more on process and theory. Encouraging students jumping head first into C before experiencing the 'coding horrors' of a large project built on a sloppy code base. I call your local consulting company and ask them to come in with some 'real world' code to review. Maybe after seeing a 1,000 hard copy of a big project they'll say... "oh, now I see why..."
Why don't let your students do some scientific simulation on Mathematica. First, it is easy to learn. Second, it can let them to use Mathematica to simulate any simple science problem they like. They may end up loving sciences more.
try writting a program to solve the classic 'Towers of Hanoi' program for a variable number of discs.
If you're looking to an alternative to programming projects, a fun one is having your students build cooling devices for a computer. Although with the public schools the way they are, budgeting it can be a bit of a pain. If you try it, be careful... it can get messy.
*Splort*
This one falls into the "Questionable Legality" area, but here's what me and some friends did Junior year of High School: Played with Commander Keen Yes, that's right, although we did this in our offtime. We played the actual game (the first one) and then proceeded to try and understand how it worked. When all was said and done, we (a group of about 5) had a rudimentary level changer made, after tabulating what each hex value within the file might do. Most programmers will remember that the idea of alteration was what drew them in in the beginning - when you first saw Hello, World on the screen, you were sucked in by the sheer knowledge of being able to make the computer do *exactly* what you wanted it to. Granted, things grow much more for programmers from there, but for learning high school level students, a good place to begin is with something they already know, not just trying to fabricate something they don't care about.
For the last time, PIN Number and ATM Machine are redundancies!
When I was in High School we worked on graphics. This is one of the most rewarding projects to attempt in a comp. sci. class due to the fact that your work is viewable on the screen. Graphics are very fun and students will not get bored as rapidly as they would writing a database or a bubble sort.
I taught a bit of introductory OpenGL to grad students at UNC-CH, and now I'm recycling the lessons for a 14-year-old who I'm tutoring. He is a beginning programmer.
Most introductory programming books use console I/O because it's universally available. OpenGL is pretty nearly universally available, and lets kids jump straight into graphics (2D or 3D) and animation with a minimum of fuss.
Hopefully you could buy copies of the OpenGL Programming Guide to supplement whatever textbook you are using. It's an excellent tutorial for OpenGL specifically and 3D graphics generally.
Setting up OpenGL
opengl.org
hey i think u underestimate ur students, even though exceeding the assigned cirriculum might seem like a challenge for your students i think u raise even higher than that and try to start a company consisted of diff aspects of computer sciences, that i think would be the most rescoursful and useful project
Best thing to do, is make them feel as if they are doing something worth while. Let them analyse your networks, encourage them to try out simple hacks, then ask them to offer solutions as to how to avoid such attacks in the future. This is what I do for a living, and while these kids are young, you have the chance to instill some hacking ethics in them, ethics many young 'script kiddies' seem to lack. Plus, their work is being put to practical use where they can derive benefit from it.
If you can get a few Linux/BSD boxes, or at least dual boot a few, get a freely available message passing library (PVM, or an MPI implementation) and let the kids learn a little about message passing programs. Almost any algorithm gets a lot more challenging, and getting good performance gets harder still. You can add concepts like speedup, efficiency, and isoefficiency into the lectures. Kids can compete on performance. It's not that complicated, we've had some success working with a local high school and an 8 machine cluster here. Worst case, you can get a message passing library for Windows -- but I can't in good conscience recommend it ;) Dan ------------------ Dan Stanzione Parallel Architecture Research Lab Clemson (Yes, the Beowulf Underground guys)
I use a vast array of sites to help me in my profession, all of which are contributed to by people at some point in the process. I don't feel guilty and neither should you. Of course I could just be reading too much into it.
netslave
document.test.visibility
First of all, I would like to thank you for teaching CompSci at the high school level at all! I am a senior in AP classes at a northwestern public high school where there is absolutely NO available CompSci Curriculum, and linux is nearly a bad word! If I were designing a course I'd start with an Ulimate goal (a 3d game for example) and divide the year into units, each unit covering a different aspect of the computer world (ie; OS's Hardware, Programming Languages, etc...) Letting the students each designing they're own project while still conveying the required curriculum.
Call it the "eKids Challenge".
Kids these days love anything to do with e's!
dfd
I don't know what the budget is like in your school district, but I've always thought it would be great to see a curriculum that could be implemented entirely on almost any computer running almost any OS. Focussing on writing HTML and programming in HTML, JavaScript, PERL, PHP, Java and the like would be great. And, with published lesson plans, it could be implemented by almost any school district that could get a 386 donated to them.
My high school has a summer program set up for it's more computer savvy kids. We'd go around school to school in the city (this is New Orleans, we're poor) and fix their computers. It doesn't really have much to do with actual programming, but you really get to know the operating system as how to force it to do it's job *cough*windows*cough*
*ouch*