Programming with building blocks.
Over the last six months, I’ve probably spent more time programming in Scratch than any other language, and despite the limitations it’s rather lovely to program in. I’ve made a lot of little games, toy examples, as well as operator precedence parsers (the latter was one of the more painful exercises).
Scratch isn’t really like other programming languages. For a start, it comes with a sandbox of its own: there is a stage with sprites that can move around and interact with each other, as well as being able to insert pictures and sound. However the biggest difference is how programs are assembled — from building blocks, not from text.

With scratch you build programs from square-ish building blocks, snapping them together inside the editor. Programmers in Scratch never receive a syntax error — No missing semicolons, no unmatched braces. There isn’t any tabs versus spaces palaver either, and it’s wonderful.
Block based programming is very similar to what Bret Victor calls “Sentence based configuration” in his excellent essay Magic Ink: Information Software and the Graphical Interface. The entire essay is worth a gander, but we’re interested in the case study on building a train journey planner, in particular how the application can be configured:
A typical design would use a preference dialog or form that the user would manipulate to tell the software what to do. However, an information design approach starts with the converse—the software must explain to the user what it will do. It must graphically express the current configuration.
For presenting abstract, non-comparative information such as this, an excellent graphical element is simply a concise sentence.
Scratch, albeit visual, is still a language built around sentence fragments. Instead of using punctuation and assorted ascii art to enchant text into code, the structure and action of a Scratch program is almost as clear as prose. By using natural language fragments instead of magic identifiers in text, Scratch is unique in another aspect — Internationalization — Scratch programs can be built up out of German, French, Chinese, Japanese fragments too.

The look on peoples faces when you change scratch into their native language is worth treasuring, an aha moment where the code becomes readable in an instant. Scratch is so readable that it has come as a surprise to some, one remarking “I understand this. It can’t be programming”.
Block based programming isn’t without drawbacks. The back and forth of dragging and dropping becomes tiresome, and in Scratch, it’s hard to share code and reuse fragments without duplication. The underlying abstract language isn’t too powerful either — using strings and lists is rather unpleasant for more than the most trivial tasks. I don’t think programmers at large are going to throw away their text editors, or stop arguing over tabs, spaces, or semicolons.
Block based programming is still aimed entirely at beginners, but I’d really like to see how it can grow to encompass more experienced programmers — especially incorporating features from modern IDEs like auto-complete, or refactoring tools. Extending the vocabulary would be useful too — one notable descendent of Scratch, Snap!, adds first class lists, first class procedures, and continuations.
Maybe one day we’ll abandon our text adventures.