Most software gets harder to change as it ages. Making modern applications, it is not enough to write a system and put it out there. We need continual improvement and adaptation to the growing world.
How can we develop and operate increasingly useful software?
To answer this, I need a mental model of how software teams work.
My model is symmathesy: a learning system of learning parts. A great software team is made of people, software, and tools. The people are always learning, the software is changing, the tools are improving.
With this view, let’s look at the question.
The external output of the team is: useful software, running in production. To make it increasingly useful, grow the symmathesy. Growth in a system is defined as an increase in flow. In a symmathesy, that means growth is an increase in learning.
The people learn about the software by operating it, mediated by tools. Then we teach the software and tools by developing. Unless development & operations are in the same team, learning is blocked.
To increase usefulness, the team needs to learn about use. We can get input from outside, and study events emitted by the running software, mediated by tools.
What we know about usefulness leads the team to design change, and move the system to the next version of itself. That next version may be more useful to the outside, or it may be better at learning and teaching, the better to increase knowledge inside the team.
Someone today told me, “All great things in life come from compounding interest” — from feedback loops. (Compound interest is the simplest familiar example of a feedback loop.)
In a great software team, that “compound interest” is our relevant knowledge. Of the software, of its environment, of the people and systems who use it.
Maximize learning to increase the usefulness of software, at an accelerating pace.