A Comment On: ‘Why writing software is not like engineering’


Harrison Ainsworth

Seeing the kernel of engineering in software development

This note is about an article that proposes a hard-line position on the ‘software is not engineering’ view. The backbone of that is the idea that software has no solid ground of law, and so is intrinsically different:

engineering is constrained by the real, physical world and software is not.

Software does not even have the concept of dimension. You might say that there are no lines within which to color. At least for engineering projects above the quantum level, no one expects to find structures that “defy the laws of physics.” This limits what you can physically build and how you can build it but at least it provides a well-defined world in which to work. The ethereal world of software does not have this luxury

This is a not uncommon conception: that because software is abstract, with no physical form, it has no rules, no determinate structure at all.

It is severely challenged by remembering the very basis of the subject: algorithms. These are where the primary constraints are. Think of sorting. If you write a sort, it cannot be faster than O(n log n). That is not some ethereal, artistic figment; that is a hard objective fact.

Further, we can see that software does indeed have dimensions: one of time and one of space – the basic measures of algorithmic complexity. Are these really real? Compare them with physical dimensions: are they entirely ‘real’? (See Kant's ‘Critique Of Pure Reason’ for some thoughts on that.) The critical thing is: they are both anchored to something independent, objective, regular.

We can make precise statements, and hence theoretical constructs, about an algorithmic structure, and we can clearly check its conformance to them.

Algorithmic structures are lawful, measurable, and exist in a well-defined world. And the core of software engineering is to build function from algorithmic structures.

The fundamental of all engineering is to have a material that is objective, determinate, and regular, that is grasped with logical mental models. An engineering discipline distils a systematic sub-part of this with certain charateristics: to be well understood and manipulable, to be sufficiently complex and flexible, and to be usefully applicable – put simply, it creates a good set of building-blocks.

Software development has various aspects and parts, but its core is essentially closer to engineering than anything else. As an engineering, it is immature, but that is forgivable for a field so young.

For a bit more: