Recently on the Clojure mailing list someone started an interesting thread on what motivates you as a programmer. My friend Nelson Morris responded as so:
Contributions and projects start off well, and energy might wane depending on time and life factors. Even contributing to tools used by many of the members of the community like [Leiningen] and Clojars doesn't prevent it. What helps is direct involvement by someone else.
This really resonated with me because it emphasizes that people are more important than programs. For me sharing is the thing that makes programming even worth doing in the first place. So it got me thinking about different technologies and what kind of people they're good for helping.
If you follow my writing it will be obvious that I enjoy working in Emacs and Clojure. While these are among the most powerful, flexible technologies I know of, collaborating with others on tools for Emacs and Clojure basically limits me to working with professional programmers, because both environments are very poor from a beginner's perspective. If I'm working solo or on a team of seasoned hackers, I'll definitely be most effective with Clojure. If my primary goal is to interact with the widest group of programmers possible, I would use Ruby as it's the most commonly-used language I can bring myself to use. But if I want to reach out to people who don't already spend all day thinking about functions and data structures, well that's another thing entirely.
This is particularly relevant for me personally as a father. I'm taking an active role in the education of my sons, and of course I think technical literacy must be an important part of it. But when you look at how computers used in traditional educational settings, you're much more likely to see computers programming children than children programming computers. So I've been looking for ways to foster technical skills and encourage algorithmic thinking in engaging ways that can keep the attention of my five-year-old.
In the book Mindstorms, Seymour Papert describes the shift from concrete reasoning to formal reasoning as one of the main transitions children undergo as they learn to think like adults. One of the design goals of the Logo system he created was to provide transitional concepts to bridge the gap between the two.
Children interact with Logo by giving commands to an onscreen object known as the turtle. While the turtle lives in the abstract world of geometry comprised of points and lines, children are able to identify with it since they tell it to move in ways which they can relate to—it has a heading and position, and it turns and moves forward and backwards just like they do. Because the turtle's movements on the screen are isomorphic to their own physical movements, it gives them a model to help them grasp abstract geometrical concepts though they're only used to thinking in concrete terms. And Piagetian learning—ambient, natural learning which children are so adept at doing without study—is all a matter of building models of the world.
Most people know Logo from its original triangle-turtle-centric incarnation, but in Mindstorms Papert describes Logo as more of an educational philosophy than any single program, language, or implementation. A more recent version of Logo is Scratch, a drag-and-drop visual programming environment from MIT's Media Lab targeting school children. Since my older son is an early reader he's been able to construct simple scripts (with some guidance) for the characters within Scratch, watching them interact with each other and even in some cases the outside world.
While it's been lots of fun to come up with ideas and talk through how we'd bring them to life on the screen, one of the most rewarding parts is watching his problem-solving abilities develop. Papert talks about how children are often afraid to try things for fear of failure, but Scratch teaches that debugging is a normal part of making things work. Rather than "does it work?", the question becomes "how can we make it work?" This was demonstrated the other day (outside the context of Scratch) when he was putting together some Snap Circuits:
Of course the goal is not to produce "little programmers". It's primarily about developing the ability to think systematically, but it extends beyond that into getting them thinking about thinking itself. In some sense once they're in the habit of asking the right epistemological questions, the parent or teacher almost just needs to get out of the way and let them explore. At that point the process of discovering a topic with someone is much more rewarding than telling facts at them.