Also, it takes a certain kind of computer scientist to teach computer science effectively, and most elementary school teachers do not match that requirement no matter how much PD you give them. I would say most elementary school teachers can't handle much beyond the basics of Scratch, but that is more than enough to get the platform in the hands of kids. If the teachers chooses to just let the kids mess around with Scratch rather than give them structure and clearly defined goals, they will still do just fine. If a teacher takes a similar lax approach with typed programming, the kids will most likely learn nothing at all, and will often develop an aversion to programming altogether.
But I completely agree with you on the importance of teaching typed programming. My heart aches when I hear of middle school CS classes using Scratch. That's the perfect age to start exposing kids to Arduinos, Python, Raspberry Pi, etc. The BBC Microbit foundation has been doing a great job in the UK bridging the gap between Scratch and typed programming with their Microbit platform (microbit.org), and (shameless self-plug) I work on this problem as well with techlabeducation.com and pythonroom.com.
I think what kids miss most of all from typed programming is the idea that a language is just like a human language, where each language has its own metaphors and way of thinking (an idea put forth by Seymour Papert in his 1998 paper "Mindstorms").
This is the same reason so many people can build complex spreadsheets, yet wouldn't know where to start if you put them in front of an IDE.
I brought a book 'Computer coding for kids by Carol Vorderman' for a friend's daughters for Xmas (aged 6 and 8, both VERY bright with grades above their age groups). As learning to program makes you think differently, especially problem solving skills. It's gone down really well. Especially with older one who spends hours reading the book, even when she doesn't have computer access (and is now set on buying Chromebook with her pocket money).
A language such as Scratch is great for sparking initial interest, before going on to more depth.
Inventing on Principle - https://www.youtube.com/watch?v=PUv66718DII (He has a handful of great demos on Youtube and Vimeo).
Another interesting source is Epic's Unreal Engine Dev tools - https://www.youtube.com/watch?v=DshYHUvLaDc
And possibly with obtaining an intuition about whatever it is that you are manipulating. Maybe "direct manipulation" is mostly about that rapid feedback, rather than the concreteness of the objects?
I know that when I hooked up an "as-you-type" evaluator[1] to my experimental programming language[2], I learned more about problems with the language in a minute than I had previously in days or weeks. The feedback bandwidth is incredible, and the short cycle times have a more than linear effect.
It's block-based—you write it by inserting syntax nodes from a big menu—but the visualization of said blocks is plain text. If it's the first type of programming you do, you come out of it able to quickly understand a "real" text-based programming language, because you've been looking at textual programming syntax for a good while already.
This is very interesting because one often hears the same thing - the exact same thing! - about Lisp as a teaching language. And Scratch and Lisp are indeed quite similar, superficially, though Scratch doesn't think of itself as a "real" programming language and hence stops short of providing features that would make it usable as one, like lexical scope.
One big difference is that Lisp simply hides a lot of its syntax behind homogeneous parentheses (many special forms can only be written a certain way, but you have to remember where the parentheses go) whereas Scratch doesn't so much hide it as handle it for you ("here are the slots where things can go in this syntactical form").
Another, separate but easily conflated difference is that it's in some sense "strongly typed" - numbers go in number slots, predicates go in predicate slots, etc etc. The return type of an expression is represented by the shape and color of its block. All types are statically known, and relayed to the programmer. It is impossible to commit a type error because the editor disallows it (which is in turn possible due to the transactional nature of drag-and-drop - what do you do if someone types the wrong thing in, untype it?)
I think these are valuable concepts that don't automatically imply "toy" and should be explored in the context of a "real" programming language. Computer science has consistently unvalued human factors. There is still a lingering sense that "real programmers" don't need to be mollycoddled, and should suck it up and endure byzantine incidental complexity. Never forget the lesson of Python, a slow and technically unremarkable scripting language which is now one of the most popular languages in the world because it is easy and fun to program in. Or the lesson of Lisp, an enormously fast and powerful language that nobody programs in because...?
I do however think Scratch is great for the younger kids and is a great way to teach them some basic concepts in a fun way.
Steve Krouse, a friend of mine from Penn, has created this to teach kids how to code in NYC. Jumping from Scratch to JS is a big jump, Woof is meant to make that easier.
I'm also planning on using it with my online 1-to-1 course for kids.
By 4th grade, you're probably right. But 2nd, unsure.
I feel that most people who know programming really underestimate how hard syntax is for beginners! You can maybe walk a kid through typing in a canned program in other languages, but the scratch "building blocks" environment makes it way easier to let kids explore and go further on their own.
Edit: 10th grade is correct - I was able to go on the scratch community website and find some sketches I had uploaded 9+ years ago!
- He still spends quite a bit of time finding keys on the keyboard, so that'd be a major distraction and would break flow.
- Memorizing keywords as text and reproducing them is a bit more of an abstract concept than being able to remember the color, location, shape, and appearance of text on the blocks in Scratch. For us, we can imaging keywords and expressions as these conceptual units, sort of like blocks. But we can also reproduce them as those units---we don't mentally deconstruct them into individual characters like my son would have to as he struggles to type them.
- Similarly, with typing, you start with a blank canvas and nothing but a daunting array of tools (keys on the keyboard, which we think of as a single tool) that alone mean nothing until placed into a very specific syntax. With Scratch, you start with a set of identifiable blocks that concretely mean something.
- Scratch aids him in other ways, like providing character and sound selections via a dropdown. You can get this type of things with certain IDEs, but mileage will vary.
Essentially what I'm saying is that I feel like my son using a keyboard at this point instead of blocks is like taking each of those blocks and smashing them with a hammer, and telling him to first assemble the blocks before determining how to use them to assemble the program.
I do wonder when I should try introducing him to text-based languages. He's also learned how to use Minetest in the past week, which is scriptable in Lua, so I wonder if that would be an interesting transition. I thought of maybe introducing him to lisp because of how naturally the syntax of the language translates to/from blocks, but I also don't want to disadvantage him practically when most of the world uses C- or Python-like syntax.
I'm totally new to this. :) But it's exciting!
I don't have kids yet but I am wondering if perhaps letting your child use a keyboard that is without printed letters could help them learn to type better.
Back in 2010 me and a good friend of mine decided to buy a TypeMatrix 2030 USB keyboard each and to switch from QWERTY to Dvorak.
Now of course I am not suggesting you let your child learn Dvorak. Teaching them Dvorak would probably be doing them a disservice at such an early age because of the amount of QWERTY keyboards they are likely to come in contact with.
But I think you should try to let your child use QWERTY with a keyboard that does not have any letters printed on it.
We bought black skins with printed letters and black skins without printed letters. In the beginning I was using the skin with the printed letters and I had to look at the keyboard for each and every letter I was typing. While my initial plan had been to first learn to touch type Dvorak on the TypeMatrix and then put on the skin without printed letters, I soon decided to put on the skin even though I had no idea where each letter was, in order to force myself to learn to touch type sooner. And it worked! It was really painful for the first two or three days. For each letter I was typing I started with the top left key and went through the keys one by one until I got to the correct key and then I used the backspace key to remove all of the letters I had typed which was not the one I was looking for. It was extremely annoying but it worked exactly as I had hoped it would.
Over time I've somewhat "unlearned" QWERTY, and for the first few years I was even carrying my TypeMatrix in my backpack pretty much at all times and in doing so I found it hard to use other keyboards even if I switched the computer to Dvorak.
After one of my keyboards broke due to wear from carrying it with me, I bought a new one but I stopped carrying it with me and started using whatever keyboard is available in Dvorak mode. I use the TypeMatrix at home and I have another one that I use at the office when I work but when I'm elsewhere I use for example the keyboard on my ThinkPad. Many keyboards will have QWERTY printed on them but since I am so proficient at touch typing Dvorak now I'm pretty much not looking at the keyboard at all anyway so it does no harm.
Anyway, point is, not being able to "cheat" by looking at the keyboard turned out to be a highly effective way to learn to touch type 100%.
edit, as I keep thinking about this: Remixes were also huge - not only could you download someone's project, you could tweak it and reupload it as a remix. There were also galleries with curators, which motivated me to make better projects. I think the language's limitations might have encouraged me to think outside the box, actually... simple things were easy, but any complex logic was very difficult. No functions, only event-driven broadcasts and receivers, and the events had to be pre-declared (no dynamic stuff). I remember doing a lot of hacky stuff with lists, like having look-up tables in lists, or having to implement really simple algorithms on my own in this constrained language...
Thank you so much for the work you and the Scratch Team did! The Scratch online community was a big part of my childhood and opened so many doors in my life by keeping me engaged and leading me to the world of software. Y'all really made the world a better place with the project.
What challenges did you encountered the most when teaching kids to code?
Do you have any suggestion on how to teach coding to kids from non-english-speaking countries? I think it would be much more challenging since most programming languages are written in english, and these kids are not fluent in english. Or, is it better if I write a new programming language using my native language?
https://www.youtube.com/watch?v=CAcv12eBqcc
PS: I want to make some leraning videos using twitch/livecoding tv. I think, this idea is good.