A good function

A good function is: A pure function, one without side-effects whose return value depends only on its arguments Available at a stable public name in a global namespace Performs work only linearly proportional to the size of its arguments (considered as structures) This notion was first described the Fluid wiki on this 2005 page which goes into some somewhat crusty historical detail for justification. The main upshot is that such a definition aids transparency — the ability to reason from effects to causes, and liveness — for the system to responsively adapt to the user’s gestures. [Read More]

Divergence

Defined in my 2016 paper, divergence represents any discrepancy between the runtime state of an application, and the state through which it can be authored. Typical sources of divergence include the program’s call stack, unintepreted addresses within the heap, event listeners and typical sources of object representation such as vtables and the like. In a tradition of materialised programming, divergence should be minimised, in order to reduce the mental burden on those trying to visualise the effects of their edits. [Read More]

End user programming

End-user programming is a time-honoured discipline but end-user tools such as spreadsheets are held in contempt by specialised developers. The discipline actively works to raise barriers of abstraction and tooling to ensure that it is only accessible by specialists and what investment is made in end-user tools is done under the assumption, like Gabriel’s, that the gulf between those empowered to build software and those empowered to use it will stay unbridgeable. [Read More]

Externalisability

Defined in my 2018 paper, externalisability, together with its dual property of addressibility, represents an essential property of a substrate supporting open authorship. An externalisable design is one which is serialisable in a form in which every design element has more or less stable and legible coordinates. An addressible, externalised serialisation of a design could be in terms of a JSON document with human-readable keys, to be contrasted with relatively opaque kinds of serialisation such as Python’s pickling or Java’s object serialization systems, designed to round-trip arbitrary in-memory structures allocated in a general-purpose programming language. [Read More]

Habitable

Habitability as applied to software technology is a term coined by Richard Gabriel in his 1993 article “Habitability and Piecemeal Growth”. You can see part of this article reproduced on Kartik Agaram’s excellent blog, as republished in Gabriel’s book Patterns of Software which I hugely recommend – I consider Gabriel the finest writer on software technology of his generation. Connecting this idea with Christopher Alexander’s idea of organic growth in the context of the architecture of buildings, Gabriel says [Read More]

Integration Domain

An integration domain is defined in Stephen Kell’s 2009 paper The Mythical Matched Modules as a domain where languages and tools are specialised towards composition of software, and so do not resemble conventional languages relations are expressed between runtime values, predicated on the context in which they occur In addition through Stephen’s principle of interface hiding, dependencies do not explicitly manifest themselves in the domain except through the contextualised values which the domain puts into relation. [Read More]

Lithification

The term lithification in software development was coined by r0ml (Robert Lefkowitz) in his incendiary 2017 talk Keeping Linux Great which is written up further in his equally trenchant article Giving up on Open Source Software. It describes a mode of software reuse that appears entirely anti-religious to anyone with a traditional programming education, of simply appropriating the source code for any library or implementation one needs, incorporating it into one’s own codebase and then bashing on it. [Read More]

Substrate

A substrate is a kind of self-sufficent model or material for the construction of software. Jonathan Edwards’ definition is a great starting point comprising the following points: A complete and self-sufficient programming system Persistent code & data store Direct-manipulation UI on that state Live programming Programming & using are on a spectrum, not distinct Conceptually unified — not a “stack” Summarized as a slogan: “A PL, DB, & WYSIWYG document unified together. [Read More]