<?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">The Isomorphism Shuffle</title>
    <base href="https://doriantaylor.com/the-isomorphism-shuffle"/>
    <link href="document-stats#ETV9EzkLQf2XOI0riYYwjL" 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="The Isomorphism Shuffle"/>
    <link href="lexicon/#EgKBzmX3EeQ5uHb5NelbqL" rel="dct:audience" title="Project Manager"/>
    <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="the-isomorphism-shuffle" datatype="xsd:token" property="ci:canonical-slug"/>
    <meta content="If I believed Agile was the answer, I'd still be a programmer." name="description" property="dct:abstract"/>
    <meta content="2011-09-24T22:50:36+00:00" datatype="xsd:dateTime" property="dct:created"/>
    <meta content="the-isomorphism-shuffle" property="dct:identifier"/>
    <meta content="2011-09-24T22:51:50+00:00" datatype="xsd:dateTime" property="dct:issued"/>
    <meta content="2011-09-24T22:52:31+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2011-10-06T15:06:00+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="The Isomorphism Shuffle" name="twitter:title"/>
    <meta content="If I believed Agile was the answer, I'd still be a programmer." name="twitter:description"/>
    <object>
      <nav>
        <ul>
          <li>
            <a href="document-stats#ETV9EzkLQf2XOI0riYYwjL" rev="ci:document" typeof="qb:Observation">
              <span>urn:uuid:4d5f44ce-42d0-47f6-b5ce-234ae2618c23</span>
            </a>
          </li>
        </ul>
      </nav>
    </object>
  </head>
  <body about="" id="ExmoPdce2wqcbx1f854IBK" typeof="bibo:Article">
    <section id="EhQfb38OXBf35xbHdEOKhI">
    <p><strong>I am a terrible programmer.</strong> Does that mean I'm bad at programming? I don't know, I think I'm pretty decent. I write regularly in three languages and can find my way along in another dozen. I indent four and wrap lines at 78 characters. I write my own development tools. I document clearly. I carefully consider class layouts. I regularize programming interfaces. I sanitize inputs. I employ test suites. I'm fastidious about version control. I package for distribution. I account for dependencies. I'm steeped in design patterns. When it comes to security, I hit the sweet spot between paranoia and efficiency. I've even permitted past employers to label me <em>senior</em> and pay me a high salary for the privilege. But I'm still a bad programmer, because in order to be a <em>good</em> programmer, I have to do something I have very little tolerance for: <em>produce industrial quantities of code</em>.</p>
    <p>I don't like writing lots of code because I believe it's bad for my physical, mental and social health. I also find it tedious and boring. And in over a decade of researching around and working with software professionally, I have come to the conclusion that it is largely unnecessary.</p>
    </section>
    <section id="Ee6gjeZQaqMC5LSB-UyQJL">
      <h2>What Software <em>Is</em></h2>
      <p>My definition of software is <em>a business process that is defined with enough specificity to be implemented as a machine</em>, taken to its logical conclusion. This conclusion being, of course, to design a machine that executes designs of machines, thus cutting out the expensive process of manufacturing or constructing the latter.</p>
      <aside role="note" id="EHVEI6rtUjCySgDve-1KMK">
        <p>Yet, ironically, our language for discussing the acquisition of software is still couched in terms of manufacturing and construction. This is a topic for another day, though.</p>
      </aside>
      <p>But a business process is a conceptual thing: it's a series of steps that reliably produces a predictable result&#x2731;. The <em>content</em> of the steps is significant, <em>not</em> their quantity. A given process requires not one iota more or less than the <em>exact</em> amount of language required to describe it. Which means under ideal conditions, for a particular process, I should only need to express it in code exactly <em>once</em>.</p>
      <aside role="note" id="E3OR6U3eHnL7ThD627lGUL">
        <p>&#x2731; I'm intentionally using a broad definition of <em>business process</em>&#x2014;any goal-oriented process is a business process. Tying your shoes could be a business process if the goal was to tie your shoes, It has nothing to do with actual <em>business</em> except that actual businesses have to produce effective results if they want to exist. Additionally, I only mention it above in the context of an algorithm, though a process that achieves effectiveness by aggregating unreliable processes, i.e. a heuristic, could be a business process just as well. The physicists tell us everything works that way anyway.</p>
      </aside>
    </section>
    <section id="EIvCPHG4kKjCQzQJxblGoK">
      <h2>I'm On a Boat (of Theseus)</h2>
      <p>It's at this point that people usually complain to me that this is an unrealistic expectation, because requirements are continually changing and new information is being exposed. For the record, they usually do it condescendingly, as if I was somehow deficient, or had never done real work before. It's unfortunate to be so unimaginative. Consider the following:</p>
      <blockquote id="Es3uV_7FO1HpkGx00ZEFvK">
        <p>Software is made of language. Language is made of symbols. Symbols have meaning. A symbol may be composed from other symbols to create a composite meaning. A symbol may also possess a detailed anatomy of smaller symbols, all the way down to the difference which makes a difference. All or part of one symbol may be isomorphic (have an equivalent meaning) to all or part of another symbol, even if it has a different shape. Where this equivalency is not the case, changing the shape of a symbol also changes its meaning, which is equivalent to minting a new symbol.</p>
      </blockquote>
      <p>Given this, we can consider a description of problem <var>P</var> as one symbol, and the code that implements its solution <var>S</var> as another symbol. But the thing is, <var>P</var> doesn't <em>change</em> when the real world changes as much as it is <em>replaced</em> by a description of another problem, <var>Q</var>. Its concomitant solution is no longer <var>S</var>, but <var>T</var>. Physical <em>stuff</em> changes, to be sure, but we aren't working with physical stuff in any more capacity than is required to represent our symbols. And that, my friends, is key.</p>
    </section>
    <section id="E_2q37-3Z7OCBTPSnvlztK">
      <h2>The Isomorphism Shuffle</h2>
      <p>The issue I have with code is that as a medium it is too damn precise. You simply can't operate over any concept until you have defined it exactly, whether or not it exhibits any fidelity to its referent. Then there are the myriad considerations peculiar to the implementation. It's like digging the Panama canal with a toothpick, or with recent advancements, a chopstick. Some might boast that as a fourfold performance improvement, but that isn't good enough for me.</p>
      <p>Software code is <em>almost</em> at the very end of a long chain of transformations between symbols that begin in your head and terminate in the transistors of a microprocessor. The <em>almost</em> is significant, because it's those last few links in the chain that make the practice even remotely close to manageable, and offer a hint to make it more so. I'm speaking of course about compilation (or interpretation), assembly, and the translation of machine code into microcode. The <em>only way</em> this can produce predictable results is if the coarser, more palpable symbols are <em>isomorphic</em> to collections of the finer, more arcane ones. So my question is <strong>why don't we put more effort into extending this chain in the opposite direction?</strong> So we have an unbroken line of isomorphisms, punctuated by representational artifacts, that go from the mental model of the system's designer all the way down to the silicon?</p>
      <p>Now, a few people have tried to bolt another layer of abstraction onto the human-touching side of code, usually as some sort of graphical interface. This is interesting, but has yet to add all that much to the pliancy of its semantic structure. The meta-discipline collectively known as <em>user experience design</em> has come from the opposite direction, clarifying and enhancing mental models to attempt to reconcile them with a viable implementation. But there is still a gap, and it's significant.</p>
      <p>Of course code needs to be written in order to create a software product. That's tautological. To hesitantly revive the construction metaphor, it's like saying you can't have a building without building a building. But that doesn't mean you should immediately run down to the job site and start laying bricks and pouring concrete. That isn't an indicator of performance, it's an indicator of lunacy.</p>
    </section>
    <section id="EN8Des5VFRHjPy4jIz4OgL">
      <h2>So What to Do?</h2>
      <p>My advice? Make representational artifacts that are no more specific than the information available to describe them. If you <em>can</em> express it specifically, it isn't necessary to race to coerce it into a product. It's arguably more important to reify a solid concept than it is to deliver product, as they say, on an <q>early and continuous</q> basis. That just puts you on a treadmill.</p>
      <p>What is a representational artifact, you ask? I can't tell you, because it's different every time. It's whatever it needs to be in order to convey a desired meaning, made out of whatever medium or media most appropriate for doing so. Like a pencil sketch, or a clay model, or a video of an interpretive dance. Code is a representational medium as well. If you experiment with different media, you will find that some afford certain forms of expression with greater ease than others. The process of acquiring software doesn't all have to happen on a computer and it <em>certainly</em> doesn't have to be expressed exclusively in code.</p>
      <aside role="note" id="EAeohMji-J2ydZutGmP4qK">
        <p>Of course, the least desirable scenario is a monolith. For a solid depiction of a robust approach, read the parable of Tempus and Hora near the end of Herbert Simon's <em>The Sciences of the Artificial</em>.</p>
      </aside>
      <p>If you hold one less-specific representational artifact in one hand and a more-specific one in the other, you should be able to look at both and say with confidence whether or not they are conceptually identical. You should be able to say if one lacks features significant in the other, or if it possesses extra features which would otherwise change its meaning. In order to do this, however, you need to sufficiently understand <em>both</em>.</p>
      <p>And that, my compatriots, means thinking about where we draw the lines between professional disciplines and how we divide labour. Another topic, perhaps, to explore another day.</p>
    </section>
  </body>
</html>
