Tuesday, April 2, 2013

The Disadvantage of Agnostic Development

There has been a trend in technology for agnostic development. In fact, if you google agnostic development, you'll likely be given the choices to be "platform agnostic", "device agnostic", "browser agnostic", "design agnostic", "os agnostic", and more - but what does it all mean?

According to one website, "agnostic, in an information technology (IT) context, refers to something that is generalized so that it is interoperable among various systems. The term can refer not only to software and hardware, but also to business processes or practices."1 The website goes on to say how agnostic is a compound word from a ·• gnosis (which it says means without knowledge). This, unfortunately, is a misunderstanding that we must first address.

Let us assume that the common understanding of the etymology is correct and look first at the word gnosis (γνώσις).

The word gnosis can most certainly be translated knowledge, however, it is not simply knowledge, but a certain kind of knowledge. It is typically used to identify experiential knowledge and is contrasted against episteme (επιστήμη), or theoretical knowledge. In this understanding, then, we can see how a ·• gnosis matches the context quite well - we are developing something that has no experiential knowledge of something.

Permit me another tangential comment - or if not, skip this paragraph. Classical Greek thought was all about the experience and their language reflected that understanding. For instance, we can see the experiential bias in this example and in the companion words chronos and kairos.

As we know, the language of Plato was very precise, and because of this precision and the observation that much of classical thought is based on one's experience, and because gnosis doesn't seem to fit the word agnostic, I would put forward that the common understanding of the etymology of agnostic is incorrect. Rather than the stem gnosis, I propose that the stem should actually be gnostikos (γνωστικοσ), and that our understanding of agnostic should be not be simply without knowledge but rather something that cannot be known.

With this new understanding of agnostic, let's look at a few examples of typical agnostic development. For instance, we may have "platform agnostic" software that runs on any combination of OS and processor architecture, "device agnostic" software that operates on multiple devices, or even "protocol agnostic" software that negotiates communication with peers rather than being bound to a single protocol.

In each of these examples, and the many more examples we can think of, the term agnostic doesn't really apply. I would put forward the idea that even if we take the original etymological understanding of the term, the term is still imprecise enough to cause confusion. In all of these cases we can, and in fact do, know the technology (OS, device, or protocol) being used - it is rather that the software doesn't care which technology is used. The correct term, then, is apathetic.

Why is this a problem? As we have experienced numerous times, the amount of coding necessary to develop a truly apathetic system is significantly more. More coding means more complexity, more complexity means more testing and more defects, more testing and defects means more time and money are invested, and on and on - more, more, more.

Yes, apathetic development means more, more, more...except where it typically counts the most, because it also means less - less optimization. Less optimization means a poorer user experience, often due to under-utilized resources, and a poorer user experience typically results in no one getting what they truly want....and that's why I always try to keep in mind that the key to failure is trying to adapt to everyone. (Robert's Rule #31)

Notes:
  1. What is agnostic?

No comments:

Post a Comment