A different way of viewing programming.
Please note that this essay is in no way an endorsement of slavery. I am simply using it as an analogy to discuss computers and programming.
Let me open with a quote from chapter IV of Aristotle’s “Politics: A Treatise on Government”, using William Ellis’s translation.
[…] a slave is an animated instrument, but every one that can minister of himself is more valuable than any other instrument; for if every instrument, at command, or from a preconception of its master’s will, could accomplish its work ([…]), the shuttle would then weave, and the lyre play of itself; nor would the architect want servants, or the master slaves.
It seems to me, with few exceptions, that Aristotle’s overall point here, which is that “instruments that can minister of themselves” are essential to any culturally developed society. He used slaves, we use computers.
Aristotle does admit that a slave is more than a self-ministering tool, with some rather confusing verbiage about slave-nature and man-nature. Computers, on the other hand, are just instruments. For my belief that a computer designed to be instrumental will never be sentient, see Luther’s First Postulate. This means that, in particular, they are not intuitive: they do what you tell them to do, not what you meant them to do.
Many stories make the wording of wishes extremely important, e.g. wishing for gold causing a gold brick to land on the wisher’s head. Talking to non-people can similarly obtuse, not because the computer is malicious but simply because it is only logical. We can teach them any language we want, but we have to teach them all of it, logically.
Suppose we want our silicon slave to understand “make the bed.” We could define exactly how to move what part of the covers, but that wouldn’t be very transferable; add another sheet and it’d get confused.
You: “Make the bed.”
It: “There is no bed.”
You: “Yes there is, right there.”
It: “No. A bed has a sheet and a blanket. This is not a bed.”
You: “A bed doesn’t have to have a sheet and a blanket. It’s just a raised place for sleeping.”
It: “Define ‘for’.”
You: “I… it’s the purpose, the intent, the common usage….”
It: “Define ‘purpose’. Define ‘intent’. Define ‘common’. Define ‘usage’.”
When we talk about programming languages we mean languages that are designed not to have this kind of problem. Usually this consists of some very basic, unambiguous elements such as arithmetic and notions of decisions and repetition, together with an unambiguous way of defining new things.
To the uninitiated, slave-talk can look absolutely insane. A bed-making robot might have an abstract definition of a bed with fifteen different sub-types defined and dozens of definitions relating to senses and limbs and hundreds of descriptions of how to match up each sensation with the bed-concepts it likely indicates and how to decide which possible signals to the fingers might result in which possible changes to the abstract bed models.
Because slave-talk is not like any human language, there are people payed simply to speak the language, whom we call “programmers”. “Software engineers” are a step above programmers; they not only know how to talk to computers, but they are also trained to work through turning crisp-for-a-human ideas like “move a finger” into logically proper ideas that can be translated into computerese. “Software architects” Some people consider architecture to be part of engineering. work on the big picture of what parts to define as things, how to group those definitions, and what processes to define operating on those things in order to reach the over-aching objectives.
In slavery terms, a program is a slave driver, talking to slaves. The software engineer is the plantation manager, deciding what tasks need to be done when. The software architect is the plantation owner, considering the larger picture of how the plantation work fits into the economy.