Friday, May 01, 2020

Software Development and Software Engineering

Prologue

The term software in this article means Application Software, as opposed to System Software. System software includes software for maintaining and cleanup of system, generally used by IT professionals, as well as compilers and other tools for creating software on a given platform. In contrast, application software is used by users to perform certain tasks, like word processor, spread sheet etc. The user of an application only needs to know how to use the application, without knowledge of the underlying platform. A hybrid application that requires the knowledge of the system on which the application runs is absurd. From this point on we will be talking about application software.

Software Development

Among the characteristics of software development are:
The use of multiple system libraries, and system software.
The use of multiple languages, including script languages for gluing parts together.
The use of system facilities, such as system calls.

This makes the software complex and dependent. All types of developers with knowledge of the dependencies are needed, which makes the development more expensive and less reliable. The unreliability is more the result of expecting one person to be familiar with multiple dependencies.

The use of system calls and other system facilities is needed for developing system software like compilers and debuggers. However, this process is programming the system rather than engineering a product, in our case an application. Engineers deal with general physical laws and abstractions. The developers have to understand huge volumes of documentation, sometimes specific to a particular version of the system. At times the documentation does not correspond to observed behavior. This factor is also responsible for lowering reliability,

Whether a car is built here or in Germany, engineers use the same laws. In contrast, software developers use the facilities of the platform for which they are developing. Very little, if any of their experience and knowledge is usable when attempting to make the same application on a different platform.

Towards Software Engineering

Engineers deal with mathematical formulation of laws of nature and empirical laws, like strength of materials. Local characteristics like humidity or heat are also well understood. They do not deal with documentation of various versions of laws of nature. Thus, there is no ambiguity. Their calculations are essentially standard and therefore reliable. However, any engineering process requires testing. At times even testing fails and cars are recalled. That is the nature of engineering.

We observe two main points of engineering: laws of nature, and their formulation. In order to speak of software engineering, rather than software development, we need the equivalent of these two points. Let us call them software abstractions, and their linguistic formulations. The abstractions must be sufficient for creating any application without having to use system or platform facilities. The formulation will be in the form of linguistic constructs, entirely within one single coherent language, and associated libraries.

An application is a conceptual entity, just like a car or a house, which do not exist naturally. Software engineering is the process of formulating an application using software abstractions. Unlike engineering, the process ends here. In engineering, formulation is only the start of implementation. Engineering formulations may comprise of blue prints, 3-D drawings etc. Software engineering uses some form of documentation so other engineers can understand the parts of formulation and their purpose.

Thus, engineering can be viewed as a formulation of a concept for materializing that concept into a product. For software, formulation ends the process. Otherwise, the materialization of concept begins after its formulation is completed. That is because, a software application is a concept.

Simplification of Abstractions

While identifying software abstractions to play the role of natural laws, we will encounter notions that correspond to system calls. For instance, threading is one such notions. Looking at Linux documentation on threads, we see a large number of system calls. Applications do not need that level of detail in dealing with threads. We need to abstract away the notion of threading as needed for formulation of applications, and provide simple linguistic constructs for its use.

For further reading on abstractions see:Evolution of Abstract Distributed Computing

Epilogue

The article attempts to clarify the distinction between software development and software engineering. So the question is, why does it even matter?

Countering virus spread and security attacks can be increased by deploying computers equipped with a large number of operating systems, randomly distributed within a network. In addition, the use of applications that make fewer, if any, system calls will reduce the threat greatly. Future operating systems can restrict or even block the installation of system programs without authorization.

Software development, as opposed to software engineering, is actually the main hurdle in the emergence of new operating systems. For each platform one needs a different set of developers, and development time. Engineered abstract applications will be available as soon as a new operating system is unveiled.

Z++ is an abstract language for engineering universal applications.

Labels: , , ,