It may be that universal history is the history of a handful of metaphors.
-- Jorge Luis Borges, "The Fearful Sphere of Pascal" (Borges 1962)
We have defined agent-based programming as a method of thinking about computational activity that is explicitly organized around animate metaphors. This chapter and the next are attempts to expand this definition by looking closely at both metaphor and animacy and the roles they play in structuring the computational domain. We will see that computation, like almost all specialized domains of knowledge, is founded on a variety of metaphors that relate its structures to those of other domains. The domain of animate behavior is a particularly important source of concepts and vocabulary for computation, for reasons to be explored. Examining the role of metaphor and animacy in detail will both lay the groundwork for designing agent-based programming systems and provide some insight into the epistemology of computation and programming in general.
Our understanding of a subject as abstruse as programming is necessarily grounded in other things we know. A novice learning to program must construct understandings by bootstrapping them from existing bodies of knowledge and skills. Suitable bases on which to build include experientially grounded systems of knowledge about the physical and social worlds, or more abstract bodies of knowledge such as mathematics or economics. Ultimately abstract knowledge must be grounded in either innate structures or basic experience. While this process of grounding out knowledge takes many forms, the role of metaphor--the overt or implicit description of one thing in terms of another--is one of the most important. The discourse of programming and programmers is heavily metaphorical, yet the role of metaphor in computer science is often ignored or even vilified. The formal presentation of computer languages tends to hide the necessarily informal methods that we use to understand them. Thus the purpose of this chapter is to lay an analytical framework for thinking about the ways in which people come to understand computers and programs, and to argue for metaphor as a legitimate and necessary tool for this process. This will provide background for the following chapter, which takes a look at one particular metaphor or way of thinking that is of particular importance to computation, that of animate or anthropomorphic metaphor.
In the present chapter, I will first outline some general theories of metaphor and particular ideas from these theories that will be useful, then move on to look at the role of metaphor in scientific discourse and in computation in particular. A number of frameworks for programming are analyzed in terms of the metaphoric structures they impose on their domain and on their users.
Learning a new field involves learning a new language, or more precisely, new ways of using language. Technical fields in particular deploy everyday terms and usages in new ways, and the fact that words with everyday meanings suddenly take on new meanings that are related but not identical to their old ones is a source of confusion for both the novice and the professional. David Pimm (Pimm 1987) refers to the peculiar mannerisms of mathematical discourse as the "mathematics register", that is, a particular way of speaking which must be learned and relies strongly on metaphorical constructs. Computation, being a relatively new and diversified field, does not yet have a single "computational register". By looking at some of the metaphors employed in some parts of computational discourse, I hope to understand how the discourse of computation is structured. This approach is somewhat contrarian, in the sense that it deliberately emphasizes the non-mathematical, metaphorical, and informal aspects of a field that has traditionally structured itself in terms of formal mathematics. By investigating the informal conceptual foundations of computing, which I believe in some senses are deeper than the mathematical foundations, I hope to be able to gain insights that will permit the design of new languages and environments for programming.