OK, I know it is getting a bit tedious, all this talk about language, but Joel Spolsky's Law of Leaky Abstractions is another argument why the *final* programming technology will be loose-knit, open and language like. The law simply says that all abstractions come to an end - and sooner or later you have to abandon the abstraction and look at the substrate it abstracts from.

That's like an inverse Gödel theorem: Instead of the idea that sooner or later you have to make reference to some meta-level to correctly describe your world, this law says that sooner or later you need to de-meta. So this is a pragmatic dualism to the idealistic notion of formal methods in programming design.

If that is the case, why not make technology that *by definition* covers the whole range of possible meta-levels.

Being a mathematician I have often encountered a purely mental version of leaky abstractions.

Mathematics *can be* a delightful play with words. A mental game, where the only thing required of you is to come up with a consistent set of utterances that are somehow interesting and meaningful in the end. This 'no rules' aspect of mathematics is a driver towards more and more abstraction. Mathematicians are always abstracting to meta-levels. The meta-level then becomes the real substrate for a new discipline of mathematics, and this new discipline in turn feeds the creation of new meta-levels of knowledge with its own group of specialists.

This process may sound ridiculous and unproductive when described from this rather tremendous distance, but in fact it is important and highly productive. The constant redefinition and refining of mathematical concepts makes the work of geniouses commonplace

An interesting example of this is the subject of linear algebra and convex analysis. The historically inclined mathematician will find the original sources for material in these fields hard to read and almost incomprehensible. Generation after generation of reformulation of the knowledge in the field has shaped into an efficient - if sometimes boring - body of knowledge. The work that was hard to the dicoverers/inventors of linear algebra is now taught to university freshmen as an easy way into the basic notions of proof in mathematics.

What has this got to do with leaky abstractions? When you're doing mathematics, trying to prove something about mathematical objects you tend to set aside the knowledge you have in principle that these objects and the models they fit into are really abstractions, and that they are not really objects at all, but rather just specific features that something may have and that you are at present recognizing this something by that property. If you always have to second guess your primal use of language - namely the presentation of information about concrete physical things - you tend to get lost really fast - so you suspend your knowledge that what you're talking about is an abstraction and talk about it *as if* it was a concrete thing. This works very well, if you have a good power of imagination at least. Because language is multilayered and doesn't look different when you access a meta-level of information it is efficient and convenient to dispense with the knowledge of abstraction.

I've never really had major difficulties in 'going meta'. In accessing the next level of abstraction. For me the problem always was going the other way. Once you're deeply into the abstraction - if you suddenly arrive at some new object, that you constructed on the meta-level, but that does of course have a less abstract value (i.e. in the context a *real* value) the very talented also know how to step back from the abstraction and access the 'real' world beneath. I have always had trouble with that, and I really think that is why I am not a mathematician today.

This is less of a problem when you have 'perfect' abstractions. But unfortunately, the 'perfect' abstractions are the very old ones, the polished ones. The new ones - and the ones so new you're making them up as you go along, tend to be more imprecise and leak a lot. When that happens, that's when you need to be good at stepping back from the abstraction to some level of knowledge that doesn't leak. A lower level, where the information you've produced makes sense. When you need to do that the very flatness, and non-layeredness of the language you use becomes the problem. You find it hard to distinguish between information about the abstract layer and information about the concrete layer. And when that happens, you know you are lost.

So in short, using language to model is no panacea either. It's just - in my opinion - the *least leaky abstraction we have of knowledge itself*.