| Glossary | Software | Software

Software

Software are programmes that run on hardware. Programs transform input data into output data, for example, the search query “bidt” into a set of relevant web pages, an unordered list into a sorted list, the distance to the vehicle ahead into braking impulses, among other things, the electrical resistance of lung tissue into current surges in a pacemaker, etc.

Software combines three essential concepts: Calculation, communication and storage, each based on data. Hardware enables computation through the so-called processor, communication through networks and data storage, and access to data through memory.
A detailed description of software can be found here:

Calculation

The transformation of input data into output data can be done in different ways. Traditionally, the solution to the problem of this transformation is achieved by a set of individual, very precise steps. Algorithms describe these steps abstractly. When the steps of an algorithm are written in a programming language so that a computer can “understand” them, they are called a programme. There are different levels. The algorithm for displaying results for an internet search contains, among other things, a step that sorts the results. Elsewhere, an algorithm describes how sorting works – for example, by searching for the smallest element in the first step, the second smallest in the second step, and so on. For each of these steps, there must again be an algorithm that can determine whether one element is smaller than another. At the end of the chain are elementary steps such as “Addition of 1” and “Is equal to zero”, which are provided directly by the hardware (more precisely: the processor). Software is therefore based on the idea of breaking down a problem into sub-problems, i.e. into individual steps, and these individual steps then represent problems again, which in turn are solved by individual steps. The essential task of software engineers is to break down a large problem into smaller problems until a solution can be directly programmed for each of them. The process of carrying out these steps is called computation – “to compute” also means to calculate, and the historical “computers” were people who carried out calculations. We describe here how exactly software and hardware as well as programmes and algorithms are connected.

Another way of transferring inputs and outputs is through so-called machine learning. Here, the individual steps are not described precisely because either the problem cannot be grasped exactly or the solution to the problem is not adequate through individual steps. An example is the problem of recognising a pedestrian. It turns out that the description by individual steps is factually impossible, such as “Is there a head?”, “Is there a torso?”, “Are there legs?”, etc. This is because there are too many different possibilities: Pedestrians can appear in groups, carry bags, push bicycles, wear caps, stand or run, etc. In such cases, it is best to proceed on an example basis. Here, this would be large sets of pictures with an explicit indication of whether there is a pedestrian on them. We describe here exactly how this works and explain why it is not always so simple and does not always work.

Communication

The decomposition of a problem into smaller, easier-to-solve problems directly means that the individual solutions of the lower levels must be linked to each other. To do this, the individual solution modules must be orchestrated. Historically, one computer ran one programme. Today, one computer runs many programmes, and one programme runs on many computers. Internet search, for example, connects a laptop or smartphone on which the search is formulated to the computers that send that search query to a computer that runs the search. The provision of the data relevant to the search is done by tens of thousands of computers that simultaneously scour the internet for web pages and whose content is prepared for the search functionality. To do this, all these machines have to communicate with each other. A similar phenomenon can be found in cars, where today about 100 computers simultaneously perform different tasks: controlling the engine, braking, measuring the distance to the car in front, wiping windscreens, streaming media, moving seats, etc. An overall functionality such as “internet search” or “driving a car” is thus made possible by different programmes running simultaneously on several computers.

Data and memory

The word “computation” linguistically suggests that input and output data are simple numbers. Historically, this was also the case. Then, over time, it became lists of numbers and tables of numbers. Numbers can also be used to describe letters, such as a 65 for the letter A, 66 for the letter B, and so on. This is how you can describe words in search queries and on websites. Numbers can also be used to describe images, such as each pixel by its position in the image and its colour and brightness. Language can also be described by numbers. Pictures can then be combined with text; pictures can also be strung together and turned into films with speech.

Data, like programmes, are structured and consist of smaller components. In order for a programme to process input data, this data must be made available. This happens in the so-called memory, another crucial piece of hardware besides the processor and the communication technology. There are very different types of memory. SD disks or USB sticks are memories that do not lose their content when there is no power supply. On the other hand, they are comparatively slow to access. There is also a much faster form of memory that programmes use for intermediate results, among other things, but which is deleted as soon as there is no more power. Data can now be stored in very different ways in both volatile and non-volatile memory. How exactly you do this has an enormous influence on how much memory you need and how quickly you can access it.

Research

The bidt-internal project “Ethics in Agile Software Development” deals with the ethical aspects of software development and aims to enable a normatively desirable design of software systems.