Software Engineering Materialism


Harrison Ainsworth

It is good to think of software engineering as ‘the design of structures in a special abstract material’.

The idea of software having or being a ‘material’ is somewhat unconsciously appreciated, but is not prominent enough. Some casual Philosophy of Engineering can help: it attempts to clarify and point thought in the right directions.

A material needs: to have objective properties, to be complex or sufficiently interesting, and to be usefully applicable. These are true of software, they only lack an obvious coherent ‘body’ – software is so abstract and intangible it disappears behind its secondary factors of developer skill and organisational process.

Software engineering is most essentially about usefully processing data within available computational resources of time and space. These are the defining elements: data and algorithms. On them are built accuracy, reliability, security, etc.. Evolvability is important, but it is a matter of representation not the structure itself, so it is dependent on the essentials.

On this basis, software material is analogous to physical material in other engineerings: objective, logical, quantifiable, practical, useful – and the foundation. And software material has, like physical material, similar general characteristics:

  • The material is objective and determinate – like mathematics it can produce logically provable, and measurable practically applicable, knowledge.
  • The material has a range of regularity – it permits precise knowledge, as well as supporting rougher yet still reliable guides (as for craft)
  • The material has certain properties, constraints, limitations – a ‘grain’ that makes some structures work better than others, and some manipulations easier than others, and regulates the work activity itself.
  • Structures can be substantially expressed in code etc. – though they are limited expressions, not covering all implications.

With this model, doing software engineering is about knowing the material and working the material – it is designing structures, in the material, for useful ends. Improving software engineering is about improving theoretical and practical understanding of the material – and co-ordinating that with other activity. Everything specific to software, and adjacent to it, can be referred to, or fits around, the material.