Programmer got to Program
"Tiger got to hunt, bird got to fly; Man got to sit and wonder 'why, why, why?'" -- Kurt Vonnegut
Back when agile was still a strange new thing I read Alistair Cockburn's "Agile Software Development: The Cooperative Game." It's a great book in its own right, but as a bonus it includes as an appendix Peter Naur's 1985 paper, "Programming as Theory Building," which Cockburn calls, "to my mind, the most accurate account of what goes on in designing and coding a program." I encourage you to read Naur's paper yourself, but its essential point is that programming is the way that programmers solve problems; that the act of programming is not so much the act of producing a program as it is the individual, ineffable way that programmers figure out what the problem is all about and from there devise a solution to it. In Naur's own words:
[P]rogramming properly should be regarded as an activity by which the programmers form or achieve a certain kind of insight, a theory, of the matters at hand. This suggestion is in contrast to what appears to be a more common notion, that programming should be regarded as a production of a program and certain other texts. -- Peter Naur
When Naur says "theory" he's talking about an idea introduced by the philosopher Gilbert Ryle in his 1949 book, "The Concept of Mind." As Naur put it, "a person who has or possesses a theory in this sense knows how to do certain things and in addition can support the actual doing with explanations, justifications, and answers to queries, about the activity of concern." Knowledge might be sufficient for intelligent activity (following the rules and "doing it right"), but for intellectual activity -- to develop new ideas, to argue, to explain -- for that, you need theory.
Another way to look at theory is as the highest level of understanding. I like to replace "wisdom" with "theory" in the data-information-knowledge-wisdom hierarchy.
In the DIKT hierarchy, you can't skip steps. You can't go straight from data to theory; you have to have information and knowledge first. Conversely, you can't just dump theory out as data; you need to work through the intervening layers. In other words, you need to express it. A program is an expression of a theory in the same way that this article, or Naur's paper, or Cockburn's book, or -- arguably -- a poem or a painting or a dance is (ask an artist whether the essence of the art is in the product or the production).
Recommended by LinkedIn
If this all seems academic, it's not; it has huge implications for how we can understand and support software developers. Recognizing that programmers are building theories while they program helps us create better software engineering practices and tools; that recognition is creeping into ideas like developer effectiveness and developer experience. Or if you prefer, consider what it means not for developers but for their potential AI replacements.
Jensen Huang and his advocates might have us believe that the programs of tomorrow will be written by AIs whose human users are subject matter experts who already possess a theory. But you can't share a theory directly -- you can't just magically impart it to someone or something else -- you can only express it and try to help others build their own, comparable theory. And to do that you have to think your way down the chain from theory to knowledge, express the knowledge as information, and then present the information as data if a machine is the consumer, and then (within the machine) go back up the hierarchy to theory again. And we're not sure if AIs really possess knowledge yet, let alone theory. Can they possess theories? If an AI can't possess a theory, how can it create a program? Humans can't build programs without a theory, so how can we produce AIs that can?
On the other hand, even if an AI can possess a theory, can it build one from somebody else's in the way we just described, by consuming their expression of it? Then, is building a theory from somebody else's theory good enough to let a human or an AI create a program, or can a theory sufficient to create a program only be built by programming?
Ultimately: can we build an AI that can program and thereby build a theory for itself? Going back to Ryle: can we build not just artificial intelligence but artificial intellect? If we can, then maybe human programmers won't be necessary. Until then: programmer got to program, and only humans can do that.