<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://five-eights.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://five-eights.com/" rel="alternate" type="text/html" /><updated>2026-01-20T02:45:11+00:00</updated><id>https://five-eights.com/feed.xml</id><title type="html">Five Eights</title><subtitle>The personal blog of Sam Stokes.</subtitle><author><name>Sam Stokes</name></author><entry><title type="html">Joining Eventual</title><link href="https://five-eights.com/2025/11/28/joining-eventual/" rel="alternate" type="text/html" title="Joining Eventual" /><published>2025-11-28T00:00:00+00:00</published><updated>2025-11-28T00:00:00+00:00</updated><id>https://five-eights.com/2025/11/28/joining-eventual</id><content type="html" xml:base="https://five-eights.com/2025/11/28/joining-eventual/"><![CDATA[<p>I’m excited to be joining <a href="https://www.eventual.ai/">Eventual</a>.</p>

<p>I became a distributed systems engineer by accident. In 2010 I was working on a startup that suddenly got tens of thousands of users overnight, which was wonderful for our fundraising prospects and terrible for our product’s availability. I had to rapidly learn about horizontal scaling, rate limits, queues, backpressure, and database replicas. It was a crazy time, with a lot of interrupted sleep because RabbitMQ was on fire again, but I was hooked. I realized I found distributed systems problems interesting to work on.</p>

<p>A few years later, I joined <a href="https://www.honeycomb.io/">Honeycomb</a>. Their customers needed to store and analyze large volumes of observability data, and they had built a special-purpose distributed data store from scratch to handle it. Building your own data store is a bold choice for a startup, but I saw how much flexibility and speed it gave customers - and how much better Honeycomb was than the monitoring products of the day - because they’d built a distributed system that matched their product needs. It’s one of the highlights of my career to have <a href="https://www.youtube.com/watch?v=tr2KcekX2kk">presented that system at Strange Loop</a>.</p>

<!-- more -->

<p>However, not everybody finds distributed systems as interesting as I do. I talk about other things at parties. Even among software engineers, it’s a specialized topic - a long way removed from the actual problems they solve for customers. Distributed systems is often an uncomfortable reality forced on them by having a lot of data.</p>

<p>Working with large volumes of data can be difficult and counterintuitive. Answering even simple questions - “how many people viewed this product yesterday?” - can be expensive and slow, even if you have a suitable way to query it in place already. Worse, even once you can efficiently answer those questions, apparently similar questions - “how many people in the last minute?”, or “how many people from our loyalty program?” - might be even slower, or need custom data engineering projects. It’s both frustrating, and can lead to bad decisions, when something that should take thirty seconds takes three weeks.</p>

<p>So when Sammy, the CEO of Eventual, told me he knew a lot of companies with large data lakes that they struggled to get value from, I started nodding vigorously. When I learned Eventual had built a <a href="https://www.daft.ai/">distributed query engine</a> - letting product engineers build large-scale data processing pipelines with a few lines of code - I got excited. I saw a rare chance to do interesting distributed systems work while actually building a customer-facing product, with the potential for a really big impact.</p>

<p>So I’m joining the really smart folks at Eventual - to build distributed systems so you don’t have to!</p>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[I’m excited to be joining Eventual. I became a distributed systems engineer by accident. In 2010 I was working on a startup that suddenly got tens of thousands of users overnight, which was wonderful for our fundraising prospects and terrible for our product’s availability. I had to rapidly learn about horizontal scaling, rate limits, queues, backpressure, and database replicas. It was a crazy time, with a lot of interrupted sleep because RabbitMQ was on fire again, but I was hooked. I realized I found distributed systems problems interesting to work on. A few years later, I joined Honeycomb. Their customers needed to store and analyze large volumes of observability data, and they had built a special-purpose distributed data store from scratch to handle it. Building your own data store is a bold choice for a startup, but I saw how much flexibility and speed it gave customers - and how much better Honeycomb was than the monitoring products of the day - because they’d built a distributed system that matched their product needs. It’s one of the highlights of my career to have presented that system at Strange Loop.]]></summary></entry><entry><title type="html">Remembering in public: starting a digital garden</title><link href="https://five-eights.com/2023/12/13/digital-garden/" rel="alternate" type="text/html" title="Remembering in public: starting a digital garden" /><published>2023-12-13T00:00:00+00:00</published><updated>2023-12-13T00:00:00+00:00</updated><id>https://five-eights.com/2023/12/13/digital-garden</id><content type="html" xml:base="https://five-eights.com/2023/12/13/digital-garden/"><![CDATA[<p>I’m publishing a subset of my private notes as a <a href="/garden/">digital garden</a>, as a home for unfinished thoughts, experiments, and random facts I find interesting. Easy to update and without the pressure to craft a polished essay, I hope it will complement this blog. I don’t necessarily expect anyone to read any of it, but it’d be lovely if somebody found something interesting there and started a conversation with me about it!</p>

<p>Right now it’s mostly a bunch of original<sup id="fnref:original"><a href="#fn:original" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> <a href="/garden/Recipes/">cocktail recipes</a>, but I’m looking forward to growing this garden over time and seeing what it becomes.</p>

<!-- more -->

<h2 id="bring-back-the-personal-homepage">Bring back the personal homepage</h2>
<p>I’ve always liked the idea of a “home on the internet” - a place to put things I’d like to share, and a place to point people at to see what I’m interested in. When I was 12 or so, I had a “homepage” - a highly cringeworthy website with colourful text, a repeating pattern background, an HTML table of my favourite sound effects, and a recorded voice greeting that autoplayed on page load. That is thankfully no longer online, but there’s still something appealing about having my own little corner of the Web - a small mark on the world.</p>

<p>For a while it looked like social networks could be that home - you’d have your profile page and a space to share things, and all your friends would be there too! It didn’t really work out. From the start, your friend network was always fragmented between different sites that had no real interest in connecting the fragments. Then <a href="https://www.theatlantic.com/technology/archive/2022/11/twitter-facebook-social-media-decline/672074/">“social networks” turned into “social media”</a>, sharing became about Building your Personal Brand instead of keeping in touch with friends, and everything got swamped by ads and memes. And renting space from your choice of billionaire edgelord didn’t feel much like home anyway.</p>

<p>At this moment at least, it feels like the answer should look more like a good old fashioned personal website - maybe even with a little cringe, although I promise to hold off on the sound effects.</p>

<p>This blog is part of that. But blogging has never come naturally to me. I feel pressure to Compose a Post that is a Finished Thought at a specific point in time. And the end result - a chronologically ordered mix of essays and journal entries - still feels like it’s missing something as a “home”.</p>

<p>I’m hoping a <a href="https://maggieappleton.com/garden-history">digital garden</a> will fill the gap. It’s a place to browse, to share things that aren’t finished.</p>

<h2 id="writing-to-think-writing-to-remember">Writing to think, writing to remember</h2>
<p>The idea of a digital garden is related to the wave of note-taking tools and workflows that got really trendy over the last few years. They go by names like “linked notes” and “personal knowledge management”, “second brains” and “tools for thought”. Proponents talk about “seeing emergent connections between ideas” and even “thinking better”. I find those ideas fascinating, but some of the more ambitious claims have never really come through for me.</p>

<p>I think it’s because a lot of the note-taking zeitgeist seems to take for granted that the main reason you’re taking notes is to produce some sort of writing for an audience. For some people, a digital garden is where they plant ideas, and cultivate them until they become essays. I do write occasionally, but I’m not a researcher or journalist where producing prose is my main form of output. And writing for an audience brings a lot of baggage - “is anyone going to care about what I have to say?” - and ambiguity - “what background knowledge can I assume? What register should I write in?”</p>

<p>A common response is “write to think”, or “write with yourself as the audience”. I see the value in that, to sort of trick myself into writing blog posts that I do then publish, but I don’t naturally think in prose or well-constructed arguments. When I do write to clarify or challenge my thinking, it tends to be a forest of branching bullet-points, not anything resembling an article. And anyway, most of my writing isn’t to think, but to <em>remember</em>.</p>

<p>Most of the time I’m writing something down to remember it, to refer to it later, or just so it can occupy less space in my brain. For me, that ends up looking like a fairly random collection of notes, without much organisation or relationship between them.</p>

<p>Some of those notes are of no interest to anyone else, like my weekly to-do list or when I last deep-cleaned my cats’ litter box, or deeply private, like takeaways from a therapy session, or just jumbled, half-formed thoughts. But some are halfway between “private braindump” and “finished blog post” - my <a href="/garden/Gin">comparative gin tasting notes</a>, or <a href="/garden/Bananas">surprising facts about bananas</a>, or a <a href="/garden/Recipes/A-Stroll-in-a-Strawberry-Field-cocktail">cocktail I came up with</a> but don’t have an Instagram-worthy photo of. Some are unpolished results of tinkering projects or <a href="/garden/Generative-Art">experiments with generative art</a> that I’m nevertheless proud of.</p>

<p>So I’d like to try putting some of those half-finished thoughts on display, and maybe growing some of them into more over time. I don’t really expect anyone to read them, but at least I can have a little corner of the Web that’s mine, and feels like how I think.</p>

<p>This is pretty similar to the ethos of <a href="https://www.swyx.io/learn-in-public/">Learning in Public</a>, but that still seems a bit grandiose to me - I’m not trying to become an astrophysicist here. My notes are primarily about remembering, so I’m calling this “remembering in public”.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:original">
      <p>Cocktails have been around for a couple of hundred years (estimates vary) and most cocktail recipes are simple variations of other recipes, with an ingredient substituted or proportions tweaked. This means parallel evolution is extremely likely, and any recipe will have been “invented” multiple times by different people. (In fact, many classic cocktails like the Manhattan and Martini have many competing and equally apocryphal origin stories!) So my cocktails are “original” in the sense that I <em>didn’t follow a recipe when first making them</em>, but I don’t claim that they are <em>novel</em>. <a href="#fnref:original" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[I’m publishing a subset of my private notes as a digital garden, as a home for unfinished thoughts, experiments, and random facts I find interesting. Easy to update and without the pressure to craft a polished essay, I hope it will complement this blog. I don’t necessarily expect anyone to read any of it, but it’d be lovely if somebody found something interesting there and started a conversation with me about it! Right now it’s mostly a bunch of original1 cocktail recipes, but I’m looking forward to growing this garden over time and seeing what it becomes. Cocktails have been around for a couple of hundred years (estimates vary) and most cocktail recipes are simple variations of other recipes, with an ingredient substituted or proportions tweaked. This means parallel evolution is extremely likely, and any recipe will have been “invented” multiple times by different people. (In fact, many classic cocktails like the Manhattan and Martini have many competing and equally apocryphal origin stories!) So my cocktails are “original” in the sense that I didn’t follow a recipe when first making them, but I don’t claim that they are novel. &#8617;]]></summary></entry><entry><title type="html">13 Years of Blogging</title><link href="https://five-eights.com/2023/01/07/13-years-of-blogging/" rel="alternate" type="text/html" title="13 Years of Blogging" /><published>2023-01-07T00:00:00+00:00</published><updated>2023-01-07T00:00:00+00:00</updated><id>https://five-eights.com/2023/01/07/13-years-of-blogging</id><content type="html" xml:base="https://five-eights.com/2023/01/07/13-years-of-blogging/"><![CDATA[<p>Over the holidays I rebuilt this blog from scratch. This isn’t the first time it’s needed major maintenance. For such a simple piece of software, it’s been surprisingly hard to keep operational for - at time of writing - 13 years. I thought a recap of its history would be interesting, if only as a cautionary tale for my future self.</p>

<p>Since I started this blog I moved country, got married, became a US citizen, adopted two cats, bought a home, sold a startup, worked at several companies and did three stints as an independent contractor… and somehow didn’t yet manage to write about any of those things on this blog!</p>

<!-- more -->

<h2 id="2009-2014-tumblr">2009-2014: Tumblr</h2>
<p>I started this blog in 2009. I wanted a space to dump occasional words and photos, without thinking at all about the mechanism, so I just set up a Tumblr and called it a day.</p>

<h2 id="2014-2015-octopress--codeship--github-pages">2014-2015: Octopress + Codeship + GitHub Pages</h2>
<p>I don’t remember what motivated me to migrate off Tumblr five years later. I vaguely recall having to use a clunky WYSIWYG editor to post, but jumping through hoops to add custom CSS or JS might have been the trigger. I still didn’t want to build everything from scratch, so I found Octopress, which was somewhere in between a Jekyll fork and a bundle of styles and plugins. That gave me a nice balance: a polished theme, reasonable defaults, social network integrations, while still giving me direct access to the HTML when I needed it.</p>

<p>Ditching Tumblr meant I also needed somewhere to host the blog. I still didn’t want to manage infra, so GitHub Pages seemed like a great fit. Unfortunately, in 2014, GitHub Pages wasn’t the flexible platform it is today. It was a great way to host static HTML, but its support for static site generators was limited to running a specific version of Jekyll, with pre-baked config. My Octopress setup wasn’t going to work.</p>

<p>A common workaround was to run Jekyll locally and commit the generated static site to a separate branch of the same Git repo, then use GitHub Pages to serve that branch. The manual build step reminded me uncomfortably of FTPing files to a VPS, so instead, I set up a CI build on <a href="https://codeship.io">Codeship</a> to automatically build, commit and push the static site each time I pushed a new commit to the blog.</p>

<p>At this point I had - of course - spent more effort setting up a blogging workflow than I had actually writing blog posts. So it goes.</p>

<p>On the plus side, around this time, a couple of my posts - notably <a href="/2014/05/01/what-programming-is-like/">What programming is like</a> - got read and appreciated by a lot of people, which made it all feel worth it!</p>

<h2 id="2015-2023-jekyll-with-octopress-trimmings">2015-2023: Jekyll with Octopress trimmings</h2>
<p>In 2014 to start an Octopress blog you forked the original Octopress repo - a heavily-customised Jekyll setup - and added your own commits on top. That meant you were pinned to certain versions of certain gems. At some point I found that due to incompatible changes those gems and in Ruby itself, I couldn’t build the blog any more.</p>

<p>A static site generator that I couldn’t run meant I couldn’t post any more, or even change anything. And Octopress was pretty long in the tooth by now. The author was talking about a <a href="http://octopress.org/2015/01/15/octopress-3.0-is-coming/">“full rewrite”</a>. I didn’t feel like being tied to a monolithic framework when I’d chosen Jekyll in the first place for simplicity and control.</p>

<p>I decided to migrate off Octopress onto mainstream Jekyll, and make sure I was running on the latest version, so this couldn’t happen again. (Ah, the innocence of youth.)</p>

<p>I had a post I wanted to publish, and didn’t want to rebuild my entire blog layout and styles from scratch first. So I imported the layout, styles, and bunch of plugins from Octopress. I now had a plain Jekyll blog, which <em>looked</em> like an Octopress blog.</p>

<p>Among other highly questionable decisions, importing the Octopress styles ended up meaning <em>downloading the minified stylesheet from the live blog</em> and committing it to the repo. This was the whole 40kB stylesheet with whitespace and newlines removed - my commit comment at the time called this “completely unmaintainable”. Naturally I ended up wanting to add some custom styles anyway, so I tacked them onto the end of the unmaintainable 40kB blob.</p>

<p>The (admittedly somewhat baroque) multi-branch CI deploy + GitHub Pages hosting basically still worked, so I didn’t change that, besides fixing some minor bit-rot.</p>

<h2 id="2023-starting-from-scratch-with-jekyll--netlify">2023: starting from scratch with Jekyll + Netlify</h2>
<p>“History doesn’t repeat itself, but it does rhyme.” Again I found my blog wouldn’t build. This time it was an accumulation of unaddressed issues - not too surprising as all the libraries and infrastructure I’d depended on had been moving on for eight years.</p>

<p>My CI solution had stopped working. GitHub Pages had got a lot more capable in the meantime, now supporting arbitrary Docker containers via GitHub Actions, so I switched to that, but encountered errors from Jekyll. I tried upgrading to the latest version of Jekyll to find it had made several breaking changes which broke my build in other ways.</p>

<p>I flailed for a while trying to debug this, but gave up sometime around discovering that Jekyll was sometimes trying to apply my <code class="language-plaintext highlighter-rouge">baseurl</code> prefix <em>twice</em>.</p>

<p>My Octopress blog had supported lots of nice things - category pages, a fancy stylesheet with collapsible sidebars, embedded widgets showing my recent tweets and <a href="https://pinboard.in">Pinboard</a> bookmarks. It was blinding me to the simplicity of my actual task - take 18 Markdown files and publish them online.</p>

<p>I started a new Jekyll<sup id="fnref:blogging-engines"><a href="#fn:blogging-engines" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> project from scratch, imported the Markdown files from the old repo, and had everything working in a couple of hours.</p>

<p>For hosting, I had heard good things about <a href="https://www.netlify.com/">Netlify</a>, so I wanted to try them out. They dealt seamlessly with my (now extremely unremarkable) Jekyll build. Setting up a custom domain took a couple of tries but is now working fine.</p>

<h2 id="new-domain-new-blog-title">New domain, new blog title</h2>
<p>My old blog lived at <code class="language-plaintext highlighter-rouge">blog.samstokes.co.uk/blog</code>. I don’t remember why I thought the <code class="language-plaintext highlighter-rouge">/blog</code> suffix was a good idea, particularly in combination with the <code class="language-plaintext highlighter-rouge">blog</code> subdomain. It was probably an SEO best practice I read about somewhere.</p>

<p>While I was nuking everything from orbit and starting again, I thought it would be a good opportunity to take advantage of one of the silly domains I had registered a while back. So my new blog is Five Eights, at <code class="language-plaintext highlighter-rouge">five-eights.com</code>.</p>

<p>Why Five Eights? Well, it’s <em>almost</em> as good as <a href="https://en.wikipedia.org/wiki/Five_nines">five nines</a>.</p>

<p>I set up a bunch of redirects - from the old domain to the new, and from old URL structures to new - so hopefully, all my URLs from the last 13 years should still be valid. I doubt anyone cares what I thought 13 years ago about the UK’s Digital Economy Act, but I’m doing my infinitesimal part to keep the Web from eroding.</p>

<h2 id="future-work---comments-and-analytics">Future work - comments and analytics</h2>
<p>As a remarkable coda to the above catalog of breakages over the last 13 years, the Disqus comments I’ve been using since 2009 are still working fine. That’s actually pretty impressive, given I’m pretty sure most of the platforms they integrated with have collapsed over that time. On the other hand, Disqus was acquired by a holding company in 2017, and their privacy practices seem pretty shady.</p>

<p>In any case, the new blog doesn’t support comments. In 2009 blog comments seemed like a great way to start a conversation, but now I’d rather move the discussion to other, more real-time platforms, and keep this my own little corner of the Web. And this way I don’t have to include Disqus’s third-party Javascript (and, no doubt, tracking cookies) on my site.</p>

<p>Some of my older posts had some good discussions, so I’m <a href="https://gist.github.com/samstokes/511bb546d45b27005efc07d99a0b7913">working on</a> importing those comment threads from Disqus.</p>

<p><em>Update 2023-02-20</em>: I got the Disqus import working, so comments on previous posts are showing up now. Definitely happy to have preserved a record of that conversation.</p>

<p>Since a couple of my posts got a fair amount of readership, analytics has become important to me. For now I’m sticking with Google Analytics because I’m familiar with it, but I’m thinking of looking into more privacy-focused solutions like <a href="https://plausible.io/">Plausible</a>.</p>

<h2 id="future-work---digital-garden">Future work - digital garden</h2>
<p>Notably absent from this post is any sort of New Year’s Resolution to Blog More This Year, because those always look rather silly in retrospect, particularly when followed by another multi-year hiatus. I’d like to write more, but I think it’s fair to say at this point that regular blogging isn’t something I’m wired for.</p>

<p>I do like the idea of <em>thinking in public</em>, though. There are plenty of things I write down - musings on concepts, half-finished theories, cocktail recipes - that I’d love to discuss online.</p>

<p>This seems closer to notions of a <a href="https://maggieappleton.com/garden-history">digital garden</a> - where the focus is less on a chronologically ordered list of timestamped, evergreen, finished essays, and more on an evolving set of “living documents”. Part of my difficulty with blogging is that psychological barrier of needing to have a <em>finished thought</em> at a particular time. I’m interested to see if I can evolve this site into a digital garden. Hopefully there won’t be any more ground-up rewrites needed first!</p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:blogging-engines">
      <p>I briefly considered switching blogging engines, to something trendier like <a href="https://gohugo.io/">Hugo</a> or <a href="https://ghost.org/">Ghost</a>, or even something written in Rust, my current favourite hobby language. But all of this bit-rot has reminded me of the benefits of remaining close to the mainstream. Jekyll works, and it’s widely used. At least when it breaks again, I’ll be in good company. <a href="#fnref:blogging-engines" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[Over the holidays I rebuilt this blog from scratch. This isn’t the first time it’s needed major maintenance. For such a simple piece of software, it’s been surprisingly hard to keep operational for - at time of writing - 13 years. I thought a recap of its history would be interesting, if only as a cautionary tale for my future self. Since I started this blog I moved country, got married, became a US citizen, adopted two cats, bought a home, sold a startup, worked at several companies and did three stints as an independent contractor… and somehow didn’t yet manage to write about any of those things on this blog!]]></summary></entry><entry><title type="html">Startup engineering (part 1)</title><link href="https://five-eights.com/2016/10/10/startup-engineering-part-1/" rel="alternate" type="text/html" title="Startup engineering (part 1)" /><published>2016-10-10T19:51:02+00:00</published><updated>2016-10-10T19:51:02+00:00</updated><id>https://five-eights.com/2016/10/10/startup-engineering-part-1</id><content type="html" xml:base="https://five-eights.com/2016/10/10/startup-engineering-part-1/"><![CDATA[<p>What should the engineering team of an early-stage startup care about?</p>

<p>The obvious answer: making the startup succeed.  <a href="http://www.paulgraham.com/good.html">Making something people want</a>, growing revenue, landing that big customer or the next funding round.  But <em>everyone</em> in a startup cares about those things.  What should engineering, specifically, care about, in order to make the startup succeed?</p>

<p>There’s loads of advice online about how to be effective founders, how to refine your business plan, how to validate your product thesis.  But I haven’t found much written about effective <em>engineering</em> for early-stage startups.  This is a shame, because for most startups, engineering is pretty important.  It’s how you build your product - not to mention probably the majority of your headcount - so the way you go about it will affect the kind of product you build, and even the way your company operates.</p>

<p><a href="https://www.flickr.com/photos/doug_weston2/8156277561" target="_blank"><img src="/assets/img/startup-engineering/happy-dog-running.jpg" alt="Happy dog running" class="center small" /></a></p>

<p>When you do find advice about startup engineering, it tends to be limited to cursory admonishments to “move fast” and “get shit done”.  These slogans aren’t <em>wrong</em>, but they are overly dismissive and reductive.  They suggest that the <em>way</em> you do things doesn’t matter at all: anything which doesn’t look like immediate, visible progress must be a waste of time.  This all but rules out introspection and improvement.  It offers no help with answering questions like:</p>

<ul>
  <li>Should we do code review?</li>
  <li>How do we prioritise maintenance work versus developing new features?</li>
  <li>Is it worth it to host our own infrastructure rather than using a cloud platform?</li>
</ul>

<p>I’d like to suggest a more constructive theory of what an early-stage startup engineering team should care about, to help answer those kinds of questions.</p>

<!-- more -->

<h2 id="culture-is-what-people-do-when-nobody-is-looking">“Culture is what people do when nobody is looking”</h2>

<p>You might think asking what an engineering team <em>cares</em> about is fluffy and impractical.  But what your team cares about has a big impact on the way you operate: where you focus your effort, which activities you encourage and which ones you try to minimise.</p>

<ul>
  <li>A team that cares a lot about moving fast will spend a lot of time identifying the obstacles that slow them down, and removing or circumventing them.</li>
  <li>A team that cares a lot about avoiding downtime will think a lot about ways their changes could break things, and set up systems to detect and resolve outages.</li>
  <li>A team that cares a lot about operating cost will spend a lot of time optimising their resource usage, maybe running their own servers rather than outsourcing to a cloud provider.</li>
</ul>

<p>Notice I didn’t say “<em>should</em> spend a lot of time”, but “<em>will</em>”.  If you talk about something at lunch, stick posters on the wall about it and chart it on plasma screens, people will inevitably start to prioritise it.  If they come up with an idea or notice some problem, they’re more likely - even subconsciously - to work on the idea rather than dismiss it if it’s relevant to the charts on those screens.</p>

<h2 id="core-values">Core values</h2>

<p>So what <em>should</em> a startup engineering team care about?</p>

<p>Clearly this will depend somewhat on the business you are in.  If you handle payments, your top priorities are probably security and data integrity, narrowly followed by uptime.  If you’re making a game, maybe users will tolerate the occasional outage, but fast UI is essential to keep them playing.  But I think for most early-stage<sup id="fnref:early-stage"><a href="#fn:early-stage" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> startups, there are a few core engineering values in common: <em>nimbleness</em>, <em>learning</em>, <em>sustainable speed</em>, and <em>simplicity</em>.</p>

<h3 id="nimbleness">Nimbleness</h3>

<p><a href="https://www.flickr.com/photos/jonhurd/13724919" target="_blank"><img src="/assets/img/startup-engineering/midair-pivot.jpg" alt="Dog pivoting in mid-air" class="right mini" /></a></p>

<p>Most of all, an early-stage startup needs to be <em>nimble</em>.<sup id="fnref:agile"><a href="#fn:agile" class="footnote" rel="footnote" role="doc-noteref">2</a></sup>  You don’t yet know yet what will make your product a success.  You have a current best guess, derived from the product vision and your learnings so far; but that best guess is likely to change frequently and with little warning.  You might need to support a new use case you never designed for, or abandon a feature that last week you thought would be essential.</p>

<p>Being nimble isn’t just shipping features quickly, although that certainly helps.  It’s about being able to <em>change direction</em> quickly.  It’s a property of how quickly you can come to a shared understanding of the new direction, and how quickly individuals shift gears to react to the change. And it’s a property of your codebase, how deeply your assumptions are embedded in it, and how hard it is to change.</p>

<h3 id="learning">Learning</h3>

<p>An early-stage startup is trying to realise a product vision, while continually validating and adapting that vision according to market reality.  That requires access to high-quality data about what people want, how they interact with your product, and how they react to the changes you push out.  You need that data <em>quickly</em> - being nimble doesn’t help if you’re acting on stale information!</p>

<p>Depending on your business, engineering may be more or less involved for actually gathering the data.  If you have a small number of users, the best way to learn is just to talk to them, or read their feedback.  If you have millions of users, talking to them (while still valuable) will yield at best a small, biased sample, but you can learn a lot from metrics and A-B testing.</p>

<p>Regardless, engineering must deliver a product you can <a href="/2016/05/20/confidence/">confidently</a> learn from.  If you push out a feature with a highly visible bug, most of the feedback you get will be about that bug, not about how well the feature solves users’ problems.  If you’re trying to understand your high churn rate, but you have frequent outages or periods of slowness, you can’t tell if users are leaving because they don’t need your product, or just because they don’t trust it to work properly.</p>

<h3 id="sustainable-speed">Sustainable speed</h3>

<p>Overnight success is a myth.<sup id="fnref:overnight-success"><a href="#fn:overnight-success" class="footnote" rel="footnote" role="doc-noteref">3</a></sup>  What you consider success is a personal matter - helped thousands of people, had a lucrative exit, made the world a better place - but it’s probably going to take <em>years</em>.  Your initial launch is not success; nor is your first funding round.  A startup is a marathon, not a sprint.<sup id="fnref:sprint"><a href="#fn:sprint" class="footnote" rel="footnote" role="doc-noteref">4</a></sup></p>

<p><a href="https://www.flickr.com/photos/glaciertim/4320524072" target="_blank"><img src="/assets/img/startup-engineering/determined-dog-running.jpg" alt="Determined dog running" class="center small" /></a></p>

<p>This implies that while reaching that initial launch quickly is important, it’s <em>not enough</em>.  If rushing out the initial launch creates a pile of technical debt that slows down every subsequent new feature, or makes you less nimble, that might not have been a good tradeoff.  Likewise, if the team is constantly firefighting production issues, that can destroy your focus, not to mention morale.  Maybe you can raise a bunch of money off that initial launch, and hire a bigger team to offset the technical debt and fix all the bugs - but first <a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month">Fred Brooks</a> would like a word with you.</p>

<p>All that said, raw speed is really important too.  Moving fast makes you more nimble, and it lets you learn faster.  So the key is to find ways to <a href="/2016/07/11/move-fast-with-confidence/">move fast <em>sustainably</em></a>: so that you keep moving fast even as your team and codebase grow.</p>

<p>Balance is needed, because you don’t want to optimise for a future that never happens.  If your startup runs out of money and dies, it no longer matters how quickly you can iterate.  On the flip side, it’s equally pointless to fly over the first hurdle only to burn out before the finish line.</p>

<h3 id="simplicity">Simplicity</h3>

<p>If your engineering team cares about nimbleness, learning, and sustainable speed, it helps a lot to also care about <em>simplicity</em>.</p>

<p>If your codebase and architecture are simple and easy to understand, not only can you change it more quickly - if your underlying assumptions change, simple, cleanly factored code is also easier to <a href="http://blog.cognitect.com/blog/2016/3/17/the-new-normal-protected-asset-or-disposable-inventory"><em>throw away</em></a>, and replace with something that fits the new requirements.  A simple product is easier to learn from than one cluttered with features and settings.</p>

<p>Valuing simplicity means ongoing effort to <em>keep</em> things simple.  Every new feature naturally creates complexity, and restoring simplicity takes effort and discipline.  It means dropping features that are unused or hard to maintain; going back and addressing the workarounds and special cases.  In extreme circumstances, you may need to push back on the product direction if it would make the system too complex.</p>

<p><a href="https://www.flickr.com/photos/mackenzieblack/5235085338" target="_blank"><img src="/assets/img/startup-engineering/dog-made-a-mess.jpg" alt="Dog made a mess" class="center small" /></a></p>

<p>Keeping things simple also means resisting overengineering.  A quick, messy, unscalable solution might still be <em>simpler</em> than the new abstraction or infrastructure you might need for the “right” solution.  Premature generalisation is a great way to make your system harder to understand and change.  Simplicity means deferring that work until you’re confident you need it, but also having systems in place to ensure you’ll revisit the quick hack once you do need to.</p>

<p>Valuing simplicity sounds, counterintuitively, like a lot of work, but it’s one of the keys to sustainable speed: that natural creep toward complexity is one of the things that slows you down.  Resisting the creep is, of course, an unwinnable battle - your system will never again be as simple as your first version - but fighting it anyway lets you retain some control over your destiny.  Investing in tools and automation can reduce the effort involved in keeping things simple.</p>

<h2 id="putting-it-into-practice">Putting it into practice</h2>

<p>In part 2 of this post, I will discuss common engineering practices like code review, automated testing, continuous delivery and crunch mode.  I’ll show how to evaluate practices by their effect on nimbleness, learning, sustainable speed and simplicity.</p>

<p class="credits">
Photo credits:
<a href="https://www.flickr.com/photos/doug_weston2/8156277561">Doug Weston</a>,
<a href="https://www.flickr.com/photos/jonhurd/13724919">Jon Hurd</a>,
<a href="https://www.flickr.com/photos/glaciertim/4320524072">Tim Shields</a>, and
<a href="https://www.flickr.com/photos/mackenzieblack/5235085338">Mackenzie Black</a>.
</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:early-stage">
      <p>By “early stage” I mean that one or more of the following is true: still searching for <a href="https://en.wikipedia.org/wiki/Product/market_fit">product/market fit</a>, team is max 10 people, raised at most a seed round or possibly Series A.  My experience is in web-based software startups, so what I’m saying may be less applicable outside that space. <a href="#fnref:early-stage" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:agile">
      <p>You might also call this quality “agility”, but the term “agile” has become strongly associated with the “Agile movement”, which has <a href="https://pragdave.me/blog/2014/03/04/time-to-kill-agile/">diluted the original meaning</a> of the term with a plethora of methodologies, certifications and process consultants.  The spirit of the original <a href="http://agilemanifesto.org/">Agile manifesto</a> is in line with what I mean by nimbleness, but Scrum and Extreme Programming are certainly not what I’m advocating here. <a href="#fnref:agile" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:overnight-success">
      <p>I was trying to find the original source of the quote “It takes ten years to become an overnight success”, but I came up with an <a href="https://www.google.com/search?q=overnight%20success%20quote">entire page of variations</a> by different people.  I view this as at least corroborating my claim that overnight success is a myth. <a href="#fnref:overnight-success" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:sprint">
      <p>The Scrum methodology uses the term “sprint” as the primary unit of planning, where the team conducts a series of sprints, one sprint beginning immediately after the previous sprint ended.  This seems to me a severe form of cognitive dissonance. <a href="#fnref:sprint" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[What should the engineering team of an early-stage startup care about? Nimbleness, learning, sustainable speed.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/startup-engineering/determined-dog-running.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/startup-engineering/determined-dog-running.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to get started making cocktails</title><link href="https://five-eights.com/2016/08/24/home-bar/" rel="alternate" type="text/html" title="How to get started making cocktails" /><published>2016-08-24T20:18:38+00:00</published><updated>2016-08-24T20:18:38+00:00</updated><id>https://five-eights.com/2016/08/24/home-bar</id><content type="html" xml:base="https://five-eights.com/2016/08/24/home-bar/"><![CDATA[<p>As well as software, I also make cocktails.  I got into it a few years ago, and by now it’s become a fully grown hobby, as evidenced by the entire kitchen shelf given over to bottles, and the ongoing invasion of my fridge by Mason jars of syrups and infused spirits.  (Luckily my roommate considers that an acceptable price to pay for having an onsite bartender!)  One question I often get asked is: “How do I get started making drinks at home?”</p>

<p>Home bartending is a very satisfying hobby, not least because you’re working with booze.  It offers much of the creativity and sensuality of cooking, but with a fraction of the prep and cleanup work.  And there’s a thrill to making a tasty, classy drink at home, for around $4 instead of $8 plus tip.  And it doesn’t take much to get started.  Your average kitchen is probably only missing four cheap pieces of equipment to make a wide variety of cocktails.</p>

<p><a href="/assets/img/cocktails/steel-quartet-1280.jpg" target="_blank"><img src="/assets/img/cocktails/steel-quartet-1280.jpg" alt="Four essential tools" class="center small" /></a></p>

<p>If you want to get started for yourself, the following are my recommendations for what to get.  They also make a nice gift package: buy someone these, wrap them up as a set, and they’ve got four fewer excuses not to start mixing their own drinks.</p>

<!-- more -->

<p>(Prices are taken from Amazon at time of writing, and for guidance only.)</p>

<h2 id="cocktail-shaker">Cocktail shaker</h2>

<p><a href="/assets/img/cocktails/shakers-640.jpg" target="_blank"><img src="/assets/img/cocktails/shakers-640.jpg" alt="Two types of shaker" class="right mini" /></a></p>

<p>You need a shaker to make shaken<sup id="fnref:shaken-not-stirred"><a href="#fn:shaken-not-stirred" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> drinks - <a href="http://www.seriouseats.com/recipes/2015/04/classic-margarita-recipe-tequila-cocktail.html">Margarita</a>, <a href="http://www.seriouseats.com/recipes/2007/10/cocktails-whiskey-sour.html">whiskey sour</a>, <a href="http://ohgo.sh/archive/chartreuse/">Last Word</a>, etc.  You’ll see two different kinds: the Boston shaker, which is just a large metal cup that you use in combination with a mixing glass, and the three-piece shaker, which has a cup, strainer and cap all in one.  The three-piece is iconic, but I prefer the Boston shaker as more effective and versatile (and also cheaper).<sup id="fnref:boston"><a href="#fn:boston" class="footnote" rel="footnote" role="doc-noteref">2</a></sup>  It’s especially better if you’re making a larger quantity: you can pour ingredients into two glasses, then use the same shaker to shake both.</p>

<p><strong>My recommendation</strong>: <a href="https://smile.amazon.com/gp/product/B000NNO2X0">Winco Stainless Steel Bar Shaker</a>, $5.69</p>

<h2 id="bar-spoon">Bar spoon</h2>

<p><a href="/assets/img/cocktails/bar-spoon-640.jpg" target="_blank"><img src="/assets/img/cocktails/bar-spoon-640.jpg" alt="The Aero from Standard Spoon" class="left mini" /></a></p>

<p>You need a bar spoon for making stirred<sup id="fnref:shaken-not-stirred:1"><a href="#fn:shaken-not-stirred" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> drinks - <a href="http://drinks.seriouseats.com/2013/04/cocktail-101-how-to-make-a-martini-technique-history-ingredients-gin-vermouth-cocktail.html">Martini</a>, <a href="http://www.esquire.com/food-drink/drinks/a18531/how-to-make-a-manhattan-0213/">Manhattan</a>, <a href="http://www.seriouseats.com/recipes/2010/04/negroni-cocktail-recipe-gin-campari-vermouth.html">Negroni</a>.  You can use a normal teaspoon or tablespoon, but you’ll knock the hell out of the ice, leading to more dilution than you want, and unsightly chunks of ice floating in the drink.  A bar spoon has a long handle and a thin, flat bowl so that you can swish it around the outside of the mixing glass, in the process bringing more of the liquid into contact with the ice.</p>

<p>It’s hard to go wrong here, so something cheap with good Amazon reviews will do fine.  If you’re buying as a gift, though, I recommend the Aero from <a href="http://www.standardspoon.com/">Standard Spoon</a> for its beautiful industrial design and precisely balanced weight.</p>

<p><strong>My recommendation</strong> (budget edition): <a href="https://smile.amazon.com/Hiware%C2%AE-Inches-Stainless-Pattern-Cocktail/dp/B01ICNODQS">Hiware Iced Tea Spoon</a>, $7.99 (I guess you can make iced tea with it too)</p>

<p><strong>My recommendation</strong> (gift edition): <a href="https://smile.amazon.com/Cocktail-Spoon-Standard-Stainless-Seamless/dp/B017JJ8TBQ">AERO Cocktail Spoon</a>, $35</p>

<h2 id="jigger">Jigger</h2>

<p><a href="/assets/img/cocktails/jiggers-640.jpg" target="_blank"><img src="/assets/img/cocktails/jiggers-640.jpg" alt="Two types of jigger" class="right mini" /></a></p>

<p>For measuring ingredients, you’ll need a jigger.<sup id="fnref:measure"><a href="#fn:measure" class="footnote" rel="footnote" role="doc-noteref">3</a></sup>  You might have seen the iconic “double cone” design, which looks cool but is rather hard to use without spilling.  I use one that’s a miniature version of a lined measuring jug, which makes it very easy to measure out various amounts.</p>

<p><strong>My recommendation</strong>: <a href="https://smile.amazon.com/gp/product/B00B6LUAPW">OXO Steel Angled Measuring Jigger</a>, $6.95</p>

<h2 id="strainer">Strainer</h2>

<p><a href="/assets/img/cocktails/strainer-640.jpg" target="_blank"><img src="/assets/img/cocktails/strainer-640.jpg" alt="Classic cocktail strainer" class="left mini" /></a></p>

<p>Whether you’re stirring or shaking, you’ll need a strainer to pour out the drink without the ice coming along too.  The classic design has a circular metal spring that lets it fit in glasses of various diameters, and a rubber grip so you can hold the strainer in place with the same hand as holds the glass.</p>

<p><strong>My recommendation</strong>: <a href="https://smile.amazon.com/gp/product/B0000DAQ93">OXO Steel Cocktail Strainer</a>, $6.99</p>

<h2 id="extras">Extras</h2>

<p>That’s pretty much all the equipment you <em>need</em>, but there are a couple of items worth discussing:</p>

<h3 id="mixing-glasses">Mixing glasses</h3>

<p><a href="/assets/img/cocktails/bar-glass-640.jpg" target="_blank"><img src="/assets/img/cocktails/bar-glass-640.jpg" alt="Bar glass" class="right mini" /></a></p>

<p>You can use just about anything here, so you’ve probably got something in the cupboard that will work.  If you’re using the Boston shaker, though, you’ll get a better seal if the glass is about the size of a standard pub pint glass.  Also, you’ll eventually end up breaking a glass in the process of freeing it from the shaker after shaking.  I buy cheap, plain, sturdy pint glasses, which are hard to break and easy to replace.</p>

<p><strong>My recommendation</strong>: <a href="https://smile.amazon.com/gp/product/B009ZRTNY8">ARC Luminarc Pub Beer Glass (Set of 4)</a>, $10.09</p>

<h3 id="citrus-juicer">Citrus juicer</h3>

<p><a href="/assets/img/cocktails/juicer-640.jpg" target="_blank"><img src="/assets/img/cocktails/juicer-640.jpg" alt="Juicer" class="left mini" /></a></p>

<p>Since I started making cocktails I’ve become very opinionated about juicers.  Lots of cocktails call for lime or lemon juice, and you’ll be doing a lot of juicing.  I grew up with the type of juicer that has a lemon-shaped core surrounded by a dish to catch the juice; that type is <em>really</em> labour intensive for a large quantity of juice.  Since I discovered the type that uses two long handles with a gear mechanism to bring leverage to bear, I’ve never looked back.  It won’t get quite as much juice out of each fruit as the core-and-dish type, but it’s so much quicker and easier that it’s worth buying one extra lime every now and then.</p>

<p><strong>My recommendation</strong>: <a href="https://smile.amazon.com/gp/product/B002XOG4B0">Chef’n FreshForce Citrus Juicer</a>, $15.91</p>

<h2 id="bottles">Bottles</h2>

<p>You might be wondering why I’ve not suggested buying any actual alcohol.  That’s because it depends what you want to make.</p>

<p>The tricky part about home bartending is that lots of cocktail recipes require just one bottle you don’t have.  An <a href="http://www.thekitchn.com/forgotten-gin-cocktails-part-1-166935">Aviation</a> sounds delicious, but where can you buy crème de violette?  You’d love to try a <a href="http://www.seriouseats.com/recipes/2011/09/martinez-cocktail-gin-cocktail-recipe.html">Martinez</a>, but what is Old Tom gin anyway?</p>

<p>To solve this, one school of thought is to buy enough bottles that you can make a good variety, and expand from there.  For example, the <a href="http://www.thekitchn.com/categories/the_9bottle_bar">9-Bottle Bar</a> and <a href="http://12bottlebar.com/">12-Bottle Bar</a>.  These are good ideas, but a bit intimidating (not to mention expensive) for getting started.</p>

<p>My preferred approach is the 3-bottle bar.  Pick a drink <em>you</em> like, look up a recipe, and buy the three or four bottles you need to make just that drink.  I started off with bourbon, sweet Italian vermouth, and Angostura bitters, to make Manhattans.  Congratulations: you can now drink that whenever you feel like it!</p>

<p>Next, repeat for a drink your roommate, significant other, or best friend likes.  Now you can make them a drink whenever you want!</p>

<p>If you’re lucky, those two drinks already had one bottle in common.  If not, browse around a bit for recipes for which you’re just one bottle shy.  Recipes also have quite a bit of overlap, so once you’ve bought a couple more bottles, you’ll start to find you can make quite a variety of things.</p>

<h2 id="resources">Resources</h2>

<p>Once you get started, you’ll want to look up recipes, ingredients, techniques and so on.  It’s easy to find good-quality information online - for example, I refer often to the cocktail section of <a href="http://www.seriouseats.com/">Serious Eats</a> for recipes - so I’d lean on Google before shopping for cocktail books.  That said, if you want to learn more about the history, variety and lore of cocktails, David Wondrich’s <a href="https://smile.amazon.com/Imbibe-Updated-Revised-Absinthe-Professor/dp/0399172610">Imbibe</a> is a very entertaining hybrid of recipe book and documentary.</p>

<p>Now go make something delicious!</p>

<p class="credits">
Photos are licensed
<a href="http://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA</a>.
If you use them, please provide a link back to this blog post.
</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:shaken-not-stirred">
      <p>There are three main techniques for making cocktails: shaking, stirring and building.  Without getting into the whole James Bond thing, it’s less of a stylistic preference and more about what’s in the drink.  If your drink is all alcohol, stir it with ice and strain.  If there’s a substantial juice component, shake it with ice and strain.  A few drinks are “built” directly in the glass they’ll be drunk out of, such as the <a href="http://www.seriouseats.com/recipes/2011/10/mojito-rum-mint-cocktail-recipe.html">Mojito</a>, involving muddled herbs, or the <a href="http://drinks.seriouseats.com/2012/01/cocktail-101-five-essential-highballs-easy-drinks.html">gin &amp; tonic</a>, where you want to preserve the fizz.  Shaken vs stirred is an ongoing controversy, but <a href="https://food52.com/blog/10100-when-to-shake-or-stir-a-cocktail">this article</a> breaks it down well. <a href="#fnref:shaken-not-stirred" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:shaken-not-stirred:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:boston">
      <p>The Boston shaker looks like it takes a lot of work to keep the two halves together, but actually the chilling from the ice forms a vacuum seal. <a href="#fnref:boston" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:measure">
      <p>Measure your cocktails.  Free pour looks cool, but the whole point of a cocktail is balancing the ingredients to complement but not drown each other.  If the proportions are off, you’ll get a sugary mess, or something that doesn’t quite taste like anything.  Besides, part of the creativity is adjusting the proportions to the drinker’s taste; but good luck doing that if you don’t know how much of everything is going in! <a href="#fnref:measure" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[As well as software, I also make cocktails. I got into it a few years ago, and by now it’s become a fully grown hobby, as evidenced by the entire kitchen shelf given over to bottles, and the ongoing invasion of my fridge by Mason jars of syrups and infused spirits. (Luckily my roommate considers that an acceptable price to pay for having an onsite bartender!) One question I often get asked is: “How do I get started making drinks at home?” Home bartending is a very satisfying hobby, not least because you’re working with booze. It offers much of the creativity and sensuality of cooking, but with a fraction of the prep and cleanup work. And there’s a thrill to making a tasty, classy drink at home, for around $4 instead of $8 plus tip. And it doesn’t take much to get started. Your average kitchen is probably only missing four cheap pieces of equipment to make a wide variety of cocktails. If you want to get started for yourself, the following are my recommendations for what to get. They also make a nice gift package: buy someone these, wrap them up as a set, and they’ve got four fewer excuses not to start mixing their own drinks.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/cocktails/steel-quartet-1280.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/cocktails/steel-quartet-1280.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Move fast with confidence</title><link href="https://five-eights.com/2016/07/11/move-fast-with-confidence/" rel="alternate" type="text/html" title="Move fast with confidence" /><published>2016-07-11T07:37:27+00:00</published><updated>2016-07-11T07:37:27+00:00</updated><id>https://five-eights.com/2016/07/11/move-fast-with-confidence</id><content type="html" xml:base="https://five-eights.com/2016/07/11/move-fast-with-confidence/"><![CDATA[<p>If you work on a software product team, you’ve probably heard, or said, things like this:</p>

<ul>
  <li>“The deadline is unreasonable, I can’t do a quality job in that time.”</li>
  <li>“Just ship it already, it doesn’t need to be perfect.”</li>
  <li>“Shipping quickly is the priority, so we don’t have time for testing and code review.”</li>
  <li>“We’ve been moving too fast recently and breaking too many things.  We need to slow down and be more careful.”</li>
</ul>

<p>These sorts of statements often come up when discussing schedule or scope.  They <a href="https://en.wikipedia.org/wiki/Framing_effect_(psychology)">frame</a> the decision being made as a choice between two approaches: you can do it <em>fast</em> or do it <em>well</em>, but not both.</p>

<p>I believe that “speed vs quality” is a false choice.  Each time we naïvely frame a decision this way, we do a disservice to ourselves and to our users.  Sometimes the best way to run fast is to be confident in your footing.</p>

<!-- more -->

<p>Doing things well helps you move faster:</p>

<ul>
  <li>You can add features more quickly to a clean, well-engineered codebase than to a messy conglomeration of well-intentioned hacks.</li>
  <li>Time you spend figuring out whether your new feature broke the old one is time you aren’t spending on the next new feature.</li>
  <li>I’ve even seen teams literally build the same feature twice, because the first time it shipped broken and nobody noticed.  Taking more care the first time would have <em>saved</em> effort.</li>
</ul>

<p>Conversely, moving fast helps you do things better:</p>

<ul>
  <li>The sooner you find out how people will use the product, the sooner you know which features to improve and which ones to drop; which kinds of change to engineer for, and which kinds will never happen.</li>
  <li>Code isn’t really done until it’s handling production traffic – and recovering gracefully from that bad input that you thought would never happen, but happens reliably 1% of the time in production.</li>
</ul>

<blockquote class="pull-quote">
  <p>“Speed vs quality is a false choice.”</p>
</blockquote>

<h2 id="move-fast-with-confidence">Move fast with confidence</h2>

<p>“Do it well or do it fast” is asking the wrong question.  The right question is where to focus your effort.  As I’ve argued before, it can help to frame that decision around <a href="/2016/05/20/confidence/">confidence</a>:</p>

<ul>
  <li>Building a really solid, beautifully designed version of feature X might be satisfying, but how confident are you that you know how X will be used - or even <em>if</em> it will be used?</li>
  <li>Conversely, if you ship a buggy, incomplete version of feature X, are you confident you’ll really learn anything from user feedback about it?</li>
  <li>If you invest in automated tests for feature X, are you still confident in shipping this week?</li>
  <li>If you <em>don’t</em> invest in automated tests for X, are you confident you won’t accidentally break X in the future?</li>
  <li>If you don’t clean up your noisy server logs, are you confident that you’ll be able to diagnose issues when customers report them?</li>
  <li>If you keep maintaining that system that nobody fully understands, are you confident in being able to add new features without getting surprised or delayed by legacy constraints?</li>
  <li>If you shut down the legacy system, are you confident you know about all the downstream systems that will break?</li>
</ul>

<p>Of course you want to move fast, but <em>fast isn’t enough</em>.  You want to be confident that what you’re shipping is useful.  You want to be confident that you’ll know if it breaks.  You want to be confident that you’ll be able to <em>keep</em> moving fast in the future.</p>

<p>To put this in the form of a slogan: <strong>“Move fast with confidence”</strong>.<sup id="fnref:move-fast-and-break-things"><a href="#fn:move-fast-and-break-things" class="footnote" rel="footnote" role="doc-noteref">1</a></sup></p>

<p>Consider running across rocky ground.  If you sprint headlong, as fast as you can, you’re likely to trip over a rock, or twist your ankle.  Slowing to a walk isn’t ideal either.  The trick is to be <em>aware</em> enough, and take just enough care, to be confident in your footing.  Look out for jagged rocks or crumbling earth where you need to step more carefully.  Identify those patches of clear, solid ground where you can afford to sprint.</p>

<p><a href="https://www.flickr.com/photos/wakonda/14309389582"><img src="/assets/img/move-fast/rocky-ground.jpg" alt="Rocky ground" class="center" /></a></p>

<p>I don’t claim this is anything novel.  I’m quite sure that high-performing teams are already thinking along these lines.  But I’ve seen too many engineering cultures whose implicit slogans were just “move fast” or “be safe”; overly reductive, with predictably suboptimal results.  “Move fast with confidence” acknowledges the need for balance: cutting corners where you can afford it, while taking care in those places that help ensure you can <em>keep</em> moving fast later on.</p>

<blockquote class="pull-quote">
  <p>“The trick is to be aware enough, and take just enough care, to be confident in your footing.”</p>
</blockquote>

<h2 id="in-search-of-quality">In search of quality</h2>

<p>But what about quality?  The slogan doesn’t address it.  Should you just <a href="/2016/02/24/quality-vs-empathy/">stop talking about quality</a>, as my earlier post provocatively suggested?  In product development we want to do more than just reach the finish line.  Discussing risks and deadlines is an effective way to communicate, but it’s also cold and rational.  Where do intuition, creativity and vision fit in?  What about pride in a job well done?</p>

<p>I think the way to reconcile this is to recognise that quality, as Julie Zhou has eloquently argued, is <a href="https://medium.com/the-year-of-the-looking-glass/quality-is-not-a-tradeoff-bcddf7c85553">a bar, not a tradeoff</a>.  Julie concludes: “quality happens because it cannot happen otherwise”.</p>

<p>Quality is a <em>cultural value</em>.  Quality means different things to different people.  Teams will vary on how they define quality, and how highly they prioritise it against other factors.  But wherever you and your team set the quality bar is part of the <em>cultural context</em> in which you make decisions about schedule and scope.</p>

<p>Your cultural quality bar isn’t something to be traded off - <em>in general</em>.  There will always be <em>specific cases</em> where you do need to accept a lower level of quality in order to achieve some goal.  Sometimes you need a demo ready for the conference announcement.  Sometimes you don’t understand the use case well enough yet to know what solving it with high quality would even look like.  But those cases should be <em>exceptional</em>.  If you’re lowering your quality bar as a matter of course, then your culture doesn’t actually value quality as much as you think it does!</p>

<p><a href="https://www.flickr.com/photos/dreamsjung/12613244714"><img src="/assets/img/move-fast/quality.jpg" alt="Quality" class="center" /></a></p>

<p>You can talk about quality within the framework of confidence.  Rather than “should we do it well or do it fast?”, you might more productively ask:</p>

<ul>
  <li>How confident are you that this feature meets the bar?  (Are you proud of it?  Do you have adequate test coverage?  Have you beta tested the design to make sure it’s easy to use?)</li>
  <li>In those hopefully rare circumstances where you choose to lower the bar, how confident are you in your reasons for doing so?  (Will you learn enough by shipping with known issues?  Is the deadline business critical, or just somebody’s misguided attempt at motivation?)</li>
  <li>Planning to ship now and fix that bug in version 2?  How confident are you that will really happen?  (Do you trust your process for bug tracking and triage?  Will you get pulled onto another project once you ship?)</li>
  <li>If you lower the bar this time, how will that affect your confidence in being able to ship the next thing?  Are you confident in that tradeoff?</li>
  <li>By lowering the bar this time, are you sure you’re not <a href="http://donellameadows.org/archives/drift-to-low-performance/">setting a bad precedent</a>?</li>
</ul>

<blockquote class="pull-quote">
  <p>“If you’re lowering your quality bar as a matter of course, then your culture doesn’t actually value quality as much as you think it does!”</p>
</blockquote>

<h2 id="move-fast-continuously">Move fast, continuously</h2>

<p>You might have noticed a theme in my bullet points above: a lot of them are about <em>how your decision now will affect the next time</em>.  It’s pretty rare that you just want to ship something, once, and then never do any more work.  You ship one feature, you move on to the next feature.  You ship an initial version, you learn from user feedback, and you iterate.  Your strategy - or the market - changes, and your product changes with it.</p>

<p>Moving fast with confidence is more than just being confident in hitting the immediate goal: it’s also <em>building</em> confidence that you can <em>keep hitting</em> goals - and confidence that you can adapt as goals change.  Often a little effort now can prevent you from getting stuck in the future.</p>

<blockquote class="pull-quote">
  <p>“It’s pretty rare that you just want to ship something, once, and then never do any more work.”</p>
</blockquote>

<p>Of course, it’s a balance.  If you focus too much on the future, you can get stuck in analysis paralysis, or waste time optimising for something that never ends up happening.  Striking the right balance has to be a team effort, requiring a diversity of skills, and a shared understanding of the quality bar.  <a href="/2016/05/20/confidence/#better-conversations-better-decisions">Framing the discussion around confidence</a> can provide a shared language for people with different skill-sets and risk tolerances.</p>

<p>Because it’s not just you running across that rocky ground.  It’s you and your team.  One of you might have run across this field before, and knows which shortcuts are actually swamps.  One of you has a compass.  Another has a map.</p>

<p>Only by working together can you <strong>keep moving fast with confidence</strong>.</p>

<p class="credits">
This post is the third in a series.  If you found it interesting or
provocative, you may enjoy the other posts:
</p>
<ul class="credits">
  <li>
    Arguing that appealing to "quality" leads to unproductive discussions:
    <a href="/2016/02/24/quality-vs-empathy/">Let's stop talking about quality</a>.
  </li>
  <li>
    Proposing a better way of framing these conversations around confidence and risk:
    <a href="/2016/05/20/confidence/">Let's talk about confidence</a>.
  </li>
</ul>

<p class="credits">
Thanks to
<a href="https://www.linkedin.com/in/gbayer">Greg Bayer</a>,
<a href="https://www.linkedin.com/in/erranberger">Erran Berger</a>,
<a href="https://www.linkedin.com/in/conradirwin">Conrad Irwin</a>,
<a href="https://www.linkedin.com/in/leemallabone">Lee Mallabone</a>, and
<a href="https://www.linkedin.com/in/jeffwang11">Jeff Wang</a>
for reviewing a draft of this post.
</p>

<p class="credits">
Photo credits:
<a href="https://www.flickr.com/photos/wakonda/14309389582">Emilio Vaquer</a>
(boot on rocky ground, cropped to remove border), and
<a href="https://www.flickr.com/photos/dreamsjung/12613244714">Jason Taellious</a>
(the word "quality" painted on a wooden board, cropped from original).
</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:move-fast-and-break-things">
      <p>This might be reminiscent of another famous slogan, “Move fast and break things”.  A slogan can’t capture the full nuance of an engineering philosophy, but it can be an effective and memorable way to convey the spirit of what’s important.  Facebook’s slogan was, unfortunately, widely taken to mean “things being broken is fine”.  The intended subtext was really: move fast and <em>don’t be afraid to</em> break things, <em>because you can move fast to fix them too</em> – which is a lot less irresponsible.  Maybe because of the misinterpretation, they later abandoned “Move fast and break things” in favour of <a href="http://mashable.com/2014/04/30/facebooks-new-mantra-move-fast-with-stability/">“Move fast with stable infra”</a>. <a href="#fnref:move-fast-and-break-things" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[&quot;Speed vs quality&quot; is a false choice in product development. Sometimes the best way to run fast is to be confident in your footing.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/move-fast/rocky-ground.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/move-fast/rocky-ground.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Let’s talk about confidence</title><link href="https://five-eights.com/2016/05/20/confidence/" rel="alternate" type="text/html" title="Let’s talk about confidence" /><published>2016-05-20T18:25:29+00:00</published><updated>2016-05-20T18:25:29+00:00</updated><id>https://five-eights.com/2016/05/20/confidence</id><content type="html" xml:base="https://five-eights.com/2016/05/20/confidence/"><![CDATA[<p>Ever been in a conversation like this?</p>

<blockquote>
  <p>Engineer: “We’re going to have to cut feature X if we want to launch on time.  It’ll take two months to build, but the deadline’s in a month.”</p>

  <p>Product manager: “That’s a shame - our competitors have that feature.  I thought you demoed it last week?”</p>

  <p>Engineer: “That was just a prototype.  We can’t ship it to users.”</p>

  <p>Product manager: “Why not?  It looks awesome, and it worked fine in the demo.”</p>

  <p>Engineer: “Sure, it basically works, but the code is a mess, and we haven’t done any testing.  It’s not ready to ship.”</p>

  <p>Product manager: “It doesn’t have to be perfect.  We need to move fast now - we can always fix it later.”</p>

  <p>Engineer: “That’s what you said last time.  Fine, we’ll ship the prototype… again.  Don’t blame me when it breaks.”</p>
</blockquote>

<p>Each person is trying to manage the risks they know about, and do what’s best for the business.  Despite the best of intentions, these conversations can feel frustrating for both parties.  It’s easy to feel like the other person doesn’t understand your concerns, or is stubbornly clinging to their own principles.  The optimal decision is probably somewhere in the middle, but this kind of discussion rarely gets there.</p>

<p>I previously argued that <a href="/2016/02/24/quality-vs-empathy/">we should stop using the word “quality”</a> because it tends to polarise conversations.  Now I want to offer an alternative.  I propose that most conversations about schedule or scope would go better if they were framed instead around <em>confidence</em>.</p>

<!-- more -->

<h2 id="confidence-and-risk">Confidence and risk</h2>

<p>Talking about confidence gives a way to educate each other about the risks you’re aware of, and how worried you are about them.  What if the same conversation went this way:</p>

<blockquote>
  <p>Engineer: “We’re going to have to cut feature X if we want to launch on time.  It’ll take two months to build, but the deadline’s in a month.”</p>

  <p>Product manager: “That’s a shame - our competitors have that feature.  It might lose us some power users, and those are exactly the users we want feedback from to be confident in our product thesis.  Are you sure there’s no way to fit it in?”</p>

  <p>Engineer: “We have a working prototype of X, but it’s pretty slow - I wouldn’t be confident in putting it in production.  It could bring down our servers.”</p>

  <p>Product manager: “X isn’t a core feature, so we don’t need 100% confidence in it.  Can we get to 80% confidence in a month?”</p>

  <p>Engineer: “I guess we can run the prototype on its own servers so it won’t harm the rest of the product.  But it could break, and we won’t have monitoring, so we’ll have to spend time after launch bringing it up to scratch.”</p>

  <p>Product manager: “That’s okay, we can afford that time after launch, and if it breaks we can handle the support calls.”</p>

  <p>Engineer: “I’ll remind you that you said that!  We’ll get the prototype ready.”</p>
</blockquote>

<p><a href="https://www.flickr.com/photos/51592180@N06/8476856482"><img src="/assets/img/confidence/risk.jpg" alt="Pointing out risks" class="center" /></a></p>

<p>Confidence is something that translates well across job functions, and is something everyone can reason about.  Engineers need confidence that the system will work, and that they’ll know when it breaks.  Product managers need confidence that someone actually wants what you built, and that they’re getting reliable user feedback.  Engineering managers need confidence that the team is tracking to plan, and that other teams they depend on are on board with the approach.</p>

<p>Talking about levels of confidence means you can actually have a reasonable discussion about tradeoffs.  The “80%” numbers can be arbitrary, but everyone understands the difference between 50% (a coin toss) and 99% (pretty certain).</p>

<h2 id="disagreement-about-confidence">Disagreement about confidence</h2>

<p>Talking about confidence doesn’t mean there will no longer be disagreements.  People will have knowledge of different aspects of the decision being made, which will lead them to differing levels of confidence.  People will have different risk tolerances: how confident they <em>prefer</em> to be.</p>

<p>In the imaginary conversation above, the engineer might have insisted that putting a prototype in front of users was irresponsible.  The product manager might have objected that an unmonitored, crash-prone version of the feature wouldn’t teach them anything about user behaviour.  Front-line support might have objected to the impending deluge of complaints about the unstable feature.</p>

<p>These are <em>good</em> disagreements.  They are the reason you had the discussion in the first place, rather than just having one person decide.  When you launch, you want to know which aspects of the product you are confident in, and where you have gaps; not to push something shiny out the door and only then discover nobody tested it under load.</p>

<p>To make an informed decision, you want the people with the most knowledge of each aspect to assess their level of confidence.  And you want people with different comfort levels to be bought into the tradeoff you’re making.  When the servers <em>do</em> catch fire, you don’t want the people holding the fire extinguishers to feel like they’re cleaning up someone else’s mess, but that you made a decision together to prepare for some fires in order to gather some crucial feedback.</p>

<p><a href="https://www.flickr.com/photos/clement127/10043349406"><img src="/assets/img/confidence/nuclear-test.jpg" alt="Running from the explosion" class="center" /></a></p>

<h2 id="risk-tolerance">Risk tolerance</h2>

<p>Taking different risk tolerances into account is tricky, because you have to do it consciously and deliberately.  If you let nature take its course, the more risk-averse people will tend to be overruled, or even ignored.  If someone more risk-tolerant is making the final decision, one of the risks they’re often prepared to accept is pissing off the risk-averse people!</p>

<p>Of course you can’t delay every decision until everyone is happy.  Rarely is everyone involved going to reach their preferred level of confidence - there just isn’t that much certainty to go around!  You might have to be okay with shipping the prototype, or with dropping the feature.  But if you can take more people’s levels of confidence into account, you’ll reach a better decision - and one with more people bought into it!</p>

<p>This is especially important because risk tolerance is <em>situational</em>.  One feature might be business critical, another might be fine with known bugs.  One small change to a creaking system might be the final straw, another might be a great opportunity to put in that fix you’d been talking about for months.</p>

<h2 id="better-conversations-better-decisions">Better conversations, better decisions</h2>

<p>The next time you’re in a conversation about schedule or scope that seems to be going nowhere, or where it seems like not every voice is being heard equally, try reframing the conversation around confidence and risk.  Instead of absolute terms like “good enough” or “launch blocker”, present alternatives; talk about the costs and benefits.</p>

<ul>
  <li>If you rush this feature out the door, what risks are you concerned about?</li>
  <li>Why is it so important to ship this feature this week?  What is the risk of delaying it a week?</li>
  <li>Can you do something simpler that would test the same product hypothesis?</li>
</ul>

<p>It’s really hard to answer these questions by arguing over absolutes, but you can make surprising progress with a few minutes of empathetic conversation about what you’re trying to achieve.</p>

<p>Of course, maybe the answer is “we’re not all that confident, but that’s fine”.  Doing anything interesting requires some level of risk.  Individuals and companies vary in how much, and what kinds of, risk they are willing to take.</p>

<p>However, I believe that building a culture that <em>values confidence</em> leads to being <em>better</em> at speed, quality, and all the other things you value.</p>

<p>In subsequent posts I plan to back up that claim, via applying this framework to some traditionally frustrating areas of software engineering, such as “productionisation” (aka turning a half-finished prototype into a half-finished product), premature generalisation, and whether startups should bother with unit tests.</p>

<p class="credits">
This post is the second in a series.  If you found it interesting or
provocative, you may enjoy the other posts:
</p>
<ul class="credits">
  <li>
    Arguing that the word "quality" leads to unproductive discussions:
    <a href="/2016/02/24/quality-vs-empathy/">Let's stop talking about quality</a>.
  </li>
  <li>
    Applying the framework of confidence to get away from false choices between
    quality and speed:
    <a href="/2016/07/11/move-fast-with-confidence/">Move fast with confidence</a>.
  </li>
</ul>

<p class="credits">
Thanks to
<a href="https://twitter.com/paulbiggar">Paul Biggar</a>,
<a href="https://twitter.com/pvh">Peter van Hardenberg</a> and
Dorothy Li for reviewing a draft of this post.
</p>

<p class="credits">
Photo credits:
<a href="https://www.flickr.com/photos/51592180@N06/8476856482">RDVPHOTO</a>
(silhouettes pointing at a satellite photo), and
<a href="https://www.flickr.com/photos/clement127/10043349406">clement127</a>
(Lego man running from mushroom cloud).
</p>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[Ever been in a conversation like this? Engineer: “We’re going to have to cut feature X if we want to launch on time. It’ll take two months to build, but the deadline’s in a month.” Product manager: “That’s a shame - our competitors have that feature. I thought you demoed it last week?” Engineer: “That was just a prototype. We can’t ship it to users.” Product manager: “Why not? It looks awesome, and it worked fine in the demo.” Engineer: “Sure, it basically works, but the code is a mess, and we haven’t done any testing. It’s not ready to ship.” Product manager: “It doesn’t have to be perfect. We need to move fast now - we can always fix it later.” Engineer: “That’s what you said last time. Fine, we’ll ship the prototype… again. Don’t blame me when it breaks.” Each person is trying to manage the risks they know about, and do what’s best for the business. Despite the best of intentions, these conversations can feel frustrating for both parties. It’s easy to feel like the other person doesn’t understand your concerns, or is stubbornly clinging to their own principles. The optimal decision is probably somewhere in the middle, but this kind of discussion rarely gets there. I previously argued that we should stop using the word “quality” because it tends to polarise conversations. Now I want to offer an alternative. I propose that most conversations about schedule or scope would go better if they were framed instead around confidence.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/confidence/risk.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/confidence/risk.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Let’s stop talking about quality</title><link href="https://five-eights.com/2016/02/24/quality-vs-empathy/" rel="alternate" type="text/html" title="Let’s stop talking about quality" /><published>2016-02-24T22:16:06+00:00</published><updated>2016-02-24T22:16:06+00:00</updated><id>https://five-eights.com/2016/02/24/quality-vs-empathy</id><content type="html" xml:base="https://five-eights.com/2016/02/24/quality-vs-empathy/"><![CDATA[<p>I don’t like discussions about quality in software.</p>

<p>Don’t get me wrong.  I want to build software I can be proud of.  I want to be part of teams that build great products.  I aspire to craftsmanship.  What I dislike is the <em>word</em> “quality”, and how it tends to polarise conversations.</p>

<p><a href="https://www.flickr.com/photos/thomashawk/16564397826"><img src="/assets/img/quality/quality-wall.jpg" alt="Quality" class="center" /></a></p>

<h2 id="quality-is-subjective">Quality is subjective</h2>

<p>A lot of factors go into software quality.  Good software is fast.  Good software is maintainable, readable, scalable, and well tested.  Good software has attractive UI and intuitive interactions.  Good software has no bugs, or at least no serious bugs, or at least no bugs that our customer support team can’t work around.</p>

<p>In practice, quality means whatever you want it to mean.  To a fan of unit testing, quality means investing in unit testing.  To a designer, quality means beautiful screens and careful interaction design.  To a customer support manager, quality means all bugs are documented and the serious ones have an ETA.</p>

<p>If you tell people that your estimates are higher than expected because you want to do a quality job, some of them will think you’re spending time refactoring and writing tests, and some will think you’re going pixel-by-pixel in Photoshop.  Some of them will end up disappointed.</p>

<!-- more -->

<h2 id="quality-is-boolean">Quality is boolean</h2>

<p>Not only is quality subjective, it’s also impossible to quantify.  It’s not clear how much time spent focussing on quality will stop those production issues, or how much less quality you’ll get if you do a rush job.  Do you want your products to be 50% better designed, or will 30% do?</p>

<p>That makes it hard to track quality over time, but that isn’t the real problem.  The problem is that <em>quality leaves no room for discussion</em>.  Debates boil down to “do you want it done properly or not?”</p>

<p>Often this comes up in the form of a decision between quality and speed:</p>

<blockquote>
  <ul>
    <li>“We’re a startup - we don’t have time for testing and code review, or we’ll miss the market window.”</li>
    <li>“We’ve been moving too fast and breaking too many things.  We need to slow down and be more careful.”</li>
  </ul>
</blockquote>

<p>If you frame it this way, you can choose speed or quality, but you can’t have both.</p>

<p><a href="https://www.flickr.com/photos/saeru/2334554340"><img src="/assets/img/quality/quality-workmanship-can-suck-it.jpg" alt="Beta's in two weeks, quality workmanship can suck it" class="center" /></a></p>

<h2 id="quality-is-judgmental">Quality is judgmental</h2>

<p>It’s not generally possible to argue against quality.  It’s a rhetorical word, loaded with positive connotations.  That means discussions about <em>improving</em> quality tend to come across as criticism:</p>

<blockquote>
  <p>“I can’t do a quality job on this timeline.”</p>
</blockquote>

<p>“I can do a <em>bad</em> job, but why would you want that?  You must be wrong about when you need this.”</p>

<blockquote>
  <p>“I’d like us to invest in unit testing - it’s a great way to improve the quality of your code.”</p>
</blockquote>

<p>“Our code is terrible right now.”</p>

<blockquote>
  <p>“We’re having too many production issues, so we need to focus on quality.”</p>
</blockquote>

<p>“The team didn’t do a good enough job.  <em>You</em> didn’t do a good enough job.  The prod issues might be due to product management insisting on impossible requirements, or that reorg we had a month before launch, but can we all agree that a <em>quality</em> product wouldn’t have these problems?”</p>

<h2 id="quality-creates-factions">Quality creates factions</h2>

<p>So quality is hard to argue against, hard to nail down, and it’s all or nothing.  Not surprisingly, some people respond by rejecting the concept of quality as unhelpful.  Quality is a luxury we don’t have time for; better to ship something than polish it forever.</p>

<p>What “we don’t have time for quality” really means is: “I’m not sure what you mean by quality, but I know moving fast is more important than what <em>I</em> mean by quality”.  Unfortunately, all too often what gets said is “we don’t have time for quality”.  Framed in these terms, there’s no common ground, and we take up sides, each frustrated at the other’s inability to see the big picture.</p>

<p>The pattern repeats at larger scales.  An engineering team can split into “pragmatic hackers” (“we just get the job done”) and “serious engineers” (“gotta clean up the mess those cowboys make”).  Or engineering can lose trust in the business (“don’t those suits understand how short-sighted they’re being?”) and vice versa (“ignore the nerds grumbling about technical debt, they’re always saying the sky is falling”).</p>

<p>What’s really going on here is a failure of communication.  This talk of factions might sound dramatic, but I bet you’ve heard variants of the above at the watercooler or the bar.  Every little joke and sarcastic aside serves to undermine trust and communication.</p>

<p><a href="https://www.flickr.com/photos/jeffeaton/7436909698"><img src="/assets/img/quality/argument.jpg" alt="Argument" class="center" /></a></p>

<h2 id="common-ground">Common ground</h2>

<p>The reality is that doing anything in the real world involves <em>difficult decisions in the face of constraints</em>.  Everyone has more exposure to some of those constraints than others.  The product manager sees customer feedback, feels the urgency of staying relevant in the market.  The designer sees limited screen real estate, the need to engage the user quickly.  The engineer sees maintenance costs and technical limitations.  But you’re all working toward the same goal: ship products, grow the business, delight your customers.</p>

<p>The only way to do that is to <em>communicate</em>.  These conversations often seem like a contest between one person’s viewpoint and another.  But the best answer for your situation probably has elements of both!  Instead of your diverse experiences getting in the way of a productive conversation, why not have them <em>be</em> the conversation?</p>

<p>Help other people understand the constraints you see, and you can work together to decide the best tradeoffs to make.  Understand the constraints another person faces, and you can understand how to help them.  Instead of negotiating, you can collaborate.</p>

<p><a href="https://www.flickr.com/photos/canonsnapper/8701575728"><img src="/assets/img/quality/communication.jpg" alt="Communication" class="center" /></a></p>

<h2 id="empathy">Empathy</h2>

<p>Next time you’re frustrated by an unrealistic deadline or an inflated estimate, instead of assuming that person just <em>doesn’t get it</em> - ask how things look from where they are.  What does a product manager do every day?  What does it mean to an engineer that the code is a mess?  What was the designer trying to achieve with that colour change?</p>

<p>Instead of talking about quality, let’s talk about goals.  We want to see whether customers engage with this new feature.  We want to cut down how often our engineers get paged at 3am.  We want the main features to be at most 3 clicks away.  We want to communicate the value of the product in the first 5 minutes.  Let’s talk about how our different goals interact.  Maybe there’s a way to do it that gets everyone closer to their goals?</p>

<p>Because that’s the fun part.  That’s why we work in teams - bringing our different strengths together, solving problems, to build something awesome.</p>

<p>So let’s have less talk about quality, and more talk about empathy.  Go talk to someone.  Learn what makes them tick.  And make something cool together.</p>

<p><a href="https://www.flickr.com/photos/abiwt/10283999515"><img src="/assets/img/quality/teamwork.jpg" alt="Teamwork" class="center" /></a></p>

<p class="credits">
<strong>Update</strong>: This post is the first in a series.  If you found it
interesting or provocative, you may enjoy the subsequent posts:
</p>
<ul class="credits">
  <li>
    Proposing a better way of framing these conversations:
    <a href="/2016/05/20/confidence/">Let's talk about confidence</a>.
  </li>
  <li>
    An engineering philosophy to get away from false choices between quality
    and speed:
    <a href="/2016/07/11/move-fast-with-confidence/">Move fast with confidence</a>.
  </li>
</ul>

<p class="credits">
Thanks to
<a href="https://twitter.com/paulbiggar">Paul Biggar</a>,
<a href="https://twitter.com/pvh">Peter van Hardenberg</a> and
Dorothy Li for reviewing a draft of this post.
</p>

<p class="credits">
Photo credits:
<a href="https://www.flickr.com/photos/thomashawk/16564397826">Thomas Hawk</a>
("quality" wall painting),
<a href="https://www.flickr.com/photos/saeru/2334554340">saeru</a>
("quality workmanship" sign, cropped from original),
<a href="https://www.flickr.com/photos/jeffeaton/7436909698">Jeff Eaton</a>
(Lego argument),
<a href="https://www.flickr.com/photos/canonsnapper/8701575728">Michael Summers</a>
(discussion with notebook), and
<a href="https://www.flickr.com/photos/abiwt/10283999515">the Anita Borg Institute</a>
(people collaborating around a laptop).
</p>]]></content><author><name>Sam Stokes</name></author><summary type="html"><![CDATA[I don’t like discussions about quality in software. Don’t get me wrong. I want to build software I can be proud of. I want to be part of teams that build great products. I aspire to craftsmanship. What I dislike is the word “quality”, and how it tends to polarise conversations. Quality is subjective A lot of factors go into software quality. Good software is fast. Good software is maintainable, readable, scalable, and well tested. Good software has attractive UI and intuitive interactions. Good software has no bugs, or at least no serious bugs, or at least no bugs that our customer support team can’t work around. In practice, quality means whatever you want it to mean. To a fan of unit testing, quality means investing in unit testing. To a designer, quality means beautiful screens and careful interaction design. To a customer support manager, quality means all bugs are documented and the serious ones have an ETA. If you tell people that your estimates are higher than expected because you want to do a quality job, some of them will think you’re spending time refactoring and writing tests, and some will think you’re going pixel-by-pixel in Photoshop. Some of them will end up disappointed.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/quality/quality-workmanship-can-suck-it.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/quality/quality-workmanship-can-suck-it.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Programming is not magic</title><link href="https://five-eights.com/2014/09/22/magic/" rel="alternate" type="text/html" title="Programming is not magic" /><published>2014-09-22T09:00:00+00:00</published><updated>2014-09-22T09:00:00+00:00</updated><id>https://five-eights.com/2014/09/22/magic</id><content type="html" xml:base="https://five-eights.com/2014/09/22/magic/"><![CDATA[<p>When people who program want to convey to others the joy and satisfaction we
find in our craft, we often liken it to doing magic. The analogy evokes a sense
of empowerment, possibility and freedom. But I think comparing programming to
magic actually does unintended harm, because it has another connotation: that
programming is a mystical ability, something you are born with, not something
you can learn.</p>

<p><a href="https://www.flickr.com/photos/evaysucamara/5438832695"><img src="/assets/img/magic/magician.jpg" alt="Magician" /></a></p>

<p>I want to get a lot more people programming, and I think we need a better
analogy to get there.</p>

<!-- more -->

<h1 id="yer-a-wizard-harry">Yer a wizard, Harry</h1>

<p>People compare programming to magic with the best of intentions. In a heartfelt
and inspiring <a href="http://www.youtube.com/watch?v=3_zW63dcZB0">keynote</a> at
<a href="https://thestrangeloop.com">Strange Loop</a> on the importance of sharing the joy
that programming brings us, <a href="https://twitter.com/gigasquid">Carin Meier</a>
likened programming to dreams of flying. A Kickstarter project
<a href="https://www.kickstarter.com/projects/thoughtstem/codespells-express-yourself-with-magic">CodeSpells</a>
offers to let you “express yourself with magic”. Fred Brooks wrote that the
programmer “builds castles in the air”.</p>

<p>As a way to inspire more people to learn to program, this seems to make
sense. Our popular culture is full of magical powers we would all love
to have access to: Harry Potter rides a broomstick and fights evil,
Gandalf summons giant eagles to get him out of harm’s way, Wolverine can
heal from any injury. (Of course, the “mutations” of the X-Men and “The
Force” in Star Wars are magic by another name.) Why wouldn’t anyone want
to learn something that gave them magical powers?</p>

<p>Here’s the problem: it’s almost always a special group of people who
have the magic. Harry Potter learns early on that he is a wizard, and
that most other people are not wizards. Gandalf never teaches Frodo any
spells. The X-Men have powers because of their mutations - they were
just born that way.</p>

<p>When we tell a non-programmer, who has watched <em>Harry Potter</em> and <em>Lord of the
Rings</em>, that programming is like magic, he’s likely to respond: “that sounds
great; I wish <em>I</em> could do it”. Most people already have little
concept of
<a href="/2014/05/01/what-programming-is-like/">what programming is like</a>. Telling
him programming is like magic confirms what he probably already suspected:
programming is complicated and mysterious; it’s not for him.</p>

<h1 id="the-man-behind-the-curtain">The man behind the curtain</h1>

<p>Comparing programming to magic gives people some idea of why it’s <em>fun</em>,
but no idea of what it <em>is</em> - or how to learn it. Claiming to be
wizards, we are more like the Wizard of Oz - hiding behind a curtain of
mystique, magnifying our achievements to impress others. If we want
everyone to have access to this power, we need to pull back the curtain.</p>

<p>Programmers aren’t wizards. We’re just people, pulling levers to operate
the machine. We learned to program the same way we learned to cook or
ride a bike - by trying and failing, changing something and getting a
different response, and enjoying it enough to keep going. We need to
show what that process looks like, and how anyone with access to a
computer can do it.</p>

<p>Programming isn’t magic. It’s building a machine that talks to another
machine that moves data around, or makes pixels change colour, or makes
a speaker cone vibrate. We need to show how to do those things, and how
they add up to produce results that <em>feel</em> like magic.</p>

<h1 id="robot-dance-party">Robot dance party</h1>

<p>That brings me back to the Strange Loop keynote. After Meier’s
presentation, she was joined by two live-coding DJs,
<a href="https://twitter.com/samaaron">Sam Aaron</a> and
<a href="https://twitter.com/graham_jp">Jonathan Graham</a>. While they built up a
soundtrack from samples and loops, Meier set up a menagerie of robots,
including a quadcopter, and wrote a quick program to control the robots. Watch
the part <a href="http://www.youtube.com/watch?v=3_zW63dcZB0&amp;t=40m30s">at 40:30</a> where
she gets the quadcopter dancing to the beat.</p>

<p>Let’s go over that again. Three programmers, with a live audience, <em>made
a flying robot dance to music they created</em>. If that’s not a magical
<em>result</em>, I don’t know what is.</p>

<p>But it wasn’t magic. Meier controlled the robots by sending
<a href="http://nodebots.io/">a few simple commands</a> to their motors. Aaron and Graham
produced the music with a screenful of code, using the
<a href="http://overtone.github.io/">Overtone</a> toolkit. Using a
<a href="http://sonic-pi.net/">simplified version</a> of Overtone, Aaron has successfully
taught 12-year-olds to make music using code.</p>

<h1 id="programming-as-a-musical-instrument">Programming as a musical instrument</h1>

<p>The kids in Aaron’s class learned how to play a sample, change the pitch
to make a melody, loop it to make a backing track. They learned how to
build up several tracks into an ensemble, and how to tweak the music
until it sounded good. They learned all this in much less time than they
would have needed to learn a real musical instrument, or at least
produce any kind of pleasant sounds from it.</p>

<p>Of course, they were also learning programming: how to build up complex
systems from simple units, how to debug by changing parameters and
observing the change in output. But as far as they were concerned, they
were making music.</p>

<p>So if we want the rest of the world to have magical powers too, maybe
instead of comparing programming to magic, we should compare it to
<em>music</em>. Programming is like a musical instrument. A beginner can play
simple tunes, and as they grow more adept, they can add chords,
harmonies, counterpoint. Not everyone can write a symphony. But we can
all make robots dance.</p>

<p class="credits">
Inspired by a conversation with <a href="https://twitter.com/roseaboveit">@roseaboveit</a>.
</p>

<p class="credits">
Lego photo credit: <a href="https://www.flickr.com/photos/evaysucamara/5438832695">evaysucamara</a>
</p>

<p class="credits">
This was originally posted <a href="https://www.linkedin.com/today/post/article/20140922160434-4503063-programming-is-not-magic">on LinkedIn</a>
</p>]]></content><author><name>Sam Stokes</name></author><category term="programming" /><summary type="html"><![CDATA[When people who program want to convey to others the joy and satisfaction we find in our craft, we often liken it to doing magic. The analogy evokes a sense of empowerment, possibility and freedom. But I think comparing programming to magic actually does unintended harm, because it has another connotation: that programming is a mystical ability, something you are born with, not something you can learn. I want to get a lot more people programming, and I think we need a better analogy to get there.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/magic/magician.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/magic/magician.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What programming is like</title><link href="https://five-eights.com/2014/05/01/what-programming-is-like/" rel="alternate" type="text/html" title="What programming is like" /><published>2014-05-01T18:24:12+00:00</published><updated>2014-05-01T18:24:12+00:00</updated><id>https://five-eights.com/2014/05/01/what-programming-is-like</id><content type="html" xml:base="https://five-eights.com/2014/05/01/what-programming-is-like/"><![CDATA[<p>What is programming like?</p>

<p>We in the software profession have done a terrible job of explaining to the public what it is that we do.  Everyone has interacted with a teacher or a doctor.  There are TV shows about lawyers, cops, even government officials.  However warped our impression of their day-to-day, we can relate to these professions.  TV depicts programmers as modern-day wizards, socially aloof, hacking into systems or bringing the new algorithm online just in time to stop the cyberterrorists — totally disconnected from people’s experience of the software they use every day.  Software remains mysterious.</p>

<p>This isn’t just a problem for awkward “so, what do you do?” conversations at parties.  I believe one reason why so many demographics are underrepresented in software is that unless you grew up with it, you’re unlikely to have the faintest idea what making software is actually like.  Why would you strive — particularly against economic obstacles and systemic biases — to enter a profession you know nothing about?</p>

<h2 id="programming-sucks">Programming sucks</h2>

<p>Inspired by a friend who couldn’t see what was so hard about programming, Peter Welch wrote a <a href="http://stilldrinking.org/programming-sucks">hilarious, heartfelt and all-too-true rant</a> about what writing software is like.  His title, and answer: “Programming Sucks”.  The whole, long post is enjoyable reading, but here’s a representative excerpt:</p>

<blockquote>
  <p>Imagine joining an engineering team […] for a bridge in a major metropolitan area. […] The bridge was designed as a suspension bridge, but nobody actually knew how to build a suspension bridge, so they got halfway through it and then just added extra support columns to keep the thing standing, but they left the suspension cables because they’re still sort of holding up parts of the bridge. Nobody knows which parts, but everybody’s pretty sure they’re important parts. […]</p>

  <p>Would you drive across this bridge? No. If it somehow got built, everybody involved would be executed. Yet some version of this dynamic wrote every single program you have ever used, banking software, websites, and a ubiquitously used program that was supposed to protect information on the internet but didn’t.</p>
</blockquote>

<!-- more -->

<p>Welch brilliantly describes the nuances and stresses of trying to cobble together something useful, based on a blueprint nobody bothered to draw, out of parts designed to do almost, but not exactly, what you need them to do.</p>

<p>Reading this, I immediately wanted to send it to every friend and family member to whom I’d failed to explain what it was I did all day.  But I didn’t send it, because it only tells part of the story.  Programming sucks, so why do it?</p>

<p>For me, it’s because programming is <em>amazing</em>.</p>

<h2 id="why-we-do-it">Why we do it</h2>

<p>Programming is like building structures out of Lego, but I never run out of Lego bricks, and if there’s no brick with the exact shape that I need, I can <em>make</em> that brick.  I can take the structures I build and use them <em>as</em> bricks to build bigger, more ambitious structures.  I can build tools out of bricks to help me build quicker.  If I build a model city, or a crane for building model cities, I can offer them to millions of people to download and play with, in any part of the world.</p>

<p><a href="https://www.flickr.com/photos/dunechaser/2703633791"><img src="/assets/img/lego-city.jpg" alt="Lego city" /></a></p>

<p>Fred Brooks wrote in <em>The Mythical Man-Month</em>:</p>

<blockquote>
  <p>The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds castles in the air, from air, creating by exertion of the imagination. Few media of creation are so flexible, so easy to polish and rework, so readily capable of realizing grand conceptual structures.</p>

  <p>Yet the program construct, unlike the poet’s words, is real in the sense that it moves and works, producing visible outputs separate from the construct itself. It prints results, draws pictures, produces sounds, moves arms.</p>
</blockquote>

<p>One of the most liberating things about writing software is that the tools you use for it are <em>also</em> software.  Remember that Lego tool you could buy to help you pry bricks apart?  Imagine if you could build that tool <em>out of Lego bricks</em>.  We can use the skills we have for writing software to improve the tools we work with.  We can write software that makes us <em>better at writing software</em>.</p>

<p>There is a dark side, as Welch entertainingly describes.  There are deep, scary flaws in the tools and processes we use to build software.  Everything is more difficult and arcane than it should be.  We spend so much effort, after the software is “done”, fixing problems that should never have been possible to introduce in the first place.  Sometimes it’s amazing that anything ever works.  But somehow, it does, and so we have smartphones, and Angry Birds, and the Internet.  Programming sucks, but look at where we are!</p>

<p>Programming gives us live video conversations with relatives around the world; a <a href="http://en.wikipedia.org/wiki/Human_Genome_Project">map of our own biology</a>; widgets that monitor oil pipelines from the inside; spreadsheets that run entire businesses; games where you build cities, or <a href="http://www.goat-simulator.com/">pretend to be a goat</a>.</p>

<p>Of course these are specialised fields, each with its own demands and disciplines, but they all start with writing apparent gibberish in a text editor.  The reach and breadth of what you can do with gibberish is remarkable.</p>

<h2 id="castles-in-the-air">Castles in the air</h2>

<p>Programming sucks, but for me, that is cause for tremendous optimism.  We can use programming to improve programming!  We can reduce the complexity that programmers have to keep in their heads.  We can make more visual, interactive, intuitive tools for understanding the behaviour of programs.  We can make it easier to fix incorrect programs, and easier to write correct ones.  Programming is only going to get easier, and more powerful, and more accessible.</p>

<p>If we’ve come this far — in the 60-odd years that programming has even been possible — while programming sucks, how far can we go when it doesn’t?</p>

<p>Brooks’ phrase “building castles in the air” was once <a href="http://en.wiktionary.org/wiki/build_castles_in_the_air">used satirically</a>, to mean chasing an impossible dream.</p>

<p>For me, <em>that’s</em> what programming is like.</p>

<p class="credits">
Thanks to
<a href="https://www.linkedin.com/in/josephmchow">Joseph Chow</a>,
<a href="http://www.lihaco-consulting.com/">Lily Han</a>,
<a href="https://twitter.com/ConradIrwin">Conrad Irwin</a>,
<a href="http://martin.kleppmann.com/">Martin Kleppmann</a>,
<a href="https://twitter.com/LeeMallabone">Lee Mallabone</a> and
<a href="http://www.linkedin.com/in/kiranprasad">Kiran Prasad</a>
for reviewing a draft of this post.  Their feedback improved this post immeasurably.
</p>

<p class="credits">
Lego photo credit:
<a href="https://www.flickr.com/photos/dunechaser/2703633791">dunechaser</a>
</p>]]></content><author><name>Sam Stokes</name></author><category term="programming" /><category term="optimism" /><summary type="html"><![CDATA[What is programming like? We in the software profession have done a terrible job of explaining to the public what it is that we do. Everyone has interacted with a teacher or a doctor. There are TV shows about lawyers, cops, even government officials. However warped our impression of their day-to-day, we can relate to these professions. TV depicts programmers as modern-day wizards, socially aloof, hacking into systems or bringing the new algorithm online just in time to stop the cyberterrorists — totally disconnected from people’s experience of the software they use every day. Software remains mysterious. This isn’t just a problem for awkward “so, what do you do?” conversations at parties. I believe one reason why so many demographics are underrepresented in software is that unless you grew up with it, you’re unlikely to have the faintest idea what making software is actually like. Why would you strive — particularly against economic obstacles and systemic biases — to enter a profession you know nothing about? Programming sucks Inspired by a friend who couldn’t see what was so hard about programming, Peter Welch wrote a hilarious, heartfelt and all-too-true rant about what writing software is like. His title, and answer: “Programming Sucks”. The whole, long post is enjoyable reading, but here’s a representative excerpt: Imagine joining an engineering team […] for a bridge in a major metropolitan area. […] The bridge was designed as a suspension bridge, but nobody actually knew how to build a suspension bridge, so they got halfway through it and then just added extra support columns to keep the thing standing, but they left the suspension cables because they’re still sort of holding up parts of the bridge. Nobody knows which parts, but everybody’s pretty sure they’re important parts. […] Would you drive across this bridge? No. If it somehow got built, everybody involved would be executed. Yet some version of this dynamic wrote every single program you have ever used, banking software, websites, and a ubiquitously used program that was supposed to protect information on the internet but didn’t.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://five-eights.com/assets/img/lego-city.jpg" /><media:content medium="image" url="https://five-eights.com/assets/img/lego-city.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>