5 February 2013

Technologies for incremental development

By Andrew Clifford

When it comes to incremental development and system evolution, not all technologies are created equal.

Modern IT methods stress incremental and iterative construction. We think of these as systems development techniques, but could we extend the idea of incremental build and continuous evolution into production systems?

Recently, through a mixture of time pressure and laziness, I have been making a lot of changes directly to our production Metrici system, even editing configuration and code on the fly. Even though it might seem risky, I have not hit serious problems. I have been trying to think through what characteristics of the platform make this possible.

It boils down to three things: early binding, low coupling, and high autonomy.

Binding refers to the resolution of symbols used in the code to each other and to external data. In a traditional compiled system, symbols in the code are bound to each other during compilation, and then bound to external data, such as files and databases, during system configuration. This is known as early binding. In more interpreted systems, code and other resources may be bound later. But in Metrici, references to data and code components are bound during development - you pick specific versions of specific objects as you configure the system or write code. This extreme early binding means that you can create and modify new versions of code without disrupting existing solutions bound to older versions.

Coupling refers to the degree of connectedness between components, how much a consumer of a component needs to know about that component. At the risk of gross simplification, early bound systems tend to be more highly coupled, with complex programming interfaces, and late bound tend to be looser because they need to resolve connections at run time. Metrici is odd for an early bound system in that the coupling between components is very low - you can include components in a solution without knowing anything much about them. This means that when there are changes, there are relatively few knock-on effects.

Autonomy refers to the ability of components to work independently of each other. Some systems are built from a sophisticated structure of components which rich interactions, but those components have no use outside the whole. In Metrici, every piece of data, including each component, can be represented as a web page, and can be viewed and maintained using in-built functionality independently of any other. If things go wrong, it is always possible to view and modify data, even if more specific functionality, such as appearance or calculations, has gone awry.

If you read about incremental development, there is a lot about methods but relatively little about the fundamental characteristics of software platforms. Our experience has shown us that the software makes a big difference. The combination of very early binding, low coupling and high autonomy frees us from many of the restrictions of traditional software, to the point where it is safe to make changes to a running, production system. If you are interested in incremental and iterative development, it is worth thinking about how the underlying software platform will support you.