Very young children aren't ready for abstract concepts as the first introduction. We need to progress very slowly and relate to the familiar.
1st: we talk about a recipe for no-bake cookies. I bring the ingredients. I show them the "program" (recipe), and the kids play the part of computer -- following the instructions.
Then we take a look at the LOGO language. The move commands issues to the "turtle" demonstrate visually the commands being given. Again, very high level, very concrete.
Next, we talk about a variable. I pick some kids and they each "hold" a number written in marker on a large sheet of paper for everyone to see. The variable name is their name (Joe, Sue, etc.). They know they can only hold one value at a time. So if I give them a new number they throw the old one away.
Then we step into Basic and learn to print a simple message.
Eventually we combine the two and end up with something like the old favorite:
10 for i = 1 to 10
20 print tab(i)
30 print "joe"
40 next
which, if you've not seen it looks a little like
joe
joe
joe
joe ...
From there, I let the kids' interest guide me. We might talk about how a "Guess a number" game works, or even graphics and "Snake Byte" (Chuck Sommerville -- early 80s).I've had pretty good luck with this approach.
His way of teaching instantly draws a connection between the work of a programmer with the world that the kids live in, which is terrific value for a child. Sure, they're not walking away with any technical knowledge, but that wasn't the point of the presentation.
Throw some wheels and a motor on a board and create a simple abstract language:
drive()
stop()
turn()
wait()
Boom, now you have them programming and have a freaking robot moving around!
I don't think we should be starting out with even mentioning binary to college students in the intro class, let alone 6 year olds. How are either of them going to use that knowledge? The college kids will use it when they get to their assembler class...otherwise that's about it.
Messing around with a super abstracted language will give them the only thing they should get out of the lesson: you tell a computer what to do and it does it.
What is the point of that lesson at that age, then? As far as I can tell, it will be of no consequence to them until high school.
> I don't think we should be starting out with even mentioning binary to college students in the intro class ... How are [the college students] going to use that knowledge?
Ideally, CS would be taught in a "bottom-up" fashion, from transistors to gates to adders to processors to higher- and higher-abstracted concepts; with Haskell etc occurring last, or nearly so. Then we'd actually have a much more solid grasp of what's going on "under the hood" and can make more informed decisions (e.g. for iterating quickly through many structs, better to actually have 1 struct of arrays/B-trees than 1 array/B-tree of the many structs; both of which are better than anything that involves a linked list; all due to how processor caches work).
In such a situation, binary would indeed be important for assembly and arithmetic units; but also for e.g. knowing to replace expensive integer divisions with cheaper right-shifts when possible by making the divisor be a power-of-2.
Perhaps it's just a natural stratification of the industry, but it leaves me feeling uncomfortable and frustrated when a jr engineer doesn't understand what's happening underneath the veneer of Rails (not to pick on Rails solely, this could also apply with many other frameworks & languages - I just see this the most because it's the latest fad) and/or doesn't understand why reentrancy, interrupts, or parallelism with mutable items is dangerous and hard-as-hell to get right.
I would love to see more developers with at least a passing familiarity with the basic concepts of computing, of the sort presented in Chuck Petzold's book CODE (which I highly recommend).
[just read my post - I really am sounding like a grumpy old man these days, but I'm clicking "reply" anyway. Stay off my lawn. ;)]
(Of course, being an undergraduate CS student, from my point of view the idea is better expressed as, "I would love to see more companies who value internship candidates with more familiarity with the basic concepts of computing, of the sort ... ".)
This doesn't mean everybody would be -- and I think your approach of having a board moving a robot car is a great idea that probably has a broader appeal -- but it's probably good not to rule out the idea that there could be even a natural curiosity about binary numbers.
When they do/did multiplying by 10, and doubles, it's a good time for a review (why does a decimal shift produce a x10, etc.).
You can use that to talk about codes (crypto), communication (Morse, etc.), computation using "switches", logic. It's a good base for a lot of interesting stuff IMO.