Writing · Architecture

Software that thinks with you

From commands to conversation: why development should be interactive, and what makes an application intelligent at all.

2022 · 2 min read

You have an idea and want to turn it into a system. The idea is raw, and the computer is dumb enough to follow you to the word. So much is left to the developer's imagination, and to ugly experiments in ordinary programming. Bret Victor has made this point better than anyone.

Less machine, more problem

Code engines, graphical programming, model-driven development, machine-learning-driven development and DSL paradigms have each helped. They let us think less about how computers work and more about the problem. The dumbness of the computer remains.

Model-driven engineering works by creating a domain-specific language for the problem, defining the application in it, and writing a generator that links the grammar to a computer language. Look closely and there are three languages at work:

  1. the language of the domain,
  2. the language of the grammar definition,
  3. the language of the machine.

Each corresponds to a model of a system, and each should reflect what that system can do.

When the idea is still evolving

The trouble starts when the idea itself is unfinished. If the concepts are undefined, the domain model is undefined, and so is the generator. The real task becomes developing a model. Machine-learning-driven development is built for exactly that: give it inputs and outputs, and a learning algorithm produces a model. But the only conversation is the training set, and the model is a black box. For an evolving idea, that throws the whole point of ideation away.

Interactive development is the alternative. Instead of do as commanded, the computer works with you. You start with a raw idea, say a game with ships, and you scribble; the computer suggests and tests; you keep what you like, until you have a set of rules you are happy with.

What makes an application intelligent

Most applications are rigid. A messenger or a music player cannot think for itself, so it cannot improve itself. Some are intelligent at a low level: photo libraries that recognise faces, recommendation feeds, self-driving features. They reason and decide, but they stop evolving past a point.

An intelligent application can reason, decide, learn, evolve and improve itself, and work with its data. It should analyse what it sees, give feedback directed at the current situation, show something like curiosity, and above all have common sense. The aspiration is the assistant in Her: software that understands enough of your world to think with you rather than for you.

Two questions from those notes are still open. Is the Turing test a valid measure of any of this? And can video games, as rich and safe worlds, be used to train it?

Drafted in 2022
Updated for site in 2026