programs are not sequences of instructions
Oh mainstream programmers, how I hate thee. Let me count the ways.
The following is a question taken from the “AP Computer Science Principles Course and Exam Description,” from the College Board:
- A programmer completes the user manual for a video game she has developed and realizes she has reversed the roles of goats and sheep throughout the text. Consider the programmer’s goal of changing all occurences of “goats” to “sheep” and all occurrences of “sheep” to “goats.” The programmer will use the fact that the word “foxes” does not appear anywhere in the original text.
Which of the following algorithms can be used to accomplish the programmer’s goal?
a)
- First, change all occurrences of “goats” to “sheep.”
- Then, charge all occurrences of “sheep” to “goats.”
b)
- First, change all occurrences of “goats” to “sheep.”
- Then, charge all occurrences of “sheep” to “goats.”
- Last, charge all occurrences of “foxes” to “sheep.”
c)
- First, change all occurrences of “goats” to “foxes.”
- Then, charge all occurrences of “sheep” to “goats.”
- Last, charge all occurrences of “foxes” to “sheep.”
d)
- First, change all occurrences of “goats” to “foxes.”
- Then, charge all occurrences of “foxes” to “sheep.”
- Last, charge all occurrences of “sheep” to “goats.”
This question makes me angry. Why? Because the obvious lesson from this example is that YOU SHOULD NOT BE MODELING COMPUTATION AS A SEQUENCE OF MUTATIONS.
In other words, the correct answer is this:
e) For each word in the document, replace it using this function: * if the word is “goats”, return “sheep” * if the word is “sheep”, return “goats” * otherwise, return the word unchanged.
Voila. Problem solved. No resorting to nasty swap ideas.
At a lower level, I think the core problem may be the inability of the English language to handle this kind of abstraction. Notice that in my proposed solution (e), I tread dangerously close to mathematical notation; it’s not really purely English any more.