I'm in the mood for a good rant, so sit back and loosen your face muscles as they might be strained making faces for a while.
First, let me start with a snippet from a Microsoft exec at Tech-Ed:
"...as much as we've expanded the tools and services, the one thing we continue to have is the commitment to a single programming model," Somasegar said. "The saying used to be write once, run anywhere, well we say 'learn once, run anywhere,' because once you learn the Microsoft programming model you can use it to build applications anywhere" on the platform, he said.
Is he talking about the same Microsoft I know?! The company that has a development methodology for every mood. Just use Sharepoint to build a... wait no, Infopath because it's XML data and... actually what you need is Expression Blend... er... Web... but no it's going to involve documents so extend Office... wait you're a real developer so you should be using Visual Studio to write VB... er... C#... wait it's a web app so Ruby.NET against SQL Server Express, no Compact Edition... wait the data is coming from different sources, try SQL Server Integration Services, wait, no you need BizTalk... with a slick UI built in ASP.NET... no Windows Forms, er... I mean WPF... using CAB, no wait that's sooo 2 years ago, you need SCSF Contrib, wait Prism with Enterprise Services, hitting web services through WCF, wait, no Entity Framework running on Windows Server, er... Singularity. Sadly, for every one of the mentioned methodologies, there are dozens of others up Microsoft's proverbial sleeves.
It's great to allow teams to be autonomous and creative to a point, but what ever happened to conceptual integrity? Is everything really just a subjective mess of competing, "different, but not necessarily better" technologies, or is there merit in actually throwing out some ideas, even when the customers are asking for them?
Why do we have so many competing ideas, and so little conceptual integrity? I blame two major things: missed abstraction and solving the wrong problems.
Missed Abstraction
Somewhere in the shuffle we discovered addition, then went straight to solving calculus problems. Without multiplication, algebra, geometry, and maybe some trigonometry, we're bound to flounder about in a pool of boggling complexity. What did we miss? The mathematics of data: the Relational Model. No, not SQL, no, not even "Truly" Relational DBMSes, but relations as a first class part of real languages. Instead we have "collections", "lists", "dictionaries" and other such low level primitives. Bear with me.
We've decided that "data" is this stuff we pull out of database systems, exists for a while in some client, then is pushed back into the system for safe keeping. But what of everything else in the computing environment? The controls on forms, the images, messages, documents, hardware state. No, we've decided, that's not data. We have different systems for that stuff, involving complicated structures of 3gl languages. Surely we wouldn't want to "normalize" it down to inefficient table structures and stuff it into a database system, nor would we want to stream it in it's encapsulated form into a database system BLOB where we couldn't query or manipulate it's parts anyway.
My friends, the database system is the worst thing that ever happened to the Relational Model. The RM is nothing short of the mathematics of data, and a DBMS is just one kind of calculator. SQL Systems of today are perhaps abacus' in the analogy. Not only is SQL about the worst imaginable embodiment of the Relational Model, the notion of Database Systems in general has crippled our thinking about how to manage and think about data. Relations should be an integral part of every modern language. Queries should just be ordinary expressions of the language. "Database Systems" simply become one kind of runtime in which the data can be shared and stored persistently.
The Relational Model gave us a) a formal basis for declaratively managing any kind of data; and b) a way to talk about logical things independent of physical things. We've hardly begun to tap either of these benefits. Consider every variety of application that doesn't use a general purpose DBMS, from Word Processors to Games. Now consider the problems faced by the engineers of these applications including: concurrency, persistence, durability, integrity, remote access, consistency, querying, security, data manipulation, scaling up, and scaling out. Everything... EVERYTHING we do is data management. A conceptual model which raises the level of abstraction in which we can do data management is going to help us!
Solving the wrong problems
We don't need another method for invoking functions remotely. That was not the problem. Just look at SOAP. We're encoding a procedure call into a highly inefficient language designed for text mark-up, hailed as unreadability, for the sake of human readability (XML). Then we are sending that information to an HTTP server, which is nothing less than a protocol for invoking remote functions. In return, we'll either get an error from HTTP or we'll get a SOAP response containing the error or results in XML format.
We don't need garbage collectors to sweep up all of our abandoned pointers. GC doesn't actually solve problems such as memory leaks and seems to succeed only in limiting the scalability of applications. I know I just offended some sensibilities, but I've been down some long an painful roads for this perspective. Besides with proper utilization of value semantics, we wouldn't be so concerned with heap management.
We certainly don't need a another "post-relational" DBMS based on ideas that predate the Relational Model. Though languages such as SQL seem ancient, the relational model will not become old any more than the notion of an integer will. Okay, think of it as old and wise if you must.
We don't need more integration "solutions". ETL has been done... and done... and done. Nor is it the "answer". If there was one way to look at all data, then suddenly integration looks no different than construction. I'm talking about federation... another thing enabled by our friend the Relational Model.
We don't need another registry, repository, directory, or other pseudo database system. These things have been around since the dark ages of computing and they've always been a blight. The operating system itself should provide a consistent data management platform; used all the way from the core of the OS, all the way up to the highest levels of application logic. The data structure of today's operating system is without a doubt the C struct. The data structure of the future OS is the Relation. Picture the Woodstock of software, with applications and systems holding hands and singing the same tune. Picture full visibility into every code and data facet of every application and system. Now *that's* open.
We don't need yet another method of querying, sorting, searching, and presenting data. How many times are we doing to have to work out the logic to refresh forms properly at all the right points?! Even still, people remain skeptical that such things can be automated; that it is somehow different from application to application. I assert that it is not different. Even the cleverest human interaction examples are mere specializations of the same, age old, patterns for the presentation and manipulation of data. Yet developers are handed framework after framework with gaping holes where data presentation and manipulation happens.
Conclusion... finally!
I've been accused of often being preachy and leaving people on a downer. I realize that I am guilty of both of these things in this posting. Frankly I'm not sure how to fix that other than to re-assure the reader that I hardly consider the situation hopeless. As long as I am able, I will be working towards solving these issues. In fact, I must admit a certain joy I receive in seeing such large scale problems because I believe that they are fixable, and I thoroughly enjoy working towards a solution.