Microsoft uses the "live labs" to release all sorts of test balloons. Sometimes we get really nifty stuff like
Photosynth or
SeaDragon. Unfortunately, sometimes we get
stupid not so bright ideas like
Volta.
Ok, so what is Volta? Here's what the project's homepage has to say (emphasis mine):
"
The Volta technology preview is a developer toolset that enables you to
build multi-tier web applications by applying familiar techniques and
patterns. First, design and build your application as a .NET client
application, then assign the portions of the application to run on the
server and the client tiers late in the development process. The
compiler creates cross-browser JavaScript for the client tier, web
services for the server tier, and communication, serialization,
synchronization, security, and other boilerplate code to tie the tiers
together.
Developers can target either web browsers or the CLR as clients and Volta handles the complexities of tier-splitting for you.
Volta comprises tools such as end-to-end profiling to make
architectural refactoring and optimization simple and quick. In effect,
Volta offers a best-effort experience in multiple environments without
any changes to the application."
The idea sounds very compelling - I kid you not. So what's the problem?
The
first issue is that, as a platform/framework (MS would say factory),
Volta tries to accomplish too much. On the one hand Volta is another go
at the
web/
desktop convergence trend.
On the other hand it is supposed to be a solution for "painless"
tier-splitting. Both of these tasks are very heavy. My opinion is that
the
Single Responsibility Principle (while originally defined for objects) applies here. And Volta should choose one thing and try to excel in that.
What's more disturbing to me, is the automatic handling of the "complexities of tier-splitting". Here's another
excerpt from the Volta site which further explains the "tier-splitting" concept:
Objective
We have an application that runs in a monolithic environment, say the
browser. We want parts of this application to run in other
environments, such as servers. We don’t want to litter the application
with plumbing code.
Rationale The standard
techniques for distributed applications infuse our code everywhere with
information about what parts run where. This makes the code hard to
change. Typically, once we make these decisions we can’t change them
because it is too expensive. However, environments, requirements, and
performance profiles change and we’re stuck with applications that
can’t adapt to new realities. We need to separate the concerns about
what the application does from the concerns about where parts of the
application run.
Without Volta, we are forced to decide
where code runs before we know everything it is going to do, in
particular before we know the communication frequencies and delays.
Development methodologies force us to make irreversible decisions too
early in the application lifecycle. Volta gives us the means to delay
decisions until we have adequate information to base them on.
Recipe
Volta tier splitting automates the creation of the communication
plumbing code, serialization, and remoting. Simply mark classes or
methods with a custom attribute that tells the Volta compiler where
they should run. Unmarked classes and methods continue to run on the
client.
We may base our decisions about tier assignment on
any criteria we like, such as performance or location of critical
assets and capabilities. Because Volta automates boilerplate code and
processes for dispersing code, it is easy for us to experiment with and
change assignments of classes and methods to tiers.
Wow,
Agile development at its best, allowing us to postpone architectural
decisions, that just sound too good to be true. Well, the problem is
that
it is too good to be true. Abstracting the network out,
and providing location transparency without thinking about the
implications of distribution is the reason "distributed objects"
failed. e.g. Here is what Harry Pierson (DevHawk)
had to say about distributed objects:
"...back in 2003, mainstream platforms typically used a distributed object approach
to building distributed apps. Distributed objects were widely
implemented and fairly well understood. You created an object like
normal, but the underlying platform would create the actual object on a
remote machine. You'd call functions on your local proxy and the
platform would marshal the call across the network to the real object.
The network hop would still be there, but the platform abstracted away
the mechanics of making it. Examples of distributed object platforms
include CORBA via IOR, Java RMI, COM via DCOM and .NET Remoting. The
(now well documented and understood) problem with this approach is that
distributed objects can't be designed like other objects. For
performance reasons, distributed objects have to have what Martin
Fowler called
a "coarse-grained interface", a design which sacrifices flexibility and
extensibility in return for minimizing the number of cross-network
calls. Because the network overhead can't be abstracted away,
distributed objects are a very leaky abstraction.
So
here comes Volta and tells us just put a [RunAtOrigin] attribute on the
code you want on another tier and if you don't like that you can change
it to another place in your application and what not. Note that the notion that you can automate some or maybe even all of the distribution "boilerplate" code may be viable. The problem is in the premise that you can seamlessly move that boundary around. There's a
fundamental
difference between tiers and layers.
Tiers should be treated as a boundary .Volta designers do talk about Security but they seem to forget a few of the other
fallacies of distributed computing...