This is over a week old, but it was striking, and I felt I ought to share it:
Dizzying but invisible depth, by Jean-Baptiste Queru (of the Android Open Source Project)
Over the past couple years, I've come to an interesting realization - I like knowing how protocols and markup languages work. Their design informs my own, and being able to speak the exact language that another system is expecting means that you are able to interact with it. You are able to understand it. You are able to analyze its behavior. This concept of common ground - speaking the same language, whether it be text strings, or a sequence of voltage levels, or something else - is a very useful abstraction. It makes it possible to build higher order things on top of them, and then people only have to understand the layer they're working on.
One of the reasons I think I like knowing all sorts of protocols is that it means that I can interact competently with systems (or people) at any of the layers. It means that I can be useful in a greater variety of settings. It means that I can start to identify where in the stack of layers a brick is missing, when something breaks. And that is something the world seems to find valuable in an engineer. If I were a recruiter, I would expect the breadth of an applicant's competencies with different protocols and languages, particularly in different layers, to correlate with the applicant's ability to deal with complexity, which I'd consider fundamental to good engineering.
It would be terribly convenient if we could apply the same principle to people. And to some extent, we can. Some layers, like spoken and written languages, are fairly good opaque abstractions. Others, like cognitive models, emotion, group interactions, and a pile of the other interesting emergent behaviors of humanity are not. People can't handle that sort of cognitive load without better abstraction - we are simply too complex.
But since we have to deal with other people anyway, I think our brains come up with ways to cope. Inevitably, we wind up making simplifications to systems. I'd posit that both stereotypes and common spoken and written language are a way that the human mind deals with the excessive complexity of people. Through both, we have restricted the amount of complexity that an individual must consider when interacting with people.
Both have an up-front cost to learn and a loss of a certain amount of expression as a result. People have feelings that they cannot adequately put into words, and stereotypes can result in improper and hasty judgment. But in exchange, we gain an abstraction layer - a common ground - that makes a great many other interactions wildly more efficient or even tractable. Without written and spoken word, we would lose history. Without history, we would be unable to build on the knowledge (and abstractions) of our predecessors.
One last thing that we rarely mention: once fixed, abstractions cannot be easily changed, since other abstractions are built on top of them. Just as we cannot change the USB protocol (we can merely add a new one), we cannot easily change languages, or alphabets, or stereotypes, but we can add new ones. Just as the tail and the appendix were useful in our earlier evolution, we are stuck with these eccentricities in our development. We must design our abstractions wisely, if we can, for we are stuck with them once we make use of them. My mind is filled with questions:
Comments:
Dustin | 2011-10-26T18:44:51.714191
Obviously the human API wars need to end. Single API! With better documentation!