A big focus of my time these days is on introduction to computer science courses. What might be called CS0 at the university level. basic courses to provide a foundation for later learning. Perhaps these courses will create or drive interest in additional courses. One of the topics that comes up in these courses is always hardware. Is it really needed? After all kids grow up with computers don’t they? They know how they work right? Well I’m not so sure they do. Of course people often point to Dijkstra saying "Computer Science is no more about computers than astronomy is about telescopes."
To some degree Dijkstra was right. But you know I think astronomy is somewhat about telescopes. Computer science is somewhat about hardware (computers). I’m no expert on astronomy but I’ve owned a telescope or two in my time and I’ve looked at the stars. Understanding a little about how telescopes work is quite helpful in understanding how to use them and what you are seeing through them. So too understanding how computer hardware works provides some understanding into how computing works. Especially as to its practical (compared to theoretical) limits.
So I think it is useful for beginners to understand the parts of a computer, especially conceptually, before they get too deep into CS. Registers, accumulators, different types/levels of memory or storage, how binary arithmetic works, and much more. I also think it is useful to explore the various ways of getting information into and out of computers. And how information is stored as well. Can you understand why 0.1 added ten times is not 1.0 if you don’t understand how computers store floating point numbers in binary?
I think we do students a disservice if we skip too lightly over the computer itself. That information is valuable. Of course we should also encourage them to think about alternative ways that computers could work. After all it is harder to break rules through limits if you don’t know what they are.
Now that I have decided that hardware is important I have to figure out what the key must know pieces are. Suggestions?
Early in the year, I suggest opening up a computer in front of the class, and then point out and describe the basic components -- this can be a "spark" to get students excited about your class early on, and for some to learn more on their own if so inclined, plus for others it can "demystify" the computer somewhat, making the computer science class less intimidating. (Just keep it basic, and don't throw out too many new terms or ideas at once.)
As others have mentioned (and I agree), the American Computer Science League (www.acsl.org) has contests for middle and high schoolers that cover both hardware- and programming-oriented concepts, and your entire class can participate, even during the regular class period if you want. I taught mini-units (a few days or so) on the concepts for each contest (plus added my own assessments), and I felt this filled some gaps in the content of AP CS which I think is too focused on pure programming. And the kids seem to enjoy the change of pace from programming.
Some topics I felt were worthwhile: binary / octal / hex numbers, truth tables and digital logic design (i.e. write a truth table, or sketch a circuit with AND/OR/NOT gates given an output truth table), follow a simple assembly language program and understand basic stuff about registers, follow a LISP program. For advanced students, we did some boolean algebra (i.e. take a digital circuit or logical expression and optimize it to the smallest number of gates / logical operations -- and show the math to prove it!)
A great resource for teaching simple computer architecture and assembly language is the "Little Man Computer" (Links from http://en.wikipedia.org/wiki/Little_man_computer). This simulator has just a few instructions, and it was very accessible to my high school students with just 1-2 days of instruction to get them started. (If you're in the upper midwest like me, I think Marquette University in Milwaukee still runs a fun annual competition for high schoolers in Jan/Feb based on this "LMC". Contact them for more info.)
Would love to have a workshop-oriented class (or computer-club activity) where kids can take a computer apart and put back together. But obviously not practical unless you can get some donated old computers??
Finally, a bit off topic, but in my experience high school CS curricula do a woefully inadequate job covering relational database concepts, which I think are critical to computer science, and with the growth of the web and data-driven web pages, this is becoming even more important. This should become a core component of CS0 / high school. Maybe a topic for another day...
Floating-point is a big one. The programming forums I monitor are regularly hit with questions about the "incorrect" results of floating point operations. We have to teach that -- and properly!
I found this by accident, but I really like the direction you're going in, especially at the high school level. When I was a freshman in high school, I already knew that I wanted to work with computers. The only computer courses available at my school were programming concepts courses. It was partly because of this that I decided to drop out of high school and do self-study towards an A+ certification (which I obtained at age 17). I really wish my high school had curriculum for computer hardware and software basics, so that's why I want to help you as best I can.
I think the important things to know about hardware for entry level is how they all function together. Start off with explaining what everything is, then get into how each component stores data (binary), how to calculate binary, and eventually how all those components work together with each other (bus flow, etc.), and with the operating system. Finally, I would introduce basic troubleshooting of hardware and software that they can implement in daily life so they don't have to go running off to geek squad and shelling out lots of money if they just need to reformat a hard drive. As a former high school student, and current college student in the IT field, I think my perspective could help you out some. Hands on work in a controlled environment with serious students can be a very beneficial process. Have them install and remove hardware components, install drivers for them, use the device manager to view failing hardware components and how to make them work. I would test that knowledge at home, with at-home computer lab work, or if the student doesn't have a computer that they can use for learning purposes, have a few computers they can access at the school to do their lab work during study halls or before/after class. Practicing the knowledge you learn will allow them to retain it, and be able to use it in the future.
I hope input from a new perspective helps you out, I wish I had staff at my high school that would go to these lengths to teach things I was interested in.