<?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">Intelligent Heterogeneity</title>
    <base href="https://doriantaylor.com/intelligent-heterogeneity"/>
    <link href="document-stats#E1I4q-UBxx_4Oo7MWHfBXI" 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="Intelligent Heterogeneity"/>
    <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="intelligent-heterogeneity" datatype="xsd:token" property="ci:canonical-slug"/>
    <meta content="A design principle I've been developing, for a good six or so years, finally gets a name." name="description" property="dct:abstract"/>
    <meta content="2013-03-11T23:10:09+00:00" datatype="xsd:dateTime" property="dct:created"/>
    <meta content="intelligent-heterogeneity" property="dct:identifier"/>
    <meta content="2013-03-11T23:09:11+00:00" datatype="xsd:dateTime" property="dct:issued"/>
    <meta content="2013-03-12T16:47:51+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2013-03-21T17:46:43+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2018-04-18T22:52:05+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="Intelligent Heterogeneity" name="twitter:title"/>
    <meta content="A design principle I've been developing, for a good six or so years, finally gets a name." name="twitter:description"/>
    <object>
      <nav>
        <ul>
          <li>
            <a href="//dorian.substack.com/p/forget-passwords" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">Forget Passwords!</span>
            </a>
          </li>
          <li>
            <a href="ia-institute-web-committee-organizational-structure" rev="dct:references" typeof="bibo:Report">
              <span property="dct:title">IAI Web Committee Organizational Structure</span>
            </a>
          </li>
          <li>
            <a href="the-hundred-year-infrastructure" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">The Hundred-Year Infrastructure</span>
            </a>
          </li>
          <li>
            <a href="the-redesign-dissolved" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">The Redesign, Dissolved</span>
            </a>
          </li>
          <li>
            <a href="there-is-no-sqlite-for-rdf" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">There Is No SQLite for RDF</span>
            </a>
          </li>
          <li>
            <a href="website-change-diary" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">Website Change Diary</span>
            </a>
          </li>
          <li>
            <a href="document-stats#E1I4q-UBxx_4Oo7MWHfBXI" rev="ci:document" typeof="qb:Observation">
              <span>urn:uuid:d48e2af9-4071-4c7f-8e0e-a3b3161df057</span>
            </a>
          </li>
        </ul>
      </nav>
    </object>
  </head>
  <body about="" id="EjT95-Y9LbyLjiXe9qPTRJ" typeof="bibo:Article">
    <section id="EcKRE3IpVmTAJiBP5RWxlJ">
      <p>Information systems have a funny way of becoming heterogeneous. No matter how hard you plan, no matter how comprehensive your pet framework is, there will <em>always</em> be that <em>one</em> indispensable service, that <em>one</em> business expediency, that will pollute an otherwise pristine stack. Heterogeneity in software is inevitable&#x2014;especially so-called <em>enterprise</em>, and by induction <abbr title="World-Wide Web">Web</abbr>-based systems&#x2014;so we <a href="content-management-a-case-study-of-sorts" title="Content Management: A Case Study (of sorts)" rel="dct:references">might as well be smart about it</a>.</p>
    </section>
    <section id="EYkzN6an7ao41MHujY16YJ">
      <h2>The Motivation</h2>
      <p>This idea has been quietly brewing for some time, but it finally came to a head with my election to the board of the <a href="http://iainstitute.org/" title="The Information Architecture Institute" rel="dct:references">Information Architecture Institute</a>. A census of back-end systems revealed no fewer than <em>thirteen</em> different instances of blog/<acronym title="Content Management System">CMS</acronym> platforms, wikis, hosted services and custom functionality, and <em>none</em> of them talk to each other. It's exactly the kind of cruft consistent with a decade of slapdash volunteer effort: people had real work to do, but they still wanted to produce results for the organization. The net result, however, is a schizophrenic hodgepodge, incapable of delivering a consistent experience to the organization's members and the public at large. While I have marked most of these systems for retirement, my board tenure will eventually come to a close. This effort is to ensure that after I'm gone, the wise things to do are still the easiest.</p>
    </section>
    <section id="E_w22YBl4wJw8OQFKB9CwI">
      <h2>Protocols over Platforms</h2>
      <p>In order to achieve intelligent heterogeneity in an information system, we need to set aside the idea that there's a product, platform, or framework out there that will solve all our problems. Instead, we look at the <em>languages</em> these systems <em>speak</em>: the network protocols and data exchange formats. We evaluate those languages in terms of their expressive range&#x2014;whether or not they are capable of saying what we want them to say. Protocols are currency, and if they're open standards, we can take our pick of specific vendors and implementations. And <em>that</em> change takes us miles away from politico-technological dependency, and towards doing things on our own terms.</p>
      <p>Lesson number one for intelligent heterogeneity: Stop focusing on the <em>things</em>, and start looking at the things <em>between</em> the things. What follows are two specific ways I'm tackling the problem in all my work, using the <acronym title="Information Architecture Institute">IAI</acronym> as a case study.</p>
    </section>
    <section id="E6Pf-TrmAbOum5U61b8rAI">
      <h2>Identity Crisis</h2>
      <p>Each back-end of the <acronym title="Information Architecture Institute">IAI</acronym> has its own incompatible user database, each with potentially different usernames, passwords, and access control policies. So in order to get one job done, you might have to log into three different systems, and fumble about for your <em>other</em> password because one of them won't let you use the same password you use for everything else. Of course, your username is your email address in one place, your first name in another, and your <samp>first.last</samp> name elsewhere. Finally, when you manage to get all that nonsense sorted out, you can't actually do what you set out to do because you aren't authorized on <em>that</em> particular system.</p>
      <p>This situation is a user experience <em>nightmare</em>. If I'm an <acronym title="Information Architecture Institute">IAI</acronym> member, I had damn well better have access to the full range of functionality accorded to me by membership. If I'm a <em>board</em> member, I shouldn't have to go monkeying around in the guts of the website just to get my <em>volunteer</em> work done. Desynchronized user databases create <em>massive</em> confusion for users, and overhead on the parts of staff and volunteers that could be put to better use. And that is to say nothing of the impression it leaves on lapsed members who still get dispatches from the mailing lists, or the monthly newsletter for that matter.</p>
      <p>My solution here is to use the industrial-grade single sign-on protocol <a href="http://en.wikipedia.org/wiki/Kerberos_%28protocol%29" title="Kerberos (protocol) &#x2014; Wikipedia" rel="dct:references">known as Kerberos</a> to handle logging in, coupled with the equally industrial-grade <a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol" title="Lightweight Directory Access Protocol &#x2014; Wikipedia" rel="dct:references">directory protocol, <acronym title="Lightweight Directory Access Protocol">LDAP</acronym></a>, to encode user profiles and access rights. On top of those, I put an organization-wide authentication proxy which handles user sessions on the <abbr title="World-Wide Web">Web</abbr>. With this stack in place, every <abbr title="World-Wide Web">Web</abbr> property belonging to the <acronym title="Information Architecture Institute">IAI</acronym> has access to the same user information, eliminating the identity crisis problem in one fell swoop. On the developer side, you can skip the housekeeping of access control and focus directly on the task at hand: most of the popular frameworks already support the integration, and it's a quick one-time hack for everything else.</p>
      <p>Relying on protocols rather than implementations means the latter become commodities. Don't like <a href="http://web.mit.edu/kerberos/" title="Kerberos: The Network Authentication Protocol" rel="dct:references"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>? Install <a href="http://www.h5l.org/" title="Heimdal" rel="dct:references">Heimdal</a>. Angry at <a href="http://www.openldap.org/" title="OpenLDAP, Main Page" rel="dct:references">OpenLDAP</a>? Dump it for <a href="http://directory.fedoraproject.org/wiki/Main_Page" title="389 Directory Server (Open Source LDAP)" rel="dct:references">389</a>. Or if you're like any organization with a physical office, hook your <abbr title="World-Wide Web">Web</abbr> properties straight into your ubiquitous corporate <a rel="dct:references" href="http://www.microsoft.com/en-us/server-cloud/windows-server/identity-access.aspx" title="Microsoft | Windows Server 2012 | Identity &amp; Access">Active Directory</a>. Even the authentication proxy is disposable: I'm currently road-testing <a href="http://webauth.stanford.edu/" title="IT Services: Stanford WebAuth" rel="dct:references">Stanford WebAuth</a>, but I could ditch it for <a href="http://weblogin.org/" title="cosign: web single sign-on" rel="dct:references">CoSign</a> at a moment's notice without registering a so much as a blip in the service.</p>
    </section>
    <section id="EMiGVaTnEIawfEiFAlLJ1K">
      <h2>Paint Job</h2>
      <p>The other perennial problem with a m&#xE9;nagerie of recalcitrant back-end systems is getting them all to look and act the same. There are at least as many template languages as there are middleware products, and all of them are, once again, in the very least <em>slightly</em> incompatible and often pretty ridiculous. Making organization-wide changes to information architecture, metadata and visual design thus explodes with a foetid plop into <a href="http://www.perseus.tufts.edu/Herakles/stables.html" title="Hercules' Fifth Labor: the Augean Stables" rel="dct:references">the Augean stable</a> of <abbr title="World-Wide Web">Web</abbr> development.</p>
      <p>To stop everything from looking like shit, I'm using a tried-and-true method that hasn't budged since I picked it up 13 years ago: <a href="http://www.w3.org/TR/xslt" title="XSL Transformations (XSLT)" rel="dct:references"><acronym title="Extensible Stylesheet Language Transformations">XSLT</acronym></a>. <em>Why</em>?</p>
      <ul>
        <li><strong>It's a standard</strong>: Which means you have your pick of dedicated processor implementations, some of which are very, <em>very</em> fast.</li>
        <li><strong>It forces you to write well-formed markup</strong>: No more weird layout bugs caused by aberrant typographical errors.</li>
        <li><strong>It only has access to information you give it</strong>: No security whoopsies because the template processor got tricked into dumping out the contents of the database.</li>
        <li><strong>You can debug it offline</strong>: Because it's been baked into your browser for over a decade.</li>
        <li><strong>You can repurpose resources</strong>: Like turning Atom feeds into page content, or turning an <acronym title="Hypertext Markup Language">HTML</acronym> table into an <acronym title="Scalable Vector Graphics">SVG</acronym> pie chart.</li>
        <li><strong>You can nerf it for the n00bs</strong>: Because it's modular, one person can write the hard transformations and designate specific, clutter-free spots for the <acronym title="Hypertext Markup Language">HTML</acronym> jockeys to drop in hunks of layout code. I had a visual design team working exactly this way for three years and they didn't have any problems picking it up.</li>
      </ul>
      <p>Perhaps most valuable though, is <acronym title="Extensible Stylesheet Language Transformations">XSLT</acronym>'s implementation-agnostic transclusion mechanism, which makes page compositing as easy as embedding an image. That means that your navigation could belong to one back-end while an inset was driven by another, all piled together onto a humble, static <acronym title="Hypertext Markup Language">HTML</acronym> page. With a little help from a reverse proxy, you can even have content from different <em>servers</em> show up seamlessly in the <span class="parenthesis" title="With scarcely a line of JavaScript to be seen.">same source code</span>.</p>
      <p>How does it all come together? The template processor gets <a href="http://www.outoforder.cc/projects/apache/mod_transform/" title="OutOfOrder.cc :: mod_transform" rel="dct:references">embedded into the server</a> as a filter and operates on any markup that it has been told to transform. In each of the back-ends, you simply strip out <em>all</em> non-essential markup, leaving only that which constitutes the main content.</p>
      <p>Making page components accessible directly as <acronym title="Hypertext Transfer Protocol">HTTP</acronym> resources is consistent with <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">the principles of <acronym title="Representational State Transfer">REST</acronym></a>, which, as an architectural style, is even <em>more</em> abstract than a protocol or data format. That means that once another standard comes along that does everything <acronym title="Extensible Stylesheet Language Transformations">XSLT</acronym> does but without all the awkwardness, the task of switching over will be a manageable one. But in the interim, I don't want to hear any complaining! <acronym title="Extensible Stylesheet Language Transformations">XSLT</acronym> may seem like a blast from the past, but it does its one job <em>extremely</em> well.</p>
    </section>
    <section id="E7SHMy7JwCYkNZ7iNhmNrL">
      <h2><a href="shearing-layers-applied-to-the-web" title="Shearing Layers Applied to the Web" rel="dct:references">Shearing Layers</a>, Revisited</h2>
      <p>Versions of specific software products move extremely fast. It's scarcely possible to go a day without being pestered for an update. New features get added, exploits get discovered, and bugs get fixed, putting us on a constant treadmill of software slavery. Developers are likewise continually releasing entirely new classes of middleware&#x2014;and accompanying techniques&#x2014;into the ecosystem. Even stolid frameworks, and the programming languages they're based on, phase in and out of vogue every couple of years.</p>
      <p>Protocol standards, by comparison, are glacial. If they have any currency, which is what makes them worth using in the first place, they outlive even the staunchest implementations. And when they finally <em>are</em> replaced, they often supply at least <em>some</em> inspiration to the new dialect.</p>
      <p>Embracing a principle of intelligent heterogeneity means gearing down the churn, and making our systems less susceptible to the caprice of products, technologies and fashion, by taking the focus off individual implementations. I'm glad I'm getting the opportunity to demonstrate this principle with the <acronym title="Information Architecture Institute">IAI</acronym>, so that I&#x2014;and the design community at large&#x2014;can create better systems going forward.</p>
    </section>
  </body>
</html>
