Is programming art…
…and can we really teach every child to program?
If you want 3 or 4 very different opinions on this, just ask 1 or 2 programmers. On this particular subject, some of my colleagues feel so strongly that they might even be able to flame themselves.
And the meanings of words….
If we were to stick to dictionary definitions there is no question. Art is defined by the OED as “The expression or application of human creative skill and imagination…”, and Webster’s has this to say: “skill acquired by experience, study, or observation”.
Programming is clearly a human creative skill acquired by experience, so that is that. Bam!
But lets take a more nuanced approach.
Programming vs. software application development or production
The two are not the same thing. All software applications involve some programming (surprisingly little usually), but not all programming is for the production of a software applications.
Definitions of what a “software application” is vary a little, but generally agree that is a special kind of program; a program that is designed for the end user. This means that it has certain defining characteristics: a user interface, it usually allows the user to enter data, it often has logic, and it almost always provides the user some way to interact and trigger the execution of functions.
Not all programs look like this. There are about a million lines of code in a car that do not do any of these things. And more code that makes the traffic lights in your neighbourhood work, and some more in your flat panel TV set that does quite a bit of image processing — without any interaction from you.
…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%
• Databases — 10%
• Technical/CAD — 30%
• 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.