<?xml version="1.0"?>
<?xml-stylesheet href="/transform" type="text/xsl"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:bibo="http://purl.org/ontology/bibo/" xmlns:bs="http://purl.org/ontology/bibo/status/" xmlns:ci="https://vocab.methodandstructure.com/content-inventory#" xmlns:dct="http://purl.org/dc/terms/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" lang="en" prefix="bibo: http://purl.org/ontology/bibo/ bs: http://purl.org/ontology/bibo/status/ ci: https://vocab.methodandstructure.com/content-inventory# dct: http://purl.org/dc/terms/ foaf: http://xmlns.com/foaf/0.1/ rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# xhv: http://www.w3.org/1999/xhtml/vocab# xsd: http://www.w3.org/2001/XMLSchema#" vocab="http://www.w3.org/1999/xhtml/vocab#" xml:lang="en">
  <head>
    <title property="dct:title">A Brief and Fuzzy History of Web Application Development</title>
    <base href="https://doriantaylor.com/a-brief-and-fuzzy-history-of-web-application-development"/>
    <link href="document-stats#E-QLK4OWnvqF7ZNtMUdxsJ" rev="ci:document"/>
    <link href="elsewhere" rel="alternate bookmark" title="Elsewhere"/>
    <link href="this-site" rel="alternate index" title="This Site"/>
    <link href="http://purl.org/ontology/bibo/status/published" rel="bibo:status"/>
    <link href="" rel="ci:canonical" title="A Brief and Fuzzy History of Web Application Development"/>
    <link href="lexicon/#EzqXIsriaILFcWjXdS7FbI" rel="dct:audience" title="Software Developer"/>
    <link href="person/dorian-taylor#me" rel="dct:creator" title="Dorian Taylor"/>
    <link href="person/dorian-taylor" rel="meta" title="Who I Am"/>
    <link about="./" href="3f36c30c-6096-454a-8a22-c062100ae41f" rel="alternate" type="application/atom+xml"/>
    <link about="./" href="f07f5044-01bc-472d-9079-9b07771b731c" rel="alternate" type="application/atom+xml"/>
    <link about="./" href="this-site" rel="alternate"/>
    <link about="./" href="elsewhere" rel="alternate"/>
    <link about="./" href="e341ca62-0387-4cea-b69a-cdabc7656871" rel="alternate" type="application/atom+xml"/>
    <link about="verso/" href="3f36c30c-6096-454a-8a22-c062100ae41f" rel="alternate" type="application/atom+xml"/>
    <link about="verso/" href="this-site" rel="alternate"/>
    <link about="verso/" href="elsewhere" rel="alternate"/>
    <meta content="a-brief-and-fuzzy-history-of-web-application-development" datatype="xsd:token" property="ci:canonical-slug"/>
    <meta content="This is an attempt to articulate my understanding of the state of Web development and how it came to be. It is not meant to be a completely accurate account. Plus, it wouldn't be right to post something on the Web without a healthy dose of editorial. It is the first of a two-part series, the second consisting of what I'm doing about it." name="description" property="dct:abstract"/>
    <meta content="2010-05-20T08:30:44+00:00" datatype="xsd:dateTime" property="dct:created"/>
    <meta content="a-brief-and-fuzzy-history-of-web-application-development" property="dct:identifier"/>
    <meta content="2010-05-20T08:32:26+00:00" datatype="xsd:dateTime" property="dct:issued"/>
    <meta content="2010-05-20T08:32:53+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2010-05-20T08:34:29+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2010-05-20T08:53:13+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2022-05-31T04:18:52+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2022-05-31T15:10:50+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta about="person/dorian-taylor#me" content="Dorian Taylor" name="author" property="foaf:name"/>
    <meta content="summary" name="twitter:card"/>
    <meta content="@doriantaylor" name="twitter:site"/>
    <meta content="A Brief and Fuzzy History of Web Application Development" name="twitter:title"/>
    <meta content="This is an attempt to articulate my understanding of the state of Web development and how it came to be. It is not meant to be a completely accurate account. Plus, it wouldn't be right to post something on the Web without a healthy dose of editorial. It is the first of a two-part series, the second consisting of what I'm doing about it." name="twitter:description"/>
    <object>
      <nav>
        <ul>
          <li>
            <a href="the-state-of-web-development-continued" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">The State of Web Development, Continued</span>
            </a>
          </li>
          <li>
            <a href="document-stats#E-QLK4OWnvqF7ZNtMUdxsJ" rev="ci:document" typeof="qb:Observation">
              <span>urn:uuid:f902cae0-e5a7-4bea-917b-64db4c51dc6c</span>
            </a>
          </li>
        </ul>
      </nav>
    </object>
  </head>
  <body about="" id="ExCw2GBLVwWz97T84IPpmI" typeof="bibo:Article">
    <section id="ETm5GMoRgW6mpN1Znw0SMJ">
      <p>Once upon a time, if you wanted to do anything on the <abbr title="World-Wide Web">Web</abbr> past serving files, you had to write your own <abbr title="World-Wide Web">Web</abbr> server, or <a href="http://httpd.apache.org/" title="Welcome! - The Apache HTTP Server Project" rel="dct:references">hack the source of somebody else's</a>. Since this would have been tremendously inconvenient, the <a href="http://en.wikipedia.org/wiki/Netscape" title="Netscape &#x2014; Wikipedia" rel="dct:references">major <abbr title="World-Wide Web">Web</abbr> server vendors</a> <a href="http://en.wikipedia.org/wiki/Netscape_Server_Application_Programming_Interface" title="Netscape Server Application Programming Interface &#x2014; Wikipedia" rel="dct:references">devised <acronym title="Application Programming Interface">API</acronym>s</a> to make their products more extensible. Developing dynamic <abbr title="World-Wide Web">Web</abbr> sites with these, however, would have been almost as slow: <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29" title="C (programming language) &#x2014; Wikipedia" rel="dct:references">programming in C</a> or <a href="http://en.wikipedia.org/wiki/C%2B%2B" title="C++ &#x2014; Wikipedia" rel="dct:references">C++</a>, recompiling, stopping and restarting the server, and of course, extremely tedious <a href="http://en.wikipedia.org/wiki/Memory_debugger" title="Memory debugger &#x2014; Wikipedia" rel="dct:references">memory debugging</a> of a potentially <a href="http://en.wikipedia.org/wiki/Multithreading" title="Multithreading &#x2014; Wikipedia" rel="dct:references">multithreaded</a> program. It hurts to even imagine.</p>
    </section>
    <section id="Ew9_mS4pVRSp6hVquWealJ">
      <h2>The <em>Other</em> <acronym title="Common Gateway Interface">CGI</acronym></h2>
      <p>At some point, <a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface#History" title="Common Gateway Interface &#x2014; History &#x2014; Wikipedia" rel="dct:references">some clever people</a> must have considered this situation to demand way too much effort for trivial goals, and created a way for what would eventually become <abbr title="World-Wide Web">Web</abbr> applications to run as simple, purpose-built, text-based programs. These programs would exist as files on the <abbr title="World-Wide Web">Web</abbr> server, often sitting among plain files. When called from a browser, the server would run them in a <a href="http://en.wikipedia.org/wiki/Pipeline_%28software%29" title="Pipeline (software) &#x2014; Wikipedia" rel="dct:references">pipeline</a>, feeding them the client's request and consuming their output to relay as a response. This was known as the <a href="http://en.wikipedia.org/wiki/Common_gateway_interface" title="Common gateway interface &#x2014; Wikipedia" rel="dct:references">Common Gateway Interface</a>, and a side benefit was that as long as you conformed to the pattern, you could use any language you wanted, even sloppy two-minute <a href="http://en.wikipedia.org/wiki/Shell_script" title="Shell script &#x2014; Wikipedia" rel="dct:references">shell-scripts</a>. The king of the <acronym title="Common Gateway Interface">CGI</acronym> script, however, was <a href="http://www.perl.org/" title="The Perl Programming Language - www.perl.org" rel="dct:references">Perl</a>.</p>
      <aside role="note" id="EE5R_RTc3peJ9u-WLqYQfJ">
        <p>Many of what I read as arbitrary or expedient design decisions that went into the ancient and venerable <a href="http://cgi-lib.berkeley.edu/" title="The cgi-lib.pl Home Page" rel="dct:references"><samp class="donthyphenate">cgi-lib.pl</samp></a> are still alive in a number of other products, such as the idea that <acronym title="Uniform Resource Identifier">URI</acronym> query string parameters and <samp>POST</samp>ed form parameters are one and the same. This in particular confuses the idea in <a href="http://tools.ietf.org/html/rfc2616" title="RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1" rel="dct:references"><acronym title="Hypertext Transfer Protocol">HTTP</acronym>/1.1</a> that the <samp>GET</samp> method should be <a href="http://en.wikipedia.org/wiki/Idempotence" title="Idempotence &#x2014; Wikipedia" rel="dct:references">idempotent</a>, that is, it should not change the state of the system after successive invocations. I suspect this convention acts as an impediment to <abbr title="World-Wide Web">Web</abbr> developers gaining a comprehensive understanding of the <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" title="Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)" rel="dct:references"><acronym title="Representational State Transfer">REST</acronym> architectural style</a>, because the underlying implementations are doing exactly the opposite of what <a href="http://roy.gbiv.com/" title="Roy T. Fielding" rel="dct:references">the author</a> of the <acronym title="Hypertext Transfer Protocol">HTTP</acronym> protocol and the architectural style prescribes.</p>
      </aside>
    </section>
    <section id="EkGgvJuICUGUxVorDKt5IK">
      <h2><a href="http://www.imdb.com/title/tt0387808/" title="Idiocracy (2006)" rel="dct:references">I Know, Let's Put Toilet Water On It</a></h2>
      <p>As <abbr title="World-Wide Web">Web</abbr> sites grew more sophisticated, people noticed that they were copying and pasting a lot of the same content. Maintaining this content would have been a pain &#x2014; constantly hunting down broken links, typos and minor incongruities. The solution came with the idea of <a href="http://en.wikipedia.org/wiki/Server_Side_Includes" title="Server Side Includes &#x2014; Wikipedia" rel="dct:references">server-side includes</a>, which enabled authors to call out to other files on the <abbr title="World-Wide Web">Web</abbr> server. You could keep chunks of your content in a single authoritative place and just refer to them. Moreover, you could reference <acronym title="Common Gateway Interface">CGI</acronym> programs and weave their output directly into your <acronym title="Hypertext Markup Language">HTML</acronym>. This was a particular bonus, as anybody who has hand-rolled <acronym title="Common Gateway Interface">CGI</acronym> applications can tell you.</p>
      <p>The natural progression of this paradigm was to plant chunks of executable code directly into <acronym title="Hypertext Markup Language">HTML</acronym> files, and run them through a special interpreter. There are several popular implementations still in use today:</p>
      <ul>
        <li><a rel="dct:references" href="http://php.net/" title="PHP: Hypertext Processor"><acronym title="Perl Home Page/Forms Interpreter">PHP</acronym></a>, a <abbr title="World-Wide Web">Web</abbr>-oriented programming language which, it is often forgotten, began its life as a Perl <acronym title="Common Gateway Interface">CGI</acronym> script;</li>
        <li><a rel="dct:references" href="http://en.wikipedia.org/wiki/Active_Server_Pages" title="Active Server Pages &#x2014; Wikipedia"><acronym title="Active Server Pages">ASP</acronym></a>, a theoretically generic protocol pioneered by Microsoft for containing and running scripting languages in <acronym title="Hypertext Markup Language">HTML</acronym> pages;</li>
        <li><a rel="dct:references" href="http://www.adobe.com/products/coldfusion/" title="Application server, middleware, web development | ColdFusion">ColdFusion</a>, an attempt to save on expensive programmers by dressing up code in a way cheap <acronym title="Hypertext Markup Language">HTML</acronym> coders could understand, and</li>
        <li><a href="http://java.sun.com/products/jsp/" title="JavaServer Pages Technology" rel="dct:references"><acronym title="Java Server Pages">JSP</acronym></a>, essentially a front-end to <span class="parenthesis" title="now Oracle, I guess">Sun's</span> <a href="http://en.wikipedia.org/wiki/Java_Servlet" title="Java Servlet &#x2014; Wikipedia" rel="dct:references">Java servlet</a> architecture and a competitor to <acronym title="Active Server Pages">ASP</acronym>, which I will discuss in a moment.</li>
      </ul>
    </section>
    <section id="EhLk9R3JtSs6w06rgpzp5J">
      <h2><a href="http://images.google.com/images?q=internet+serious+business" title="internet serious business - Google Search" rel="dct:references">Internet: Serious Business</a></h2>
      <p>While the advent of <acronym title="Common Gateway Interface">CGI</acronym> enabled tremendous innovation at a trifling cost, it wasn't the only part of the <abbr title="World-Wide Web">Web</abbr>'s conceptual infrastructure to evolve. For those who insisted on spending huge sums of money on <acronym title="Information Technology">IT</acronym> projects, there were enterprise solutions to match. At around the same time the paradigm of embedding code in <acronym title="Hypertext Markup Language">HTML</acronym> was evolving, so was that of the server <acronym title="Application Programming Interface">API</acronym>, in the form of the <a href="http://en.wikipedia.org/wiki/Application_server" title="Application server &#x2014; Wikipedia" rel="dct:references">application server</a>.</p>
      <p>An application server was initially conceived as its own machine or <a href="http://en.wikipedia.org/wiki/Cluster_%28computing%29" title="Cluster (computing) &#x2014; Wikipedia" rel="dct:references">cluster</a> thereof, which sat in between a regular <abbr title="World-Wide Web">Web</abbr> server and a <a href="http://en.wikipedia.org/wiki/Relational_database_management_system" title="Relational database management system &#x2014; Wikipedia" rel="dct:references">database server</a> &#x2014; again, or clusters thereof. <em>Expensive</em>. The idea was that the regular content servers would respond to the highest volume of static requests while forwarding dynamic requests to the application server, which would be fewer in number but more resource-intensive. This would theoretically enable the application to scale quickly and transparently to its users, while avoiding slow and costly engineering considerations.</p>
      <p>In this configuration, it was inconceivable to go mincing around with individual files and trying to keep them in sync across multiple application servers. What it demanded was an entire <abbr title="World-Wide Web">Web</abbr> application to be crammed into a monolithic bundle so it could be pushed to the cluster in one piece. At the same time, the files in the bundle didn't necessarily correspond directly to pages on the <abbr title="World-Wide Web">Web</abbr> site, but instead would be generated on the fly, just as with the server <acronym title="Application Programming Interface">API</acronym>s. The most prominent example of these bundles is probably the <a href="http://en.wikipedia.org/wiki/Java_Servlet" title="Java Servlet &#x2014; Wikipedia" rel="dct:references">Java servlet</a>, for which just about every major software corporation, bridge club and corner store has its own brand of application server. Except Microsoft of course, as they have <a href="http://en.wikipedia.org/wiki/ASP.NET" title="ASP.NET &#x2014; Wikipedia" rel="dct:references">ASP.NET</a>, which is their proprietary version of basically the same thing.</p>
    </section>
    <section id="EKWjhjnpInCsK-UFUpseuK">
      <h2>Yeee Haw</h2>
      <p>As the patterns of embedded code and application servers matured, <abbr title="World-Wide Web">Web</abbr> technology began to get down like an Ozark family reunion. Domain-specific languages intended to generate tables and populate forms in <acronym title="Hypertext Markup Language">HTML</acronym> sprouted legs. <abbr title="World-Wide Web">Web</abbr> frameworks now ship with their own embedded servers for testing, or they <em>are</em> <abbr title="World-Wide Web">Web</abbr> servers designed from the ground up. The distinct roles of content and application servers began to merge back together, and they can now be leased at at affordable rates based on storage, traffic and computation time. Possibly most remarkable is the sheer bulk of application state, presentation logic and even business logic which has migrated wholesale to the browser and/or being offered as a <a href="http://en.wikipedia.org/wiki/Web_widget" title="Web widget &#x2014; Wikipedia" rel="dct:references">third-party widget</a>, possibly under some kind of <a href="http://en.wikipedia.org/wiki/Freemium" title="Freemium &#x2014; Wikipedia" rel="dct:references"><em>freemium</em> business model</a>.</p>
    </section>
    <section id="EvPHTeEPfuDjx17aKg_h5J">
      <h2>Products, Products, Everywhere&#x2026;</h2>
      <p>We find ourselves now floating in a sea of products, at all points along <a href="http://en.wikipedia.org/wiki/Solution_stack" title="Solution stack &#x2014; Wikipedia" rel="dct:references">what is known as a stack</a>. The stack starts at the <a href="http://en.wikipedia.org/wiki/Operating_system" title="Operating system &#x2014; Wikipedia" rel="dct:references">operating system</a> and/or <a href="http://en.wikipedia.org/wiki/Virtual_machine" title="Virtual machine &#x2014; Wikipedia" rel="dct:references">virtual machine</a>, then proceeds to <abbr title="World-Wide Web">Web</abbr> server, data store, application programming language, <a href="http://en.wikipedia.org/wiki/Web_application_framework" title="Web application framework &#x2014; Wikipedia" rel="dct:references">application framework</a>, and finally <a href="http://en.wikipedia.org/wiki/Content_management_system" title="Content management system &#x2014; Wikipedia" rel="dct:references">content management system</a>, under which I would include blog, wiki and social media platforms. Pick a product anywhere in this stack and you'll find that it overlaps heavily with just about every other product in its category, and the few unique behaviours it offers, it does in a surprisingly incompatible way. Mixing and matching small chunks of functionality is not economical, so you write your own; there is still no such thing as <abbr title="World-Wide Web">Web</abbr> Lego. There has been some respite to this incompatibility with the advent of <abbr title="World-Wide Web">Web</abbr> services and the JavaScript objects which venture past <em>blogger-bling</em> sophistication, though they create their own menagerie of problems.</p>
    </section>
    <section id="EqnFEhWp9FhMYem3aJyt2J">
      <h2>I Think It's Called <a href="http://oreilly.com/web2/archive/what-is-web-20.html" title="What Is Web 2.0 - O'Reilly Media" rel="dct:references">Web 2.0</a></h2>
      <p><a href="http://en.wikipedia.org/wiki/Utility_computing" title="Utility computing &#x2014; Wikipedia" rel="dct:references">Utility computing</a> is great because it amortizes big capital costs into small operating expenses, but can you run an <a rel="dct:references" href="http://aws.amazon.com/ec2/" title="Amazon Elastic Compute Cloud (Amazon EC2)">Amazon <acronym title="Elastic Compute Cloud">EC2</acronym></a> application on <a href="http://www.joyent.com/" title="Joyent" rel="dct:references">Joyent</a> or <a href="http://code.google.com/appengine/" title="Google App Engine - Google Code" rel="dct:references">Google App Engine</a>? Can search engines index your third-party blog comments, and most importantly, associate them with your site? Can one widget interact intelligently with another if both are on your page? Would you want them to? Are you okay with not having physical possession of your data? If one of these providers disappeared overnight, would you be left in a lurch? If they did, who would find out first? You, or your customers?</p>
      <p>Oh, and how about the dozens of accounts everybody ends up registering to interact with all of these products, as users, site owners and developers? <a href="http://en.wikipedia.org/wiki/Federated_identity" title="Federated identity &#x2014; Wikipedia" rel="dct:references">Federated identity management</a>? Getting there, but still a way off.</p>
      <p>The interesting thing about all this recent development on the <abbr title="World-Wide Web">Web</abbr> is that it really tangles up the business relationships with those to technology. It then takes that mess and exposes it for all the world to see. This means that your relationship with your customers can be affected all too easily by someone else's relationship with one of your suppliers. I suppose this has always been the case, but not to the extent of depending on two dozen different companies to make your site work as intended, <em>every time</em> somebody loads a page. Don't get me wrong, I think interdependence is a good thing, but what we currently have is just <em>dependence</em>. I want my systems to be a bit more robust than to be subject to the caprice of any particular vendor, or a vendor's vendor, or some random basement-dweller. Moreover, if there's a problem with any one of them, <em>I</em> want to know about it first.</p>
    </section>
    <p style="text-align: center; font-weight: bold"><a rel="dct:references xhv:next" href="the-state-of-web-development-continued" title="The State of Web Development, Continued">Continued in Part Deux</a></p>
  </body>
</html>
