[Philosophy] The ontology of software


Being a computer scientist before I am a hacker means I spend a lot of time thinking about the general ideas we use to process information and produce meaningful algorithms and computations. But of course being a philosopher before I am even a computer scientist means I think also a lot about what things are, how they are, why the the way the are and how we manage to say the are in such ways. (top-down)

I like asking questions and this aggressive question asking has led me to thinking about the ontological nature of software.  This post is a collection of a few potentially meaningless stabs I'm taking at what I perceive is the currents state of affairs (this was a typo at first, left it in as a joke for reasons obvious later) with regard to the nature of software's philosophical ontology.


Lets start with, what is software... what is software not?

The common approach to asking this question is often to turn your mind to what it is not ("it is difficult to start with what it is, let us start with what it is not"), in order to edge out a shadow of what it really appears to be in some objective enough fashion.

For some reason (perhaps due to its massive occupation of the common thought processes, and its history of occupation) one tends to think about how it is different from hardware. Of course it might be useful to treat hardware with some magic dust that lets you enter it into the discussion as a basis to orchestrate a distinction, but that cannot (or rather should strongly not) be done without a clear understanding that the magic dust has appeared to make this possible. That is to say, "sure we can talk about how software is different from hardware and therefore allows us to then learn what it is and is not" but then I would say "if you are logical you understand this course of thinking must only be undertaken with a strong focus on the fact that we are first assuming hardware can indeed be something different from software". To restate even simpler; we can talk of software being different from hardware, but that is only do to a pure assumption that it is and can be said to be different in the first place.

We want to know what software is and is not, we cannot start by drawing distinctions from something that very likely is the same as software. This is surely dangerously un-objective thinking, purely due to its approach. To sum up the thinking "We are fully aware there is a massive dispute about the nature of the ontological distinction of software's differences from hardware, but fuck all that lets use hardware in the argument and pretend it is different, though it could potentially and completely not be different at all". I will enter the discussion with a discussion of this, and then take to establishing software's ontology using simple and inexorable properties of its existence.

Lets start with: what software is...


Software we know most definitely to be a set of instructions. But if this alone defines software then books are software, and literally anything is software and this is the breakdown some philosophers poke at as making the Moor/Suber definition not useful.

This is a blog so I can interleave it with divulged talking points at random: That is to say that what I have read about the commentary on the Suber/Moor idea of duality is not that it is isn't correct but merely that it turns everything into software (and by extension of its duality everything also becomes a hardware then). I hear/read only published argument about why this is hard to accept not whether it is correct to accept it or not. So I will here orchestrate an argument about why it is entirely correct to assume so, I will start outside of the realm of computers and funnel down into to with my argument and then I will start at its very kernel and expand outwards rapidly until I find myself defining what was defined with the start of my previous argument. I enjoy doing this with argumentative proof because in computer science proof culture this is the idea of top-down, bottom-up; it is something we use to build solutions, prove and develop algorithms with. 

So software is a set of instructions, instructions are instructions because they describe actions to be performed on data (the data is not entirely importantly-different all the time from the instruction) some instructions are transformed from instruction to data and back at dizzying and instant speed during certain computations. It transforms back and forth but for the median it is both instruction and data. This leads me to only be able to make the following statement...

So software is :

instruction/data that allows us to transform instructions/data[i] for a pre-defined purpose[ii].  (1)

I believe is the most concrete way to state completely and without a possible refute; what software is.

Lets rip this apart a bit see if it really makes sense to say this:

[i] instruction/data that allows us to transform instructions/data


You must have noticed that while there is clear dispute (i could establish proof to firm this statement up, but that is available else where) about whether instructions itself is data or vice versa. Now (from the first principle of my argument, the starting point) we must in the same fashion say here: we cannot focus on whether, what software "works on" is in fact only data or only instruction we take away (that in concreteness only) that it "works on" these things, whatever we are sure they are is not important. Software is what "works" on instruction/data that is concretely what it does.


[ii] for a pre-defined purpose 


Why is the purpose necessary? Well if we are talking of something that is merely a transform/permutation then it is important that we realize literally everything is a transform. We must then bring light to the idea of why we call certain transforms computer software and other transforms music or art or continental drifts. Well here I claim that the purpose to me is the only thing that differentiates it. Or more simply the property that it has a purpose is what allows us to call software, software.

This is very easy to see when you draw analogies with the other transforms/softwares happening on "computers":
Your computer is constantly changing its state and changing the state of the data (on the computer), that is literally all it does. When it is not running software A, a set of software other than A is constantly running and some of them are what enables the computer to run A. When it is off it is even running a special kind of software that tells it to do "nothing" or be "off" (a null-type, identity-type)(a). So then if the computer is always running software (even when it is doing nothing) how do we know when a given distinct software is running and when not? Well that must be and to my mind can only possibly done if you can argue that the potentially completely random collection of squeaks and squalls happening in front of you definitely and provably performs a given task.

How do you know your software is running? Well, the computer does what your software tells it to do not so? If your software is running and it does NOT do what your software says it does then your software un-exists surely? Otherwise we must have a strict way to say that the software sometimes does and does not do what we say it does, statements made and instruction/data used to label the software at an atomic level must be capable of more than one thing as well then. Some instructions must then be duel in nature; sometimes doing a given thing and sometimes doing another still being the same instruction (already this doesn't make sense).  Sometimes fulfilling one purpose and sometimes not full-filling this purpose. That means when you read the definition of the program you are also reading the non-definition of the program and potentially reading and infinite number of programs definitions. Surely arriving at a statement to say X is X and then also entirely potentially not X at all; would mean that ontologically I have gain absolutely nothing. This definition of softwares existence leads me to be able to say that software both is a definite thing and is completely not a definite thing.

So, clearly software must have a defined unique purpose otherwise it is not software, but potentially as much software as the entire collection of everything your computer and every computer has ever done. Without a strict defined purpose software is rendered absolute noise.  So therefore to exist as a distinct object in its own right for us to call a collection of transforms that runs on a "computer"; for us to call those transforms software, a strict pre-defined purpose for every particular collection of transforms must exist.

(a) A comment on the music analogy used in Irmak's[1] paper (due to my introduction of the null/identity-type inclusion above): Is argument as far as I understand it is to say that software is like music. Thinking logically you will eventually realize that a pause in music is also music, we know this because when we add something to music and get more music the thing we add must also be music (given that it doesn't change the nature of the music itself into: music + non-music; the sum total stays a "music").  So if you then take away something from music and it doesn't change the music into non-music, what you have taken away must then also be music! So, if we take the pauses out of music doesn't that make it non-music? if we add pauses does that make it non-music? This reason i think makes it obvious that the pauses are very very much very musical in nature, they are a "music". Anyone trained in classical music will let you know of years they spend learning how to not play at the right times so it produces the right, non-sound for you to properly enjoy the non-non-sounds.  There is even further ways to prove this working on music as a collection of sounds; therefore allowing absence of sound to be a sound itself and therefore... :) As you can see top-down ;) 

So given the statements I made can be made in such a way and cannot be refuted on logical basis  I can then claim that: Software is a set of instructions/data that transforms instruction/data for a given purpose.

Now we can get to what is and what is not hardware and is it a different thing from software.
I think this is a good place to leave the argument for consumption, in further posts I will expand and apply this idea to study the ontological nature of hardware.

Reading list



  1. https://plato.stanford.edu/entries/computer-science 
  2. http://sci-hub.cc/10.1093/bjps/29.3.213 
  3. http://legacy.earlham.edu/~peters/writing/software.htm