in ,

The Philosophy of Computer Science, Hacker News

The philosophy of computer science is concerned with those ontological, methodological, and ethical issues that arise from within the academic discipline of computer science as well as from the practice of software development. Thus, the philosophy of computer science shares the same philosophical goals as the philosophy of mathematics and the many subfields of the philosophy of science, such as the philosophy of biology or the philosophy of the social sciences. The philosophy of computer science also considers the analysis of computational [is] artifacts , that is, human-made computing systems, and it focuses on methods involved in the design, specification, programming, verification, implementation, and testing of those systems. The abstract nature of computer programs and the resulting complexity of implemented artifacts, coupled with the technological ambitions of computer science, ensures that many of the conceptual questions of the philosophy of computer science have analogues in the   Philosophy of mathematics ,  the philosophy of empirical sciences, and the   Philosophy of technology .  Other issues characterize the philosophy of computer science only. We shall concentrate on three tightly related groups of topics that form the spine of the subject. First we discuss topics related to the ontological analysis of computational artifacts, in Sections 1-5 below. Second, we discuss topics involved in the methodology and epistemology of software development, in Sections 6-9 below. Third, we discuss ethical issues arising from computer science practice, in Section below. Applications of computer science are briefly considered in section .

1. Computational Artifacts

Computational artifacts underpin our Facebook pages, control air traffic around the world, and ensure that we will not be too surprised when it snows. They have been applied in algebra, car manufacturing, laser surgery, banking, gastronomy, astronomy, and astrology. Indeed, it is hard to find an area of ​​life that has not been fundamentally changed and enhanced by their application. But what is it that is applied? What are the things that give substance to such applications? The trite answer is the entities that computer scientists construct, the artifacts of computer science, computational artifacts, if you will. Much of the philosophy of computer science is concerned with their nature, specification, design, and construction.

1.1 Duality

Folklore has it that computational artifacts fall into two camps: hardware and software. Presumably, software includes compilers and natural language understanding systems, whereas laptops and tablets are hardware. But how is this distinction drawn: How do we delineate what we take to be software and what we take to be hardware?

A standard way identifies the distinction with the abstract-physical one (see the entry on   abstract objects ,  where hardware is taken to be physical and software to be abstract. Unfortunately, this does not seem quite right. As Moor (1986) points out, programs, which are normally seen as software, and therefore Under this characterization abstract, may also be physical devices. In particular, programs were once identified with sequences of physical lever pulls and pushes. There are different reactions to this observation. Some have suggested there is no distinction. In particular, Suber ( argues that hardware is a special case of software, and Moor (1986) argues that the distinction is ontologically insignificant. On the other hand, Duncan (2014 insists that there is an important difference but it is one that can only be made within an ontological framework that supports finer distinctions than the simple abstract-physical one (eg, B. Smith 2014. Irmak (

also thinks that software and hardware are different: software is an abstract artifact, but apparently not a standard one, because it has temporal properties.

Whether or not the software-hardware distinction can be made substantial, most writers agree that, although a program can be taken as an abstract thing, it may also be cashed out as a sequence of physical operations. Consequently, they (eg, Colburn Moor 1985) insist that programs have a dual nature: they have both an abstract guise and a physical one. Indeed, once this is conceded, it would seem to apply to the majority of computational artifacts. On the one hand, they seem to have an abstract guise that enables us to reflect and reason about them independently of any physical manifestation. This certainly applies to abstract data types (Cardelli & Wegner 1990. For example, the list abstract data type consists of the carrier type together with operations that support the formation and manipulation of lists. Even if not made explicit, these are determined by several axioms that fix their properties: e.g., if one adds an element to the head of a list to form a new list, and then removes the head, the old list is returned. Similarly, an abstract stack is determined by axioms that govern push and pop operations. Using such properties, one may reason about lists and stacks in a mathematical way, independently of any concrete implementation. And one needs to. One cannot design nor program without such reasoning; one cannot construct correct programs without reasoning about what the programs are intended to do. If this is right, computational artifacts have an abstract guise that is separable from their physical realization or implementation. Indeed, this requirement to entertain abstract devices to support reasoning about physical ones is not unique to computer science.

On the other hand, they must have a physical implementation that enables them to be used as things in the physical world. This is obviously true of machines, but it is equally so for programs: Programmers write programs to control physical devices. A program or abstract machine that has no physical realization is of little use as a practical device for performing humanly intractable computations. For instance, a program that monitors heart rate must be underpinned by a physical device that actually performs the task. The computer scientist Dijkstra puts it as follows.

A programmer designs algorithms, intended for mechanical execution, intended to control existing or conceivable computer equipment. Dijkstra 1979: 1)

On the duality view, computer science is not an abstract mathematical discipline that is independent of the physical world. To be used, these things must have physical substance. And once this observation is made, there is a clear link with a central notion in the philosophy of technology (Kroes ; Franssen et al. 2016) , to which we now turn.

1.2 Technical Artifacts

Technical artifacts include all the common objects of everyday life such as toilets, paper clips, tablets, and dog collars. They are intentionally produced things. This is an essential part of being a technical artifact . For example, a physical object that accidentally carries out arithmetic is not by itself a calculator. This teleological aspect distinguishes them from other physical objects, and has led philosophers to argue that technical artifacts have a dual nature fixed by two sets of properties (eg, Kroes

; Meijers ; Thomasson 2014 Vermaas & Houkes 2006: functional properties and structural properties.

Functional properties say what the artifact does. For example, a kettle is for boiling water, and a car is for transportation. On the other hand, structural properties pertain to its physical makeup. They include its weight, color, size, shape, chemical constitution, etc. For example, we might say that our car is red and has white seats.

The notion of a technical artifact will help to conceptualize and organize some of the central questions and issues in the philosophy of computer science. We begin with a concept that underpins much of the activity of the subject. Indeed, it is the initial expression of functional properties.

2. Specification and Function

In computer science, the function of an artifact is initially laid out in a (functional) specification (Sommerville

[1982]; Vliet 2012. Indeed, on the way to a final device, a whole series of specification-artifact pairs of varying degrees of abstractness come into existence. The activities of specification, implementation and correctness raise a collection of overlapping conceptual questions and problems (BC Smith

Turner 2016; Franssen et al. 2014)

2.1 Definition

Specifications are expressed in a variety of ways, including ordinary vernacular. But the trend in computer science has been towards more formal and precise forms of expression. Indeed, specialized languages have been developed that range from those designed primarily for program specification (eg, VDM, Jones [1986]; Z, Woodcock & Davies ; B, Abrial 2002 and wide spectrum languages ​​such UML (Fowler 2006, to specialized ones that are aimed at architectural description (eg, Rapide, Luckham

Darwin, Distributed Software Engineering 2002; Wright, Allen 2012. They differ with respect to the their underlying ontologies and their means of articulating requirements.

Z is based upon predicate logic and set theory. It is largely employed for the specification of suites of individual program modules or simple devices. UML (Fowler UML) has a very rich ontology and a wide variety of expression mechanisms. For example, its class language allows the specification of software patterns (Gamma et al. 1998). In general, an architectural description language is used to precisely specify the architecture of a software system (Bass et al. [P Downarrow c]. Typically, these languages ​​employ an ontology that includes notions such as components , connectors , interfaces and configurations . In particular, architectural descriptions written in Rapide, Darwin, or Wright are precise expressions in formalisms that are defined using an underlying mathematical semantics.

But what is the logical function of the expressions of these languages? On the face of it, they are just expressions in a formal language. However, when the underlying ontology is made explicit, each of these languages ​​reveals itself to be a formal ontology that may be naturally cast as a type theory (Turner a). Under this interpretation, these expressions are stipulative definitions (Gupta 2016. As such, each defines a new abstract object within the formal ontology of its system. 2.2 Definitions as Specifications

However, taken by itself a definition need not be a specification of anything; it may just form part of a mathematical exploration. So when Does a definition act as a specification? Presumably, just in case the definition is taken to point beyond itself to the construction of an artifact. It is the intentional act of giving governance of the definition over the properties of a device or system that turns a mere definition into a specification. The definition then determines whether or not the device or system has been built correctly. It Provides the criteria of correctness and malfunction. From this perspective, the role of specification is a normative one. If one asks Whether the device work, it is the definition functioning as a specification that tells us whether it does. Indeed, without it, the question would be moot. At any level of abstraction (see   §8.1 ,  the logical role of specification is always the same: It provides a criterion for correctness and malfunction. This is the perspective argued for by Turner (2014. Indeed, this normative role is taken to be part of any general theory of function (Kroes 2016.

It should go without saying that this is an idealization. A specification is not fixed throughout the design and construction process. It may have to be changed because a client changes her mind about the requirements. Furthermore, it may turn out for a variety of reasons that the artifact is impossible to build. The underlying physical laws may prohibit matters. There may also be cost limitations that prevent construction. Indeed, the essential definition may be logically absurd. In these cases, the current specification will have to be given up. But the central normative role of specification remains intact.

Unlike functional descriptions, specifications are taken to be prescribed in advance of the artifact construction; they guide the implementer. This might be taken to suggest a more substantive role for specification i.e., to provide a method for the construction of the artifact. However, the method by which we arrive at the artifact is a separate issue from its specification. The latter dictates no such method. There is no logical difference between a functional specification and functional description; logically they both provide a criterion of correctness. 2.3 Abstract Artifacts

Software is produced in a series of layers of decreasing levels of abstraction, where in the early layers both specification and artifact are abstract (Brooks Sommerville […] [1982]; Irmak 2016. For example, a specification written in logical notation might be taken to be a specification of a linguistic program. In turn, the linguistic program, with its associated semantics, might be taken as the specification of a physical device. In other words, we admit abstract entities as artifacts. This is a characteristic feature of software development (Vliet