mca bloghttp://www.amundsen.com/blog/making progressFri, 19 Mar 2010 02:08:06 GMTen-us180The H Factor for Media Typeshttp://www.amundsen.com/blog/archives/1039http://www.amundsen.com/blog/archives/1039Tue, 09 Mar 2010 20:24:00 GMT<p> <a href="http://www.flickr.com/photos/genbug/3211632108/" title="Tape Measure"> <img src="http://farm4.static.flickr.com/3467/3211632108_a83a17de55_t.jpg" align="right" class="inline" /> </a> today i stumbled upon <a href="http://restpatterns.org/Articles/The_Hypermedia_Scale" title="The Hypermedia Scale">The Hypermedia Scale</a> posted to <a href="http://restpatterns.org" title="REST Patterns">REST Patterns</a> by <a href="http://www.twitter.com/bjorg" title="@bjorg">@bjorg</a> last year. it reminded me of some work i've been doing recently on cataloging <a href="http://amundsen.com/hypermedia" title="Hypermedia Types">Hypermedia Types</a>. </p> <p> unlike the REST Patterns article, which categorizes hypermedia based on CRUD capabilities, i've tried to parse out various features of a media type that allow servers and clients to share information about hypermedia capabilities. i've dubbed my effort <a href="http://amundsen.com/hypermedia/hfactor.html" title="H Factor">The H Factor</a>. </p> <p>currently, i have identified two classes of factors: link support, and control data support. here's my current breakdown: </p> <ol> <li>Link Support</li> <ul> <li>Embedding links (LE)<br />e.g. HTML <code>img</code> tags</li> <li>Outbound links (LO)<br />e.g. HTML <code>anchor</code> tags</li> <li>Templated queries (LT)<br />e.g. HTML <code>form</code> w/ <code>method='get'</code></li> <li>Non-Idempotent Updates (LN)<br />e.g. HTML <code>form</code> w/ <code>method='post'</code></li> <li>Idempotent Updates (LI)<br />e.g. <code>XmlHttpRequest</code> object w/ PUT or DELETE </li> </ul> <li>Control Data Support</li> <ul> <li>Control data for reads (CR)<br />e.g. XInclude's <code>accept</code> attribute</li> <li>Control data for updates (CU)<br />e.g. HTML <code>form</code> w/ <code>enc-type</code> attribute</li> <li>Control data for methods (CM)<br />e.g. HTML <code>form</code> w/ <code>method</code> attribute</li> <li>Control data for link relations (CL)<br />e.g. Atom <code>link</code> elements supports <code>rel="edit"</code> and others</li> </ul> </ol> <p> by identifying elements of a media type that support link semantics and detailing the ways clients and servers can decorate these elements with added information to modify the method used and the control data supplied, media types become more than representations of data, they become the instrument of application flow for both the client and server. </p> <p>that is the essence of a hypermedia type.</p>the developer certification problemhttp://www.amundsen.com/blog/archives/1038http://www.amundsen.com/blog/archives/1038Sun, 07 Mar 2010 15:42:00 GMT<p> <a href="http://www.flickr.com/photos/zz77/2901708472/" title="Mardin"> <img src="http://farm4.static.flickr.com/3143/2901708472_a4955624cc_t.jpg" align="right" class="inline" /> </a> i saw a <a href="http://blog.objectmentor.com/articles/2010/03/07/developer-certification-wtf" title="Developer Certification WTF?">great post</a> from <a href="http://twitter.com/unclebobmartin" title="Robert Martin">@unclebobmartin</a> on dealing with the terrible state of software developer skills. it reminds be of an effort i got involved in several years ago to promote government licensing of software developers (ala <a href="http://edn.embarcadero.com/article/29921" title="Interview with Steve McConnell by Clay Shannon">Steve McConnell's</a> "<a href="http://www.amazon.com/After-Gold-Rush-Profession-Engineering/dp/0735608776" title="After the Gold Rush: Creating a True Profession of Software Engineering">After the Gold Rush</a>"). that fell flat, of course. </p> <p> IMO, the issue of poor quality software is tied up in how developers want to 'cast' their work. IOW, is the discipline of writing code primarily <a href="http://www.google.com/search?q=define:art" title="define:art"><i>art</i></a>, <a href="http://www.google.com/search?q=define:craft" title="define:craft"><i>craft</i></a>, or <a href="http://www.google.com/search?q=define:engineering" title="define:engineering"><i>engineering</i></a>? </p> <p> <b>if software is an engineering discipline</b>, then the way to ensure quality and value is through boards and standardized testing. the way architecture, structural engineering, and other disciplines are managed. </p> <p> <b>if software is a craft</b>, then the way to ensure quality and value is through a stringent master/apprentice model the way many building trades (plumber, electrician, etc.) are handled. </p> <p> <b>if, on the other hand, software is primarily an art</b>, then it's future lies in the establishment and promotion of 'schools' and styles and standard-bearers similar to the way most other artistic endeavors are judged and sustained. </p> <p> personally, i favor the 'craft' model. in this case, what is currently needed are master developers willing to take on apprentices. these masters need to be of the caliber that industry accepts their advice and favors their apprentices. in this way, masters can protect and promote the quality of software development for future generations. </p> <p> IMO, Robert Martin would make a fine master developer. i'm sure he can identify others worthy of that title. from there, it's up to those masters to take on the responsibility of training apprentices and making sure they carry forward the high craft of software development. </p> <p> of course, we need folks willing to accept the role of apprentice, too. people willing to figuratively 'sit at the feet' of the master and take in all the master has to offer. from what i've seen over the last several years, there are too few developers willing to accept that relationship. instead they are anxious to create 'the next big thing' in software. the result is usually a weak idea poorly implemented. occasionally i see a good idea poorly executed. rarely do i see evidence of a great idea implemented by true software craftsmen. </p>Fielding Property Mapshttp://www.amundsen.com/blog/archives/1037http://www.amundsen.com/blog/archives/1037Wed, 03 Mar 2010 18:06:00 GMT<p> <a href="http://www.flickr.com/photos/42614915@N00/421308531/" title="Map of my neighborhood"> <img src="http://farm1.static.flickr.com/151/421308531_1ca8b2c1bf_t.jpg" align="right" class="inline" /> </a> I posted some <a href="http://amundsen.com/examples/fielding-props/" title="Fielding Property Maps">example code</a> along w/ a short explanation today. It demonstrates an HTTP resource update pattern based on an idea by Roy Fielding. At the end of a post on the topic of WebDAV semantics, Fielding illustrates one way to expose and manipulate a set of properties for a resource using a URI convention (similar to that used for HTML image maps) where appending <code>;props</code> to a resource URI allows clients to access any available properties for that resource. Since I first saw this idea articulated by Fielding, I've dubbed the pattern <b>Fielding Property Maps</b> (without his knowledge or consent). </p> <p> the interactive example can be used to modify the metadata for the poem document using the Fielding Property Maps pattern and supports the following operations from any HTTP-aware client: </p> <pre class="code"> GET /poem;props retrieves a list of properties for that document GET /poem;props?{dcterm} retrieves a single property for that document PUT /poem;props?{dcterm} supports updating the value the indicated property DELETE /poem;props?{dcterm} deletes the value for the indicated {dcterm}, but does not remove the actual metadata entry. </pre> <p> thanks to <a href="http://www.twitter.com/algermissen" title="Jan Algermissen on Twitter">Jan Algermissen</a> for showing me Roy Fielding's email post on the subject. </p>"PATCH is a very simple method"http://www.amundsen.com/blog/archives/1036http://www.amundsen.com/blog/archives/1036Mon, 01 Mar 2010 12:28:00 GMT<p> <a href="http://www.flickr.com/photos/captainsticky/493592923/" title="My brother with eye patch"> <img src="http://farm1.static.flickr.com/228/493592923_59a197d854_t.jpg" align="right" class="inline" /> </a> Regarding <a href="http://www.rfc-editor.org/authors/rfc5789.txt" title="PATCH Method for HTTP">PATCH Method for HTTP (RFC5789)</a>: </p> <blockquote> <p> PATCH is a very simple method -- look at the content-type to see the format of the body, which contains instructions on how to apply a desired state change. The intent (when I added it back in 1995) was to define patch media types that contained a first section containing changes to metadata and then later sections containing the diffs. The decision on which patch media type to support would largely depend on the nature of the resource (and the ability of folks who wanted them to get off their duff and define the types). I started on a definition of a patch format for YAML late last year, but it was derailed by the partitioning work. </p> <p align="right"> ....<a href="http://lists.w3.org/Archives/Public/ietf-http-wg/2008JanMar/0312.html" title="">Roy</a> (March 2008) </p> </blockquote>You have a RESTful applicationhttp://www.amundsen.com/blog/archives/1035http://www.amundsen.com/blog/archives/1035Tue, 23 Feb 2010 11:01:00 GMT<p> <a href="http://www.flickr.com/photos/pmtorrone/2083016791/" title="open source gift guide"> <img src="http://farm3.static.flickr.com/2415/2083016791_18d3cd2be6_t.jpg" align="right" class="inline" /> </a> If you can draw a state machine in which: <ol> <li>Each state is self-described (resident on the client)</li> <li>The transitions from that state are also self-described (instructions for the client to initiate)</li> <li>And each transition is invoked using a self-descriptive message</li> </ol> Then you have a RESTful application. </p> <p align="right"> <a href="http://tech.groups.yahoo.com/group/rest-discuss/message/4578" title="....Roy">....Roy</a> from rest-discuss, late 2004] </p> <p> thanks to <a href="http://twitter.com/algermissen" title="Jan Algermissen">@algermissen</a> for the pointer. </p>"I Design Representations"http://www.amundsen.com/blog/archives/1034http://www.amundsen.com/blog/archives/1034Mon, 22 Feb 2010 10:52:00 GMT<p> <blockquote> <p>"And now for something completely different..."</p> <p align="right"> <a href="http://en.wikipedia.org/wiki/And_Now_for_Something_Completely_Different" title="">Monty Python</a> </p> </blockquote> </p> <p> <a href="http://www.flickr.com/photos/thelizabeth/2241014526/" title="drinks are pretty"> <img src="http://farm3.static.flickr.com/2013/2241014526_afab956f32_t.jpg" align="right" class="inline" /> </a> </p> <p> It was late afternoon on a Friday and, against my better judgement, I'd agreed to meet some friends at their favorite geek watering hole. Even at this early hour, the place was packed with twenty-something cube-rats eager to get a head start on the weekend. I had the misfortune of being the first of my clan to arrive so I waited quietly at the bar; nursed my beer, ignored the pudgy guy next to me, and kept an eye on the entry-way for a recognizable face. </p> <p> "So, what do you do?" pudgy finally asked me as he slurped his whiskey on the rocks. </p> <p> I gave him a quick look. Balding, cheap sport jacket over khakis, rumpled shirt, and an ugly tie. "I design representations for a living," I responded bluntly. </p> <p> "A designer, eh? 'Fashion Forward' and all that?" he asked waving his drink in my direction. </p> <p> "Representations," I repeated, leaning in to be heard over the thin gruel of 80s rock pouring from the docked iPod behind the bar. "I work with representations." The smell of burnt pizza lifted from his sport coat. </p> <p> "Oh, I get it," he nodded. "My brother in-law is a lawyer. Represents sports celebrities. Lots of negotiations and stuff like that." </p> <p> "Well, I work with content negotiation, not contracts." </p> <p> 'Pizza 'n Whiskey' shot me a puzzled look. "No law degree?" </p> <p> "Nope. Computer Science." </p> <p> "Ah! Computers!" he intoned as he took a gulp of brown liquid. "All about outsourcing nowadays, eh?" </p> <p> "I do Resources, not outsourcing." </p> <p> "Yeah, we're in the same game," he continued, ignoring my last remark. "I'm a Program Manager on that big integration project up at the university." Proudly stabbing the air with his free hand, he told everyone within earshot, "My team 'owns' the middleware!" </p> <p> "Really?" </p> <p> "Oh, yeah. Over ten months to spec it out; coming in at two years for the first release. Huge project." He stretched out the word 'huge' and ice clattered in his glass as he carefully traced a giant circle in the air between us. </p> <p> "Sounds like exciting work." </p> <p> "Never-ending work is more like it," he replied, turning to me and squaring his shoulders. "See, we barely get one part of the system done and then the users tell us they need some other piece of data on the screen or report or something. That means I gotta tell the programmers in India to start all over again." He counts out on his fingers. "New data tables. Rebuild the object layer. Update the business rules. Change the UI. Compile it. Test it. Deploy it. That stuff takes time, right? Hell, before it's all done the customer wants something else!" He paused, hitched his thumb under his belt and added, "Of course, we bill by the hour, so..." </p> <p> "And lucrative." I was egging him on, now. </p> <p> "Say, you're a computer guy!" His eyes lit up. "You know anything about ORMs? We could use another ORM guy. The last one quit on us." </p> <p> "No, sorry. I'm an HTTP guy." </p> <p> "Oh, well hey! We got HTTP stuff, too. All 'Ajax' this and 'Two-Dot-Oh' that." He used 'air quotes' to punctuate the buzz words for me. Then, as if taking me into his confidence, he reached up and put his arm around my shoulder offering me another hint of pizza and said quietly, "Frankly, I think that's all just fluff but the customers love it." </p> <p> "Fluff?" </p> <p> "Heheh, that's OK," he backed up and tossed me a big smile. "Every time they ask for that 'webby' stuff we end up bulding a whole 'nuther set of middleware." He waved his hands in the air, saying "One for the desktop, one for the browser." He looked like Moses parting the Red Sea. "It's great for the monthly billings, but a real mess on the back end." His voice trailed off as he contemplated the dwindling whiskey at the bottom of his glass. "Yeah, sometimes this web stuff can be a real pain..." </p> <p> I felt a bit sorry for him. "It doesn't have to be that way, you know." </p> <p> "I know. I know," he confessed. "I keep sayin' we need some way to write just one set of middleware that everyone can use. But every time we try it the Web guys complain, the desktop guys are unhappy, no-one can agree on a single data format, our perfomance metrics go to hell... Plus, every little change means we have to re-write all the client code, do a crap ton of tests again..." He slumped against the bar and stared off into space. "If only there was a way to do middleware differently. One that scaled well, didn't take forever, and let everyone get data the way they wanted." </p> <p> I smiled. </p> <p> After a short pause, his eyes slowly narrowed as he pointed his glass at me and asked, "What is it you do again?" </p> <p> "HTTP. Resources and Represenations, remember?" </p> <p> "Huh... Damned if I even know what that means." Shrugging his shoulders, he thrust his right arm out at me and we shook hands. "Take it easy, kid," he said as he tossed back his last bit of whiskey, turned around and leaned over the bar waving his empty glass as a signal for a refill. </p> <p> I took that as my cue to head for the exit. I had some representations to design. </p>is this REST?http://www.amundsen.com/blog/archives/1033http://www.amundsen.com/blog/archives/1033Wed, 17 Feb 2010 19:27:00 GMT<p> <a href="http://www.flickr.com/photos/fotoosvanrobin/2784514642/" title="Comparing Shaoxing Ricewine"> <img src="http://farm4.static.flickr.com/3040/2784514642_637abaf0c6_t.jpg" align="right" class="inline" /> </a> recently, i've been contemplating the details of implementing application flow using REST over HTTP. along the way, i <a href="http://rest.hackyhack.net/2010-02-17.html#36/h36" title="">said in the REST IRC channel in freenode</a> that application flows may include multiple resource interactions, some of which may be considered 'interim' resource transitions. IOW, when dealing at the application level (not the HTTP or resource level) there are arcs that involve multiple state transitions. </p> <p>however, my online friend <a href="http://www.jalgermissen.com/" title="">Jan Algermissen</a> pointed out the use of interim state transitions may actually be a symptom of bad design.</p> <p>so i have a simple test. below are two implementations of an online survey. i claim both of them are examples of REST-ful implementations. What do you think? </p> <p>in addition, i have a number of questions at the end of the two examples to see how variations on this theme affect your answers.</p> <h4>a single-question survey</h4> <pre class="code"> REQUEST **** GET /surveys/ Host: www.example.org Accept: application/html RESPONSE *** HTTP/1.1 200 OK Content-Type:application/html ... &lt;form method="post" action="http://www.example.org/surveys/"&gt; &lt;label for="name"&gt;Name&lt;/label&gt; &lt;input type="text" name="name" value="" /&gt; &lt;input type="submit" /&gt; &lt;/form&gt; ... REQUEST *** POST /surveys/ Host: www.example.org Content-Type: application/www-form-urlencoded name=Mike RESPONSE *** HTTP/1.1 201 Created Location: http://www.example.org/surveys/1 ... &lt;a href="http://www.example.org/surveys/1"&gt;Begin&lt;/a&gt; ... REQUEST *** GET /surveys/1 Host: www.example.org Content-Type: applcation/html RESPONSE *** HTTP/1.1 200 OK Content-Type: application/html ... &lt;form method="post" action="http://www.example.org/surveys/1"&gt; &lt;label for"q1"&gt;Is this a REST-ful survey?&lt;/label&gt; &lt;input name="q1" value="" /&gt; &lt;input type="submit" /&gt; &lt;/form&gt; ... REQUEST *** POST /surveys/1 Host: www.example.org Content-Type: application/www-form-urlencoded q1=yes RESPONSE *** HTTP/1.1 200 OK Content-Type: text/plain Your survey answer has been recorded. </pre> <h4>a two-question survey</h4> <pre class="code"> REQUEST **** GET /surveys/ Host: www.example.org Accept: application/html RESPONSE *** HTTP/1.1 200 OK Content-Type:application/html ... &lt;form method="post" action="http://www.example.org/surveys/"&gt; &lt;label for="name"&gt;Name&lt;/label&gt; &lt;input type="text" name="name" value="" /&gt; &lt;input type="submit" /&gt; &lt;/form&gt; ... REQUEST *** POST /surveys/ Host: www.example.org Content-Type: application/www-form-urlencoded name=Mike RESPONSE *** HTTP/1.1 201 Created Location: http://www.example.org/surveys/1 ... &lt;a href="http://www.example.org/surveys/1/q1"&gt;Begin&lt;/a&gt; ... REQUEST *** GET /surveys/1/q1 Host: www.example.org Content-Type: applcation/html RESPONSE *** HTTP/1.1 200 OK Content-Type: application/html ... &lt;form method="post" action="http://www.example.org/surveys/1/q1"&gt; &lt;label for"q1"&gt;Is this the first question?&lt;/label&gt; &lt;input name="q1" value="" /&gt; &lt;input type="submit" /&gt; &lt;/form&gt; ... REQUEST *** POST /surveys/1/q1 Host: www.example.org Content-Type: application/www-form-urlencoded q1=yes RESPONSE *** HTTP/1.1 200 OK Content-Type: application/html ... &lt;a href="http://www.example.org/surveys/1/q2"&gt;Continue&lt;/a&gt; ... REQUEST *** GET /surveys/1/q2 Host: www.example.org Content-Type: applcation/html RESPONSE *** HTTP/1.1 200 OK Content-Type: application/html ... &lt;form method="post" action="http://www.example.org/surveys/1/q2"&gt; &lt;label for"q2"&gt;Is this a REST-ful survey?&lt;/label&gt; &lt;input name="q2" value="" /&gt; &lt;input type="submit" /&gt; &lt;/form&gt; ... REQUEST *** POST /surveys/1/q2 Host: www.example.org Content-Type: application/www-form-urlencoded q2=not sure RESPONSE *** HTTP/1.1 200 OK Content-Type: text/plain Your survey answers have been recorded. </pre> <h4>for your consideration</h4> <p> now consider the following: <ol> <li>how do you create a REST-ful implementation of a survey with 75 questions?</li> <li>what should be the server response when a client application activates a question out of order (jumps from question #1 to question #13)?</li> <li>does your answer change if the survey is adaptive? IOW, subsequent questions depend on the answers to previous questions?</li> <li>how do you create a REST-ful implementation of a timed survey; one in which each question must be answered within a fixed amount of time (60 seconds) and/or the entire survey must be completed within a fixed amount of time (30 minutes)?</li> <li>how do you create a REST-ful implementation of a survey that allows clients to save their partially-completed work and come back to finish it later?</li> <li>if a client returns to complete a survey, how does the server make sure the client picks up at the same place they left off?</li> <li>what if the user wants to complete the survey from a new location (home instead of office)?</li> </ol> </p>Where S is a steady-state beginning...http://www.amundsen.com/blog/archives/1032http://www.amundsen.com/blog/archives/1032Thu, 11 Feb 2010 18:51:00 GMT <p align="center"> <a href="http://amundsen.com/images/s-to-si-2.png" title="An arc where S is a steady-state beginning, Si is a steady-state ending, and {t0..n} represents an optional set of zero or more transient state transitions."> <img src="http://amundsen.com/images/s-to-si-2.png" width="500" title="An arc where S is a steady-state beginning, Si is a steady-state ending, and {t0..n} represents an optional set of zero or more transient state transitions." /> </a> </p> <p style="display:none;"> An arc where S is a steady-state beginning, Si is a steady-state ending, and {t0..n} represents an optional set of zero or more transient state transitions. </p>EFF's 20th Birthdayhttp://www.amundsen.com/blog/archives/1030http://www.amundsen.com/blog/archives/1030Tue, 02 Feb 2010 16:03:00 GMT<p align="center"> <a href="http://www.eff.org/deeplinks/2010/02/effs-20th-birthday-commemorative-poster" title="EFF's 20th Birthday Commemorative Poster"> <img src="http://farm5.static.flickr.com/4043/4325854994_2e9635e35e.jpg" title="" /> </a> </p>HTML->HTTP->Hypermediahttp://www.amundsen.com/blog/archives/1029http://www.amundsen.com/blog/archives/1029Tue, 02 Feb 2010 10:24:00 GMT<p> <a href="http://www.flickr.com/photos/trevor-dennis/3181095438/" title="Ladder Nemesis"> <img src="http://farm4.static.flickr.com/3297/3181095438_16a53c5ca2_m.jpg" align="right" class="inline" /> </a> i've been contemplating various flavors and forms of HTTP and REST over the past few weeks; all part of a master plan to wrap my mushy brain around the varying degrees of compliance and complication that come w/ crafting credible web apps (not so easy to say <i>or</i> do). </p> <p> along the way i've bumped into a valuable scale first outlined by <a href="http://www.crummy.com/self/" title="Leonard Richardson">Leonard Richardson</a> (<a href="http://www.crummy.com/writing/speaking/2008-QCon/act3.html" title="Justice Will Take Us Millions Of Intricate Moves - Act Three: The Maturity Heuristic">The Maturity Heuristic</a>) and also mentioned by <a href="http://jim.webber.name/bio.html" title="Jim Webber, Ph.D.">Jim Webber</a> (<a href="http://jim.webber.name/downloads/presentations/2009-05-HATEOAS.pdf" title="HATEAOS: The Confusing Bit from REST">The Confusing Bit from REST</a>). It's been referred to by different names; the one i use is the Richardson Maturity Model (<b>RMM</b>). </p> <p> i've sometimes found it useful to express the same prinicples embodied in <b>RMM</b> from a different perspective; in a model i call the <b>HHH</b> Scale. but i'm getting ahead of myself... </p> <h4>RMM</h4> <p> The referenced presentations are well worth a look, but here's RMM in a nutshell: </p> <dl> <dt>Level 0</dt> <dd> <ul> <li>Single URI, Single verb</li> <li>SOAP, XML RPC, POX</li> </ul> </dd> <dt>Level 1</dt> <dd> <ul> <li>Many URIs, Single verb</li> <li>URI Tunnelling (e.g. ASP.NET, JSP, etc.)</li> </ul> </dd> <dt>Level 2</dt> <dd> <ul> <li>Many URIs, many verbs</li> <li>CRUD services (e.g. Amazon S3)</li> </ul> </dd> <dt>Level 3</dt> <dd> <ul> <li>Level 2 + Hypermedia</li> <li>RESTful Services</li> </ul> </dd> </dl> <p> i like this model because it expresses, in just a few statements, relationships between a wide range of application types that all 'work' on the Web today. it also sends the message that items farther along in the model are 'more mature' than earlier ones; a handy value judgement when you're working to make a point [grin]. </p> <p> however, the <b>RMM</b> has a decidedly server-side tinge when describing the maturity of Web applications. the examples and descriptions employed as illustrations typically approach the topic from the POV of those responsible for implementing web services hosted on an HTTP server. </p> <p> sometimes i am talking with folks that spend most of their time on the client-side of the equation. for them, talk of SOAP, RPC, and the like, are not within their usual vocabulary. consequently, i have come up with a slightly different version of the maturity model; one i call <b>HHH</b> or HTML-&gt;HTTP-&gt;Hypermedia. </p> <h4>HHH</h4> <p> this expression of Web app maturity highlights common views of the Web held by those who are in charge of creating the heavily scripted, Ajax-ified, DHTML-powered Web 2.0 applications most of us use every day. </p> <p> the <b>HHH</b> model has three different levels: </p> <dl> <dt>HTML</dt> <dd> devs at this level view Web applications through the prism of common HTML Web browser limits and the semantics expressed in the <a href="http://www.w3.org/TR/html4/" title="HTML 4.01 Specification">HTML Document</a> spec; namely two possible HTTP verbs: <code>GET</code>, <code>POST</code> and a single progammable media-type: <code>text/html</code>. </dd> <dt>HTTP</dt> <dd> devs at this level see Web applications constrained by a basic understanding of the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" title="Hypertext Transfer Protocol -- HTTP/1.1 ">HTTP Protcol</a> spec; meaning the four most often-used HTTP verbs: <code>GET, PUT, POST, DELETE</code> and simple data-oriented meda-types <a href="http://www.w3.org/XML/" title="Extensible Markup Language (XML)"><code>application/xml</code></a> and <a href="http://www.json.org/" title="Introducing JSON"><code>application/json</code></a>. </dd> <dt>Hypermedia</dt> <dd> devs at this level consider Web applications to be rooted in the notion of state transfer via hypermedia links; an idea first outlined by <a href="http://www.ics.uci.edu/~fielding/" title="Roy T. Fielding">Roy Fielding</a> in <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" title="Representational State Transfer (REST)">Chapter 5</a> of his <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" title="Architectural Styles and the Design of Network-based Software Architectures">dissertation</a>. they recognize value in the rich link semantics within the HTML media-type and know there are other media-types (e.g. <a href="http://www.ietf.org/rfc/rfc4287" title="The Atom Syndication Format"><code>application/atom+xml</code></a>) that reflect the same support for state transition links as a way to induce application flow. these devs also understand the importance of the HTTP spec as a starting point for building applications that not only use the full range of HTTP verbs, but also implement a powerful control data model (HTTP Headers) that allows both clients and servers to take advantage of shared caches, conditional requests, extensible authentication, and other services that make up the infrastructure of the World Wide Web. </dd> </dl> <p> whether you view this issue from a server-side or a client-side perspective, the farther along you go in the models the more felxible, scalable, and robust your applications become. it is also true that applications reflecting higher maturity levels are more demanding to architect and implement; not always more complicated, but usually more involved. in my experience, well-implemented hypermedia Web applications almost always look deceptively easy; and that's the beauty, the challenge, and the reward of it all. </p> <p> <i>so: how rewarding, challenging, and beautiful are your Web applications?</i> </p>