If you want to move the state of computing forwards, how are you to do it?
I think that people tend to think of vertical technologies as the answer.
For example, if we think that computing would be moved forwards if it could provide better means for us to collaborate with each other, then we tend to think the answer must lie in developing better collaboration systems.
It sounds obvious enough, but I think it's wrong.
First I need to talk about what I mean by 'vertical technologies' and mention what the alternative is.
Computational technologies differ in how domain specific they are.
At the very domain specific end of the scale, you might have a program that performs a specific function for companies in the finance sector.
At the other end, there are technologies like the C programming language or HTML. You can write a C program that does pretty much what you like. You can write a HTML page about whatever you like. They're not very domain specific.
Domain specific technologies are vertical technologies, whereas things like C and HTML are horizontal technologies. Other examples of horizontal technologies are cut and paste, RSS, regular expressions, relational databases and dialog boxes.
I think that advances in horizontal technologies tend to push forwards the state of computing more than vertical ones do. And similarly, flaws or limitations in horizontal technologies tend to hold us back the most.
Horizontal technologies are infrastructure. Vertical technologies tend to work within the bounds of that infrastructure. Vertical improvements tend to be more incremental, horizontal improvements can be more revolutionary.
That's not to say to say that vertical technologies are unimportant, or that you can't have a big impact from developing a new vertical technology. Nor am I suggesting it's equally easy to make advances in both vertical and horizontal technologies. I'm just saying that, in general, with horizontal technologies, you can get a bigger bang for your buck.
I'm talking in broad outline here, and I'm not saying there's no exceptions.
I think that most people know that 'infrastructure' changes have the potential for being the biggest changes. But I think the thing is that, when it actually comes to considering how we can move the state of computing forwards, it's really hard to avoid thinking about it in terms of developing new vertical technologies.
It seems to stand to reason that if you've got a difficult goal you really want to meet, then you should focus as much of your efforts as possible on that goal.
This means focusing as sharply as possible on that goal, and targeting it with as much as possible of your solution. Any bits that aren't targeted at that solution are like wasted effort -- the effort'd be better targeted more directly at the goal.
Translating this into horizontal/vertical technology terms, this means that horizontal solutions feel less than ideal, because they're something more general that is not just for this problem but can be used for all sorts of other things. Their powers must be spread more thinly, and can only really bestow some of its benefits on this specific problem.
A more focused solution would be a vertical one - targeted specifically at this problem. Every bit of it is designed with that thing in mind. How could it not be the right way to go?
But benefits don't just come from specific targeting. Horizontal technologies provide benefits not by being for a specific goal, but by helping to enable them. They can enable new fundamentals, that then can be used to tailor specific vertical solutions. And I think that often what's needed is new fundamentals. That's what relational databases provided, what the web and RSS provided.
Look at what actually has been the biggest boon for collaboration. I think it's largely horizontal technologies -- computer networks, the world wide web, RSS, CVS. These are all things that are not specifically for collaboration but which enable it.
This is closely related to what I've been writing about recently about people looking at software pretty exclusively in functional terms.
The functions are domain-specific capabilities of the software. Looking at the software pretty-exclusively in these terms means overlooking the horizontal functions that are used to implement them.
Related: A short post from March 2006, where I briefly looked at vertical and horizontal technologies - Factors in Tool Complexity/Simplicity: Vertical- and Horizontal- Features