…involves very little actual programming.
Alexander Stepanov, the primary designer and implementer of the C++ Standard Template Library, relays to us that Scott Byer, the architect of Adobe Photoshop, estimates that 90% of developer efforts are dedicated to “glue” and housekeeping tasks such as memory management, scripting, UI management, file I/O, and color management. 10% is spent on “substance”. He provides the following estimates of how much time is spent on what he deems “substance” for a variety of application types:
• Word processing?—?3%
• Presentation App?—?1%
• Operating System?—?1%
• Enterprise Application Software?—?1%
From personal experience, these numbers sound just about right to me.
Now about programming
Programming is like writing music; there is no one true way to write a melody, but there are plenty of wrong ones. There are many combinations of notes that will be absolutely displeasing to almost all who listen to them.
Similarly, there is not one true way to write a program.
Programming is like literature; nobody would confuse even a single paragraph of Umberto Eco with a paragraph of Richard Brautigan.
Similarly, a programmer’s coding style is as unique and identifiable as the styles of any author in any medium. Programmers can easily recognize each other’s work once they know a particular programmer’s style.
Programming is like painting; what you don’t paint is as important as what you do. Negative space defines form, adds depth.
Similarly, more lines of code is not better. Top notch programmers measure the success of refactoring by how many lines of code are removed, not by how many lines were added.
Programming is like dance; anyone can dance, but only a very few people can dance well enough to be paid for it.
To write good code a person has to have a certain kind of mind, a mind that can analyze messy human processes and practices, and then boil it down to formal logic.
A good programmer needs abundant patience. Far more patience than the average person has, because :
“Computers are like Old Testament gods; lots of rules and no mercy.”
~ Joseph Campbell
A good programmer has to be able to mentally process things that are quite simply impossible for most people, such as recursion, or concurrency, or callbacks or closures.
…and that brings us to the second question
Can we really teach every child to program?
I cannot even fathom that anyone takes this question seriously.
We might as well ask if we could teach every child to perform appendectomies. Doctors are in short supply, it would make a lot of sense to increase the supply of doctors and surgeons by teaching all children to become medically literate, no?
Or maybe we could teach every child to become a teacher, then we wouldn’t need schools because when this children grew up, all adults would be teachers for the following generation.
I suppose we could teach every child to program, in the same way that anyone can dance. But it is no more possible to teach every child to program well than it woud be to teach every child to dance en pointe, or entrechat.
Programming is art by anyone’s definition, but we should not confuse the art of programming with the repetitive integration and fitting together of code libraries that most of the “developers” working in enterprise IT departments are doing. The same way we should not confuse the engineer who designs the car with the assembly line worker that assembles the car.
“Application development” is not programming and will inevitably become more and more automated and accessible to more and more people with less and less skill.
Meanwhile “real programmers” will continue to practice their art, the same way that cars are still modeled in clay.