<?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 HURRDURR Games</title>
    <base href="https://doriantaylor.com/the-hurrdurr-games"/>
    <link href="document-stats#EEwZih5xr5dz849EQKYEQL" 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 HURRDURR Games"/>
    <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-hurrdurr-games" datatype="xsd:token" property="ci:canonical-slug"/>
    <meta content="Or, &#x201C;Hackathons&#x201D; Considered Harmful." name="description" property="dct:abstract"/>
    <meta content="2016-09-19T16:38:08+00:00" datatype="xsd:dateTime" property="dct:created"/>
    <meta content="the-hurrdurr-games" property="dct:identifier"/>
    <meta content="2016-09-19T16:40:46+00:00" datatype="xsd:dateTime" property="dct:issued"/>
    <meta content="2016-09-22T03:50:22+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 HURRDURR Games" name="twitter:title"/>
    <meta content="Or, &#x201C;Hackathons&#x201D; Considered Harmful." name="twitter:description"/>
    <object>
      <nav>
        <ul>
          <li>
            <a href="hello-internet" rev="dct:references" typeof="bibo:Note">
              <span property="dct:title">Hello, Internet</span>
            </a>
          </li>
          <li>
            <a href="toys" rev="dct:references" typeof="bibo:Article">
              <span property="dct:title">Toys</span>
            </a>
          </li>
          <li>
            <a href="document-stats#EEwZih5xr5dz849EQKYEQL" rev="ci:document" typeof="qb:Observation">
              <span>urn:uuid:13066287-9c6b-4e5d-bcfc-e3d110298110</span>
            </a>
          </li>
        </ul>
      </nav>
    </object>
  </head>
  <body about="" id="E101-JKbW9JTo6QXTF8mIJ" typeof="bibo:Article">
    <p>The concept of the <a rel="dct:references" href="https://en.wikipedia.org/wiki/Hackathon" title="Hackathon &#x2014; Wikipedia"><q>hackathon</q></a> has drifted considerably far from its origin as an invite-only retreat to collaborate on self-directed, open-source software development. This is a term whose meaning has been polluted to mean a <dfn>design contest</dfn>, which is just another form of <a rel="dct:references" href="http://www.nospec.com/" title="No!Spec">spec work</a>. Since these events only seem to be getting more prevalent, it is perhaps worth analyzing what they <em>were</em>, and what they ostensibly are <em>now</em>.</p>
    <section id="EKo-OcMuktJfruYGjq8k6L">
      <h2>What <q>Hackathon</q> Once Meant</h2>
      <p><span class="parenthesis" title="in 1999">A millennium ago</span>, the maintainers of an obscure, <span class="parenthesis" title="it's where all the security innovations come from">yet nevertheless important operating system called OpenBSD</span>, <a rel="dct:references" href="http://www.openbsd.org/hackathons.html" title="OpenBSD: Hackathons">cooked up an idea</a> to get all their core developers from all around the world into the same room for a blast of productivity. The event, which has since expanded, has these features:</p>
      <dl>
        <dt>Invite-only</dt>
        <dd>You can't attend if you haven't been tapped.</dd>
        <dt>Detailed problem set determined in advance</dt>
        <dd>Attendees have a pretty good idea about what they're going to work on, before they arrive, since they're the ones who come up with it.</dd>
        <dt>Cooperative, not competitive</dt>
        <dd>The purpose of the event is to get geographically disparate colleagues into the same room, so they can work <em>together</em>.</dd>
        <dt>Open-source</dt>
        <dd>The work product is a public good.</dd>
        <dt>Attendees are <strong>funded</strong></dt>
        <dd>Compensated unconditionally through grants.</dd>
      </dl>
      <p>I am a fan of these kinds of gatherings. I am considerably more skeptical about corporate slumber parties with Fabulous Cash Prizes&#x2122;.</p>
    </section>
    <section id="E_p41Ocwgjxt7X7aPmLx4J">
      <h2>So You're Considering It Anyway</h2>
      <p>Humour me and do this first.</p>
      <form id="calculator">
        <fieldset>
          <p>Start with what you would charge a client for the same work: say, <label class="dollars"><input class="three-em" type="number" name="hourly-rate" value="100" min="1" step="1" onchange="this.form.calculate()"/></label> an hour. The hackathon is <input class="two-em" type="number" name="hours" value="24" min="2" step="1" onchange="this.form.calculate()"/> contiguous hours, so be sure to include a stiff premium of <label class="percent"><input class="three-em" type="number" name="premium" value="200" min="0" step="1" onchange="this.form.calculate()"/></label> for any hours past the first <input class="two-em" type="number" name="cutoff" value="8" min="1" onchange="this.form.calculate()"/>. Again, picture a rich client, <span class="parenthesis" title="remember: their problem, not yours">in crisis</span>, willing to pay you whatever it took to work nonstop until their problem was solved. According to these inputs, this chunk of your time is worth <strong><output class="five-em dollars" name="time-value">5600</output></strong>.</p>
          <p>There are <input class="two-em" type="number" name="people" value="50" min="2" onchange="this.form.calculate()"/> people competing in <input class="two-em" type="number" name="teams" value="10" min="2" onchange="this.form.calculate()"/> teams. There are <input class="two-em" type="number" name="your-team" value="5" min="1" onchange="this.form.calculate()"/> people on your team. Prizes go as follows:</p>
          <blockquote class="note" id="EmVh9-SH8CzDAH2wMNsuvJ">
            <p>I picked these values up from a hackathon that <a rel="dct:references" href="https://hackbd.builddirect.com/">floated through the tubes</a> over the weekend. I have no idea if it's representative, but this whole calculator thing is adjustable, so I encourage you to spend some time adjusting it.</p>
          </blockquote>
          
          <ol id="prizes">
            <li><label class="dollars"><input class="three-em" type="number" value="2000" min="0" onchange="setPrize(this)"/></label> <span class="desc">for first prize</span> <button type="button" style="display: none" onclick="killPrize(this)">&#xD7;</button></li>
            <li><label class="dollars"><input class="three-em" type="number" value="1000" min="0" onchange="setPrize(this)"/></label> <span class="desc">for second prize</span> <button type="button" onclick="killPrize(this)">&#xD7;</button></li>
            <li><label class="dollars"><input class="three-em" type="number" value="500" min="0" onchange="setPrize(this)"/></label> <span class="desc">for third prize</span> <button type="button" onclick="killPrize(this)">&#xD7;</button></li>
          </ol>
          <div><button type="button" onclick="addPrize(this)">+</button></div>
          <blockquote id="notice" class="note">
            <p>It is worth noting that the largest prize, <output class="dollars" name="largest-prize">2000</output>, is less than the <output class="dollars" name="time-value">5600</output> we determined to be the value of <output name="hours-out">24</output> nonstop hours of your time. Even if your compensation was certain <em>and</em> you didn't have to share it, you'd still be accepting <output name="solo-discount">36</output> cents on the dollar. Sharing with <output name="other-team">4</output> other people? <output name="team-discount">7.1</output> cents on the dollar.</p>
          </blockquote>
          <p>Assuming the teams are evenly matched and the judging is fair&#x2731;, you have a <output class="percent" name="chance">30</output> chance of winning a prize. This puts the <a rel="dct:references" href="https://en.wikipedia.org/wiki/Expected_value" title="Expected value &#x2014; Wikipedia">expected value</a> of the contest at <output class="dollars" name="team-ev">350</output>, which of course split <output name="team-out">5</output> ways is <strong><output class="dollars" name="your-ev">70</output></strong>.</p>
          <p>Odds are you could earn more if you spent that <output name="hours-out">24</output> hours cleaning out all your storage space and selling what you find on craigslist.</p>
          <p>Just for funsies though, let's figure out how big the prizes would have to be in order to balance out an outlay of this size:</p>
          <p>Start with the value of your time, which we determined to be <output class="dollars" name="time-value">5600</output>, then multiply it by <output name="team-out">5</output> to yield an expected value <span class="parenthesis" title="of course because the whole team has to win in order for you to win">for your whole team</span>. Then divide by <output class="percent" name="chance">30</output> for a total of <output class="dollars" name="adjusted-total">93333</output> in prize money. Using the same proportions, the prizes would be:</p>
          
          <ol id="adjusted-prizes">
            <li><output class="dollars">53333</output></li>
            <li><output class="dollars">26666</output></li>
            <li><output class="dollars">13333</output></li>
          </ol>
        </fieldset>
          <p><em>That's</em> how big the prizes would have to be to even <em>begin</em> to consider a contest like this, assuming your goal was to win it. It also assumes no other discounts or premia, <em>and</em> that the increased prize money wouldn't attract significantly more people, driving down the odds and jacking up the equilibrating prizes even higher, attracting still more people, and on and on recursively until the whole system equilibrates.</p>
          <blockquote class="note" id="EtvCcmIG9bxbrALwgesIjJ">
            <p>&#x2731; A note about judging: This calculation assumes a lottery-like drawing of prizes, <em>not</em> the caprice of a panel of judges. Because of this, the aforementioned math exercise is useless, except to confirm how comically <em>bad</em> the deal is. One might na&#xEF;vely assume that the dispensation of prizes would have something to do with merit, but there are good strategic reasons for the patrons <em>not</em> to award a prize to the best work. Indeed, it would be prudent for them not to draw attention to it.</p>
            <p>Besides, who's to say the winner wasn't determined before the contest even started?</p>
          </blockquote>
      </form>
      <script type="text/javascript">
        function addPrize (button) {
          var f = button.form;
          /* do input */
          var t  = document.getElementById('prizes');
          var items = t.getElementsByTagName('li');
          var li = items[items.length-1].cloneNode(true);
          li.getElementsByTagName('button')[0].style.display = 'initial';
          var i = li.getElementsByTagName('input')[0];
          //i.value = 0;
          var x = t.getElementsByTagName('input');
          // don't fuck with this for now; it's not that important
          //i.max = x[x.length - 1].value;

          /* set the blurb */
          var s = li.getElementsByTagName('span')[0].firstChild;

          if (f.prizes.length &gt; x.length) {
            var p = f.prizes[x.length]; // index after
            if (p[0] &gt; 0) i.value = p[0];
            s.data  = p[1];
          }
          else {
            s.data  = '\u2026';
            f.prizes.push([i.value, s.data]);
          }

          t.appendChild(li);

          /* do output */
          t  = document.getElementById('adjusted-prizes');
          li = t.getElementsByTagName('li')[0].cloneNode(true);
          x  = li.getElementsByTagName('output')[0];
          x.value = 0;
          t.appendChild(li);

          f.calculate();
        }

        function listIndex (list, item) {
          var lis = list.getElementsByTagName('li');
          var i = 0;

          for (i; i &lt; lis.length; i++) {
            if (lis[i].isSameNode(item)) break;
          }

          return i &gt;= lis.length ? -1 : i;
        }

        function killPrize (button) {
          var f  = button.form;
          var li = button.parentNode;
          var ul = li.parentNode;

          /* find the ordinality */
          var i = listIndex(ul, li);
          console.log(i);

          /* get rid of the element */
          ul.removeChild(li);

          /* now we redo the prize list */
          var lis = ul.getElementsByTagName('li');
          //lis[i].getElementsByTagName('input')[0].max = lis[i-1].getElementsByTagName('input')[0].value;
          for (var j = i; j &lt; lis.length; j++) {
            var input = lis[j].getElementsByTagName('input')[0];
            var blurb = lis[j].getElementsByTagName('span')[0].firstChild;

            f.prizes[j][0] = input.value; // prize value to content
            blurb.data     = f.prizes[j][1]; // blurb to original
            
          }

          
          /* now get rid of the one in the output */
          var t = document.getElementById('adjusted-prizes');
          t.removeChild(t.getElementsByTagName('li')[i]);

          f.calculate();
        }

        function setPrize (input) {
          var f  = input.form;
          var li = input.parentNode;
          var ul = li.parentNode;

          var i = listIndex(ul, li);
        
          f.calculate();
        }

        function setOutput (form, name, value) {
          var o = form[name];
          if (o.nodeType) {
            o.value = value;
          }
          else {
            for (var i = 0; i &lt; o.length; i++) {
              o[i].value = value;
            }
          }
        }

        function getPrizes () {
          var ul = document.getElementById('prizes');
          var lis = ul.getElementsByTagName('li');
          var out = [];
          for (var i = 0; i &lt; lis.length; i++) {
            var input = lis[i].getElementsByTagName('input')[0];
            out.push(parseInt(input.value));
          }
          return out.sort(function (a, b) {
            return a &lt; b ? -1 : a &gt; b ? 1 : 0; }).reverse();
        }

        var f = document.getElementById('calculator');
        /* here is some memory for the prizes */
        f.prizes = [
          [2000, 'for first prize'],
          [1000, 'for second prize'],
          [500,  'for third prize'],
          [0,    '\u2026'],
          [0,    '\u2026'],
          [0,    'for the lulz'],
          [0,    'for great justice'],
          [0,    'for a set of steak knives']
        ];
        var p  = document.getElementById('prizes');
        var li = p.getElementsByTagName('li');
        f.calculate = function () {
          /* get the inputs */
          var hourly  = parseInt(this['hourly-rate'].value);
          var hours   = parseInt(this['hours'].value);
          var cutoff  = parseInt(this['cutoff'].value);
          var premium = parseInt(this['premium'].value) / 100 + 1;
          var value   = Math.round(hours &gt; cutoff ?
            hourly * cutoff + (hours-cutoff) * hourly * premium :
            hourly * hours);

          /* set the time value */
          setOutput(this, 'time-value', value);

          var teams   = parseInt(this['teams'].value);
          var people  = parseInt(this['people'].value);
          var yours   = parseInt(this['your-team'].value);

          /* note these are actual prizes, not state */
          var prizes = getPrizes();
          var money  = prizes.reduce(function (a, b) { return a + b });
          var chance = prizes.length / teams;

          setOutput(this, 'chance', Math.round(chance * 100));

          /* now deal with the notice */
          var discount = prizes[0] / value;
          setOutput(this, 'largest-prize', prizes[0]);
          setOutput(this, 'hours-out', hours);
          setOutput(this, 'solo-discount', Math.round(discount * 100));
          setOutput(this, 'team-discount', Math.round(discount / yours * 100));
          setOutput(this, 'other-team', yours - 1);
          var notice = document.getElementById('notice');
          notice.style.display = prizes[0] &lt; value ? 'block' : 'none';
            
          /* now deal with EV */
          var ev = money / prizes.length * chance;
          setOutput(this, 'team-out', yours);
          setOutput(this, 'team-ev', Math.round(ev));
          setOutput(this, 'your-ev', Math.round(ev / yours));

          /* now deal with projections */
          var adjusted = value * yours / chance;
          setOutput(this, 'adjusted-total', Math.round(adjusted));

          var adjp = document.getElementById('adjusted-prizes').getElementsByTagName('li');
          for (var i = 0; i &lt; prizes.length; i++) {
            var o = adjp[i].getElementsByTagName('output')[0];
            o.value = Math.round(prizes[i] / money * adjusted);
          }

          var ppl = document.getElementById('suckers');
          if (ppl) ppl.value = people;
          var hrs = document.getElementById('hours');
          if (hrs) hrs.value = hours;
          var $$$ = document.getElementById('dollars');
          if ($$$) $$$.value = people * value;

          console.log(prizes);
        };
      </script>

    </section>
    <section id="EuFgyMruhTZuLUqeUVsTBI">
      <h2>What They Get Out of It</h2>
      
      <p>For starters, the hackathon's patron is getting <output id="suckers">50</output> people to work <output id="hours">24</output> hours each, which, if they all demanded the same compensation <em>you</em> would for <em>not</em>-a-hackathon, would cost <output id="dollars" class="dollars">280000</output>. It is overwhelmingly likely, however, that the whole shebang costs them $10000, <em>maybe</em> $20000 all in. That is a sweet, <em>sweet</em> discount. What did they do to deserve such a generous gift?</p>
      <p>The <em>real</em> value, though, comes in the form of intellectual property, which you sign over as the price of admission. Arguably this is the entire point of events like these: harvesting <abbr title="intellectual property">IP</abbr>.</p>

      <p>There is no guarantee <em>you</em> get paid, but the patron unconditionally owns your output. Forget the magnanimous donation of otherwise-billable <em>time</em>: You are <em>literally</em> trading away your valuable ideas for a few slices of pizza.</p>
      <p>Putting a price tag on intellectual property is an inherently thorny topic, or I'd have included it in the model above. It's ultimately a bet that what you gain <em>now</em> is worth more than what you give up in perpetuity. We're talking about never being able to use those ideas <em>again</em>, or at least over any time horizon short enough to be meaningful. It's a tough claim that a crap-shoot at a few hundred bucks is enough to cover that.</p>
      
    </section>
    <section id="EEdjZK_r9k14ChU6RYyPIJ">
      <h2>Other Risks, Negative and Positive</h2>
      <p>I anticipate arguments that go something like, in this or that jurisdiction, the patron can't claim your <abbr title="intellectual property">IP</abbr> without properly compensating you for it. I submit that all they have to do to ruin you is <em>try</em> to claim it. The question I have here is how many work-a-day folks can absorb the financial pounding of even the <em>overture</em> of a lawsuit, to say nothing of the suit&#x2014;and appropriate countersuit&#x2014;itself.  While we're at it: did you also sign a non-compete?</p>
      <p>It may seem weird to think about <em>positive</em> <q>risks</q>, but we can think the same way about uncertain events irrespective of whether they're good or bad. I suppose you could argue that events like these <span class="parenthesis" title="they aren't">are good for networking</span>, or enable you to <span class="parenthesis" title="and then be contractually forbidden from using them">learn new skills or practice techniques</span> you don't normally get to use, or otherwise gain you <span class="parenthesis" title="Marge Simpson growl">some kind of exclusive access</span>, and a shot at some money is just the cherry on top. I don't know, maybe. But I'm willing to bet you could find other gatherings that provide the same opportunities, and don't commit you to such a hefty sacrifice.</p>
    </section>
    <section id="ENUZ8BMydc07znSiL2txHI">
      <h2>Conclusion</h2>
      
      <p>It isn't clear that all patrons of so-called <q>hackathons</q> are sinister. Like most comedically skewed offerings, it is far more likely that they simply haven't given it much thought, and are operating on autopilot, using boilerplate terms excreted unthinkingly from their legal department. The fact that they don't seem to have too much trouble filling a room, implies that the people who show up haven't given it much thought either.</p>
      <blockquote class="note" id="E4IN7a7cMpzctViehWH3rJ">
        <p><span class="parenthesis" title="Anybody who is any good.">I can tell you who <em>isn't</em> in that room.</span></p>
      </blockquote>
      <p>This is bad, because it reinforces the optics that creative professionals have been fighting for-freaking-<em>ever</em>: that we don't value our <em>own</em> time, so why should anybody else? Moreover&#x2014;and I waited all the way until the end to say this&#x2014;<strong>what kind of product can you possibly deliver overnight that isn't either complete garbage on one hand, or the capstone on a much bigger, more labour-intensive product you've been working on for some time already?</strong> It makes the optics <em>twice</em> as bad, as it implies creative professionals only come in two flavours: <em>worthless</em> or <em>magic</em>.</p>
      <p>It is a safe bet that spec work will be a part of the creative professional's experience for the foreseeable future. People who have sophisticated enough language to just <em>ask</em>, in precise detail, for the kind of work we do, don't need us to do it. A lot of effort is involved on our part, to proactively&#x2014;<em>speculatively</em>&#x2014;make things we <em>anticipate</em> people will want, or at least similar enough to give them a handle they can grab onto. We can still be smart about it though.</p>
      <p>Moreover, you can't just change the scale of a system and expect it to exhibit the same dynamics: Architects and advertising agencies, for instance, spend <em>millions</em> on pitches and contests, involving hundreds and hundreds of practitioner-hours&#x2014;something as a creative professional you <span class="parenthesis" title="BUT YOU WERE PAID UNCONDITIONALLY FOR YOUR PARTICIPATION">may have experienced first-hand</span>. But the contracts up for grabs are <em>so huge</em>&#x2014;as are their war-chests&#x2014;that this behaviour is actually perfectly rational.</p>
      <p>At the scale of a single ordinary human, or even a small team thereof, the budget for spec work is considerably tighter. If spec work was a lottery, you'd want cheap tickets offering small chances at big payoffs. The corporate-sponsored <q>hackathon</q> is an expensive ticket with a medium chance at a crappy payoff.</p>
      <p><a rel="dct:references" href="https://en.wikipedia.org/wiki/Expected_value" title="Expected value &#x2014; Wikipedia">Expected value</a> is Truth. Expected value is God. In the absence of better information it is the heuristic that will quickly tell you if <em>any</em> engagement is four-alarm not worth pursuing, <q>hackathon</q> or otherwise. Corporations will likely continue to insist on sponsoring these events, but calibrating them as above might make their propositions a little less embarrassing.</p>
    </section>
  </body>
</html>
