Uniformity and Recombinant Computing
|
|
I'm reading about the Obje project from Xerox PARC. Its got a couple of interestingly titled papers "The Case for Recombinant Computing" and "Designing for Serendipity". The core argument of the project is that if you standardize to a narrow set of fixed interfaces you overcome the chief obstacle to enabling network effects. That is, its an argument identical to the RESTful uniform interface argument. I however like their choice of terms "Recombinant Computing" and "Designing for Serendipity", definitely sounds more impressive.
The project sets out to define three general categories of "meta interfaces":
- Connection. How do components exchange information with each other?
- Context. How do components reveal information about themselves?
- Control. How do components allow users (and other components) to effect change in them?
Then followed by an intriguing claim "expressing functionality in terms of these meta-interfaces allows entities to use new components that appear in their environment without explicit rewriting, updates, or installation of drivers." Now if you look at the different meta-interfaces (i.e. Data Transfer, Aggregation/Discovery, User Interface/Control ), it doesn't look like Obje is proposing anything novel. The only thing novel I can think of is the emphasis on the use of a narrow set of uniform interfaces and of course the use of the terms "recombinant" and "serendipity". That's something the REST folks should start using in their vocabulary to spice up their respective arguments.
Unfortunately, supporters of a narrow set of uniform interfaces don't seem to have enough ammunition in their arguments. The proof of the argument have always been the existence of the web, but can we show something that's a little more fundamental? The argument for uniformity is obvious, that's why you have standard committees all over the place. However, is there an argument that a single interface is better than two or more interfaces? "Less is more" is a difficult argument just too unintuitive to grasp. How can one be better than two or more?
Fortunately, I've stumbled upon an interesting formulation, that is "Concatenative Combinators". There are two basic functional forms that are Turing Complete, that is lambda calculus and combinatory calculus. Concatenative combinators is new theory of combinators. The primary difference between it and the other forms is that it supports a narrow fixed uniform interface, that is a stack and nothing but a stack. Every combinator takes in a stack and returns a stack.
The consequences of this are quite astonishing. Aside from the fact that it appears to be Turing Complete it has the properties that these combinators are composable. The usual way of supporting composable functions in functional languages is to exploit Currying and work primarily of unary functions.
Concatenative combinators work of nothing but unary functions that transform stacks into stacks (Sounds a lot like Implicit Invocation doesn't it?). The beauty of this approach is that its simple (everything can be derived from two elementary combinators), furthermore its extremely powerful. The primary argument against narrow uniform interfaces is that it doesn't look like its powerful enough to do every thing we might need.
Concatenative combinators however proves that that's startling wrong. In fact the difference between just one interface (i.e. composition) and two (composition and application) is huge. It could be the difference between recombinant computing and ordinary computing. Its ironic that uniformity breeds something far from the ordinary.

