After today’s Deploy 2010 talks, I’m left with a new thought:

If the problem you’re solving is heterogeneity, then you’re probably solving the wrong problem.

The probability of wrongness is a function of how close your solution is to a “platform.”

The world of technology is, and forever will be, heterogeneous. Those who don’t embrace this suffer from uniformitis.

A key symptom of uniformitis is write-once, run-anywhere. For decades, this tempting meme has lured developers down dark and fearful paths. Today at Deploy I saw another example: PhoneGap. PhoneGap is an interesting platform that allows developers to write mobile applications once, in HTML and javascript, and then “compile them down” to native code with full access to hardware features. It is quite possible to build high-quality apps with PhoneGap, and we saw some solid demonstrations at Deploy. But the story with PhoneGap is, from what I can gather, the same with Java Swing, or QT, or countless similar technologies before it: you can only go so far before you hit a wall.

Another manifestation of uniformitis is piles of inflexible or least-common-denominator abstraction. I recently spent some time looking at libcloud, an impressive and useful library that attempts to pave over differences between cloud providers by providing common abstractions of storage and compute. But the moment you need to do something interesting – for example, placing compute instances in different AWS availability zones – the limitations of libcloud’s abstractions become clear.

One final indicator of uniformitis is non-incrementalism. Microsoft’s OData is motivated by noble goals: if only all data were presented via a uniform service API, goes the argument, we’d be able to build such great things. The OData approach is RESTful, clever, and elegant. Developers who live strictly in the Microsoft ecosystem can immediately reap the benefits. Unfortunately, not everyone lives in Microsoft’s ecosystem. OData places somewhat heavy requirements on the server side. There are early-stage OData server libraries for Ruby and Java, but they are immature. And as NoSQL stores become more commonplace, it may become harder to meet the basic requirements OData places on the backend.

There’s a counterpoint that’s worth highlighting. There are, of course, times when trying to unify the world is exactly the right course of action. In some sense, the history of our industry is that of technological divergence followed by negotiated consolidation around protocol and interface.

If you can successfully establish homogeneity, you are in a position to reap enormous economies of scale.

I’m willing to believe that this counterpoint is why we constantly see new examples of uniformitis in the wild.

Microsoft is a perfect example. Microsoft’s brilliant business innovation was realizing that if all computers used the same operating system, then the hardware and software ecosystems could effectively be decoupled – and Microsoft could extract huge value at the interface.

Of course, power derived from homogeneity doesn’t last forever. Much that is homogeneous becomes commodity. Microsoft understands this of Windows, which is why it is aggressively entering new markets.

(Postscript: this post was very much off the top of my head after Deploy ended. As a result, this doesn’t feel fully coherent, and I’m not fully sold on these thoughts… so I’d love to hear yours.)