From http://wiki.c2.com/?GarryHamilton on http://wiki.c2.com/?PurposeOfProgramming

Programming is the way we:

  • speed up the attainment of answers whose solution process is already known so that the time can be used for more valuable things
  • automate tedious tasks whose methods are already known so that the time can be used for more valuable things
  • accelerate communications, used in concert with other technologies to speed up and automate the processes that enable said communications, improving the efficiency of communications so that the time can be used for more valuable things
  • create tools which, used singly or in combination, enable permutations of the above, so that the time can be used for more valuable things
  • using the speed and automation mentioned above, create abstract environments (frameworks) to enable better understanding, discovery of relationships, and … well … entertainment (games and the like).

Yep. But it’s not just “…so that the time can be used for more valuable things”, it’s also to drop the time to the point where something becomes practical at all (e.g. modern algorithms for factoring larger numbers than otherwise feasible at all), or more generally, to lower the barriers limiting activities.

Amongst zillions of examples, much of what average people do with home computers today (multi-font publishing, graphics/image/video manipulation, etc) was possible 3 decades ago, but generally only to professionals and at much higher cost.

  • Let me expand on this a bit. One of the learning tools I’ve used for years with great effectiveness is the “demonstration” technique. Given a concept, you can test your grasp of the material by demonstrating, or modeling, the concept. You can draw it on paper or white board, model it with various handy objects, carve it from wood, model it in clay, or build a cardboard prototype. The idea is to get a physical representation of the idea at hand. Get it “out of your head” and into the physical world. The gaps in your understanding show up here, the flaws in your conceptualization become apparent.
  • When I learned to program, it struck me that, over and above the basic ideas I listed above, a computer is the ultimate modeling clay (plasticine for those East of the Pond). It was amazing – even with a text-only screen and a 2 MHz 8-bit processor – you could render any concept. Never mind that the machines of that generation lacked the resources for the kind of stuff we do today. What was clear was that, given the resources, anything could be modeled. I remember trying to convey this to the people around me that saw it as a large, heavy, expensive calculator. I remember the frustration of trying to show them that, while a computer does calculate, calculation is not its primary value. It’s a communications device of unparalleled flexibility.
  • Now, programming, that’s where you realize the potentials of this magical, dimensionless space. You can write programs that are as primitive and earthy as railroad tracks. Slightly more advanced are the programs that create worlds modeling the imagination of their authors – railroads that span the clouds.
  • Much of what can be conceived can be achieved in animation or with calculators or whatever, but the time penalty of doing it manually is what makes it impossibly arduous. Programming, using the electronic clay that is the computer, makes it possible to do these hitherto unthinkably hard things by removing the time penalty from the exercise. It’s not about replacing people, it’s about removing the time penalty so that more can be accomplished.