2007/01/15: if you happen to read through this blog entry, please also read the comments. Steve felt a bit misquoted here, especially in the title, and I offer up my rational, and apology, but more importantly, we continue the argument :-)
As someone who believes there is some value for 'schema' in the REST world, I'd like to
respond to Steve Vinoski's latest blog post
"Lying Through Their Teeth: Easy vs. Simple".
Since I'm more firmly in the REST camp than the WS-* camp, and since I love an underdog,
I'll side with schema just for the halibut.
It's probably more correct to say that I haven't made up my mind w/r/t schema than I believe there
is some value - my 'pro' stance on schema is a gut feel - I've seen no significant evidence
to sway me either way.
I definitely feel like schema has gotten a bad rap from it's association with WS-*.
Well-deserved, to some extent; XML schema is overly complex,
resulting in folks having differing interpretations of some of the structures;
WSDL itself is so overly indirect it's horribly
un-DRY,
while on the other hand being terribly brittle at points like
hardcoding URLs to your service in the document.
So? Yeah, they got it wrong. They got a lot of stuff wrong. Anyone
consider we might be throwing the baby (schema) out with the bath water (WS-*)?
I'd say my general reaction to the typical RESTafarian's rant against
schema is that it's misplaced, guilt-by-association.
Let's look at some of Steve's arguments:
"After all, without such a language, how can you generate code,
which in turn will ease the development of the distributed system by making it all
look like a local system?"
That's making a bit of a leap - "making it all look like a local system?". That's
pretty much what the WS-* world did. Why would he think someone who is pro-schema would
necessarily want to repeat
the mistakes of the WS-* world? I don't want to!
Anyone who's done any amount of client-side HTTP programming is going to
realize there's a fair amount of boiler plate-ish code here. Setting up
connections, marshalling inputs, making requests, demarshalling outputs,
etc. Want caching? How about connection pooling? You're going to be
writing a little framework, my friend, if you don't have one handy.
And once you've done that, perhaps you'd like to wrapper some of the
per-resource operation bits in some generated code, just to make
your life easier. And note, I count things like dynamic proxies as
code generation; it's just that isn't static code generated by
a tool that you have to re-absorb back into your application.
And guess what? Your generated code doesn't have to hide the foibles
of the network, if it doesn't want to. And as Steve implies, it shouldn't.
"trying to reverse-map your programming language classes into
distributed services, such as via Special Object Annotations,
is an attempt to turn local design artifacts into distributed ones"
Again, no. Schema and "hiding remoteness" are two separate things,
they aren't necessarily related.
Similarly, with REST, you read the documentation and you write your
applications appropriately, but of course the focus is different because the interface is
uniform.
The documentation? What documentation? I'm picturing here
that Steve has in mind a separate
document (separate from the code, not generated from the code) written
by a developer. But human generated documentation like this is still schema,
only it's not understandable by machines, pretty much guaranteed to get out of
sync with the code, probably incomplete and/or imprecise. Not that
machine generated schema might fare any better, but it couldn't be any worse.
But there are more problems with this thought. The notion of hand-crafted
documentation for an API is quaint, but impractical if I'm dealing with more
than a handful of APIs. In fact, the "uniform interface" constraint of
REST pretty much implies you are going to have a greater number of
"interfaces" than had you defined the functionality as a service
(or set of services) in WS-*. Though presumably
each REST interface has a smaller number of operations.
Of course it would be nice to have this documentation highly standardized
(at least given a related 'set' of documented interfaces), available
electronically, etc. I don't see that happening with documentation
generated by a human.
Another problem here is that although the "uniform interfaces" themselves
will be generally easy to describe - "GET returns an Xyz in the HTTP response
payload" - the format of the data is certainly not uniform.
Is
this
sufficient documentation for data structures sent in HTTP payloads? It's not for
me. Documenting data structures 'by example' like that seems to be the status quo, and
is of course woefully inadequate.
Lastly, I'll point out that I think the primary reason for having
some kind of schema available is specifically to generate standardized,
human-readable documentation. But not the only one. I think there are
opportunities to have have machine-generated 'client libraries',
machine-generated test suites, many-flavored documentation (PDFs, web-based,
man pages,
context-assisted help in editors, etc), validators,
assembly tools for use by non-programmers (think Yahoo! Pipes), etc.
What the proponents of definition languages seem to miss
is that such languages are primarily geared towards generating tedious
interface-specific code, which is required only because the underlying
system forces you to specialize your interfaces in the first place.
Right. Except for the data, which will be different; and URL template
variables. Don't forget that sometimes you'll be needing to be setting
cache validators up; maybe some special headers. Face it, there's plenty
of tedious code here, especially if you're making more than onesy-twosey
requests. Especially if you're in a low signal-to-noise ratio language
like Java. Tedious code is no fun. Why not framework-ize some of it?
Summary
Even though I have this feeling that schema will be of some value in the
REST world, I actually welcome having to have an argument about it. Absolutely,
assume we don't need it until we find a reason that we really need it. We haven't
yet hit the big time with REST, to know if we'll need it or not. When we see
APIs on the order of
eBay's,
only REAL REST, then we'll know REST will have hit the big time.
For right now though, none of the anti-schema arguments I've ever heard is very compelling to me.
In the meantime, it's also refreshing to see folks experimenting with stuff
like WADL. If we end up needing / wanting schema, it would be nice to have
some practical experience with a flavor or two, for REST, before trying to
settle on some kind of universal standard.