Progressive enhancement and AJAX
Once upon a time, the world wide web was invented. I'm not really going to
talk about that. Later, something called the Hypertext Markup
Language (HTML) was developed. It let you share nicely laid out documents
over the web. And it was Awesome.
HTML had some limitations
though, it was kind of verbose and you had to mix up your content, paragraphs
and such, with code that was used to show how the thing should be laid out and
look. At more or less the same time, there were two new pushes to make HTML
better. Javascript (1995) was developed to allow a web site
designer to make things change on a page. No longer would a web page be a
simple static document like a magazine or newspaper article. Cascading Style
Sheets (CSS - 1995-1996ish) was created to help a web designer keep the
content, the article, online store, etc. distinct and in a different place
from the stuff that was responsible for how that content actually looked on
the page.
And this was Awesome, except, it wasn't. At the time
that these developments were happening, the First Browser War was underway. Netscape put some
Javascript and CSS stuff into their browser. Microsoft put different things
into theirs. Bit players in the browser wars did other things. The end result
was that if you wanted to make a sufficiently sophisticated web page, you had
to create two or three versions of the thing so that it actually worked in
multiple browsers. Now, for a long while, this did not actually matter as
Internet Explorer 6 held so much market share that you could target IE6 only
and get away with it.
That is no longer the case. Arguably, it
was never the case, but there were lots of so called 'web developers' who
happily wrote sites that worked in IE6 and IE6 alone. There are several major
browsers now. More importantly, there are several major devices now.
Blackberries, cell phones and game consoles all have limited support for
browsing the web in various forms. It's probably a good idea to try to write
your web code in such a way it works in as many platforms as possible. More
specifically, at least the major platforms that your clients are using.
Approaches
Inevitably, however, some of
the fancy dynamic content, crazy layouts or Javascript dancing puppies will
not work on some platform that at least some of your customers are using.
There are a couple of different strategies for dealing with this scenario: Progressive Enhancement and Graceful Degradation. Effectively, the end result of
either of these strategies is the same thing. A website that functions
properly under just about every browser platform. There is overlap between the
two strategies, in that you can safely say a website built via a progressive
enhancement strategy will degrade gracefully. That said, there is definitely a
difference in the development process when building a web application in
either of these manners.
Having worked on projects that focused
on graceful degradation, I can offer my opinion that it is a route fraught
with problems. My gut feeling is that if you are going this route, you're
almost better off writing off customers who don't have your minimum supported
browser.
Progressive Enhancement and HIJAX
I'm mostly going to talk about progressive enhancement now as my
current project has gone that route. I mainly went that way as I was concerned
with the smell of the code that I had written or worked on in the past that
went the other way around. Taking a full featured, beautiful Web 2.0
application and trying to hack in static HTML support was difficult and led to
some fragile functionality in places. Progressive enhancement seemed to solve
that problem in that you started with a functional, solid HTML version and
then began to add the flashy enhancements.
Google for HIJAX and
read some of the blog posts you find, all are pretty short and give you an
overview of the approach I am making with this particular application. There
isn't really a definitive definition of HIJAX, suffice it to say, the point of
the thing is what I outlined above. Normal, old fashioned site first, then
start writing the flash. The basic philosophy is "Plan for AJAX
from the start. Implement AJAX at the end."
Of course, there
is no
silver bullet.
While I truly do like the development process
that follows with HIJAX, I cannot help but feel I have traded one type of code
smell with another. Well, in this case, it isn't really code smell, it's more
of a project management smell. The single biggest problem I have with the
simple HIJAX philosophy is how simply it discounts the nature of web
applications.
Implement AJAX at the end.
This is where it all falls apart. Anyone who has built web application
that goes beyond the trivial knows that there is no end. Paul Graham talks
about the advantages to web development in The Other Road
Ahead. He has an entire section dedicated to releases and notes that in a
web application, you really don't have releases. You have features that you
deploy one or two at a time.
So if there is no end, implementing
AJAX at the end isn't really possible. So the HIJAX philosophy migrates more
into a "Plan for AJAX from the start. Implement AJAX in chunks as you go
along." This is notably still different from "Implement AJAX from the start",
but must be pointed out. The majority of articles and essays on this topic
that I have read thus far do not take a high level perspective. They deal with
specific implementation issues and provide an outline that works at the
feature level. The naive philosophy will not work when applied to an entire
project.
This is not to say that it is a lost cause and we should
get back to writing rich applications that only work in specific versions of
Firefox. Progressive enhancement is the way to go for a general purpose
application on the Internet where you do not want to drive away any customers.
HIJAX, on the other hand, is a nice buzzword for a simplified philosophy that
I think will die out quickly as it becomes apparant that it is just a bit too
simple.