Programming
a computer is the act of building up a large number of instructions for
a machine to follow based on ‘primitive’ operations and underlying
libraries. These instructions or ‘algorithms’ are always computed
rigorously, which is occasionally not what we intended. Thus ‘bugs’ may
interfere with the user’s objectives, but they will not harm the machine
itself (although they can occasionally damage peripherals). The machine
is simply following the steps that it was told in a deterministic
manner.

Underneath,
the computer manipulates ‘data’, which itself has to fit to a
predefined format. Data stored in a computer is a symbolic placeholder
for things that exist in the real world. It doesn’t really exist, but it
can be used to track and analyse the world around us.

As
such software can be viewed as a ‘system’, whose set of instructions is
‘formal’. We can’t just create any arbitrary collection of bits and
expect it to run, the computer will reject the code or data if it isn’t
structured properly.

Mathematics,
in its simplest sense, is the study of ‘abstract’ formal systems.
Mathematicians create sets of ‘primitives’ that act on abstract
mathematical ‘objects’. Collectively, the primitives are used to express
relationships between the objects that are rigorous, often these can be
combined together to form ‘theorems’ and algorithms. That is, for any
mathematics to be valid, it must conform to strict formal rules.
Mathematical objects exist only in the abstract sense, although they are
often used symbolically to relate back to real things in this world.
Doing so allows us to explain or predict the way things are working
around us. There are many domains that attempt to model the real world
by applying mathematics including statistics, physics, economics and
most other sciences.

Both
mathematics and computer languages are primarily about formal systems.
They both allow us to build up the underlying primitives into larger
components such as theorems or libraries. They both exist away from the
real world, and their utility comes from mapping them back. The
underlying most expressive formal system for computers is the Turing
Machine. Within this context we often create other more specific systems
like programming languages or applications. Turing Machines also exist
within mathematics, however they are not the most expressive formal
system that is known. There are larger formal systems that encompass
Turing Machines. As such we can see that the formal systems within
computers are a subset of those within mathematics.

An
interesting difference is that mathematics is completely abstract. It
can be written down in a serialized fashion, but it is not otherwise
tangible. Software however runs on physical machines, that are derived
from the mechanization started by the industrial revolution. Internally
software might be abstract, but externally the computers on which it
runs are subject to real world issues like electricity, temperature and
moisture. In this way software manages to bridge the gap between our
abstract thoughts and the real world around us. Software also often
interfaces directly with users who are creating new input or trying to
analyse what is already known.

Given
the relationship, software is a form of applied mathematics. Its formal
systems share all of the abstract qualities of mathematical formal
systems, and the underlying data is essentially various mathematical
objects. Building up software on a computer is similar to building up
theorems or algorithms within a branch of mathematics. Both mathematics
and computers have issues when getting mapped back to reality, since
they are at best ‘approximations’ to the world around them.

Software
development has been underway for at least five decades, and as such
has built up a large base of existing code, knowledge and libraries. The
many partial sub-systems of software, like operating systems or domain
specific languages can help to hide its underlying mathematical nature,
particularly when crafting graphical user interfaces, but ultimately a
strong understanding of mathematics helps considerably in understanding
and structuring new parts for systems. There are some aspects of
programming that are non-mathematical, such as styling an interface or
the content of an image, but for the rest of software development having
a good sense of mathematics and logic aid in being able to craft
elegant, correct and consistent instructions.

Since software is an applied branch of mathematics, it is clear that not all code is intrinsically mathematics, but realistically what isn’t lies only within the intersection between the machine and the user. That is, whatever irrational or illogical adaptations are needed to make the system more usable for people, is non-mathematical. The rest of the system however, if well-written (and possibly elegant) is a formal system like the many that are known in other branches of mathematics.