Programming as many programmers think about it (typing various commands in Java or C or whatever language of the day, long algorithmic procedures, waiting for it to compile, etc) is obviously not something that preschoolers can do, but there are aspects of programming and computer science that can be learned in early childhood - sometimes using computers, but often not using any 'technology'.
To start off, why programming in early childhood? Because we want our kids to be creators, not just consumers. “When human beings acquired language, we learned not just how to listen but how to speak. When we gained literacy, we learned not just how to read but how to write. And as we move into an increasingly digital reality, we must learn not just how to use programs but how to make them.”Program or be Programmed Our kids (and thus our future adults) should understand how computers work - that it's not magic, but rather that a real person (or more likely a large group of people) designed the hardware and the software, and that anyone can hack at it or change it.
From a more academic standpoint, programming principles are wonderful for teaching sequencing, following a set of rules or procedures, and breaking a larger problem down into smaller 'bite-size' pieces - all of which are essential skills to learn in early childhood. Algorithms don't have to be done on a computer - following a cooking recipe, remembering how to navigate around the school, even knowing the order of how to put your clothing layers on are all algorithms, albeit very simple ones.
Programming is also about abstract thinking, which is something that young children are not very good at yet - but I would argue that just because they're not good at it (and probably won't be for a while) doesn't mean that they can't practice basic abstractions at an age-appropriate level. Asking generalized questions - not just "What do you need to put on before going outside?", but "What would a person need to put on before going outside?" Helping children to use symbols to represent something else - possibly making up their own 'language'. Using Legos or other basic building toys to create 'something' out of 'nothing' - a house from blocks, a necklace from pasta.
Many programming concepts are actually being taught to preschoolers already, without being thought of as programming or having anything to do with computers. But learning how to use technology is also important - there are many programs coming out to help young children get even more into programming. Scratch JR (Page on Mit) uses graphics, rather than typing. And a project out of Tufts (http://ase.tufts.edu/devtech/pub...) uses physical/tangible objects that the kids can manipulate to lay out their computer programs, and has been shown to develop children's sequencing abilities (Page on Tufts)
Estonia starts teaching coding in first grade (Why Estonia Has Started Teaching Its First-Graders To Code) - maybe we should one up them and start even earlier? :-)
Also - Page on Pbskids
UPDATE 9/9/13 - you can also use board games to teach programming concepts to 3-8 year olds - check out Robot Turtles! http://www.kickstarter.com/proje...