<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Simple, Beautiful Software Development]]></title><description><![CDATA[Idle words from Andrew Howden about Site Reliability Engineering, Software Development, Product development or other software and software tangential topics.]]></description><link>https://www.andrewhowden.com</link><image><url>https://substackcdn.com/image/fetch/$s_!3jml!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9988174-4d82-43ae-8a55-22bbc62e39c5_400x400.png</url><title>Simple, Beautiful Software Development</title><link>https://www.andrewhowden.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 13:46:28 GMT</lastBuildDate><atom:link href="https://www.andrewhowden.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Andrew Howden]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[hello@andrewhowden.com]]></webMaster><itunes:owner><itunes:email><![CDATA[hello@andrewhowden.com]]></itunes:email><itunes:name><![CDATA[Andrew howden]]></itunes:name></itunes:owner><itunes:author><![CDATA[Andrew howden]]></itunes:author><googleplay:owner><![CDATA[hello@andrewhowden.com]]></googleplay:owner><googleplay:email><![CDATA[hello@andrewhowden.com]]></googleplay:email><googleplay:author><![CDATA[Andrew howden]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Learning Path: Software Engineering]]></title><description><![CDATA[I find myself coming back to a series of posts, books, talks and so on &#8212; this is my attempt to document them.]]></description><link>https://www.andrewhowden.com/p/learning-path-software-engineering</link><guid isPermaLink="false">https://www.andrewhowden.com/p/learning-path-software-engineering</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Sun, 28 Dec 2025 07:55:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3jml!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9988174-4d82-43ae-8a55-22bbc62e39c5_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I find myself coming back to a series of posts, books, talks and so on &#8212; this is my attempt to document them. The items are (loosely) hierarchial, but I&#8217;d pick and choose among them.</p><p><strong>People</strong></p><ul><li><p><a href="https://www.martinfowler.com/">Martin Fowler</a></p></li><li><p><a href="https://kentbeck.com/">Kent Beck</a></p></li></ul><p><strong>Papers / Articles</strong></p><ul><li><p><a href="https://agilemanifesto.org/">Agile Manifesto</a></p></li><li><p><a href="https://www.andrewhowden.com/p/anatomy-of-a-good-commit-message">Writing detailed commits</a></p></li></ul><p><strong>Books</strong></p><ul><li><p><a href="https://www.martinfowler.com/books/refactoring.html">Refactoring</a> - Martin Fowler</p></li><li><p><a href="https://www.martinfowler.com/books/eaa.html">Patterns of Enterprise Architecture</a> - Martin Fowler</p></li></ul><p>(The following are related, but not directly, software engineering)</p><ul><li><p><a href="https://www.amazon.com.au/Principles-Product-Development-Flow-Generation/dp/1935401009">The principals of product development flow</a></p></li></ul><p><strong>Related Paths</strong></p><ul><li><p><strong>&#8230;</strong></p></li></ul><h1></h1><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Hey! You seem like you like reading what I write. How about getting notified when it&#8217;s in your inbox?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[LLM Prompt: Writing Styleguide]]></title><description><![CDATA[A styleguide useful for large language models when producing summaries, papers etc.]]></description><link>https://www.andrewhowden.com/p/llm-prompt-writing-styleguide</link><guid isPermaLink="false">https://www.andrewhowden.com/p/llm-prompt-writing-styleguide</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Tue, 14 Oct 2025 08:23:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3jml!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9988174-4d82-43ae-8a55-22bbc62e39c5_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Education &amp; Reading Level</strong></h2><p>The paper should be targeted at someone who has a university education (e.g. bachelor or masters) in the subject matter being explored, and should not shy away from the use of Jargon.</p><h2><strong>Styleguide</strong></h2><p>The writing should be simple, taking inspiration from books like &#8220;On Writing Well&#8221; by William Zinsser, or similar writing styleguides. As a rule, it should avoid using the &#8220;passive voice&#8221;.</p><h2><strong>Format</strong></h2><p>Prefer to make the content as a series of paragraphs, using dot points sparingly and only where the subject is useful to understand through a list.</p><h2><strong>Fidelity</strong></h2><h3><strong>Precision</strong></h3><p>Ensure that the paper is focused, and makes a limited number of key points rather than introducing additional subject matter. Where a paper has any meaningful length (e.g. more than one page), create an executive summary at the beginning of the paper that summarizes it.</p><p>Ensure that the paper is precise, and doesn&#8217;t use terminology to convey size without providing numbers, or where this is necessary as there is no numeric representation, use simple relative terms (e.g. &#8220;large&#8221; and not &#8220;huge&#8221;).</p>]]></content:encoded></item><item><title><![CDATA[Writing a bug report]]></title><description><![CDATA[A story about what developers see, and how to maximise their initial understanding of an issue.]]></description><link>https://www.andrewhowden.com/p/writing-a-bug-report</link><guid isPermaLink="false">https://www.andrewhowden.com/p/writing-a-bug-report</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Fri, 14 Feb 2025 09:52:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3jml!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9988174-4d82-43ae-8a55-22bbc62e39c5_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a software engineer, my stock and trade are bugs or features. My team and I need to make changes to the software to make it perform some new thing, or modify the behaviour of the thing it does continually, cycling releases through approximately 1x per week.</p><p>We don&#8217;t always get it right.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Want to learn how to get it right? Haha me too. In the mean time, you can learn from my mistakes here:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>We take reasonable care in how we develop software; all changes are subject to code review, nearly all system changes are expressed in version control and all changes need to go through an independent QA process &#8212; all of which means we do okay. But sometimes, something slips through the cracks.</p><p>Invariably, the things that slip through aren&#8217;t the things that we thought of. They&#8217;re usually the result of complex system interactions, a limitation in the way we&#8217;ve constructed the business logic or some bespoke circumstance that modifies the state such that it breaks a fundamental assumption. Because they&#8217;re things that we both don&#8217;t think of and don&#8217;t test for, we must get as much information as possible to help us investigate the issue further.</p><p>Skipping ahead, when writing a bug it&#8217;s best if it&#8217;s written according to the formula supplied below in the &#8220;Markdown&#8221; format:</p><pre><code># The paypal checkout seems to fail with the error "Error: The upstream provider returned an invalid response.

## StoryOn Thursday, 25th of February 2018 at approximately 6:18pm I attempted to checkout via the standard checkout with the following items in my cart:

- 2x Widget
- 1x Foobar
I delivered to the address: Untermainkai 30

Frankfurt am Main 60320
Deutschland

And attempted to pay via the payment method Mastercard, with the last 4 digits ending in 0430.

I was able to complete the checkout up to and including the PayPal step, but on being sent back to the store the store showed only "Error: the upstream provider returned an invalid response".

I did not receive any order success email as I expected, nor was I shown the "Checkout Success" page.

## ScreenshotsPlease find attached the following screenshots which show:

1. The error following the checkout
2. The contents of my cart prior to checkout
3. The order summary page prior to being redirected to Paypal

## Technical Detail
### BrowserThe browser I used was Chrome. The details from the `chrome://version` tab are as follows:

```
Google Chrome66.0.3359.181 (Official Build) (64-bit)
Revision a10b9cedb40738cb152f8148ddab4891df876959-refs/branch-heads/3359@{#828}
```

### Browser Console

The browser console showed the following entries:

```
content.js:4 [Deprecation] chrome.loadTimes() is deprecated, instead use standardized API: nextHopProtocol in Navigation Timing 2. <a href="https://www.chromestatus.com/features/5637885046816768">https://www.chromestatus.com/features/5637885046816768</a>.
(anonymous) @ content.js:4
content.js:5 [Deprecation] chrome.loadTimes() is deprecated, instead use standardized API: nextHopProtocol in Navigation Timing 2. <a href="https://www.chromestatus.com/features/5637885046816768">https://www.chromestatus.com/features/5637885046816768</a>.
(anonymous) @ content.js:5
```</code></pre><p>The above report is super detailed &#8212; I would be extremely happy to receive such a report. But it&#8217;s worth unpacking the report further, to understand why each section is important from the point of view of the developer.</p><h1><strong>Title</strong></h1><p>The title is surprisingly important. There are always many outstanding bugs that must be triaged, and it&#8217;s often not clear which task has the highest priority. However, we can determine from the title:</p><pre><code>The paypal checkout seems to fail with the error "Error: The upstream provider returned an invalid response.</code></pre><p>That the error is in the checkout; the last step of the user journey. It&#8217;s thus critically important, and is likely to trigger incident response internally. Additionally, we can see that it&#8217;s associated with as specific provider, and that from the error we can see the provider is performing abnormally. It may be the provider is experiencing issues, which can usually be quickly verified with status pages.</p><h1><strong>Story (or steps to reproduce)</strong></h1><p>Perhaps the most important step in a bug is detailed steps to reproduce. It&#8217;s best to write these as detailed as possible, and from the point of view of the person who has experienced the issue. Let&#8217;s break it down piece by piece.</p><h2><strong>Time and Date</strong></h2><pre><code>On Thursday, 25th of February 2018 at approximately 6:18pm I attempted</code></pre><p>As developers, we know ahead of time that we are not going to catch all issues. As far as I&#8217;m aware, there has never been bug free software, no matter the expense &#8212; the systems that we build upon <a href="https://www.techradar.com/news/intels-cpus-with-baked-in-spectre-defenses-could-still-be-haunted-by-new-variant">are simply not that reliable</a>. So, we build the application with this in mind. We collect certain diagnostic information at all times throughout the application, but we collect even more information when we have determined that an unusual situation has occurred.</p><p>We are able to look up the information associated with a request, but <strong>only if we know specifically which request it is</strong>. Sometimes it&#8217;s not so obvious which requests are problematic and which are not; the proverbial needle in the haystack. So, narrowing the problem down to a time range allows us to look very specifically at the information from a certain time, which can dramatically reduce the amount of effort required to investigate.</p><h2><strong>Detailed User Story</strong></h2><pre><code>I attempted to checkout via the standard checkout with the following items in my...

...${SEE_ABOVE}...

...but on being sent back to the store the store showed only "Error: the upstream provider returned an invalid response".</code></pre><p>As mentioned, bugs often arise out of complex behaviour. Unfortunately we cannot test all possible combinations of what will occur in a production environment during testing. There are a couple of reasons for this:</p><ol><li><p>We don&#8217;t know them, and</p></li><li><p>It&#8217;s cost prohibitive to test every combination of every feature prior to shipping to production</p></li></ol><p>We make tradeoffs on the cost of an issue in a given area, and shape our testing policy accordingly.</p><p>Detailed user journeys that clearly describe the application state as well as the actual error allow us to reproduce exactly the set of conditions that arose from the error. In the case above, it may be that <code>1x foobar</code> contains a special character in it&#8217;s description that causes the application to break when it is returned from PayPal, or that the credit card has been marked as fraudulent and the application hasn&#8217;t been designed to deal with the issue.</p><p><strong>If you take nothing away, please painstakingly detail the steps to reproduce the issue.</strong></p><h2><strong>Screenshots</strong></h2><pre><code>1. The error following the checkout
2. The contents of my cart prior to checkout
3. The order summary page prior to being redirected to Paypal</code></pre><p>The phrase &#8220;a picture is worth a thousand words&#8221; is rarely more true than screenshots associated with an issue.</p><p>As much as we try and create a common understanding of what is happening in an application and surface information that is useful debugging, there is certain information that it is inherently complex to communicate. A screenshot is a low effort tool to communicate an extremely large amount of information:</p><ul><li><p>Time of day</p></li><li><p>Operating system</p></li><li><p>Browser</p></li><li><p>Application state through status icons</p></li><li><p>User data that can be correlated with the issue</p></li></ul><p>While it would be possible to ask for all of these details up front, it&#8217;s often difficult to explain the impact of different browsers, or why an operating system matters. Sending screenshots allows a vast amount of technical communication with an ostensibly simple action.</p><p>Further, multiple screenshots compound this effect. It is possible to determine state change over time from screenshots, and there may be things the developer can spot that are difficult to communicate.</p><p>Lastly, screenshots even make sense in terms of &#8220;terminal&#8221; or text only applications!</p><h1><strong>Technical Detail (Bonus)</strong></h1><p>There are some bugs that, no matter how much we instrument, are impossible to foresee and thus instrument for. If a bug report is being reported by a more technical user (for example, a project manager) it&#8217;s possible for them to communicate additional very technical information about the nature of the bug which helps particularly with bugs that are otherwise extremely hard to trace.</p><h2><strong>Browser Version</strong></h2><pre><code>The browser I used was Chrome. The details from the `chrome://version` tab are as follows:</code></pre><p>It is possible for a develop code that works perfectly well one day, but breaks the next. One such example would be the use of in-development web specifications whos format changes following the development implementation, or deprecation to other specifications. Lastly, there are a class of bugs in which the browser fails to implement the specification as documented, in which the browser itself will be problematic rather than the application.</p><p>By being specific about the browser version we can either rule out a class of issues, or otherwise reproduce an issue exactly as it&#8217;s defined. Additionally, copying directly from <code>about</code> or <code>version</code> sections of a browser allows us to capture information that may seem redundant, such as the <code>(stable)</code> part of the Chrome version string.</p><h2><strong>Browser Console</strong></h2><pre><code>content.js:4 [Deprecation] chrome.loadTimes() is deprecated, instead use standardized API: nextHopProtocol in Navigation Timing 2. <a href="https://www.chromestatus.com/features/5637885046816768">https://www.chromestatus.com/features/5637885046816768</a>.
(anonymous) @ content.js:4</code></pre><p>The browser console is a tool that is used by various browsers to express additional, non user facing information to interested parties &#8212; specifically information that is useful for the developers. There are various mechanisms to access them, but the <a href="https://developers.google.com/web/tools/chrome-devtools/console/">in Chrome it&#8217;s Ctrl+Shift+J</a>.</p><p>There is a particular class of problems with the code &#8220;JavaScript&#8221; which we often have very little visibility into. These issues are expressed through the JavaScript console, so adding these to the report can render an otherwise completely opaque problem transparent.</p><h2><strong>HAR File</strong></h2><p>For the truly technically savvy among us, it&#8217;s even possible to capture the entire request and send it through in a format called &#8220;HAR&#8221;. Instructions on how to do this in Chrome are at the following address:</p><p><a href="https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#save-as-har">https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#save-as-har</a></p><h1><strong>Conclusion</strong></h1><p>Bugs are an inevitable part of software development. They are also among the most painful to investigate, and thus the most expensive issues that we can work on. By submitting a detailed bug report we can save a large amount of time and discussion back and fourth, and get fixes into production faster.</p><h2><strong>Further Reading</strong></h2><ul><li><p><a href="https://medium.com/@andrewhowdencom/writing-a-user-story-5e6f80ddffdf">Writing a user story</a></p></li></ul><h2><strong>Thanks</strong></h2><ul><li><p>Aario Shahbany and Svetlin Kalendzhiev who assisted in creating the &#8220;ideal bug report&#8221;.</p></li><li><p>Tomasz Kaplonski for reviewing and suggesting improvements.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Simple, Beautiful Software Development! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[On communicating through writing]]></title><description><![CDATA[In February 2024, I joined a new organization as a &#8220;principal engineer&#8221;.]]></description><link>https://www.andrewhowden.com/p/on-communicating-through-writing</link><guid isPermaLink="false">https://www.andrewhowden.com/p/on-communicating-through-writing</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Mon, 06 Jan 2025 17:43:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d4cffd41-b320-49aa-89b0-9a8574c17c21_3867x2628.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In February 2024, I joined a new organization as a &#8220;principal engineer&#8221;. This was a bit of an adventure &#8212; the last 12 months have been an opportunity for me to learn an enormous amount, as well to join a high profile project, sort through a number of substantial project challenges and establish relationships at different levels through this new company.</p><p>Whenever joining a new company, I&#8217;m always surprised at how different that company works. In this particular case, I rejoined a series of colleagues I&#8217;d worked with in the past, but in vastly different roles and with a very different customer base. It was a good opportunity to see both the culture that exists between my former colleagues and I, and the culture that exists in the broader group.</p><p>One of the principles that I take for granted is the use of documents as a vehicle for coordinating decisions. I am used to product, portfolio, technical, organizational and managerial decisions all having an accompanying (hopefully short) paper. This exists in pockets in the new company I work for, but it is by no means &#8220;common&#8221;. So! This article exists to try and explain <em>why </em>I am so used to using documents to drive a shared understanding, and ultimately, a clear decision.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Simple, Beautiful Software Development! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The Fundamental Challenge: Developing an Idea</h2><p>The goal of most communications is first to develop a shared understanding of an idea. Whether that&#8217;s &#8220;We should use Go as our primary software development language&#8221;, &#8220;This application programming interface needs an additional field which determines whether or not this application is a frontend application&#8221; or &#8220;We need a new team to build a load testing capability&#8221;. The second is to allow others to contribute to that idea, bringing their own knowledge and perspective to improve the assumptions that the idea makes or bring a new iteration of an idea that solves the underlying problem. Lastly, there should be enough clarity that a leader can make a clear decision that is well understood in the team.</p><p>There are different ways to &#8220;develop an idea&#8221;. The most frequent ones I come across are:</p><ol><li><p>A &#8220;workshop&#8221;, in which team members share their understanding in a &#8220;brainstorm&#8221; against a common model (e.g. on a whiteboard).</p></li><li><p>A &#8220;document&#8221;, in which someone takes the time to write up their understanding</p></li></ol><p>My experience so far is that a &#8220;workshop&#8221; is incredibly useful to gain a lot of perspectives quickly and settle on the &#8220;broad definition&#8221; of an idea. However, workshops usually do not provide enough clarity that a decision can be made &#8220;in the moment&#8221; &#8212; while participants may feel they share a good understanding of each other's perspective, frequently I find that when it is written into a document and re-read, what&#8217;s there is quite different than the expectations that each participant had out of the workshop.</p><p>Additionally, workshops miss at least two key opportunities for input. These are:</p><ol><li><p><strong>Inspiration</strong>. The proverbial <a href="https://www.reddit.com/r/Showerthoughts/">&#8220;shower thought&#8221;</a> or key moment of insight that happens outside a workshop, when your brain is just idling over the day.</p></li><li><p><strong>Research</strong>. A structured analysis of what other people have done, and been kind enough to communicate in the past.</p></li><li><p><strong>Feedback</strong>. Asking a broader group of participants outside the initial workshop for their input.</p></li><li><p><strong>Experimentation</strong>. Having a go in a cheap way, before settling on a larger investment.</p></li></ol><p>All of these can substantially improve the initially described, rough idea.</p><blockquote><p>&#128188; <strong>Practical Experience</strong>: Earlier this year, I joined a very large, company wide project. This project used workshops early on in its delivery to make key decisions, but only some of the decisions were extensively written up. Later, it turned out many of the initial assumptions didn&#8217;t pan out, and the project ran into substantial trouble. The project did not have clearly defined checkpoints or moments to course correct. It was put back on track by making clear, key decisions and aligning with senior stakeholders on the new requirements &#8212; the majority in time, in writing, and with substantial earlier preparation.</p></blockquote><h2>Communicating an idea</h2><p>Let&#8217;s assume that an idea was clearly defined, if not articulated, in someone's mind. There are different ways to convey that idea, each that can solve a different problem. These include:</p><h3>Verbally</h3><p>Verbally communicating an idea is extremely cheap, requiring almost no preparation and providing the opportunity for the communication partner to take a directed path toward understanding by asking questions.</p><p>Unfortunately, verbal communication scales very poorly. While it is possible to communicate verbally to a large number of people, this substantially increases preparation cost and decreases the opportunity to ask questions with larger audiences. Additionally, verbal communication happens at a point in time, which means if someone is not present at that point, they miss it.</p><p>Lastly, while it can be very fun watching a compelling speaker speak passionately about their idea, that passion can bias us toward endorsing a fundamentally weak idea from a fundamentally strong speaker.</p><h3>With Slides</h3><p>It is possible to overcome some of the challenges speaking verbally by providing visual aids. This enriches the communication with additional context that can help reinforce the speaker's meaning, and provides some level of retrospect ability to the content later.</p><p>This is very useful to communicate pre-aligned ideas, but is less useful for developing them further. It also suffers from the &#8220;point in time&#8221; problem.</p><blockquote><p>&#128188; <strong>Practical Experience</strong>: In October 2022, I and a colleague (Salome Santos) spoke on the topic of <a href="https://www.usenix.org/conference/srecon22emea/presentation/howden">how our reliability culture and practice evolved over time.</a> While the talk seemed to be well received, it was the product of 100 hours of work getting the talk written up as a script, making slides and practicing multiple times before delivery. Writing was at the core of the slide delivery.</p></blockquote><h3>With Video</h3><p>It is even further possible to create engaging material by using a recorded talk, and then using video editing tools to provide more complex visual aids for the speaker. Speaker awkwardness can be removed, such as long pauses or other linguistic challenges.</p><p>It additionally addresses the &#8220;point in time&#8221; problem that slides suffer from, but is still not very useful for developing an idea.</p><blockquote><p>&#128188; <strong>Practical Experience</strong>: In 2023, I created a course called <a href="https://www.udemy.com/course/practical-introduction-to-observability/">&#8220;practical introduction to observability&#8221;</a>. Similarly to the slides, it used writing as the core mechanism to align content. However, to turn writing into video was about 80x the initial writing time. This is a key reason why the content has not evolved quickly, and why I have not produced additional material.</p></blockquote><h3>In Writing</h3><p>Easily my favourite way of communicating. Communicating in writing is substantially more expensive for the author, needing both to articulate their understanding and then to review it before it is published to others.</p><p>However, it is far cheaper for the readers. People can frequently read much faster than they can listen to a speaker or watch a video. While text doesn&#8217;t inherently provide visual aids, it is possible to enrich it with diagrams (or even videos) to provide the required understanding.</p><p>Writing also does not suffer the &#8220;point in time&#8221; problem, as writing can be read at any point in time &#8212; whether immediately after it has been written, or months later as a given idea is being reviewed for its efficacy. It can help us &#8220;shift back&#8221; in time to understanding our thinking at that point, rather than us trying to imagine it with the biases that our more recent experiences have created.</p><p>Lastly, writing is extremely cheap to iterate on. A typical flow for a document might be:</p><ol><li><p>Write the first draft, put it away. Read it in the morning. Edit it some more.</p></li><li><p>Send it to a colleague for their review. Edit it some more.</p></li><li><p>Send it to an immediate manager for review, in conjunction with experts from a small community. Edit it some more.</p></li><li><p>Send it to a broader community for review. Edit, and &#8220;publish&#8221; it &#8212; indicating there will be no more edits, and the decision is made.</p></li></ol><p>This is something that no other communication medium can deliver on.</p><blockquote><p>&#128188; <strong>Practical Experience</strong>: This article has been sitting in my inbox for about 4 weeks before I finally took the time to write it up. In the meantime, I added notes on what I wanted to say as I thought of it during my commute, or in discussions with those around me.</p></blockquote><h1>Point in time reading</h1><p>While it is possible for people to read documents at any time, it is frequently the case that people do not prioritize reading material without dedicating time to it specifically. To overcome this challenge, we can employ a &#8220;silent meeting&#8221;.</p><p>A silent meeting is a meeting in which all participants are given the document, and a reasonable amount of reading time (usually 50% of the meeting time). They can then read through the document, raising feedback through that meeting.</p><p>At the end of this silent reading period, a moderator will go through the comments in the document, selecting those that seem especially useful for further discussion. The group will discuss each document, after which a note will be made and the author will (later) refine the document based on the group's feedback.</p><p>This works extremely well for technical design documents, product discussions or other substantial engineering decisions. Learn more at <a href="https://www.andrewhowden.com/p/running-an-effective-meeting">&#8220;running an effective meeting&#8221;.</a></p><blockquote><p>&#128188; <strong>Practical Experience</strong>: As part of a project this year, I needed to align with multiple senior stakeholders on how to collaborate and determine a path forward. To do that, I wrote up the current challenges, contributing factors and recommendations and held a &#8220;silent meeting&#8221;. While there was discussion at the end of the meeting, this conversation anchored all future collaboration, and provided both parties with a clear path forward.</p></blockquote><h1>Writing Tips</h1><p>Communicating via writing is a skill that, like all others, takes practice. This blog is my attempt both at communicating ideas, and improving my ability to do so! However, there are some practical things you can do to improve your writing quickly:</p><ul><li><p><strong>Write toward a target audience</strong>. Have a specific group in mind when writing, and review your writing against whether those people will understand it.</p></li><li><p><strong>Keep your documents concise. </strong>While it is useful to &#8220;think&#8221; in long form, it is awkward to read. The less fluff in a document, the better. As a rule, a document should never exceed 6 pages, and a decision never more than 1.</p></li><li><p><strong>Remove complexity. </strong>When writing, it is possible to repeat yourself multiple times, to use language that is bespoke (or &#8220;unusual&#8221;). Try and remove as much of this as possible, leaving only the simplified essence behind.</p></li></ul><h1>Bonus: Large Language Models</h1><p>This past year (2024), large language models such as ChatGPT or Gemini have become substantially more prominent. These models excel at digging through an abundance of documentation for fairly vaguely articulated ideas. Ideas written up can be surfaced by these tools, giving readers that &#8220;directed path&#8221; through the material.</p><p>Additionally, large language models can be very useful as editors. This document was edited based on feedback from prompts such as:</p><ul><li><p>Consider this document as a reader who has a professional background, but is earlier in their career. Would you find it interesting? Why or why not? What would make it more interesting?</p></li><li><p>Consider this document as a reader. What information in it is redundant or repeated? What can be safely removed without hurting the "core message"?</p></li><li><p>Consider this document as a graduate level reader. What language or terminology is unclear? How could that language be simplified?</p></li></ul><p>That&#8217;s it. Happy monday fam!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Simple, Beautiful Software Development! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Anatomy of a “Good” commit message]]></title><description><![CDATA[Current thinking about what should be in a commit]]></description><link>https://www.andrewhowden.com/p/anatomy-of-a-good-commit-message</link><guid isPermaLink="false">https://www.andrewhowden.com/p/anatomy-of-a-good-commit-message</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Fri, 01 Nov 2024 14:31:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iA2z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iA2z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iA2z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 424w, https://substackcdn.com/image/fetch/$s_!iA2z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 848w, https://substackcdn.com/image/fetch/$s_!iA2z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 1272w, https://substackcdn.com/image/fetch/$s_!iA2z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iA2z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp" width="800" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iA2z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 424w, https://substackcdn.com/image/fetch/$s_!iA2z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 848w, https://substackcdn.com/image/fetch/$s_!iA2z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 1272w, https://substackcdn.com/image/fetch/$s_!iA2z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1cca7ab-799e-4a2a-8228-85cb891b774e_800x300.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#128161; <strong>This old post</strong>&nbsp;was&nbsp;<a href="https://medium.com/@andrewhowdencom/anatomy-of-a-good-commit-message-acd9c4490437">originally posted on Medium</a> on April 14th, 2018. However, it&#8217;s so useful that I moved it to the place where I keep my new posts! Enjoy, with the caveat I&#8217;ve grown some since I wrote it.</p><div><hr></div><p>Git is a tool that&#8217;s fundamental to my software development workflow. In the five years I have been a developer, I have swapped out almost all my tools, but I have found nothing super to git. Its adoption, tooling, speed, and reliability have made it a supremely difficult competitor to beat in terms of version control.</p><p>One of the more useful features of git is the &#8220;Commit Message&#8221;. As each change is applied to the software repository, it is annotated with a message. Users can put whatever they like in this message, however, some practices make it much easier when reviewing the history of the repository.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Like what you&#8217;re reading? That&#8217;s good! Want to read more? Better subscribe then.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Let&#8217;s evaluate this by taking a look at a (fake) commit message:</p><pre><code>Introduce the widget to handle image creation

The project owner has requested the ability to attach images to user
profiles. Currently in this project, while users can add images to their
own profiles, administrators cannot add an image on behalf of the user.
Administrators can create users and full out certain user details, such
as name and email. However, with the introduction of a policy to ensure
all users of the system have an up to date photograph attached to the
profile, the administrator should be able to attach this photograph at
the time of the users creation. This commit introduces the widget in the admin section that handles this capability. It reuses the existing objects that exist to represent user images, only providing a new pathway by which they might be uploaded.

== Stakeholder Impact ==
=== Project Owner ====

This will allow the project owner to add new images to user profiles.
In this case the primary users of the application are employees, and
this will allow an easier publication of the welcome packet sent to the
team about new employees to ensure the employee transition is easier. Additionally, the administrator will have a picture associated with all
users; useful for company directories or the like.

=== Users ===

By having a picture uploaded on their behalf before they start using the
system users are not required to immediately learn an unfamiliar system
to upload their own image prior to the dispatch of the welcome packet.
This allows the welcome packet to be sent earlier, and a smoother
transition into employment.

== Design Notes ==    
=== Sanitisation by image copy ===

In order to prevent any inadvertent vunlerabilities (such as the
embedding of PHP code in EXIF metadata) the image is not stored in its
original form, but rather put through a converter to drop EXIF or other
steganographically stored data.

BREAKING CHANGE: Modification of the interface for the User object
                 constructor</code></pre><p>Whoah. That was large! Let&#8217;s break it down piece by piece.</p><h1><strong>The subject line</strong></h1><p>The subject line is the first line in the commit. It&#8217;s used to show a small title of the commit in summary views, such as:</p><pre><code>$ git log --pretty=oneline # amended

cd6d940 (HEAD -&gt; master) AD-HOC refactor (deployment): Deploy automatically on master
810f662 AD-HOC fix (Prometheus Configuration): Update port used for Prometheus connections
6d2c979 AD-HOC feat (Prometheus Config): Add confluence server</code></pre><p>You can see there above a coupe of bad commits, and a good one. In the case of our commit:</p><pre><code>Introduce the widget to handle image creation</code></pre><p>The goal for the subject line is to provide a concise summary of what the commit is about when reviewing commits en masse. Given this, some guidelines are:</p><ul><li><p><strong>Make it short:</strong> I usually aim for ~72 characters long</p></li><li><p><strong>Be descriptive:</strong> Be specific about what changed. <code>Fix bug</code> is not super great, but <code>Modify the import category object to nest subcategory arrays</code> is.</p></li></ul><p>You&#8217;ll see the angular commit guidelines in various places I code. I don&#8217;t feel strongly about these, they&#8217;re just part of the spec at Sitewards.</p><h1><strong>The Commit Body</strong></h1><p>i.e. &#8220;the rest of the commit&#8221;</p><p>The commit body is where we can provide context about the commit itself. I usually break it down into several sections:</p><h2><strong>General Background</strong></h2><p>The most important aspect of a git commit message is to provide the context around a code change. In our fake commit the example is below:</p><pre><code>The project owner has requested the ability to attach images to user
profiles. Currently in this project, while users can add images to their
own profiles, administrators cannot add an image on behalf of the user.
Administrators can create users and full out certain user details, such
as name and email. However, with the introduction of a policy to ensure
all users of the system have an up to date photograph attached to the
profile, the administrator should be able to attach this photograph at
the time of the users creation.This commit introduces the widget in the admin section that handles this
capability. It reuses the existing objects that exist to represent user
images, only providing a new pathway by which they might be uploaded.</code></pre><p>As you can see, it&#8217;s lengthy. However, it&#8217;s our only opportunity to give the people who will be maintaining the code in future t<a href="https://medium.com/sitewards/git-tips-the-memoir-of-commit-messages-7d15ed2205ac">he necessary context behind the changes that we made</a>.</p><p>Some guidelines for this one are:</p><ul><li><p><strong>Break at 72 characters:</strong> It is much easier to view in primitive tools such as the CLI, is the format expected on mailing lists and is well supported by tooling. While more modern tooling is less restrictive, it&#8217;s a nice nod to our computing past.</p></li><li><p><strong>Write in the imperative</strong>: A git commit is a change (or &#8220;patch&#8221;) to code. A commit message is attached to that change &#8212; not the code itself. Accordingly, when you write a commit message you are writing it <strong>as if it&#8217;s about to be applied</strong>, rather than about what you just did.</p></li><li><p><strong>Use consistent terminology: </strong>after many years of working with a project, or even many projects, it&#8217;s sometimes hard to track what a developer meant with a word in one case compared with another. For example, &#8220;administrator&#8221; may mean developer, project manager, project owner, the staff working on the project or special users. Settling on canonical terminology makes it much easier to understand changes over time, as well as search the repository.</p></li><li><p><strong>Use a standard markup format: </strong>Whether it&#8217;s Markdown, MediaWiki, Restructured text etc. It&#8217;s useful if a standard markup format is used in git commits. While it&#8217;s unlikely to be rendered, it provides guidelines on how to structure lists, headings etc which make it clear how the content should be written.</p></li><li><p><strong>Provide as much context as you can: </strong>It&#8217;s super hard to understand what was going through a colleague&#8217;s mind (or even your own) 6 months after the code has been committed. Providing the context allows understanding of why the code was changed, not simply how.</p></li></ul><p>Though it&#8217;s not usually necessary, we can even go so far as doing ASCII diagrams or other lists or other useful structures in a git log. Whatever is required to convey the context behind the commit.</p><p>Additionally, the guidelines here apply to subsequent sections.</p><h2><strong>Stakeholder Impact</strong></h2><p>Another large section:</p><pre><code>== Stakeholder Impact ==
=== Project Owner ====

This will allow the project owner to add new images to user profiles.
In this case the primary users of the application are employees, and
this will allow an easier publication of the welcome packet sent to the
team about new employees to ensure the employee transition is easier.Additionally, the administrator will have a picture associated with all users; useful for company directories or the like.

=== Users ===
By having a picture uploaded on their behalf before they start using the
system users are not required to immediately learn an unfamiliar system
to upload their own image prior to the dispatch of the welcome packet.
This allows the welcome packet to be sent earlier, and a smoother
transition into employment.</code></pre><p>The stakeholder impact allows us to both mentally self-check and restate the intended goals of the work. By writing up the impact on the people who are associated with this work, we clearly describe what we intend will be the outcome once the changes are merged as well as to whom and why the changes matter.</p><p>Some tips for this section are:</p><ul><li><p><strong>List all stakeholders before writing notes: </strong>By listing all those involved in a project before writing how our changes will affect them, we ensure that we do not skip those who might not occur to us on first thought, and spell out the implications for those users.</p></li><li><p><strong>Restate the goals of the work in the context of the stakeholder: </strong>Too often it&#8217;s easy to get lost in the implementation of the work rather than the impetus that started it. I have adjusted more than one commit as I have realised I forgot or misunderstood something as I was committing it.</p></li><li><p><strong>Omit stakeholders you deliberately haven&#8217;t considered: </strong>Sometimes, changes simply don&#8217;t concern a given stakeholder. Project owners often don&#8217;t care about server configuration changes or instrumentation improvements &#8212; but developers do. In omitting them it&#8217;s clearly communicated they&#8217;re not the intended audience for the change.</p></li></ul><h2><strong>Design Notes</strong></h2><pre><code>== Design Notes ==
=== Sanitisation by image copy ===
In order to prevent any inadvertent vunlerabilities (such as the
embedding of PHP code in EXIF metadata) the image is not stored in its
original form, but rather put through a converter to drop EXIF or other
steganographically stored data.</code></pre><p>When doing any sort of development work, we make tradeoffs between various factors that we are implementing. However, these tradeoffs are not visible to users who are reviewing our code either doing a code review or simply when trying to understand the code at a future date.</p><p>By explicitly stating these tradeoffs, we add additional information that may help future developers as they revisit this code, or try and write other systems that are dependent on this system.</p><p>Some tips for this are:</p><ul><li><p><strong>Answer questions in design notes</strong>: Whether in code review, chat or any other tooling try and answer questions by adding them to the design notes, rather than simply replying inline. In this way, answers are recorded for all future developers rather than simply for that conversation.</p></li><li><p><strong>Make notes during development: </strong>Sometimes, when development work is particularly in-depth, we forget the tradeoffs that we make as we write the code. Make notes during development about decisions you have made so they&#8217;re much easier to record in the commit.</p></li></ul><h2><strong>Breaking Changes</strong></h2><pre><code>BREAKING CHANGE: Modification of the interface for the User object
                 constructor</code></pre><p>This section makes it clear when things have changed that other users may have to be aware of, either when accepting the patch or deciding on a version under which to release this software.</p><h1><strong>Making that easy</strong></h1><p>The above is super hard to remember. I would find it impossible to reliably implement it all the time. However, git allows contemplating of commit messages! In this, we can add helpful pointers to let us remember this and other guidelines. For more information, see the following article:</p><p><a href="https://medium.com/sitewards/git-tips-template-your-commit-messages-187d8a2051b8">https://medium.com/sitewards/git-tips-template-your-commit-messages-187d8a2051b8</a></p><h1><strong>In Summary</strong></h1><p>Git histories are an incredibly valuable tool. However, it&#8217;s sometimes not clear what delimits a &#8220;good&#8221; commit message from a &#8220;bad&#8221; one. The above is a rough standard that I try and reach while developing, and one that I have found pays off within a few months.</p><h2><strong>Thanks</strong></h2><ul><li><p>Tbaggery, <a href="https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html">whose guidelines I shamelessly rip off here</a>.</p></li><li><p>Matthew Gamble, who originally educated me in great pain about these things.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks also to you! Your reading of these articles motivates me to write more. Getting these subscriber notifications is a joy in my day! Want to bring me joy? Well, enter your email!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Should you go to SRECon?]]></title><description><![CDATA[A story about whether or not it is useful to go to conferences (spoiler: yes), why, how to maximize the value and how to overcome the invariable challenges you'll face.]]></description><link>https://www.andrewhowden.com/p/should-you-go-to-srecon</link><guid isPermaLink="false">https://www.andrewhowden.com/p/should-you-go-to-srecon</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Mon, 16 Oct 2023 15:30:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9a2adb23-3587-4980-8c3a-bee4ca181a3e_1764x1437.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On Friday, 13th October, Exhausted, I returned <a href="https://www.usenix.org/conference/srecon23emea">from SRECon EMEA 23</a>. A conference I have been to twice now is one of my favourite ways to spend time and the most critical professional periods of my career. However, of all the people I know and work with, only a tiny slice go to these conferences each year. This post is for people <em>who do not</em> but who are interested in whether they can / should in future.</p><p>Let&#8217;s start by looking briefly at <em>this</em> conference.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Whoo boy, this post is different! Most of my posts are less community-focused. Still, if you like the work, consider subscribing! </p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>SRECon</h1><p>SRECon is:</p><blockquote><p>a gathering of engineers who care deeply about site reliability, systems engineering, and working with complex distributed systems at scale. SREcon strives to challenge both those new to the profession as well as those who have been involved in it for decades. &#8212; <a href="https://www.usenix.org/conference/srecon23emea">SRECon</a></p></blockquote><p>It is a <em>problem-oriented</em> conference (as opposed to a technology-oriented or vendor-oriented conference). It thus tends to have a wide range of talks, approaching software operations from different sides. This year, there were deep dives into technology (e.g. <a href="https://www.usenix.org/conference/srecon23emea/presentation/rice">eBPF</a>), reliability, domain (e.g. a <a href="https://www.usenix.org/conference/srecon23emea/presentation/kammermann">Telco</a>), learning and development (e.g. <a href="https://www.usenix.org/conference/srecon23emea/presentation/kumari">Scale your Future</a>) and organizational change (<a href="https://www.usenix.org/conference/srecon23emea/presentation/alves">Tracing the journey of Distributed Tracing</a>). </p><p>The immediate question is, is this a <em>valuable </em>conference? Moreover, is it <em>sufficiently valuable to dedicate a week of work, flights and hotels</em>? For this particular conference, I obviously think the answer is &#8220;yes&#8221;. But let&#8217;s dive into the value of a conference more generally and how you can maximize it while you&#8217;re there.</p><div class="pullquote"><p><strong>Heads Up </strong>&#128161;<strong> </strong>One of the reasons that SRECon is such a good conference is because the organizers truly believe and commit to delivering <a href="https://www.usenix.org/about">on the USENIX Mission</a>. The USENIX members and sponsors support this mission and make this conference (and the YouTube content) possible. If you appreciate this material, consider <a href="https://www.usenix.org/annual-fund">donating</a> or <a href="https://www.usenix.org/membership">becoming a member.</a> I picked membership!</p></div><h1>Value</h1><p>Most of the &#8220;work&#8221; that seems to go around a conference is in scheduling and planning the talks that go into it or choosing which talks to attend. However, there is vastly more that you can do at conferences if you keep your eye out for the opportunity. For me, the most valuable aspects of a conference are:</p><ol><li><p>Meeting People</p></li><li><p>Sharing Knowledge</p></li><li><p>Consuming Talks</p></li><li><p>Sightseeing</p></li></ol><p>Let&#8217;s dig into these a little bit.</p><h2>People</h2><p>It&#8217;s hard to overstate quite how much technology is a people-driven industry. Often, a handful of people write technology that changes the landscape of software engineering. People meet at conferences, discover a shared need, and work across organizational boundaries to try and find a standard solution to that problem. People are actively scouting talent to solve deeply challenging engineering problems. Invariably, some (like me soon<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>) use these conferences to try and find our next opportunity.</p><p>Working with people is slightly different from working with technology or a bureaucracy. People tend much more quickly to picture those they&#8217;ve seen or interacted with as partners, employees or managers. People weigh the ideas of others with greater heft if they&#8217;ve seen their peers react well to those ideas and will pay progressively more attention to them the more <em>others also </em>pay attention.</p><p>Attending a conference can be a massive boon to hiring or your efforts to find work simply because it exposes you to many people. At worst, the more you&#8217;re exposed, the more likely you&#8217;ll find someone looking for the particular kind of magic you&#8217;ll bring to an organization. At best, you&#8217;ll find new colleagues who bring the experience you sorely need within your organization, or perhaps you&#8217;ll find an organization that understands the value you can bring in a way your existing one struggles to.</p><p>There are ways in which you can work to maximize this value. These include:</p><h3>Meet new people</h3><p>Suppose you are attending a conference in another country and in a new environment. In that case, it can be extremely compelling to hang with people you brought along for the journey or meet regularly at these conferences.</p><p>My recommendation is to avoid this, if possible. The challenge here is that there are many ways to catch up with people you <em>know </em>already but few ways to get to know people you do not. A conference brings many people together with a shared interest, thus the perfect opportunity to meet these new people.</p><p>There&#8217;s no graceful way (in my experience) to go about this. Easily my favourite strategy is walking around with a coffee until you spot a gap in a group, and then ask at a convenient moment, &#8220;Do you mind if I crash this conversation?&#8221;. You will sometimes get uncomfortable looks, and you can move on &#8212; but far more often, you&#8217;ll get &#8220;Of course! We&#8217;re talking about &#8230;&#8221;. Once you join, listen in, ask some questions, and if the opportunity arises, share your experience. Be a polite &#8220;conversational guest&#8221;.</p><p>Lastly, if the opportunity comes up toward the end of the day, invite people out for dinner or join a shared dinner. The conversations at dinners can go much deeper, and you can build a much more lasting connection over fish and chips and a glass of wine.</p><blockquote><p><strong>In Practice @ SRECon</strong></p><p>At SRECon, I met quite a large number of people this way, and had some tremendous conversations with colleagues from Microsoft, Reddit, Slack, Pragmatic AI Consulting, Nobl9, Lightstep (now ServiceNow). Mostly I just listened, and asked questions, and tried to bounce the conversation to include other listeners. As a result, I now have multiple new connections for both my courses and when I&#8217;ll need work again &#129299;</p></blockquote><h3>Grab LinkedIn</h3><p>As you&#8217;re talking to different people, there&#8217;s a natural moment in which the conversation will end &#8212; going into a talk, for example. At that moment, if you&#8217;d like to catch up later, you can always ask for people&#8217;s LinkedIn. Something like, &#8220;Oh! We could connect on LinkedIn if you like?&#8221; is usually sufficient; people can always refuse this with something like &#8220;Ahh, sorry, I do not have mine handy and need to run!&#8221;. </p><p>Following the conference, you can go through LinkedIn and figure out if there&#8217;s anyone who made a connection that you&#8217;d like to reach out to later. LinkedIn helpfully <a href="https://www.linkedin.com/help/linkedin/answer/a566261">sorts them by recency.</a></p><blockquote><p><strong>In Practice @ SRECon</strong></p><p>Here, I didn&#8217;t do this as much as I should have for this year &#8212; I learned from others. However, at the end I discovered the recency short, and messaged all those who were kind enough to reach out. Quite a number of us live in Berlin! I fully intend to reach out and arrange a gathering.</p></blockquote><h2>Sharing Knowledge</h2><p>To understand why sharing your perspective with the community is so valuable, it is first essential to understand one of the weirder dynamics of growing within our careers. Beyond a certain career level, hiring the person who will be best in class in a given position is far less essential than ensuring you do not hire the person who will be destructive in that position. </p><p>This is perfectly reasonable given some thought about the organization itself &#8212; an organization can definitely survive being less efficient. Still, it cannot survive if the organization is torn down and stops delivering value.</p><p>That begs the question: How do you identify the people likely to be &#8220;sufficiently valuable&#8221; with limited risk of being &#8220;destructive&#8221;? Well, you ask them for their perspectives on a series of complex tradeoffs and ensure their tradeoffs and decisions align with yours (or are at least logical and defensible).</p><p>That brings us back to sharing knowledge. The challenge of people looking to hire senior colleagues and those running the conference is similar &#8212; find people who have to solve a challenging problem and ask them how they did that. The boon for you, as the speaker, is that by sharing your perspective across the audience (and on YouTube), you&#8217;re <em>proactively sharing your tradeoffs</em> <em>and approach</em>. In this, you&#8217;re exposing yourself to a wide range of people looking for that candidate and who might approach you based on that experience &#8212; even years later.</p><p>In parallel, it&#8217;s nice to give back to the engineering community as so many others are so kind with their knowledge. You might ignite an engineer&#8217;s curiosity and fundamentally transform their perspective! I have seen many talks that have changed mine. Additionally, nothing teaches you a topic like knowing you will have to present it and answer questions in front of up to a few hundred people.</p><p>Like before, there are a few ways to maximize your value here:</p><h3>Submit the Call for Papers</h3><p>You must submit the call for papers to talk at any conference.  The reviewer decides whether or not to include your talk based on these proposals, so take them seriously. </p><p>What to submit is a challenging question, but I would look at the lessons <em>you personally </em>have learned over the past 12 months and take the opportunity to submit those. Don&#8217;t worry if someone else has already published material on this before &#8212; we are all at different points in our growth journey, and your version might be what someone else needs to hear at theirs.</p><p>You will face rejection in the majority of cases. There are too many enthusiastic speakers! But knowing that ahead of time is helpful, so you do not feel disheartened when the &#8220;no&#8221; comes back. </p><blockquote><p><strong>In Practice @ SRECon</strong></p><p>This year, I submitted one full length talk that was rejected:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!djTz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!djTz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 424w, https://substackcdn.com/image/fetch/$s_!djTz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 848w, https://substackcdn.com/image/fetch/$s_!djTz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 1272w, https://substackcdn.com/image/fetch/$s_!djTz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!djTz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png" width="661" height="111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:111,&quot;width&quot;:661,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19600,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!djTz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 424w, https://substackcdn.com/image/fetch/$s_!djTz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 848w, https://substackcdn.com/image/fetch/$s_!djTz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 1272w, https://substackcdn.com/image/fetch/$s_!djTz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc88fbe-dfcb-4983-8b29-bdc8cc598d9c_661x111.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And three lightning talks, two of which were rejected:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kKLn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kKLn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 424w, https://substackcdn.com/image/fetch/$s_!kKLn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 848w, https://substackcdn.com/image/fetch/$s_!kKLn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 1272w, https://substackcdn.com/image/fetch/$s_!kKLn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kKLn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png" width="649" height="137" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:137,&quot;width&quot;:649,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22915,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kKLn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 424w, https://substackcdn.com/image/fetch/$s_!kKLn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 848w, https://substackcdn.com/image/fetch/$s_!kKLn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 1272w, https://substackcdn.com/image/fetch/$s_!kKLn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F233bc2c2-a825-482b-a5c9-75faef76a8e4_649x137.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You can find the talk I did on stage <a href="https://www.youtube.com/watch?v=mQWghl7w6-k">duplicated on YouTube.</a></p></blockquote><h3>Practice</h3><p>Let&#8217;s assume that you&#8217;re lucky enough to have a talk (or a lightning talk) submitted. Congratulations &#127881; You&#8217;ll then need to write that talk. Without going into detail, the process I usually follow is:</p><ol><li><p>Write a post or a script</p></li><li><p>Practice reading that aloud, editing along the way. </p></li><li><p>Write slides</p></li></ol><p>After that, in theory, you&#8217;ve got &#8220;everything you need&#8221; to present! However, presenting has one key factor that I (at least) find deeply challenging to overcome: sheer bloody panic. Presenting in front of people is terrifying; my legs shake, I speak too fast, and my mind goes blank. I rarely remember the talks themselves.</p><p>I&#8217;ve found only one solution to this over the years: Practice. Practice a lot. The reason to practice is to overcome that panic by &#8220;falling back&#8221; on the version of the talk you&#8217;ve wired into your brain. At best, you do not need it, but at worst, you can at least convey the talk you <em>intended </em>to convey without adjusting it to variables on the day. So, practice it, practice speaking it, practice it in front of your dog, practice it with a clicker and then practice it to a small community. Practice it until you&#8217;re hearing your voice in your sleep.</p><p>Lastly, when you&#8217;re at the conference, figure out where and how you&#8217;ll present. Figure out what mic you&#8217;ll be using, whether you can take notes, whether there&#8217;ll be a &#8220;confidence monitor&#8221;, and so on. Ideally, take a break to walk on stage in the empty room and test your computer's work with the HDMI. All of this minimizes the panic-inducing moments.</p><blockquote><p><strong>In Practice @ SRECon</strong></p><p>This year, I only did a lightning talk and did exactly as I described above (though it was only 4 minutes). I was still over too quickly.</p><p>Last year, however, I did a talk with a colleague (<a href="https://www.linkedin.com/in/salom%C3%A9-santos-b50440152/">Salom&#233; Santos</a>). We had practice the talked exhaustively before the conference, but shortly before Salom&#233; needed to present remote! In talking to the AV team, this meant that we would have no slides. Additionally, the whole talk setup was very unusul. </p><p>We adjusted to these constraints by falling back on what we&#8217;d practice. While I felt nothing but panic during the talk, it all worked out beautifully for the conference itself. I later got the opportunity to speak at another, industry internal conference as a result!</p></blockquote><h2>Talks</h2><p>Lastly (for the conference itself), we have the talks. I put the talks last because, <a href="https://www.usenix.org/about">thanks to the USENIX mission</a>, <a href="https://www.usenix.org/membership">the members who support it</a> and the conference sponsors, they&#8217;re available on YouTube afterwards. That&#8217;s not to say there are not valuable to do on the days &#8212; they are &#8212; but given a choice between making a connection and viewing a talk, I&#8217;ll choose the connection and watch the content a bit later.</p><p>That said, talks are still super helpful. First, and with some irony, they&#8217;ll bring together other people, <em>even within a conference, </em>who are interested in a topic you&#8217;re also interested in. That makes it an excellent opportunity to connect with those people (or the speaker) to ask further questions or discuss their challenges.</p><p>Second, I&#8217;ve lost count of the times I&#8217;ve watched a talk and had my perspective fundamentally shifted. Talks on Human Factors and Safety Science were recently my most substantial shifts and structured how I ran Embedded SRE for the last couple of years.</p><p>As always, there are ways to maximize your value from talks.</p><h3>Seek Value</h3><p>At a conference, you&#8217;re generally there for specific work reasons. That means to get the most value out of topics; you should pick the topics relevant to your job (or the job you want) that help you understand a challenge you are facing in a new way or provide you with peers to discuss it. </p><p>This means <em>not picking the talks because the speakers are compelling or because you are excited by the topic</em>. This is the hardest challenge and one I regularly fail, as I deeply love digging into the Linux kernel and technology challenges around infrastructure. Still, my job focuses on enabling software engineers to own much more frequent, less complex operational challenges.</p><blockquote><p><strong>In Practice @ SRECon</strong></p><p>At SRECon I joined some talks on topics that I am currently working on, such as Observability. It was super helpful as I was struck there&#8217;s still a substantial disconnect between how operations people see Observability versus how product engineers see it. This is encouraging for me, as this is the problem I set out to solve with the<a href="https://h4n.link/pito"> Practical Introduction to Observability.</a> I also learned quite a bit more about Machine Learning observability, and made a connection with an expert in this domain (<a href="https://www.linkedin.com/in/lina-weichbrodt-344a066a/">Lina Weichbrodt</a>)</p><p>However, I also failed here and joined talks on Chubby (and its history) as well as Sockmap in the kernel. In my own defense, there&#8217;s only so much I can focus without joy &#128517;</p></blockquote><h3>Thank the Speaker</h3><p>Speakers are people too, and people who just went through an emotional ringer in front of many other people. You can help brighten their day by thanking them for their talk and pointing out a concrete insight you took away from it. You can ask if they (later) want feedback on it, or if you have only positive feedback, pass that on directly.</p><p>You&#8217;ll be surprised how many speakers are grateful for this! I know I sure am. You might not get answers immediately (or at all) &#8212; speakers tend to get bombarded with questions after a talk.</p><h2>Sight Seeing</h2><p>Last on the list. Personally, the fundamental reason I started going to conferences was that I was too poor to travel independently. I figured out that the conference ticket is free if I speak, and I can get work to (at least) chip in for my flight under &#8220;employer branding&#8221;. Its no additional cost for the employer to send you a few days earlier, so you can get your own hotel for the extra couple of days and look around.</p><p>My financial situation has somewhat improved, but some of my life's best travel experiences have been just before or just after a conference. My wife and I will go, explore the city for a little while and then I&#8217;ll head to the conference. We&#8217;ve been to a bunch of remarkable and unexpected places like this! </p><blockquote><p><strong>In Practice @ SRECon</strong></p><p>My wife and I went a few days early, and did the Guiness tour, Viking bus and quite a few dinners and afternoon cocktails. It was great fun! After that, she went back and I went into &#8220;full conference mode&#8221;.</p><p>Right now, I have no employer so there is no financial benefit for doing this way. But we have the habit, and its a nice one to keep.</p></blockquote><h1>Challenges</h1><p>So! We&#8217;ve talked extensively about the value of this conference, how to maximize it, and examples from this year&#8217;s SRECon. However, at this point, you might think, &#8220;This sounds all great and well, but I cannot do this because &#8230;&#8221;.</p><p>Let&#8217;s chat about some of the challenges that I (at least) faced </p><h2>Cost</h2><p>The first and most substantial challenge is cost. SRECon this year cost me ~3,000 &#8364; all up. 1000 for the tickets (approx), another 1000 for the hotel, 150 for the flights (I live close), and a few hundred for food and incidentals. This is an enormous outlay of cash, no matter your financial position!</p><p>Fortunately, there are definitely ways in which you can limit how much you spend.</p><h3>Learning &amp; Development Budgets</h3><p>In this post, we&#8217;ve talked extensively about the value of conferences, settling on the primary value being around <em>people</em>. For companies, the highest ROI for conferences is sending people for hiring rather than <em>learning</em>. Still, the shared understanding that conferences are educational means that we can usually use our &#8220;learning and development&#8221; budgets to attend.</p><p>Often, just the ticket will exhaust or multiply the budget. However, these budgets are often pooled between 30 people, and companies can inadvertently make them hard to reach. This means that if you ask toward the end of the year when the budget is essentially &#8220;doing nothing&#8221; and will shortly expire, it&#8217;s easy to argue to spend it all on a conference ticket.</p><h3>Speaking</h3><p>So far, we&#8217;ve discussed speaking as primarily valuable if you&#8217;re looking for either work yourself or some new colleagues to work with. However, one pragmatic upside of speaking is the free ticket.</p><p>Additionally, companies can look at <em>speakers </em>differently than they look at <em>attendees</em>. This means working with corporate communications to ensure your talk is aligned (which, if you&#8217;re in a large org, you need to do anyway); <em>however, </em>it also means there&#8217;s a separate and often much larger budget to tap for your flights and hotels.</p><p>Speaking is how I used to be able to afford to attend conferences!</p><h3>Sharing</h3><p>While not something you can do beforehand, it is much easier to convince management figures that a conference is worthwhile if there is clear evidence that attending it drove positive change within the organization. Notably, this change doesn&#8217;t have to come from <em>you</em>.</p><p>You can use what you learned at the conference to try and drive change through your organization <em>simply by summarizing your discoveries for others to consume</em>. That gives people an &#8220;editorial view&#8221; of the material and helps them discover relevant things specific to their context. This is illustrated in an exceptionally amusing way by <a href="https://twitter.com/NYCDubliner">Tiarn&#225;n de Burca</a> in this Slack thread.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w4Oo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w4Oo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 424w, https://substackcdn.com/image/fetch/$s_!w4Oo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 848w, https://substackcdn.com/image/fetch/$s_!w4Oo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 1272w, https://substackcdn.com/image/fetch/$s_!w4Oo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w4Oo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png" width="708" height="112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:112,&quot;width&quot;:708,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22138,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w4Oo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 424w, https://substackcdn.com/image/fetch/$s_!w4Oo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 848w, https://substackcdn.com/image/fetch/$s_!w4Oo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 1272w, https://substackcdn.com/image/fetch/$s_!w4Oo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96aea6e4-d1c9-45f3-9ce7-ec9d8fe4d1e2_708x112.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Writing this up is cheap and can be done the day after the conference! </p><blockquote><p><strong>In Practice @ SRECon</strong> </p><p>This post was inspired by a discussion within a chat on this very topic. Hopefully it helps people understand just how valuable these conferences can be!</p></blockquote><h2>Time</h2><p>The conference takes a significant amount of <em>time </em>away from your professional work. If you are working in an organization with strict deadlines, this can be challenging. In terms of getting that time approved, the approach is similar to the cost issue &#8212; try to clarify the value of going and sharing the knowledge you gained when you return. If it is &#8220;ambassadorial&#8221; work, it is much easier for companies to pay for than if it is &#8220;learning&#8221;.</p><p>That said, at the outset, be clear that this is not &#8220;work time&#8221; &#8212; you will be entirely unavailable during this period. The value of the conference is in the people, and when and how to meet with them tends to be unpredictable. You should not plan work at this time.</p><p>Aside from that, plan the time away as you would a holiday!</p><h2>Exhaustion</h2><p>Lastly, you'll quickly discover a challenge unique to the conference itself: Exhaustion. Essentially, you&#8217;re heading away from home to an (often cheap) hotel, and you&#8217;re not going to have the local coffee or food shops that you&#8217;re used to. You&#8217;ll be joining peers from across the industry, trying to put on a witty or polite facade for 12 - 16 hours a day over multiple days.</p><p>During this period, it is critical to be kind to yourself. Find a way to get space if you become overwhelmed, ensure that you get enough sleep and limit your alcohol intake to one that doesn&#8217;t interrupt your sleep (or interrupt your &#8220;ambassadorial work&#8221;).</p><p>Lastly, take care of things like the Coronavirus (or other kinds of sicknesses). If you are sick, stay away. Brutal though that is, by joining anyway, you&#8217;re probably taking out a large chunk of the critical engineering staff across multiple companies across a couple of weeks. When you&#8217;re there, you should feel empowered to take measures for your safety, such as wearing a mask, frequently washing your hands or working with organizers to ensure the rooms are adequately ventilated.</p><blockquote><p><strong>In Practice @ SRECon</strong> </p><p>This year, the primary challenge I faced was food. I train a few hours daily at the moment, and no food means I quickly get &#8220;Hangry&#8221;. I quickly found a local bakery which does good coffee and sausage rolls, and I disappeared there when I got overwhelmed.</p><p>The hotel itself was far away, so I blew my budget on Ubers at Midnight. Money well spent &#8212; money is cheaper than sleep &#8212; and I&#8217;ll book a closer hotel next time.</p><p>Lastly, I skipped a few talks I had intended on joining when I wasn&#8217;t able to be my &#8220;present and jovial self&#8221;. They&#8217;ll be on YouTube anyway, and I saved myself for dinner or the break.</p></blockquote><h1>In Summary</h1><p>The question asked at the outset &#8212; Should you go to SRECon &#8212; is hopefully answered. For me, at least, the answer is overwhelmingly &#8220;Yes&#8221;; so much so that I sponsored my ticket this year (as I am unemployed). Hopefully, this article helps you understand <em>why </em>it is so valuable, how to maximize that value and how you can overcome some of the organizational inertia required to attend.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Wow, you made it to the end. Kudos!! You must like my writing. Or at least, my writing augmented with Grammarly. How about showing that through a subscription?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Probably not till December or January. I want to focus on getting this <a href="http://h4n.link/pito">Practical Introduction to Observability</a> done.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Suddenly, you’re in charge. How do you create direction?]]></title><description><![CDATA[A story about how I've learned to use strategy as a common tool]]></description><link>https://www.andrewhowden.com/p/suddenly-youre-in-charge-how-do-you</link><guid isPermaLink="false">https://www.andrewhowden.com/p/suddenly-youre-in-charge-how-do-you</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Mon, 04 Sep 2023 06:00:11 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/136640375/54e7c45dd6b4001cd8b7b3b4fce976f5.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p></p>]]></content:encoded></item><item><title><![CDATA[Suddenly, you're in charge. Now what?]]></title><description><![CDATA[Some tools and techniques I've used in the past to create a common sense of direction and purpose.]]></description><link>https://www.andrewhowden.com/p/suddenly-youre-in-charge-now-what</link><guid isPermaLink="false">https://www.andrewhowden.com/p/suddenly-youre-in-charge-now-what</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Fri, 01 Sep 2023 14:52:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d98a2c04-5924-442f-805b-b91f72166965_1654x1183.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>This one is a pretty long read. You can find it broken up into chunks on YouTube <a href="https://www.youtube.com/playlist?list=PL2gXMIxM-1Olq7il4JNVFn8yH63zPe13X">on YouTube!</a> More of a listener? I&#8217;ll upload that shortly.</p></blockquote><p>I&#8217;ve found myself suddenly responsible for a large group of technical people a few times. I&#8217;ve done this in preparation for CyberWeek, driving reliability projects across the checkout and in the formation of my team. I want to talk today about some of the tools and techniques I use to create a shared understanding, sense of purpose and direction in the people I am working with to deliver &#8230; something or other.</p><p>The sharpest, hardest lesson I learned was with the creation of Embedded SRE. In 2019, we hired four engineers with a broad mandate: &#8220;Improve the reliability of the transactional experience&#8221;. We&#8217;d be four people working with over 160 engineers, managers, technical experts and other contributors. We somehow had to come to terms with this and develop some semi-reasonable plan to make that area more reliable. For the first five months, we essentially &#8220;span wheels&#8221; &#8212; we did some operational work, but nothing substantial.</p><p>Fortunately, the engineering director in this domain, Andrei Gherasim, came to my rescue. He and I collaborated on a document called &#8220;Mission and Strategy 2022&#8221;. This document covered the scope, purpose, engagement model and broad deliverables my team would deliver over the next nine months. We kept reviewing it until we had it in good shape, after which we started sharing it with the engineers, directors and VPs my team would ultimately engage with.</p><p>That document changed the course of my team. Suddenly, rather than needing to negotiate each commitment individually with the stakeholders, we had a transparent contribution model and a path to choose when (and when not) to intervene. We had expectations to fulfil ourselves, and leadership within each domain could fold us into their operational plan. That strategy worked beautifully &#8212; for about a month or so. Then, a new operational challenge popped up, and we suddenly had too much to deliver on. We half-delivered a bunch of stuff.</p><p>2023 rolled around, and we did a review of that strategy. We identified what assumptions we had initially that didn&#8217;t bear out and what underlying theory we had that turned out to be wrong. It was a hard one to go through. I wrote up a new strategy that factored in our challenges in 2022. This strategy was more successful than the previous one; we made systems substantially more reliable. The process had room for improvement, but this structured approach was vital for my learning and the team's evolution.</p><p>Recently, I&#8217;ve been writing up another strategy for the course. It has helped me shape my approach, and I&#8217;ve iterated on quite a few it's still on paper. Given this, I thought I&#8217;d share my general approach to disambiguating the unknown based on the last couple of years of figuring this out for my commitments. Who knows, maybe it&#8217;ll save you months of stress as it did me!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This one is a pretty long read. How about subscribing now so you don&#8217;t forget?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>The Problem</h1><p>To figure out how to write a strategy, we must first understand the problem we want to solve by writing a strategy. In his book &#8220;Good Strategy, Bad Strategy: The Difference and Why It Matters,&#8221; Richard Rumelt squares this away on page #1:</p><blockquote><p>&#8220;The core of strategy work is always the same: discovering the critical factors in a situation and designing a way of coordinating and focusing actions to deal with those factors&#8221;</p></blockquote><p>In my experience, an organisation (whether it&#8217;s a team, department or whole company) is organised around a small set of fundamental problems. Substack lets independent writers and podcasts directly publish to their audience and get paid through subscribers. Netflix enables people to watch the latest TV immediately on their devices. In the upcoming Site Reliability Engineering courses, I want to empower engineers to run software reliability through a reference approach to software operations.</p><p>There are usually many, many different ways to solve a problem. A large subset of these will get the job done at some point, and a smaller subset will be as efficient &#8212; if we execute that idea exclusively. To solve a problem, everyone needs to rally behind a single approach. The correct method for any organisation depends on its strengths, weaknesses, capabilities and challenges. So, the next step is to figure those out!</p><p>As a necessary caveat, I&#8217;m still learning to write &#8220;strategies&#8221; and lead people. It&#8217;s a fun adventure, but some positions might surprise you if you&#8217;re a more experienced leader. That&#8217;s fine &#8212; just correct me in the comments, and I&#8217;ll have learned more!</p><h1>SWOT</h1><p>In 1965, three colleagues (Robert, Otis and Arnold) designed SWOT to appraise an organisation's strengths, weaknesses, opportunities and threats. While it is a little older, it is still handy for inventorying what we need to consider when crafting our strategy. It is also a fantastic way to open our strategic planning to a larger community, sourcing perspectives from diverse people across job roles.</p><p>A SWOT analysis consists of a 4x4 grid. In this grid, we label a section for each component:</p><ul><li><p><strong>Strengths</strong>: Characteristics of the organisation that give it an advantage and can be leveraged</p></li><li><p><strong>Weakness: Characteristics of the organisation that give it a disadvantage and need to be overcome</strong></p></li><li><p><strong>Opportunities: Something in the environment that can we can exploit for an advantage</strong></p></li><li><p><strong>Threats: Something in the environment that poses a risk to the organisation</strong></p></li></ul><p>For solo projects, a landscape document is acceptable; for collaborative work, a whiteboard (or virtual whiteboard) to which &#8220;sticky notes&#8221; can be attached works well. I have more valuable insights when doing something other than my everyday work (such as cleaning the house or walking to the shops), so I stick it somewhere accessible and add to it over a few days.</p><p>Let&#8217;s take, for example, my current goal to enable engineers to run software reliability through a reference approach to software operations. I have some <strong>strengths</strong>, such as extensive experience running software and helping 160 teams at a large eCommerce company do the same. I have a small social media following, access to multiple engineering communities, relationships with many engineering leaders in this domain across Berlin and some experience creating content. I also have some <strong>weaknesses</strong>, such as challenges focusing on a topic for an extended time, inexperience in producing educational content, no experience in marketing or monetising this content or the isolation that comes with working solo on a project. There is <strong>opportunities</strong> to make the course material as helpful as possible through collaboration with peers in industry and conferences and determine whether the problems I see running software are as substantial as I imagine. Lastly, there are <strong>threats </strong>to this project, including a minimal period and the parallel requirement to find a new job to start in December or January.</p><p>With the SWOT analysis, we have a good index of the organisational capabilities. This is great! The next is to start thinking about the actual strategy.</p><p><em><strong>&#128161; You can try this in your workplace</strong></em><strong>. </strong><em>You can do it alone or with a team; take a moment and figure out what strengths, weaknesses, opportunities, and threats exist within your organisation. Once you&#8217;ve written this up, overlay this with your current strategy or the work you&#8217;ve been doing over the last three months. Are you maximising your strengths? Overcoming your weaknesses? Are there opportunities in the next weeks you can take advantage of? Challenges you should be preparing yourself for?</em></p><h1>Story #2: Site Reliability Engineering</h1><p>I&#8217;ve seen a lot of different &#8220;strategy documents&#8221;. They can vary widely in their ability to empower an organisation to solve their core problem, but one example sticks out in my mind: The formation of the Site Reliability Engineering department. I want to share this story as it was especially pivotal for my understanding, and I want you to understand the power of a good strategy.</p><p>In 2019, the organisation at which I was working did a reorganisation of central technology teams. It brought a series of teams together, including the &#8220;incident management&#8221; team, the &#8220;logging&#8221; team, the &#8220;SRE enablement&#8221; team and the &#8220;visibility&#8221; team, all under a leader called &#8220;Luis Mineiro&#8221;. The reorganisation made sense &#8212; the teams were all oriented around ensuring engineers could understand and operate their software. The teams had worked together in the past but had very different ideas as to how the future for their teams should look like and little notion as to how they should work together for a shared purpose.</p><p>Enter: &#8220;The Site Reliability Engineering Strategy 2020&#8221;. Luis wrote this document in collaboration with the engineering managers of each of those teams and created a shared understanding of the vision and purpose of the department. It rallied the teams together to make their work substantially more cohesive and clarify what the department would do and what it would not. Consequently, the department was able to ship remarkable changes quickly, restructuring incident response, rebuilding the time-series system and delivering a new model for thinking about time-series data.</p><p>The question that didn&#8217;t occur to me until I created my team was why this strategy was so successful. Why did engineering managers buy in so heavily? Where did it enable decisions, and how? Unfortunately, I subsequently left the company and cannot read it to be sure!&nbsp;</p><p>Earlier, we outlined the fundamental problem a strategy needs to solve: discovering the critical factors in a situation and designing a way of focusing actions to deal with those factors. There are a few things we need to have to complete that design. Let&#8217;s get out a document and start making notes!</p><h1>The Problem</h1><p>The first is a shared understanding of the problem. It might be surprising to think about this &#8212; after all, we&#8217;re all here for the same purpose! However, people can have different perspectives on what we&#8217;re trying to achieve and why. Given this, the first thing to do is to summarise the problem we&#8217;ll be working to solve. The customers who have this problem, what that problem is, how it affects that customer and what the scope of the problem we&#8217;re considering is!&nbsp;</p><p>Let&#8217;s stick with the course example. We might start with, &#8220;We need to teach engineers site reliability engineering&#8221;. That <em>feels </em>like a problem, but in fact, it is only the absence of the solution we intend to build. Which engineers have this problem? How many of them are there? What is their experience? Why does this work even matter? Let&#8217;s rephrase the problem a little. &#8220;All software companies need to ensure an acceptable level of reliability, and there are effective mechanisms to define that acceptable level and make tradeoffs to ensure that it is met. However, these mechanisms are not widely known, and companies must discover them independently. Because engineers are developing these approaches in parallel, we end up with competing approaches that are inefficient or a solution that comes at the cost of a greater business outcome.&#8221;</p><p>Now, we have a clearer picture of why our work matters and a more extensive range to draw solutions from. Courses are one approach, but so might be building a product to commodify knowledge or defining a standard organisations should adopt. It also defines what we will <em>not </em>solve &#8212; we will not solve the definition of business requirements, analytics or other software requirements, just the reliability tradeoff.</p><h1>Success Criteria</h1><p>As a corollary to the problem, we need to know how we will progress against this problem. It should be something that does not limit the potential solutions or tolerate changes in approach as we figure out a more efficient way to solve our problem.</p><p>Let&#8217;s stick with the course example. Our fundamental goal is to help organisations improve reliability, so let's try and measure that! Unfortunately, we are unlikely to maintain access to organisations' data directly, but we can certainly ask them three months after completing the course whether their reliability has improved. In addition, as we intend to <em>teach </em>learners, we can ask them three months after completing this material whether or not it helped.</p><p>Once we have a way of validating our strategy, we need to set up a routine to check whether or not we&#8217;re delivering what we need to. A good default is to check in on these monthly, comparing the current the past month and if possible, the same position last year.</p><p><em><strong>&#128161; Try this in your workplace. </strong>Write up your understanding of the problem your organisation is designed to solve and how you&#8217;re validating that it's solved. If you have a patient colleague, ask them to write theirs down in parallel. It doesn&#8217;t have to be long &#8212; 100 words is great! Then, compare. Did they overlap? What were the differences? What happens when you share it with your team?</em></p><h1>organisational Theories</h1><p>So far, we have an analysis of our capabilities, a clear problem definition and the criteria by which we&#8217;re going to measure if we&#8217;re making progress. The next step is to write up our theory as to what might be contributing to the problem, and what might be effective interventions to try and address it. It's the basis on which we&#8217;ll make &#8220;strategic decisions&#8221; later.</p><p>Sticking with our course example, the problem we want to solve is that organisations need to maintain an amount of reliability, but there&#8217;s no common path to do that. Engineers need to discover the solutions to this problem on their own. Some theories that might contribute to this include:</p><ul><li><p><strong>Giving engineers a good operations model will improve reliability</strong>. If the engineers know how to engineer reliable systems, they&#8217;ll choose to do so.</p></li><li><p><strong>Multiple colleagues doing the same training are more likely than one colleague to drive change. </strong>Team members collaborate on new ideas much more efficiently if they&#8217;ve learned that new idea at the same time, and can collectively discuss how to implement it.</p></li><li><p><strong>Providing a shared reliability model means a path to shared evolution</strong>. Rather than every engineer discovering operations for themselves, we can give them all a &#8220;standard reference&#8221;. Even if they disagree, they have something explicit to disagree with.</p></li></ul><p>These theories will either be correct or not. But by making them explicit, we can be clear about why we&#8217;re making the strategic decisions that we will. Additionally, we can work to validate these theories as we execute the strategy, abandoning the theories that do not match reality (or abandoning the strategy if the theories are sufficiently incorrect).</p><p>We need to review these theories for evidence; a good model to do this is once every six months.</p><h1>Capabilities &amp; Constraints</h1><p>We have our problem, measurement and organisational theories. We now have as much opportunity to be creative as we can be! Unfortunately, while it is fun to be boundlessly creative, we are all bound bythe capabilities we have access to or the constraints we need to meet &#8212; the same ones from the SWOT analysis earlier.</p><p>We should document them in the strategy unless the SWOT document is otherwise especially legible. We do not have to elaborate on them. We can simply restate them from the SWOT:</p><ul><li><p><strong>Capability</strong>: An instructor with over ten years of experience in writing software and maintaining and operating that software in a production environment</p></li><li><p><strong>Capability: </strong>A series of social media profiles that can provide snacks of this content, with the hope people will choose to purchase the whole material.</p></li><li><p><strong>Constraint: </strong>The time to write the courses is limited, with only 12 weeks (between September 1st and November 30th) available.</p></li></ul><p>This is useful to reevaluate as we evaluate the rest of our strategy in 6, 12 or 24 months. If we develop new capabilities or meet new constraints, we can factor them in and adjust our strategic choices.</p><h1>Tradeoffs</h1><p>Wheow! We&#8217;ve done much investigative work so far. We&#8217;ve done an analysis of our strengths and weaknesses, defined and aligned on the problem and how we&#8217;ll measure it and created some theories around why that problem exists. We&#8217;ve been clear about our opportunities and constraints. It&#8217;s time to make some decisions.</p><p>Let&#8217;s stick with our course example. We have a <em>hard constraint of time</em>. We&#8217;re thus making a broad choice as to how to spend that time. Our first tradeoff might be:</p><ul><li><p><em>We will focus on the delivery of limited material for rapid feedback with our community instead of publishing a large release at once. We will revise and expand content that appears especially helpful to learners.</em></p></li></ul><p>In and of itself, the tradeoff is not a decision &#8212; rather, it's something that we should consider as we&#8217;re making other decisions. Other tradeoffs might be:</p><ul><li><p><em>We will focus on providing value by creating compelling material, rather than on the delivery of that material itself. We will work actively with third-party providers where they provide a suitable mechanism to deliver.</em></p></li><li><p><em>We will focus on a limited subset of the material if that proves especially valuable rather than aim for material completeness</em></p></li></ul><p>I would expect tradeoffs to be much longer lived than any decisions that we make as part of a strategy. Tradeoffs only tend to be adjusted when the underlying conditions of the organisation change, such as the time horizon on which the organisation is focused or the core problem the organisation is faced with changes.</p><p><em><strong>&#128161; Try this in your workplace. </strong>All organisations are making tradeoffs all the time. See if you can look over several major decisions leaders have made in your organisation. Is there a common theme? Can you write down this theme and validate it with your peers? Can you figure out whether that tradeoff is by design or accidental?</em></p><h1>Constraining Choices</h1><p>Hooray! We&#8217;re about to make some strategic choices &#8212; the most exciting part of any strategy. However, this is also easily the most challenging part of a strategy to execute well. The primary challenge is not the decisions themselves but figuring out how to <em>layer decisions </em>to give an organisation direction but does not constrain its creativity.</p><p>Let&#8217;s think first about about a team of people. The value in dividing an organisation into &#8220;teams&#8221; is that each can make a series of decisions with some independence from other teams; that&#8217;s how the organisation can get a lot done quickly. Let&#8217;s think about an organisation of 100 people, organised into &#8220;two-pizza&#8221; teams of four to 5 people. There might be 15 delivery teams of 5 people and a manager. Those managers will need to be managed by an additional three managers (which we&#8217;ll call &#8220;department heads&#8221;), which, in turn, need another manager (&#8220;director&#8221;). We might have six senior technical team members (&#8220;staff engineers&#8221;) and one project manager.</p><p>That means we have at least 19 <em>managers</em> who need to make coordinated decisions across multiple layers of management, without counting any technical experts who inform these decisions or teams who are expected to own and deliver on them! There is a tradeoff between an organisation that is <em>aligned </em>and an organisation that is <em>fast-moving</em>. Our goal is to create a strategy that allows an organisation to be as <em>aligned as necessary</em> while moving <em>as fast as necessary</em>.&nbsp;</p><p>The trick is to make decisions that constrain choices just enough to ensure alignment but that allow the maximal creativity for the next management layer to take. This can be extremely challenging and requires balancing freedom and accountability in the management layer.</p><p>For the example of the course, it&#8217;s a little easier &#8212; it&#8217;s just me writing these courses! As organisations get larger and larger, the balance gets harder and harder to strike. The course decisions include:</p><ul><li><p><strong>Provide multiple, small courses teaching Site Reliability Engineering</strong>. This enables us to validate our organisational theories with relatively minimal work and meets the tradeoff of delivering a limited amount of material for rapid feedback.</p></li><li><p><strong>Provide learners connections with communities of practice.</strong> This enables us to validate the theory that multiple learners executing in parallel will be more effective change agents than a single learner &#8212; even if those learners are not in the same organisation.</p></li></ul><p>Thats it! We can figure out anything more specific than that over the coming weeks.</p><p><em><strong>Try this in your workplace. </strong>See if you can figure out how your top-level leader balances autonomy and alignment in your management chain. At what layers are which decisions made? What are the controls that keep things aligned? Are there multiple layered strategies?</em></p><h1>Review &amp; FAQ</h1><p>Gosh, wasn&#8217;t that a blast! We&#8217;ve now completed our strategy.&nbsp;</p><p>Unfortunately, the work around the strategy has <em>only begun. </em>A strategy is only ever solid if it prompts a shared understanding that you, as a leader, can use to drive organisational efficiency. The first step to doing this is getting it in front of people.</p><p>The first and counterintuitive step is to use yourself as the first reviewer. To start, <em>put the strategy away</em>. Hide the tab, put it in a draw, and rename it opaque. Then, a week later, you come back. Print it out, get a marker and start going through it. You&#8217;ll be surprised at how much you see that you have already evolved your thinking. Go through and correct it. Then, get a recorder, read the document aloud and then play it back to yourself going for a walk or similar. As before, you&#8217;ll notice things that you missed.</p><p>The next challenge is getting people to read it. Mostly, people will only read some way through a more extended strategy! Reduce your larger document to a 1-page strategy summary to get the entire buy-in. Once you&#8217;ve written this, start sharing it for others to read. Share it with</p><ol><li><p>A close teammate</p></li><li><p>Your leader</p></li><li><p>Your team</p></li><li><p>Your stakeholders</p></li><li><p>Your organisation</p></li></ol><p>As you share it with more and more people, you&#8217;ll start to find that common questions come up. You can answer these questions in a new section called &#8220;FAQ&#8221; at the bottom of the document. Common questions include:</p><ol><li><p>Who are the customers of this strategy?</p></li><li><p>What gives you confidence in this strategy? What are the risks?</p></li></ol><p>After you&#8217;ve distributed your strategy, call a meeting and invite whoever needs to approve the document. Allow your approvers one final read, ask for approval, and then you&#8217;re aligned once you have it. Time to start executing!&nbsp;</p><h1>In Summary,</h1><p>Disambiguating the unknown can be extremely challenging. I struggled with it when my manager tasked me with driving the Embedded SRE team. I first saw it solved elegantly during the creation of the Site Reliability Engineering department. However, taking a structured approach to understanding the problem is very helpful.</p><p>SWOT allows us to inventory our organisation's capabilities. Then, we can go through and ensure we have a shared understanding of the problem and theory as to why it exists, list our capabilities and constraints, make tradeoffs and then define the constraining choices.&nbsp;</p><p>Once we&#8217;ve written it up, we can condense it into a one-pager and share it with our colleagues. We can then use that to walk our now clear path into the unknown.</p><p>I recommend you try it! At worst, you&#8217;ll learn a tonne.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Wow, you made it to the end!! Excellent work; you are committed. How about celebrating by signing up for more content?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Reading Lists]]></title><description><![CDATA[Books, papers and assorted bits I've made it through and are useful.]]></description><link>https://www.andrewhowden.com/p/reading-lists</link><guid isPermaLink="false">https://www.andrewhowden.com/p/reading-lists</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Mon, 28 Aug 2023 15:49:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3jml!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9988174-4d82-43ae-8a55-22bbc62e39c5_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128161; denotes a uniquely helpful read. In no order in particular.</p><h2>Books</h2><ul><li><p><a href="https://www.amazon.de/-/en/Richard-Rumelt/dp/0307886239">Good Strategy Bad Strategy: The difference and why it matters</a> &#8212; Richard Ruemelt</p></li><li><p><a href="https://www.amazon.de/gp/product/B00K7OWG7O/">The Principles of Product Development Flow</a>: Second Edition &#8212; Donald G. Rienertsen</p></li><li><p><a href="https://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309">High-Performance Web Sites</a> &#8212; Steve Souders</p></li><li><p>&#128161; <a href="https://a.co/d/6tVuTMX">High-performance browser networking </a>&#8212; Illya Grigorik</p></li><li><p>&#128161; <a href="https://a.co/d/4nzbNYw">Drift into Failure</a> &#8212; Sidney Dekker</p></li><li><p><a href="https://a.co/d/dqDI4Qc">Linux iptables Pocket Reference</a> &#8212; Gregor N. Purdy</p></li><li><p><a href="https://a.co/d/9rFhbOS">The Five Dysfunctions of a Team</a> &#8212; Patrick Lencioni </p></li><li><p><a href="https://a.co/d/cXivYKX">Six Simple Rules</a> &#8212; Yves Morieux, Peter Tollman</p></li><li><p>&#128161; <a href="https://a.co/d/eKKApWi">Thinking in Systems</a> &#8212; Donella Meadows</p></li><li><p><a href="https://a.co/d/2rSM3GM">Systems Thinking for Social Change</a> &#8212; David Peter Stroh</p></li><li><p><a href="https://a.co/d/eSsOArQ">Building Microservices</a> &#8212; Sam Newman</p></li><li><p>&#128161; <a href="https://a.co/d/3IRHkDy">Accelerate</a> &#8212; Nichol Forsgren, Jes Humble and Gene Kim</p></li><li><p><a href="https://a.co/d/c62B5jG">The Pheonix Project</a> &#8212; Gene Kim, Kevin Behr, George Spafford</p></li><li><p><a href="https://a.co/d/1CVpsoy">Grit: The power of passion and perseverance </a>&#8212; Angela Duckworth</p></li><li><p>&#128161; <a href="https://a.co/d/ijnsLbI">The Go Programming language</a> &#8212; Alana A. A. Donovan, Brian W. Kernighan</p></li><li><p><a href="https://a.co/d/hEqX70V">Infrastructure as Code</a> &#8212; Kief Morris</p></li><li><p><a href="https://a.co/d/35KpDF0">Work Rules </a>&#8212; Laslo Bock</p></li><li><p><a href="https://a.co/d/f3I29xU">How Google Works</a> &#8212; Eric Schmidt &amp; Jonathan Rosenberg</p></li><li><p>&#128161;  <a href="https://sre.google/books/">Site Reliability Engineering</a> &#8212; Betsey Beyer, Chris Jones, Jennifer Petoff, Niall Richard Murphy</p></li><li><p><a href="https://a.co/d/fxcAwOB">The Manager Path</a> &#8212; Camille Fornier</p></li><li><p><a href="https://a.co/d/eevyAQn">The 5th Discipline </a>&#8212; Peter M. Senge</p></li><li><p><a href="https://a.co/d/204q6Pm">The Unicorn Project</a> &#8212; Gene Kim</p></li><li><p><a href="https://a.co/d/elsSB2z">Attacking Network Protocols</a> &#8212; James Forshaw</p></li><li><p><a href="https://sre.google/books/">The Site Reliability Workbook </a>&#8212; Betsey Beyer, Niall Richard Murphy, David K. Rensin, Kent Kawahara &amp; Stephen Thorne</p></li><li><p>&#128161; <a href="https://www.amazon.de/-/en/Colin-Bryar/dp/1250267595">Working Backwards; Insights, Stories &amp; Secrets from Inside Amazon</a> &#8212; Colin Brayar, Bill Carr</p></li><li><p><a href="https://amzn.eu/d/io9IbBs">Continuous delivery</a> &#8212; Jez Humble, David Farley</p></li><li><p>&#128161; <a href="https://amzn.eu/d/dcHLOTz">Thinking in Bets</a> &#8212; Anne Duke</p></li><li><p><a href="https://www.amazon.de/-/en/Culture-Map-Breaking-Invisible-Boundaries/dp/1610392760">The Culture Map</a> &#8212; Erin Meyer<br>Useful to understand how different perspectives around the world can help implicitly shape understandings, and lead to quite different views on the same communication.</p></li><li><p><a href="https://www.amazon.de/-/en/Scarcity-having-little-means-much/dp/1846143454">Scarcity</a> &#8212;  Sendhil Mullainathan, Eldar Shafir<br>Useful to provide good models of how resource-poor people (e.g. time, money, etc) bias themselves in a way that systematically leads to poor outcomes. </p></li></ul>]]></content:encoded></item><item><title><![CDATA[My Radical Idea: How to be a Site Reliability Engineer]]></title><description><![CDATA[Listen now (8 mins) | I want to pass on whatever I've learned about SRE. I need your help to make sure its useful]]></description><link>https://www.andrewhowden.com/p/my-radical-idea-how-to-be-a-site</link><guid isPermaLink="false">https://www.andrewhowden.com/p/my-radical-idea-how-to-be-a-site</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Sat, 26 Aug 2023 08:50:57 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/136427320/16b5c52f208206bce84ced2190dff25e.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p></p>]]></content:encoded></item><item><title><![CDATA[My radical idea: How to be a Site Reliability Engineer]]></title><description><![CDATA[I want to pass on whatever I've learned about SRE. I need your help to make sure its useful]]></description><link>https://www.andrewhowden.com/p/my-radical-idea-how-to-do-site-reliability</link><guid isPermaLink="false">https://www.andrewhowden.com/p/my-radical-idea-how-to-do-site-reliability</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Wed, 23 Aug 2023 08:00:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2d4bc409-03c6-4404-ac8a-3a12e4bab11f_1654x1183.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>You can also <a href="https://h4n.link/aWc5">find this on YouTube</a></p></blockquote><h2>The backstory</h2><p>One of the more exciting parts of my job has always been sharing an amount of experience I&#8217;ve either been able to gain first-hand or composite together from blogs, research and other people&#8217;s insights. I do this quite a lot internally wherever I&#8217;m working, and occasionally try and share this with the broader community (e.g. <a href="https://www.youtube.com/watch?v=diUOjC109Mw">SLOConf</a>, <a href="https://www.usenix.org/conference/srecon22emea/presentation/howden">SRECon</a>, <a href="https://increment.com/software-architecture/software-architecture/">Increment</a> and so on)</p><p>As Covid-19 hit, the opportunities to <a href="https://www.andrewhowden.com/p/community">go to conferences</a> and meet new colleagues in person were (rightfully) dramatically limited, and we waited patiently for the world to reopen. In the meantime, I started playing with video equipment. This sponsored videos for my org about being on-call, observability and distributed tracing. The videos seemed to help those new to these topics and became part of the standard Zalando onboarding process.</p><p>I got to do this a few times, but the videos were expensive to make &#8212; about 100 hours each. As you can imagine, there are many demands on engineers&#8217; time and making videos was not one of them ;D Still, I felt like we were under-leveraging the innovation and capabilities of our engineering community. If we could better empower them with some of our senior community's hard-won knowledge, we could make our environment more productive, healthier and happier. It sat in the back of my mind &#8212; two years, an itch that never went away. I kept hacking on making prettier and prettier video content. While I am no YouTube sensation, I don&#8217;t think there&#8217;s much else I could do without focus.</p><h2>The inflection point</h2><p>My work in the intervening period has been tremendously satisfying. I believe that I and the peers I worked with substantially improved the customer experience and the quality of life of our engineering community. However, recently due to some organizational restructuring, I faced a series of choices &#8212; a moment of inflection. I could do what I&#8217;ve done in the years previously, or I could try and scratch that itch.</p><p>I talked to my wife, colleagues and peers, and after some challenging reflection, I decided to try and scratch that itch. I&#8217;m going to try and make an SRE course.</p><p>I start next week. I have between now (August 28th) and November 30th to deliver.  My work with my previous employer has ended, leaving me with no focus except to execute this course. By December 1st, I must have found and started on a new opportunity.</p><p>There&#8217;s no other opportunity that will present itself like this one. Let&#8217;s see what we can do!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Wait, I&#8217;m doing what?! That&#8217;s right! I have no idea, either. You can follow this adventure on this mailing list:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The material</h2><p>The course aims to empower engineers in their career between a &#8220;software engineer&#8221; and a &#8220;staff engineer&#8221; to understand how to make a reliable customer experience without sacrificing the health and well-being of the engineers who strive to make that experience work. After doing the course, I would expect learners to be able to:</p><ol><li><p>Know what "Site Reliability Engineering" is, the areas that it covers and the broad approach it takes</p></li><li><p>Be able to make software &#8220;observable&#8221;</p></li><li><p>Be able to deploy software to "the cloud"</p></li><li><p>Understand how to  detect and respond to critical production issues confidently and collaboratively</p></li><li><p>Understand the different operational tradeoffs (money, on-call health, developer velocity and reliability)</p></li><li><p>Know different strategies to consult with product delivery teams</p></li></ol><p>To do the course, you will need some software development experience. Where the course makes specific references to a language, I&#8217;ll be using <a href="https://go.dev/">Go</a>. We&#8217;ll cover a broad range of topics, such as how:</p><ul><li><p>Do systems break?</p></li><li><p>Can we design systems?</p></li><li><p>Do we validate our software before release?</p></li><li><p>Do we release our software safely?</p></li><li><p>Can we modify our software safely at runtime with configuration?</p></li><li><p>Do we understand what our system is doing in production?</p></li><li><p>Do we respond to production incidents? Learn from them afterwards?</p></li><li><p>Can we articulate and set guidance on operational tradeoffs?</p></li><li><p>Can we work with other teams specifically on reliability topics?</p></li></ul><p>The goal is to cover as much of this material as I can within 8 hours of your time (or less), making sure you get as much value as possible. So far, I intend to publish it on Udemy for the company-friendly price of 199 &#8364;.</p><h2>Making this a reality</h2><p>I am genuinely excited about seeing if I can make this work, but there&#8217;s still an enormous amount of challenge ahead. I&#8217;m going to need some help to make this a success.</p><p>There are a few ways you could help if you so desire:</p><h3>Feedback</h3><p>You&#8217;ll notice that recently I&#8217;ve been posting material on this blog, on YouTube, on LinkedIn, and so forth. This is practice material &#8212; I am learning what I must do to make a compelling course. I will continue to do this over the next 12 weeks (and hopefully beyond), but I need feedback from you most here. Things like:</p><ol><li><p>Is it valuable content for you? If yes, why? If not, why not?</p></li><li><p>Are you able to follow my line of thinking? Are there ways I could make this more straightforward for you to understand?</p></li><li><p>Is the way it&#8217;s presented useful? Do you prefer written content, video content, shorts or anything else I haven&#8217;t thought of?</p></li><li><p>Is the content accurate and comprehensive? Am I missing anything?</p></li></ol><p>You should comment on the material directly wherever you see it. You should also be <em><strong>very direct</strong></em>. You will be doing me a favour; the internet is an unforgiving place, and I need your perspectives early to help me evolve &#9829;</p><h3>Engagement</h3><p>If you find the content interesting, let&#8217;s chat about it! Ask questions, raise comments, disagree or otherwise engage with the material.</p><p>This solves two substantial problems:</p><ol><li><p>It will help me connect with you. As I make this transition, these connections are just vital for me.</p></li><li><p>I will understand you more. The more I understand you, the better I can craft helpful content.</p></li></ol><h3>Buy in</h3><p>Lastly, if you find it useful, subscribe. When the course comes out, buy it. Ultimately, this will determine whether I will make more of this material or focus on other areas.</p><p>As a bonus, I will publish a coupon code for subscribers of this mailing list that will give you a substantial discount in case your org does not give this much love to learning and development. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">What&#8217;s that? Cheap stuff?! but only for subscribers. Join now!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Let&#8217;s get to it</h2><p>This is an urge I&#8217;ve had for a good couple of years now. The moment has come when I have the opportunity to pursue it, and while it is terrifying, I am committed to delivering on it. The material will cover everything designed to help you engineer reliable systems or drive reliability commitments within your organization.</p><p>I won&#8217;t be able to do it alone, and I will frequently stumble along the way. Your help will be vital to making this a success. You can do this simply by giving me feedback, engaging with the material or buying in when you see the opportunity.</p><p>The project ahead feels like an enormous mountain to scale. That said, the mountain gets no smaller, and we get nowhere by thinking about how to scale it. Let&#8217;s get to it!</p>]]></content:encoded></item><item><title><![CDATA[Incident Commander]]></title><description><![CDATA[Listen now | What an incident commander is, they need to know, what they do and how to prepare for the role.]]></description><link>https://www.andrewhowden.com/p/ra--incident-commander</link><guid isPermaLink="false">https://www.andrewhowden.com/p/ra--incident-commander</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Sun, 20 Aug 2023 14:29:31 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/136245305/5f25e8a4ba6417805e0fffb534bb55d3.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p></p>]]></content:encoded></item><item><title><![CDATA[Incident Commander]]></title><description><![CDATA[How to maximize the capabilities of those responding to production outages]]></description><link>https://www.andrewhowden.com/p/incident-commander</link><guid isPermaLink="false">https://www.andrewhowden.com/p/incident-commander</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Mon, 14 Aug 2023 17:03:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nzmH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128161; You can also <a href="https://www.andrewhowden.com/p/ra--incident-commander?r=d5zkg&amp;utm_campaign=post&amp;utm_medium=web">listen to this post via a podcast</a> or <a href="https://www.youtube.com/watch?v=U-kHORylrqE">find it on YouTube with some handy visuals.</a></p><div><hr></div><p>I&#8217;ve been part of the &#8220;incident commander&#8221; at a large, multi-national European eCommerce fashion company for the last couple of years. Through this, and my time as a  Site Reliability Engineer, I have been exposed to numerous incidents, from the occasional &#8220;&#8230; this is not an incident. We can just deal with this tomorrow&#8221; to the &#8220;we need the CTO on the phone right now&#8221;. It&#8217;s a hugely exciting role that I would encourage peers to consider as part of their personal development.</p><p>To that end, let&#8217;s go into what an &#8220;Incident Commander&#8221; is, their roles and responsibilities, how to prepare for the role, and what the role looks like in practice.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Hoh boy! Incident commander! I bet this one is going to be fun. You can get this and other good posts by subscribing!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Incident Response</h2><p>Rather than dig into the incident response details, I&#8217;d encourage you to read the article &#8220;<a href="https://www.andrewhowden.com/p/i-hereby-declare-this-an-incident-4219ba2573a6">I hereby declare this an incident</a>&#8221; and &#8220;<a href="https://www.andrewhowden.com/p/help-im-now-on-call">Help! I&#8217;m now on call!</a>&#8221;. They go through this in substantially more detail.</p><p>For incident commanders, a few things are worth calling out especially. These include Severity, Stakeholders and Maturity.</p><h3>Severity</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nzmH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nzmH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 424w, https://substackcdn.com/image/fetch/$s_!nzmH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 848w, https://substackcdn.com/image/fetch/$s_!nzmH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 1272w, https://substackcdn.com/image/fetch/$s_!nzmH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nzmH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png" width="400" height="233.15217391304347" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:429,&quot;width&quot;:736,&quot;resizeWidth&quot;:400,&quot;bytes&quot;:59028,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nzmH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 424w, https://substackcdn.com/image/fetch/$s_!nzmH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 848w, https://substackcdn.com/image/fetch/$s_!nzmH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 1272w, https://substackcdn.com/image/fetch/$s_!nzmH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b822753-50a6-4d42-89cc-e1efdf7ebd17_736x429.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The severities that we see as an incident commander can vary pretty widely; everything from &#8220;someone deployed something bad and should roll it back&#8221; to &#8220;this is going to appear on the news tomorrow, and we&#8217;d better wake up the crisis management team to prepare the required press releases&#8221;. We&#8217;re usually the most senior stakeholder in the room &#8212; indeed, the most empowered unless a VP or CTO turns up &#8212; and we thus need to make a set of decisions factoring in the current level of impact, the risk of future impact and the likelihood of recovery.</p><p>To that end, we need to understand the significance of our issue quickly.</p><h3>Stakeholders</h3><p>On paper, only a few people are involved in incident response &#8212; the responder fixing the issue, the scribe making notes and you as the incident commander.</p><p>In practice, as the issue gets more significant, many stakeholders turn up. We have:</p><ul><li><p><strong>Management</strong> is looking for clarity on the current issue and to make it clear that it deserves the focus of all people required. Also, to offer help and coordination.</p></li><li><p><strong>Sideline Experts</strong> who are watching the incident on a public channel or otherwise doing off-book investigation and who have learned something they believe is beneficial.</p></li><li><p><strong>Product Owners </strong>who are suddenly powerless to do their work and are watching their hard-earned customer trust wash away.</p></li><li><p><strong>Non Experts</strong> are trying to help by supplying additional information or reporting the issue in parallel without understanding the existing context.</p></li></ul><p>Each of these stakeholders requires a level of coordination to ensure they either can contribute to or at least do not hinder the response.</p><h3>Maturity</h3><p>In principle,  an organisation optimizes to ensure things are available. They usually have a group of people tasked with this responsibility and allocate those people the time and effort required to practice and improve their response.</p><p>In practice, an organization comprises a diverse set of people, each of whom has a unique set of expertise and capabilities. Sometimes those capabilities are less developed than we might expect, given a person&#8217;s assigned responsibility as an on-call engineer. </p><p>They might:</p><ul><li><p><strong>Freeze</strong>. Due to an incident's sheer stress, a responder might not think clearly and either freeze entirely or get stuck hyperfocused on an irrelevant part of the investigation. This is understandably exaggerated if that responder also triggered the incident.</p></li><li><p><strong>Offload Responsibility. </strong>A responder might review their systems, conclude nothing is wrong, and thus, it&#8217;s someone else problem. They&#8217;ll involve them and then leave. This is understandable but unacceptable during response &#8212; information usually evolves too quickly to step away before it&#8217;s repaired.</p></li><li><p><strong>Not know</strong>. A responder might not know how to debug a system, where a systems telemetry is or what the consequence of a given decision might be for the business.</p></li></ul><p>These are all surprising during the process of a response, but over a long enough time happen predictably. It&#8217;s part of an incident commander&#8217;s mandate to try and help responders overcome these challenges.</p><h2>Role</h2><p>So, an incident has happened, and the incident commander has been paged. They&#8217;re reading the chat and understand the severity of an incident, the stakeholders that are appearing and the maturity of those involved. What&#8217;s their actual role in this mess?</p><p> An incident commander is tasked with structuring the response to minimise the impact on the business. The practicalities of this include:</p><h3>Structuring Communication</h3><p>An incident is a high-stress moment with many people coordinating around a single issue. Frequently, people start to take shortcuts with their communication, and messages become things like:</p><blockquote><p><strong>A</strong>: flop system is broke</p><p><strong>B</strong>: broke?</p><p><strong>A</strong>: yeah broke it doesn&#8217;t work anymore</p><p><strong>C</strong>: A what does the graph say</p><p><strong>B</strong>: it works for me</p><p><strong>A</strong>: no its broke</p></blockquote><p>Or similarly vague requests. With stressed people, this quickly deteriorates and can end up with people either getting &#8220;snippy&#8221; with each other, making demands or working in parallel and not talking. As more and more people join the chat, it becomes unworkable, and we lose valuable time just understanding each other rather than analyzing the problem to intervene.</p><p>As incident commanders, we need to intervene and clearly set communication expectations. Often we can do this simply by reading through the thread and articulating everything that&#8217;s happened so far in a status message. For example, </p><blockquote><p><strong>IC</strong>: So far, I understand the customer experience impact is<br><br>* flop system<br><br>Our underlying hypothesis of this are:<br><br>* we&#8217;re out of disk space (being verified by A)<br>* we&#8217;re overloading CPU (being verified by B)<br><br>at this time, our estimated time to recovery could be up to 1hr and is very unpredictable. Please add a &#10133; is this is correct</p></blockquote><p>Such a message clearly sets the expectation for how communication should be and combines a bunch of communication happening in bits between stakeholders piecemeal.</p><p>This can quiet the thread until there&#8217;s a discovery or intervention. Whenever there is, it might still appear piecemeal:</p><blockquote><p><strong>A</strong>: disk is full </p></blockquote><p>We can tidy this up by both setting the expectation about comms and clarifying the actual data:</p><blockquote><p><strong>IC</strong>: A, I am struggling to understand your message as it does not contain the context I need. Do you mean that the disk with the ID a-service-disk has zero free space left according to the graph &#8220;https://&#8230;&#8221;</p><p><strong>A</strong>: Yep sorry will add this in future</p></blockquote><p>After which the communication usually improves.</p><h3>Making Decisions</h3><p>As the incident response goes on, there often comes a point when a responder can intervene, but that intervention comes with some risk. For example, they might disable a payment method even though it is used by 50% of users in that country, even if it is broken, or they might need to make many products unavailable while data is repaired. The responder might be able to supply some information about the consequences but does not feel sufficiently empowered to make that call.</p><p>An incident commander is empowered to make these decisions. They need to balance the impact on the customer experience, the customer experience given the alternative and the impact on the business. They need to assess whether other, better-informed stakeholders are available to make the decision or whether it is better to make it sooner. Ultimately, they need to provide a path forward for the responder.</p><p>There are no correct solutions here, but commanders are expected to know enough to make reasonable decisions the majority of the time.</p><h3>Managing Stakeholders</h3><p>As earlier mentioned, many stakeholders will turn up during a response &#8212; both those who are supposed to and those who are trying to be helpful. The problem is those stakeholders can start to distract those that are actually repairing the issue, either with requests for clarification (usually management) or helpful ideas about restoring the service (other engineers)</p><p>To repair a system &#8212; especially if the underlying failure is non-intuitive &#8212; the responders need to be able to focus. This means that while the messages addressed to responders are well-intentioned, they are also degrading the response.</p><p>As incident commanders, we need to take away as much of the burden of communication from responders as possible and work to manage the expectations of those trying to contribute with only the information we have. We can encourage people to send technical insights they have to us privately to keep them out of the main thread, and if we catch one that is especially useful, ask the contributor to surface it in the main thread and join the response.</p><p>We also need to communicate proactively with non-technical stakeholders, translating the technical findings of the incident so far into information that these stakeholders can take action on. This could be as simple as clearly conveying the current customer experience, giving an estimation of time to recovery or simply reassuring people that the response is happening and just to be patient.</p><h3>Manage large incidents</h3><p>Occasionally some incidents are so substantial they require multiple parallel efforts to restore system functionality. This could be a whole team executing a repetitive task (e.g. repairing DNS records) or many different teams figuring out how to repair their service (e.g. shifting many different services out of a broken availability zone).</p><p>During such a response, it is up to the incident commander to survey the available people and then to task either specific people or teams with people with tasks that they should complete. The incident commander should also set up an ad-hoc management process &#8212; often just a Google Sheet or Doc &#8212; to keep track of these tasks and identify any people who are stuck or need intervention.</p><p>This can take substantial mental effort. The critical thing in these cases is to maintain an overview of the current impact, hypothesis, interventions and people doing tasks. This means that some of the incident commander's responsibility should be delegated to other incident commanders or senior colleagues. For example, managing communications, communicating with management or updating sheets can all be delegated to someone else while the incident commander maintains an overview.</p><h3>Kick-off crisis management</h3><p>There are occasions when a given technical issue has such substantial ramifications that it will mean the company either loses customer trust or money or appears in the news. All of this is beyond the usual remit of incident response, but there are parts of the company that are designed to cope with these challenges.</p><p>An incident commander should kick off these crisis management teams and empower them with what they need to control the narrative around what is happening with the system. Occasionally, these teams will come back with requests (e.g. &#8220;Can we put up a notice here&#8221; or &#8220;Can we identify customers to apologize and send a voucher&#8221;); the commander has to prioritize and implement these requests against the backdrop of the incident.</p><h3>Off the beaten path</h3><p>Lastly, there are occasions when something happens simply that no one planned for. Still, it is sufficiently urgent that it bypasses all software deliverables and is worth as much effort as we can bring to bear on it. One recent example is security issues that affect many systems (e.g. log4j) and are outside the normal security response process.</p><p>Incident Commanders are frequently involved in these incidents for their experience managing such urgent tasks, relationships with responders, and credibility within the community. While the incident might not follow the traditional process, the commander can still help deliver a critical and immediate business requirement.</p><h1>Preparation</h1><p>What characterises the incident commander role (at least, in my experience) is that it tends to be involved in issues that are outside the normal processes. This makes the role challenging, as it would be &#8220;preparing for the unexpected&#8221;, and the unexpected is &#8230; well, unexpected.</p><p>That said, there are things that incident commanders should have:</p><h3>Practice</h3><p>An incident response process is generally designed to empower responders to prioritize, communicate and respond to production issues, but it also usually doesn&#8217;t say much about the response. The response depends on the specific technical stack, the business impact, the stakeholders and other organizational contexts. </p><p>The only way to understand what responders are going through is to be a responder. Because incident commanders are usually only called for issues more critical than the &#8220;average&#8221; incident, they should have experience with similarly critical incidents. </p><p>This allows them to build empathy with responders as they go through their most challenging professional experience so far and build a toolkit to understand the impact, manage these responders, or otherwise coordinate incidents.</p><p>Once they have that experience, they should join the incident commander rotation in the shadow role to get perspective on the other side of that responsibility and build the required business context and relationships. </p><h3>A broad business understanding</h3><p>As mentioned earlier, incident commanders will tend to be involved in more substantial issues, and occasionally, they need to make time-sensitive decisions that can broadly impact the customer experience.</p><p>They can only do that if they also understand the business, the customer experience, and the software architecture and can make a judgement call as to which is the better technical path to follow.</p><p>Gaining a better understanding of the business is dedicating time to learning it, reading each domain's top-level and significant strategies, and then understanding the approximate software architecture. It will evolve, but a business&#8217;s core deliverables are stable over many years.</p><h3>Good stakeholder relationships</h3><p>Lastly, as the incident commander interacts with a broad range of stakeholders across a broad range of job roles, they must communicate in ways that suit each stakeholder. Additionally, they have (hopefully) established this communication outside the bounds of the incident itself. Good relationships allow much of the communication to be implicit, and stakeholders are more likely to trust the incident commander&#8217;s judgement until it can be reviewed.</p><p>As a pro tip, communication does not necessarily have to be two-way &#8212; being seen as a visible, technical expert with good communication skills makes life easier.</p><h3>Debugging Skills</h3><p>Naively, an incident commander is also expected to have excellent debugging skills and be able to reason through the behaviour of a broad range of systems.</p><p><strong>If you are debugging an incident yourself during a response, the incident is in deep trouble</strong>.</p><p>That&#8217;s not to say it doesn&#8217;t happen &#8212; it does, every so often &#8212; but an incident commander's core value is in enabling others' excellent work rather than being a technical expert.</p><p>Where they are needed, skills in reasoning through the system in first principles (e.g. as a system of constrained resources, as a series of queues or in its interactions with the kernel) are most helpful in understanding a broad range of systems, runtimes and architectures. After that, reading the internals of different runtimes &#8212; Java, Scala, Go, Node and so on are all useful as they frequently have excellent debugging capabilities that responders didn&#8217;t know, as they&#8217;d never needed to go that deep. <br><br>In the end, all just bits flowing through the network get run on several cores and, occasionally, written to disk.</p><h1>In Summary</h1><p>Incident Commander is an exciting role. It exists primarily to catalyze response rather than contribute significantly to anything about the response. This means they must understand the severity, stakeholders and maturity of responders and work by structuring communication, making decisions, managing stakeholders, significant incidents or anything &#8220;off the beaten path&#8221;. </p><p>There&#8217;s no secret to preparation, save taking the time to practice &#8212; especially in incidents of the same severity that incident commanders are regularly involved in. This practice and developing a broad business understanding, stakeholder relationships and debugging skills all go a long way to making an effective incident commander.</p><p>Hopefully, this reassures you that incident commanders are, in fact, human and that, with time and effort, you, too, can join their ranks!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Simple, Beautiful Software Development! Subscribe for free to receive new posts and support my work. It probably won&#8217;t, but you never know!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The elegant, but unspoken solution]]></title><description><![CDATA[A quick write-up about the interlinking between engineering value, high performance teams and psychological safety]]></description><link>https://www.andrewhowden.com/p/the-elegant-but-unspoken-solution</link><guid isPermaLink="false">https://www.andrewhowden.com/p/the-elegant-but-unspoken-solution</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Mon, 07 Aug 2023 18:36:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7c1b7673-0232-437e-8da4-e558bd9cc257_397x286.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So far, throughout my career, I&#8217;ve been a software engineer, systems engineer, site reliability engineer, principal engineer and finally, engineering manager. I&#8217;ve built new user interfaces, checkouts, ansible definitions, and Kubernetes clusters and, more recently, been embedded in a large organisation in a team dedicated to improving the reliability of the checkout experience.</p><p>This sounds very impressive, but let me assure you &#8212; it&#8217;s a journey that&#8217;s been absolutely littered with failure. As a software engineer, I broke whole shops; as a systems engineer, I deleted critical data. As a site reliability engineer in a major production issue, I&#8217;ve been wrong, with strong insistence, while millions of dollars slipped away. I&#8217;ve caught Bitcoin miners running around my (non-production) systems, and I&#8217;ve soured relationships with colleagues. All of this is to say I&#8217;ve struggled quite a lot. As Site Reliability Engineer, I&#8217;ve also been exposed to many other teams' struggles.</p><p>Over time, I&#8217;ve developed <a href="http://mw-headline">a preoccupation with failure.</a> This has led to the study of failure, which unexpectedly led <a href="https://safetydifferently.com/why-do-things-go-right/">to the study of success.</a> There have been invaluable lessons here, but I want to discuss one on working with people.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Ooh, the hook is in! Are you interested yet? I hope so! You can get this and other exciting content in your inbox. Subscribe now!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>On the value of engineering</h1><p>Software development work's fundamental value is making<a href="https://www.andrewhowden.com/p/the-value-of-a-software-engineer-38bddf1a34bb"> users' lives easier</a>. There are different ways to do this, but in my experience, the most remarkable deliverables result from some unique insight that understands the customer perspective, the product vision and the technology and combines them in some new and innovative way. Understanding (for example) that when buying clothes online, they struggle to understand their sizes but <a href="https://corporate.zalando.com/en/technology/zalando-launches-size-recommendations-based-customers-own-body-measurements">that recent gains in computer vision can be leveraged to make that easier</a>. Or <a href="https://en.wikipedia.org/wiki/Netflix">that customers are happy to watch a subset of content instantly</a> if they do not have to leave the house.</p><p>To make these more immense capabilities available to customers, there still needs to be a lot of work done, but in each deliverable, there is often an insight that allows a lot of work to be done more efficiently, rather than deploying on Kubernetes, deploying on AppEngine. Rather than using Java, use Go or Python. Rather than using Redis as a document store, use DynamoDB. Small efficiencies lead some teams to substantially outperform others in delivering that value.</p><p>Insight comes from a few people with a large amount of context and the ability to combine that context in new and exciting ways &#8212; often in discussion with others. However, there can be a bit of a gap between how these colleagues gain and leverage their insight and how their leadership views the same work.</p><h1>The decision-maker disconnect</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!454I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!454I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 424w, https://substackcdn.com/image/fetch/$s_!454I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 848w, https://substackcdn.com/image/fetch/$s_!454I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!454I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!454I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png" width="500" height="360.9203296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1051,&quot;width&quot;:1456,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:274561,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!454I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 424w, https://substackcdn.com/image/fetch/$s_!454I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 848w, https://substackcdn.com/image/fetch/$s_!454I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!454I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9fa6e34-d825-4ca7-b7b9-602c4f73be30_1734x1252.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Within any given organisation, there is frequently a set of people who hold substantially more power than others. They can be more formally allocated that power (for example, engineering management), or they can have it due to expertise or reputation (staff or site reliability engineering). Because of that power, these colleagues can either make or strongly influence decisions directly.</p><p>These colleagues all have some notion as to how the organisation works. They might have either explicitly prescribed it or might be imagining it. They use this understanding as a precursor on which to make decisions.</p><p>One of the more surprising things from the &#8220;human actors&#8221; research is <em>just how disconnected a decision-makers model of how the org work is from how it works</em>. Sometimes, the overlap between how the leader <em>thinks </em>the organisation gets work done and how it gets delivered is minimal! In practice, there <a href="https://humanisticsystems.com/2016/12/05/the-varieties-of-human-work/">are four ways to view &#8220;work&#8221;:</a></p><ol><li><p>Work as imagined</p></li><li><p>Work as prescribed</p></li><li><p>Work as disclosed</p></li><li><p>Work as done</p></li></ol><p>Only the last case is how work actually gets delivered.</p><h1>Work as (not) disclosed</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7fGM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7fGM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 424w, https://substackcdn.com/image/fetch/$s_!7fGM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 848w, https://substackcdn.com/image/fetch/$s_!7fGM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 1272w, https://substackcdn.com/image/fetch/$s_!7fGM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7fGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png" width="500" height="331.3873626373626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:965,&quot;width&quot;:1456,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:207616,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7fGM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 424w, https://substackcdn.com/image/fetch/$s_!7fGM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 848w, https://substackcdn.com/image/fetch/$s_!7fGM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 1272w, https://substackcdn.com/image/fetch/$s_!7fGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a9413d-cba3-402b-80d8-8ce9e3aa2a27_1894x1255.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of the challenges that decision makers or leaders within an organisation will face is the power dynamic between a decision maker (a &#8220;high power&#8221; person) and the person taken with executing that decision (a &#8220;low power&#8221; person) means that lower power colleagues can have a much more comprehensive range and more significant set of adverse consequences if they challenge that high power person. This could be as simple as losing esteem in the eyes of the decision maker or as complex as being criticized by that decision maker for disagreeing with their perspective.</p><p>As colleagues on the execution side of decisions deal with a broader range of leaders, they tend to encounter leaders who are more punitive in their approach and thus start to tailor their information to minimise the chance of that leader being unhappy. The more extreme the power differential between the decision maker and the executor, the more likely an executor will tailor their information to benefit that decision maker.</p><p>For an organisation that is predicated on insight, this can be disastrous. At best, a colleague may not contribute their ideas on how to solve a company goal. Still, at worst, the colleague will contort themselves into agreeing with the decision maker. The colleague views the work through a highly optimistic lens (&#8220;if everything goes right, I can make this work&#8221;), which, given that everything invariably doesn&#8217;t, leads to missed expectations and general unhappiness.</p><h1>Safety in adversity</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ydN6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ydN6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 424w, https://substackcdn.com/image/fetch/$s_!ydN6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 848w, https://substackcdn.com/image/fetch/$s_!ydN6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!ydN6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ydN6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png" width="506" height="365.2513736263736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1051,&quot;width&quot;:1456,&quot;resizeWidth&quot;:506,&quot;bytes&quot;:309627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ydN6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 424w, https://substackcdn.com/image/fetch/$s_!ydN6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 848w, https://substackcdn.com/image/fetch/$s_!ydN6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!ydN6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F584ee01d-1c13-4c70-a41e-6462d7bc0f58_1734x1252.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In his article <a href="https://safetydifferently.com/why-do-things-go-right/">&#8220;Why do things go right</a>&#8221;, Sydney Dekker highlights several critical properties of organisations that are more successful:</p><ol><li><p>Diversity of opinion and the ability to voice dissent</p></li><li><p>Keeping a discussion on risk alive</p></li><li><p>Deference to expertise</p></li><li><p>Ability to say stop</p></li><li><p>Broken down barriers between hierarchies and departments</p></li><li><p>Not waiting on audits or inspections to improve</p></li><li><p>Pride in workmanship</p></li></ol><p>The challenge of any decision-maker (or anyone responsible for the management of people) is to try and figure out how to encourage diversity, dissent, discussions of risk, the ability to say stop and so on. The decision maker must first make the environment psychologically safe to promote these behaviours.&nbsp;</p><p>Psychological safety is:</p><blockquote><p>the belief that you won&#8217;t be punished or humiliated for speaking up with ideas, questions, concerns, or mistakes. At work, it&#8217;s a shared expectation held by members of a team that teammates will not embarrass, reject, or punish them for sharing ideas, taking risks, or soliciting feedback.</p><p>&#8212; <a href="https://www.ccl.org/articles/leading-effectively-articles/what-is-psychological-safety-at-work/">Center for Creative Leadership</a></p></blockquote><p>Leaders within an organisation influence psychological <a href="https://www.usenix.org/system/files/login/articles/login_winter17_09_looney.pdf">safety through their actions.</a> Whether by encouraging discussion or punishing dissent, leaders set the tone for what is tolerable within their organisations. Correspondingly, this leads to those insightful engineering outcomes &#8212; or late projects.</p><h1>A safe space</h1><p>In his article <a href="https://www.usenix.org/system/files/login/articles/login_winter17_09_looney.pdf">&#8220;Psychological Safety in operations teams</a>&#8221;, John Looney recommends concrete ways leaders can make their organisations psychologically safer. These include:</p><ol><li><p>Creating space for people to take chances</p></li><li><p>Making it obvious when the team is doing well</p></li><li><p>Making your communication clear and your expectations explicit</p></li><li><p>Making your teams feel safe</p></li></ol><p>In my experience, the most critical habit here is &#8220;listening with the intent to understand&#8221;. I&#8217;ll ask questions about how colleagues feel about their work in 1:1s, their primary challenges, and how they feel it fits into the strategic whole. I&#8217;ll listen, try and restate their perspective and ask them to confirm it before we proceed. Then, I&#8217;ll try to answer that question using their language and reconcile it against what I&#8217;ve seen and what other stakeholders might be considering. This gives them a much larger context to operate with and the ability to ask further clarifying questions. </p><p>In broader environments, we can set this expectation through example, asking questions that are deliberately naive so as to set the expectation other questions also have this capability. We can ask for input from our colleagues, with the explicit direction we&#8217;re asking them because of their perspective &#8212; even if they do not share (or even fully understand) what else is happening. We can listen and be kind in our interactions.</p><p>Lastly, there are environments in which more conversation is inherently permissible. Going for a walk, meeting at a conference or meetup, having a glass of wine after work or deliberately manufacturing a different context to discuss a topic can make it easier for people to take more risks.</p><p>By taking these actions, decision-makers can encourage their executors to take more chances when proposing, discussing or contributing to a group discussion. More discussion allows a greater diversity of opinion and dissent and the ability to recognise and surface expertise. This, in turn, will enable us to manufacture insight.</p><h2><strong>Safety with limits</strong></h2><p>The only caveat to an organisation that encourages dissent is that such an organisation, with controls around decision-making processes, can avoid getting stuck in analysis paralysis. In my experience, while decisions should be discussed freely, there comes a point when a leader needs to make and own a decision.</p><p>This is made a much smoother process if there is a way of retrospecting on previous decisions made, as well as learning whether or not there was a different decision that could be made in future. This allows dissenting colleagues to &#8220;disagree and commit&#8221; and for either that dissenting colleague or others within the organisation to learn from the results of previous decisions.</p><h1>In Conclusion</h1><p>My career so far has been varied but pockmarked with failure. Most recently, I&#8217;ve made failure my study of choice, and through this, I have encountered the analysis of success. This has led me to understand the value of engineering being fundamentally measured in customers' happiness, which is most easily found through some unique insight into an existing set of problems and technologies that can be applied in a new way.&nbsp;</p><p>This can be challenging to implement within organisations as decision-makers can become disconnected from those that execute their decisions. The power dynamic within an organisation means that unless they&#8217;re invested, those leaders might never discover how what they expect doesn&#8217;t bear up against reality, and what happens is much more fraught with risk. Some organisations are routinely more successful, and those organisations prioritise discussions, have diverse opinions and allow dissent. To turn our organisations into these successful examples, we need to cultivate an environment of psychological safety that will enable colleagues to raise their diverse opinions or participate in discussions.&nbsp;</p><p>If we do this, we&#8217;ll have a much larger potential space to find our fundamentally elegant insights and a group of peers able to understand and execute them, delivering on that most valuable improved customer experience. </p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/p/the-elegant-but-unspoken-solution?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Woof! That one was hard to write. Find it useful? Great! Maybe someone else will. You can help them out by sharing it with them!</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/p/the-elegant-but-unspoken-solution?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.andrewhowden.com/p/the-elegant-but-unspoken-solution?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[What is a container?]]></title><description><![CDATA[A (long) description of the internals of a container.]]></description><link>https://www.andrewhowden.com/p/what-is-a-container</link><guid isPermaLink="false">https://www.andrewhowden.com/p/what-is-a-container</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Thu, 03 Aug 2023 09:17:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a40b9e65-2838-40bf-ab1d-d8c850815194_1725x1252.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p><strong>Editors Note</strong>: I initially published this in 2019, but subsequently tore the property hosting it down. I wanted to share it with a colleague, so I&#8217;m repositing it. It might be slightly out of date.</p></div><p>Containers have recently become a common way of packaging, deploying and running software across various machines in various environments. With the initial release of Docker in March 2013<sup>[</sup><a href="#wikipedia.docker"><sup>1</sup></a><sup>],</sup> containers have become ubiquitous in modern software deployment, with 71% of Fortune 100 companies running it in some capacity<sup>[</sup><a href="#redmonk.f100"><sup>2</sup></a><sup>]</sup>. Containers can be used for:</p><ul><li><p>Running user-facing, production software</p></li><li><p>Running a software development environment</p></li><li><p>Compiling software with its dependencies in a sandbox</p></li><li><p>Analysing the behaviour of software within a sandbox</p></li></ul><p>Like their namesake in the shipping industry, containers are designed to easily "lift and shift" software to different environments and execute that software similarly across those environments.</p><p>Containers have thus earned their place in the modern software development toolkit. However, to understand how container technology fits into our modern software architecture, it&#8217;s worth understanding how we arrived at containers, as well as how they work.</p><h2>History</h2><p>The "birth" of containers was denoted by Bryan Cantrill as March 18th, 1982<sup>[</sup><a href="#youtube.bryancantrill.revolution"><sup>3</sup></a><sup>],</sup> with the addition of the <code>chroot</code> syscall in BSD. From the FreeBSD website<sup>[</sup><a href="#bsd.jail"><sup>4</sup></a><sup>]</sup>:</p><blockquote><p><em>According to the SCCS logs, the chroot call was added by Bill Joy on March 18, 1982 approximately 1.5 years before 4.2BSD was released. That was well before we had ftp servers of any sort (ftp did not show up in the source tree until January 1983). My best guess as to its purpose was to allow Bill to chroot into the /4.2BSD build directory and build a system using only the files, include files, etc contained in that tree. That was the only use of chroot that I remember from the early days.</em></p></blockquote><p><em>&#8212; Dr Marshall Kirk Mckusick</em></p><p><code>chroot</code> is used to put a process into a "changed root", a new root filesystem with limited or no access to the parent root filesystem. An extremely minimal <code>chroot</code> can be created on Linux as follows<sup>[</sup><a href="#sagar.chroot"><sup>5</sup></a><sup>]</sup>:</p><pre><code><code># Get a shell
$ cd $(mktemp -d)
$ mkdir bin
$ $(which sh) bin/bash

# Find shared libraries required for shell
$ ldd bin/sh
&#9;linux-vdso.so.1 (0x00007ffe69784000)
&#9;/lib/x86_64-linux-gnu/libsnoopy.so (0x00007f6cc4c33000)
&#9;libc.so.6 =&gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6cc4a42000)
&#9;libpthread.so.0 =&gt; /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6cc4a21000)
&#9;libdl.so.2 =&gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6cc4a1c000)
&#9;/lib64/ld-linux-x86-64.so.2 (0x00007f6cc4c66000)

# Duplicate libraries into root
$ mkdir -p lib64 lib/x86_64-linux-gnu
$ cp /lib/x86_64-linux-gnu/libsnoopy.so \
    /lib/x86_64-linux-gnu/libc.so.6 \
    /lib/x86_64-linux-gnu/libpthread.so.0 \
    /lib/x86_64-linux-gnu/libdl.so.2 \
    lib/x86_64-linux-gnu/

$ cp /lib64/ld-linux-x86-64.so.2 lib64/

# Change into that root
$ sudo chroot .

# Test the chroot
# ls
/bin/bash: 1: ls: not found
#</code></code></pre><p>There were problems with this early implementation of <code>chroot</code>, such as being able to exit that <code>chroot</code> by running <code>cd..</code><sup>[</sup><a href="#youtube.bryancantrill.revolution"><sup>3</sup></a><sup>]</sup>, but these were resolved in short order. Seeking to provide better security, FreeBSD extended the <code>chroot</code> into the <code>jail</code><sup>[</sup><a href="#youtube.bryancantrill.revolution"><sup>3</sup></a><sup>,4]</sup> which allowed running software that desired to run as <code>root</code> and running it within a confined environment that was <code>root</code> within that environment but not <code>root</code> elsewhere on the system.</p><p>This work was further built upon in the Solaris operating system to provide fuller isolation from the host<sup>[</sup><a href="#youtube.bryancantrill.revolution"><sup>3</sup></a><sup>][</sup><a href="#joyant.zones"><sup>6</sup></a><sup>]</sup>:</p><ul><li><p>User separation (similar to <code>jail</code>)</p></li><li><p>Filesystem separation (similar to <code>chroot</code>)</p></li><li><p>A separate process space</p></li></ul><p>Providing something similar to the modern concept of containers, processes running on the same kernel. Later, similar work took place in the Linux kernel to isolate kernel structures per process under "namespaces"<sup>[</sup><a href="#lwn.namespaces"><sup>7</sup></a><sup>]</sup>.</p><p>However, in parallel, Amazon Web Services (AWS) launched their Elastic Compute Cloud (EC2) product which took a different approach to separate workloads: virtualising <em>the entire hardware</em><sup>[</sup><a href="#youtube.bryancantrill.revolution"><sup>3</sup></a><sup>]</sup>. This has different tradeoffs; it limits the exploitation of the host kernel or isolation implementation; however, running the additional operating system and hypervisor meant far less efficient use of resources.</p><p>Virtualisation continued to dominate workload isolation until the company "dot-cloud" (now Docker), then operating as a "platform as a service" (PAAS) offering, open-sourced the software they used to run their PAAS. With that software and much luck, containers proliferated rapidly until Docker became the powerhouse it is now.</p><p>Shortly after Docker released their container runtime, they expanded their product offerings into build, orchestration and server management tooling<sup>[</sup><a href="#coreos.rocket"><sup>8</sup></a><sup>]</sup>. Unhappy with this, CoreOS created its container runtime, <code>rkt</code>, which had the stated goal of interoperating with existing services, such as <code>systemd</code>, following <a href="https://en.wikipedia.org/wiki/Unix_philosophy">the UNIX philosophy</a> of "Write programs that do one thing and do it well<sup>[</sup><a href="#catb.unix"><sup>9</sup></a><sup>]</sup>."</p><p>The Open Container Initiative was established to reconcile these disparate definitions of a container [10], after which Docker donated its schema and runtime as a defacto container standard.</p><p>There are now several container implementations and standards to define their behaviour.</p><h2>Definition</h2><p>It might be surprising to learn that a "container" is not a real thing&#8201;but a specification. At the time of writing, this specification has implementations on^[<a href="#github.opencontainers.runtime">11</a>]:</p><ul><li><p>Linux</p></li><li><p>Windows</p></li><li><p>Solaris</p></li><li><p>Virtual Machines</p></li></ul><p>In turn, containers are expected to be<sup>[</sup><a href="#github.opencontainers.principles"><sup>12</sup></a><sup>]</sup>:</p><ol><li><p>Consumable with a set of standard, interoperable tools</p></li><li><p>Consistent regardless of what type of software is being run</p></li><li><p>Agnostic to the underlying infrastructure the container is being run on</p></li><li><p>Designed in a way that makes automation easy</p></li><li><p>Of excellent quality</p></li></ol><p>Specifications dictate how containers should reach these principles by defining how they should be executed (the runtime specification<sup>[</sup><a href="#github.opencontainers.runtime"><sup>11</sup></a><sup>]</sup>), what a container should contain (the image specification<sup>[</sup><a href="#github.opencontainers.image"><sup>13</sup></a><sup>]</sup>) and how to distribute container "images" (the distribution specification<sup>[</sup><a href="#github.opencontainers.distribution"><sup>14</sup></a><sup>]</sup>).</p><p>These specifications mean that various tools can be used to interact with containers. The canonical tool in most common use is the Docker tool, which in addition to manipulating containers, provides container build tooling and some limited orchestration of containers. However, there are many container runtimes:</p><ul><li><p><a href="https://www.docker.com/">Docker</a></p></li><li><p><a href="https://github.com/rkt/rkt">Rkt</a></p></li><li><p><a href="https://cri-o.io/">cri-o</a></p></li><li><p><a href="https://discuss.linuxcontainers.org/t/lxc-3-0-0-has-been-released/1449">LXC</a></p></li><li><p><a href="https://github.com/clearcontainers/runtime">"Clear Containers"</a></p></li></ul><p>As well as other tools that help with building or distributing images.</p><p>Lastly, extensions to the existing standards, such as the container networking interface, define additional behaviour where the standards are not yet clear enough.</p><h2>Implementation</h2><p>While the standards give us some idea as to what a container is and how it should work, it&#8217;s perhaps helpful to understand how a container implementation works. Not all container runtimes are implemented this way; notably, kata containers implement hardware virtualisation, as mentioned earlier with EC2.</p><p>The problems being solved by containers are:</p><ol><li><p>Isolation of a process(es)</p></li><li><p>Distribution of that process(es)</p></li><li><p>Connecting that process(es) to other machines</p></li></ol><p>With that said, let&#8217;s dive into the Docker implementation<sup>[</sup><a href="#docker.overview"><sup>15</sup></a><sup>]</sup>. This uses a series of technologies exposed by the underlying kernel:</p><h3>Kernel feature isolation: namespaces</h3><p>The <code>man namespaces</code> command defines namespaces as follows:</p><blockquote><p><em>A namespace wraps a global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. Changes to the global resource are visible to other processes that are members of the namespace, but are invisible to other processes. One use of namespaces is to implement containers.</em></p></blockquote><p>Paraphrased, a namespace is a slice of the system; from within that slice, a process cannot see the rest of the system.</p><p>A process must make a system call to the Linux kernel to change its namespace. There are several system calls:</p><ul><li><p><code>clone</code>: Create a new process. When used in conjunction with <code>CLONE_NEW*</code> it creates a namespace of the kind specified. For example, if used with <code>CLONE_NEWPID</code> the process will enter a new <code>pid</code> namespace and become <code>pid 1</code></p></li><li><p><code>setns</code>: Allows the calling process to join an existing namespace specified under <code>/proc/[pid]/ns</code></p></li><li><p><code>unshare</code>: Moves the calling process into a new namespace</p></li></ul><p>There is a user command also called <code>unshare</code> which allows us to experiment with namespaces. We can put ourselves into a separate process and network namespace with the following command:</p><pre><code><code># Scratch space
$ cd $(mktemp -d)

# Fork is required to spawn new processes, and proc is mounted to give accurate process information
$ sudo unshare \
    --fork \
    --pid \
    --mount-proc \
    --net

# Here we see that we only have access to the loopback interface
root@sw-20160616-01:/tmp/tmp.XBESuNMJJS# ip addr
1: lo: &lt;LOOPBACK&gt; mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

# Here we see that we can only see the first process (bash) and our `ps aux` invocation
root@sw-20160616-01:/tmp/tmp.XBESuNMJJS# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.3  0.0   8304  5092 pts/7    S    05:48   0:00 -bash
root         5  0.0  0.0  10888  3248 pts/7    R+   05:49   0:00 ps aux</code></code></pre><p>Docker uses the following namespaces to limit the ability for a process running in the container to see resources outside that container:</p><ul><li><p>The <code>pid</code> namespace: Process isolation (PID: Process ID).</p></li><li><p>The <code>net</code> namespace: Managing network interfaces (NET: Networking).</p></li><li><p>The <code>ipc</code> namespace: Managing access to IPC resources (IPC: InterProcess Communication).</p></li><li><p>The <code>mnt</code> namespace: Managing filesystem mount points (MNT: Mount).</p></li><li><p>The <code>uts</code> namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).</p></li></ul><p>These provide reasonable separation between processes such that workloads should not be able to interfere with each other. However, there is a notable caveat: <strong>we can disable some of this isolation</strong>^[<a href="#youtube.jfrazelle.containers-crazy">16</a>].</p><p>This is an extremely useful property. One example would be for system daemons needing access to the host network to bind ports on the host<sup>[</sup><a href="#docker.hostnamespace"><sup>17</sup></a><sup>]</sup>, such as running a DNS service or service proxy in a container.</p><blockquote><p><strong>TIP: </strong>Process #1 or the <code>init</code> process in Linux systems has some additional responsibilities. When processes terminate in Linux they are not automatically cleaned up, but rather simply enter a terminated state. It is the responsibility of the init process to "reap" those processes, deleting them so that their process ID can be reused<sup>[</sup><a href="#krallin.tini"><sup>18</sup></a><sup>]</sup>. Accordingly the first process run in a Linux namespace should be an <code>init</code> process, and not a user facing process like <code>mysql</code>. This is known as the <em>zombie reaping problem</em>.</p></blockquote><h3>Resource isolation: control groups</h3><p>The kernel documentation  <code>cgroups</code> defines the cgroup as follows:</p><blockquote><p><em>Control Groups provide a mechanism for aggregating/partitioning sets of tasks, and all their future children, into hierarchical groups with specialized behaviour.</em></p></blockquote><p>That doesn&#8217;t really tell us much, though. Luckily it expands:</p><blockquote><p><em>On their own, the only use for cgroups is for simple job tracking. The intention is that other subsystems hook into the generic cgroup support to provide new attributes for cgroups, such as accounting/limiting the resources which processes in a cgroup can access. For example, cpusets (see Documentation/cgroup-v1/cpusets.txt) allow you to associate a set of CPUs and a set of memory nodes with the tasks in each cgroup.</em></p></blockquote><p>So, <code>cgroups</code> are a groups of "jobs" that other systems can assign meaning to. The systems that currently use this <code>cgroup</code> systems:</p><ul><li><p><a href="https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt">CPU</a></p></li><li><p><a href="https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt">Memory</a></p></li><li><p><a href="https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt">PIDs</a></p></li><li><p><a href="https://www.kernel.org/doc/Documentation/cgroup-v1/net_prio.txt">Network Priority</a></p></li></ul><p>As well as various others.</p><p><code>cgroups</code> are manipulated by reading and writing to the <code>/proc</code> filesystem. For example:</p><pre><code><code># Create a cgroup called "me"
$  mkdir /sys/fs/cgroup/memory/me

# Allocate the cgroup a max of 100Mb memory
$ echo '100000000' | sudo tee /sys/fs/cgroup/memory/me/memory.limit_in_bytes

# Move this proess into the cgroup
$ echo $$  | sudo tee /sys/fs/cgroup/memory/me/cgroup.procs
5924</code></code></pre><p>That&#8217;s it! This process should now be limited to 100Mb total usage</p><p>Docker uses the same functionality in its <code>--memory</code> and <code>--cpus</code> arguments, and it is employed by the orchestration systems Kubernetes and Apache Mesos to determine where to schedule workloads.</p><p><strong>TIP</strong></p><p>Although <code>cgroups</code> are most commonly associated with containers that&#8217;s already used for other workloads. The best example is perhaps <code>systemd</code>, which automatically puts all services into a <code>cgroup</code> if the CPU scheduler is enabled in the kernel<sup>[</sup><a href="#0pointer.resources"><sup>20</sup></a><sup>]</sup>. <code>systemd</code> services are &#8230;&#8203; kind of containers!</p><h3>Userland isolation: seccomp</h3><p>While both namespaces and <code>cgroups</code> go a significant way to isolating processes into their containers Docker goes further than that to restrict what access the process can have to the Linux kernel itself. This is enforced in supported operating systems via "SECure COMPuting with filters", also known as <code>seccomp-bpf</code> or simply <code>seccomp</code>.</p><p>The Linux kernel user space API guide defines <code>seccomp</code> as:</p><blockquote><p><em>Seccomp filtering provides a means for a process to specify a filter for incoming system calls. The filter is expressed as a Berkeley Packet Filter (BPF) program, as with socket filters, except that the data operated on is related to the system call being made: system call number and the system call arguments.</em></p></blockquote><p>BPF, in turn, is a small, in-kernel virtual machine language used in several kernel tracing, networking and other tasks<sup>[</sup><a href="#lmc.ebpf-intro"><sup>21</sup></a><sup>]</sup>. Whether the system supports seccomp can be determined by running the following command<sup>[</sup><a href="#docker.seccomp"><sup>22</sup></a><sup>]</sup>:</p><pre><code><code>$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)

# Our system supports seccomp
CONFIG_SECCOMP=y</code></code></pre><p>Practically this limits a process&#8217;s ability to ask the kernel to do certain things. Any system call can be restricted, and docker allows the use of arbitrary seccomp "profiles" via its <code>--security-opt</code> argument<sup>[</sup><a href="#docker.seccomp"><sup>22</sup></a><sup>]</sup>:</p><pre><code><code>docker run --rm \
  -it \
  --security-opt seccomp=/path/to/seccomp/profile.json \
  hello-world</code></code></pre><p>However, most usefully, Docker provides a default security profile that limits some of the more dangerous system calls that processes run from a container should never need to make, including:</p><ul><li><p><code>clone</code>: The ability to clone new namespaces</p></li><li><p><code>bpf</code>: The ability to load and run <code>bpf</code> programs</p></li><li><p><code>add_key</code>: The ability to access the kernel keyring</p></li><li><p><code>kexec_load</code>: The ability to load a new Linux kernel</p></li></ul><p>As well as many others. The full list of syscalls blocked by default is <a href="https://docs.docker.com/engine/security/seccomp/">available on the Docker website</a>.</p><p>In addition to <code>seccomp</code> there are other ways to ensure containers are behaving as expected, including:</p><ul><li><p>Linux Capabilities<sup>[</sup><a href="#docker.sec.capabilities"><sup>23</sup></a><sup>]</sup></p></li><li><p>SELinux</p></li><li><p>AppArmour</p></li><li><p>AuditD</p></li><li><p>Falco<sup>[</sup><a href="#sysdig.falco.discussion"><sup>24</sup></a><sup>]</sup></p></li></ul><p>Each of these takes slightly different approaches to ensuring the process is only executed within expected behaviour. It&#8217;s worth spending time investigating the tradeoffs of each security decision or simply delegating the choice to a competent third-party provider.</p><p>Additionally, it&#8217;s worth noting that even though Docker defaults to enabling the <code>seccomp</code> policy, orchestration systems such as <code>kubernetes</code> may disable it<sup>[</sup><a href="#kubernetes.pod-security-policy"><sup>25</sup></a><sup>]</sup>.</p><h3>Distribution: the union file system</h3><p>To generate a container, Docker requires a set of "build instructions". A trivial image could be:</p><pre><code><code># Scrath space
$ cd $(mktemp -d)

# Create a docker file
$ cat &lt;&lt;EOF &gt; Dockerfile
FROM debian:buster

# Create a test directory
RUN mkdir /test

# Create a bunch of spam files
RUN echo $(date) &gt; /test/a
RUN echo $(date) &gt; /test/b
RUN echo $(date) &gt; /test/c

EOF

# Build the image
$ docker build .
Sending build context to Docker daemon  4.096kB
Step 1/5 : FROM debian:buster
 ---&gt; ebdc13caae1e
Step 2/5 : RUN mkdir /test
 ---&gt; Running in a9c0fa1a56c7
Removing intermediate container a9c0fa1a56c7
 ---&gt; 6837541a46a5
Step 3/5 : RUN echo Sat 30 Mar 18:05:24 CET 2019 &gt; /test/a
 ---&gt; Running in 8b61ca022296
Removing intermediate container 8b61ca022296
 ---&gt; 3ea076dcea98
Step 4/5 : RUN echo Sat 30 Mar 18:05:24 CET 2019 &gt; /test/b
 ---&gt; Running in 940d5bcaa715
Removing intermediate container 940d5bcaa715
 ---&gt; 07b2f7a4dff8
Step 5/5 : RUN echo Sat 30 Mar 18:05:24 CET 2019 &gt; /test/c
 ---&gt; Running in 251f5d00b55f
Removing intermediate container 251f5d00b55f
 ---&gt; 0122a70ad0a3
Successfully built 0122a70ad0a3</code></code></pre><p>This creates a docker image with the id of <code>0122a70ad0a3</code> containing the contents of <code>date</code> at <code>a</code>, <code>b</code> and <code>c</code>. We can verify this by starting the container and examining its contents:</p><pre><code><code>$ docker run \
  --rm=true \
  -it \
  0122a70ad0a3 \
  /bin/bash

$ cd /test
$ ls
a  b  c
$ cat *

Sat 30 Mar 18:05:24 CET 2019
Sat 30 Mar 18:05:24 CET 2019
Sat 30 Mar 18:05:24 CET 2019</code></code></pre><p>However, in the <code>docker build</code> command earlier, Docker created several images. If we run the image after only <code>a</code> and <code>b</code> have been executed, we will not see <code>c</code>:</p><pre><code><code>$ docker run \
  --rm=true \
  -it \
  07b2f7a4dff8 \
  /bin/bash
$ ls test
a  b</code></code></pre><p>Docker is not creating a whole new filesystem for each of these images. Instead, each of the images is layered on top of each other. If we query Docker, we can see each of the layers that go into a given image:</p><pre><code><code>$ docker history 0122a70ad0a3
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
0122a70ad0a3        5 minutes ago       /bin/sh -c echo Sat 30 Mar 18:05:24 CET 2019&#8230;   29B
07b2f7a4dff8        5 minutes ago       /bin/sh -c echo Sat 30 Mar 18:05:24 CET 2019&#8230;   29B
3ea076dcea98        5 minutes ago       /bin/sh -c echo Sat 30 Mar 18:05:24 CET 2019&#8230;   29B
6837541a46a5        5 minutes ago       /bin/sh -c mkdir /test                          0B
ebdc13caae1e        12 months ago       /bin/sh -c #(nop)  CMD ["bash"]                 0B
&lt;missing&gt;           12 months ago       /bin/sh -c #(nop) ADD file:2219cecc89ed69975&#8230;   106MB</code></code></pre><p>This allows docker to reuse vast chunks of what it downloads. For example, given the image we built earlier, we can see that it uses:</p><ol><li><p>A layer called <code>ADD file:&#8230;&#8203;</code>&#8201;&#8212;&#8201;this is the Debian Buster root filesystem at 106MB</p></li><li><p>A layer for <code>a</code> that renders the data to disk at 29B</p></li><li><p>A layer for <code>b</code> that renders the data to disk at 29B</p></li></ol><p>And so on. Docker will reuse the <code>Add file:&#8230;&#8203;</code> Debian Buster root for all images that start with <code>FROM: debian:buster</code>.</p><p>This allows Docker to be highly space efficient, reusing the same operating system image for multiple executions.</p><p><strong>TIP</strong></p><p>Even though Docker is hugely space efficient, the docker library on disk can grow extremely large and transferring large docker images over the network can become expensive. Therefore, try to reuse image layers where possible and prefer smaller operating systems or the <code>scratch</code> (nothing) image where possible.</p><p>These layers are implemented via a Union Filesystem or UnionFS. There are various "backends" or filesystems that can implement this approach:</p><ul><li><p><code>overlay2</code></p></li><li><p><code>devicemapper</code></p></li><li><p><code>aufs</code></p></li></ul><p>Generally speaking, the package manager on our machine will include the appropriate underlying filesystem driver; docker supports many:</p><pre><code><code>$ docker info | grep Storage
Storage Driver: overlay2</code></code></pre><p>We can replicate this implementation with our overlay mount fairly easily<sup>[</sup><a href="#so.overlay2"><sup>26</sup></a><sup>]</sup>:</p><pre><code><code># scratch
cd $(mktemp -d)

# Create some layers
$ mkdir \
  lower \
  upper \
  workdir \
  overlay

# Create some files that represent the layers
$ touch lower/i-am-the-lower
$ touch higher/i-am-the-higher

# Create the layered filesystem at overlay with lower, upper and workdir
$ mount -t overlay \
    -o lowerdir=lower,upperdir=upper,workdir=workdir \
    ./overlay \
    overlay

# List the directory
$ ls overlay/
i-am-the-lower  i-am-the-upper</code></code></pre><p>Docker goes so far as to nest those layers until the multi-layered filesystem has been successfully implemented.</p><p>Files that are written are written back to the <code>upper</code> directory in the case of <code>overlay2</code>. However, Docker will generally dispose of these temporary files when the container is removed.</p><p><strong>TIP</strong></p><p>Generally speaking, all software needs access to shared libraries found in static paths in Linux operating systems. Accordingly, it is the convention to simply ship a stripped-down version of an operating system&#8217;s root file system such that users can install it and applications can find the libraries they expect. However, it is possible to use an empty filesystem and a statically compiled binary with the <code>scratch</code> image type.</p><h3>Connectivity: networking</h3><p>As mentioned earlier, containers make use of Linux namespaces. Of particular interest when understanding container networking is the network namespace. This namespace gives the process separate:</p><ul><li><p>(Virtual) ethernet devices</p></li><li><p>routing tables</p></li><li><p><code>iptables</code> rules</p></li></ul><p>For example,</p><pre><code><code># Create a new network namespace
$ sudo unshare --fork --net

# List the ethernet devices with associated ip addresses
$ ip addr
1: lo: &lt;LOOPBACK&gt; mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

# List all iptables rules
root@sw-20160616-01:/home/andrewhowden# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# List all network routes
$ ip route show</code></code></pre><p>By default, the container has no network connectivity&#8201;&#8212;&#8201;not even the <code>loopback</code> adapter is up. We cannot even ping ourselves!</p><pre><code><code>$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
ping: sending packet: Network is unreachable</code></code></pre><p>We can start setting up the expected network environment by bringing up the <code>loopback</code> adapter:</p><pre><code><code>$ ip link set lo up
root@sw-20160616-01:/home/andrewhowden# ip addr
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

# Test the loopback adapter
$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.092 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.068 ms</code></code></pre><p>However, we cannot access the outside world. In most environments, our host machine will be connected via ethernet to a given network and either have an IP assigned to it via the cloud provider or, in the case of a development or office machine, request an IP via DHCP. However, our container is in a network namespace of its own and does not know the ethernet connected to the host. We need to employ a veth device to connect the container to the host.</p><p><code>veth</code>, or "Virtual Ethernet Device" is defined by <code>man vet</code> as:</p><blockquote><p><em>The veth devices are virtual Ethernet devices. They can act as tunnels between network namespaces to create a bridge to a physical network device in another namespace, but can also be used as standalone network devices.</em></p></blockquote><p>This is precisely what we need! Because <code>unshare</code> creates an anonymous network namespace, we need to determine what the <code>pid</code> of the process started in that namespace is<sup>[</sup><a href="#so.anon-veth"><sup>27</sup></a><sup>]+[&lt;&lt;igalia.network-namespaces,28&gt;&gt;]+</sup>:</p><pre><code><code>$ echo $$
18171</code></code></pre><p>We can then create the <code>veth</code> device:</p><pre><code><code>$ sudo ip link add veth0 type veth peer name veth0 netns 18171</code></code></pre><p>We can see these virtual ethernet devices appear both the host and the guest. However, neither has an IP attached nor any routes defined:</p><pre><code><code># Container

$ ip addr
1: lo: &lt;LOOPBACK&gt; mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: veth0@if7: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 16:34:52:54:a2:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
$ ip route show

# No output</code></code></pre><p>To address that, we add an IP and define the default route:</p><pre><code><code># On the host
$ ip addr add 192.168.24.1 dev veth0

# Within the container
$ ip address add 192.168.24.10 dev veth0</code></code></pre><p>From there, bring the devices up:</p><pre><code><code># Both host and container
$ ip link set veth0 up</code></code></pre><p>Add a route such that <code>192.168.24.0/24</code> goes out via <code>veth0</code>:</p><pre><code><code># Both host and guest
ip route add 192.168.24.0/24 dev veth0</code></code></pre><p>And voil&#224;! We have connectivity to the host namespace and back:</p><pre><code><code># Within container
$ ping 192.168.24.1
PING 192.168.24.1 (192.168.24.1): 56 data bytes
64 bytes from 192.168.24.1: icmp_seq=0 ttl=64 time=0.149 ms
64 bytes from 192.168.24.1: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 192.168.24.1: icmp_seq=2 ttl=64 time=0.104 ms
64 bytes from 192.168.24.1: icmp_seq=3 ttl=64 time=0.100 ms</code></code></pre><p>However, that does not give us access to the wider internet. While the <code>veth</code> adapter functions as a virtual cable between our container and our host, there is currently no path from our container to the internet:</p><pre><code><code># Within container
$ ping google.com
ping: unknown host</code></code></pre><p>To create such a path we need to modify our host such that it functions as a "router" between its own, separated network namespaces and its internet facing adapter.</p><p>Luckily, Linux is set up well for this purpose. First, we need to modify the normal behaviour of Linux from dropping packets not destined for IP addresses with which their associated but rather allow forwarding a packet from one adapter to the other:</p><pre><code><code># Within container
$ echo 1 &gt; /proc/sys/net/ipv4/ip_forward</code></code></pre><p>That means when we request public facing IPs from within our container via our <code>veth</code> adapter to our host <code>veth</code> adapter the host adapter won&#8217;t simply drop those packets.</p><p>From there we employ <code>iptables</code> rules on the host to forward traffic from the host <code>veth</code> adapter to the internet facing adapter&#8201;&#8212;&#8201;in this case <code>wlp2s0</code>:</p><pre><code><code># On the host
# Forward packets from the container to the host adapter
iptables -A FORWARD -i veth0 -o wlp2s0 -j ACCEPT

# Forward packets that have been established via egress from the host adapater back to the contianer
iptables -A FORWARD -i wlp2s0 -o veth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Relabel the IPs for the container so return traffic will be routed correctly
iptables -t nat -A POSTROUTING -o wlp2s0 -j MASQUERADE</code></code></pre><p>We then tell our container to send traffic it doesn&#8217;t know anything else about down the <code>veth</code> adapter:</p><pre><code><code># Within the container
$ ip route add default via 192.168.24.1 dev veth0</code></code></pre><p>And the internet works!</p><pre><code><code>$ # ping google.com
PING google.com (172.217.22.14): 56 data bytes
64 bytes from 172.217.22.14: icmp_seq=0 ttl=55 time=16.456 ms
64 bytes from 172.217.22.14: icmp_seq=1 ttl=55 time=15.102 ms
64 bytes from 172.217.22.14: icmp_seq=2 ttl=55 time=34.369 ms
64 bytes from 172.217.22.14: icmp_seq=3 ttl=55 time=15.319 ms</code></code></pre><p>As mentioned, each container implementation can implement networking differently. There are implementations that use the aforementioned <code>veth</code> pair, <code>vxlan</code>, <code>BPF</code> or other cloud specific implementations. However, when designing containers we need some way to reason about what behaviour we should expect.</p><p>To help address this the <a href="https://github.com/containernetworking/cni">"Container Network Interface"</a> tooling has been designed. This allows defining consistent network behaviour across network implementations, as well as models such as Kubernetes shared <code>lo</code> adapter between several containers.</p><p>The networking side of containers is an area undergoing rapid innovation but relying on:</p><ol><li><p>A <code>lo</code> interface</p></li><li><p>A public facing <code>eth0</code> (or similar) interface</p></li></ol><p>being present seems a fairly stable guarantee.</p><h2>Landscape review</h2><p>Given our understanding of the implementation of containers we can now take a look at some of the classic docker discussions.</p><h3>Systems Updates</h3><p>One of the oft-overlooked parts of containers is the necessity to keep them and the host system up to date.</p><p>In modern systems, it is pretty common to enable automatic updates on host systems, and so long as we stick to the system package manager and ensure updates stay successful, the system will keep itself both up-to-date and stable.</p><p>However, containers take a very different approach. They&#8217;re effectively giant static binaries deployed into a production system. In this capacity, they can do no self-maintenance.</p><p>Accordingly, even if there are no updates to the container's software, containers should be periodically rebuilt and redeployed to the production system&#8201;&#8212;&#8201;less they accumulate vulnerabilities over time.</p><h3>Init within container</h3><p>Given our understanding of containers its reasonable to consider the "1 process per container" advice and determine that it is an oversimplification of how containers work, and it makes sense in some cases to do service management within a container with a system like <code>runit</code>.</p><p>This allows multiple processes to be executed within a single container including things like:</p><ul><li><p><code>syslog</code></p></li><li><p><code>logrotate</code></p></li><li><p><code>cron</code></p></li></ul><p>And so fourth.</p><p>In the case where Docker is the only system that is being used it is indeed reasonable to think about doing service management within docker&#8201;&#8212;&#8201;particularly when hitting the constraints of shared filesystem or network state. However systems such as Kubernetes, Swarm or Mesos have replaced much of the necessity of these init systems; tasks such as log aggregation, restarting services or colocating services are taken care of by these tools.</p><p>Accordingly its best to keep containers simple such that they are maximally composable and easy to debug, delegating the more complex behaviour out.</p><h2>In Conclusion</h2><p>Containers are an excellent way to ship software to production systems. They solve a swathe of interesting problems and cost very little as a result. However, their rapid growth has meant some confusion in industry as to exactly how they work, whether they&#8217;re stable and so fourth. Containers are a combination of both old and new Linux kernel technology such as namespaces, cgroups, seccomp and other Linux networking tooling but are as stable as any other kernel technology (so, very) and well suited for production systems.</p><p>&lt;3 for making it this far.</p><h2>References</h2><p>[1] &#8220;Docker.&#8221; <a href="https://en.wikipedia.org/wiki/Docker_(software">https://en.wikipedia.org/wiki/Docker_(software</a>) .</p><p>[2] &#8220;Cloud Native Technologies in the Fortune 100.&#8221; <a href="https://redmonk.com/fryan/2017/09/10/cloud-native-technologies-in-the-fortune-100/">https://redmonk.com/fryan/2017/09/10/cloud-native-technologies-in-the-fortune-100/</a> , Sep. 2017.</p><p>[3] B. Cantrill, &#8220;The Container Revolution: Reflections After the First Decade.&#8221; , Sep. 2018.</p><p>[4] &#8220;Papers (Jail).&#8221; <a href="https://docs.freebsd.org/44doc/papers/jail/jail.html">https://docs.freebsd.org/44doc/papers/jail/jail.html</a> .</p><p>[5] &#8220;An absolutely minimal chroot.&#8221; <a href="https://sagar.se/an-absolutely-minimal-chroot.html">https://sagar.se/an-absolutely-minimal-chroot.html</a> , Jan. 2011.</p><p>[6] J. Beck <em>et al.</em>, &#8220;Virtualization and Namespace Isolation in the Solaris Operating System (PSARC/2002/174).&#8221; <a href="https://us-east.manta.joyent.com/jmc/public/opensolaris/ARChive/PSARC/2002/174/zones-design.spec.opensolaris.pdf">https://us-east.manta.joyent.com/jmc/public/opensolaris/ARChive/PSARC/2002/174/zones-design.spec.opensolaris.pdf</a> , Sep. 2006.</p><p>[7] M. Kerrisk, &#8220;Namespaces in operation, part 1: namespaces overview.&#8221; <a href="https://lwn.net/Articles/531114/">https://lwn.net/Articles/531114/</a> , Jan. 2013.</p><p>[8] A. Polvi, &#8220;CoreOS is building a container runtime, rkt.&#8221; <a href="https://coreos.com/blog/rocket.html">https://coreos.com/blog/rocket.html</a> , Jan. 2014.</p><p>[9] &#8220;Basics of the Unix Philosophy.&#8221; <a href="http://www.catb.org/&nbsp;esr/writings/taoup/html/ch01s06.html">http://www.catb.org/&nbsp;esr/writings/taoup/html/ch01s06.html</a> .</p><p>[10] P. Estes and M. Brown, &#8220;OCI Image Support Comes to Open Source Docker Registry.&#8221; <a href="https://www.opencontainers.org/blog/2018/10/11/oci-image-support-comes-to-open-source-docker-registry">https://www.opencontainers.org/blog/2018/10/11/oci-image-support-comes-to-open-source-docker-registry</a> , Oct. 2018.</p><p>[11] &#8220;Open Container Initiative Runtime Specification.&#8221; <a href="https://github.com/opencontainers/runtime-spec/blob/74b670efb921f9008dcdfc96145133e5b66cca5c/spec.md">https://github.com/opencontainers/runtime-spec/blob/74b670efb921f9008dcdfc96145133e5b66cca5c/spec.md</a> , Mar. 2018.</p><p>[12] &#8220;The 5 principles of Standard Containers.&#8221; <a href="https://github.com/opencontainers/runtime-spec/blob/74b670efb921f9008dcdfc96145133e5b66cca5c/principles.md">https://github.com/opencontainers/runtime-spec/blob/74b670efb921f9008dcdfc96145133e5b66cca5c/principles.md</a> , Dec. 2016.</p><p>[13] &#8220;Open Container Initiative Image Specification.&#8221; <a href="https://github.com/opencontainers/image-spec/blob/db4d6de99a2adf83a672147d5f05a2e039e68ab6/spec.md">https://github.com/opencontainers/image-spec/blob/db4d6de99a2adf83a672147d5f05a2e039e68ab6/spec.md</a> , Jun. 2017.</p><p>[14] &#8220;Open Container Initiative Distribution Specification.&#8221; <a href="https://github.com/opencontainers/distribution-spec/blob/d93cfa52800990932d24f86fd233070ad9adc5e0/spec.md">https://github.com/opencontainers/distribution-spec/blob/d93cfa52800990932d24f86fd233070ad9adc5e0/spec.md</a> , Mar. 2019.</p><p>[15] &#8220;Docker Overview.&#8221; <a href="https://docs.docker.com/engine/docker-overview/">https://docs.docker.com/engine/docker-overview/</a> .</p><p>[16] J. Frazelle, &#8220;Containers aka crazy user space fun.&#8221; , Jan. 2018.</p><p>[17] &#8220;Use Host Networking.&#8221; <a href="https://docs.docker.com/network/host/">https://docs.docker.com/network/host/</a> .</p><p>[18] Krallin, &#8220;Tini: A tini but valid init for containers.&#8221; <a href="https://github.com/krallin/tini">https://github.com/krallin/tini</a> , Nov. 2018.</p><p>[19] <a href="https://chromium.googlesource.com/chromium/src.git/+/HEAD/docs/linux_sandboxing.md">https://chromium.googlesource.com/chromium/src.git/+/HEAD/docs/linux_sandboxing.md</a> .</p><p>[[0pointer.resources]][20] L. Poettering, &#8220;systemd for Administrators, Part XVIII.&#8221; <a href="http://0pointer.de/blog/projects/resources.html">http://0pointer.de/blog/projects/resources.html</a> , Oct. 2012.</p><p>[21] A. Howden, &#8220;Coming to grips with eBPF.&#8221; <a href="https://www.littleman.co/articles/coming-to-grips-with-ebpf/">https://www.littleman.co/articles/coming-to-grips-with-ebpf/</a> , Mar. 2019.</p><p>[22] &#8220;Seccomp security profiles for docker.&#8221; <a href="https://docs.docker.com/engine/security/seccomp/">https://docs.docker.com/engine/security/seccomp/</a> .</p><p>[23] &#8220;Linux kernel capabilities.&#8221; <a href="https://docs.docker.com/engine/security/security/#linux-kernel-capabilities">https://docs.docker.com/engine/security/security/#linux-kernel-capabilities</a> .</p><p>[24] M. Stemm, &#8220;SELinux, Seccomp, Sysdig Falco, and you: A technical discussion.&#8221; <a href="https://sysdig.com/blog/selinux-seccomp-falco-technical-discussion/">https://sysdig.com/blog/selinux-seccomp-falco-technical-discussion/</a> , Dec. 2016.</p><p>[25] &#8220;Pod Security Policies.&#8221; <a href="https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp">https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp</a> .</p><p>[26] Programster, &#8220;Example OverlayFS Usage.&#8221; <a href="https://askubuntu.com/a/704358">https://askubuntu.com/a/704358</a> , Nov. 2015.</p><p>[27] &#8220;How do I connect a veth device inside an &#8217;anonymous&#8217; network namespace to one outside?&#8221; <a href="https://unix.stackexchange.com/a/396210">https://unix.stackexchange.com/a/396210</a> , Oct. 2017.</p><p>[28] D. P. Garc&#237;a, &#8220;Network namespaces.&#8221; <a href="https://blogs.igalia.com/dpino/2016/04/10/network-namespaces/">https://blogs.igalia.com/dpino/2016/04/10/network-namespaces/</a> , Apr. 2016.</p>]]></content:encoded></item><item><title><![CDATA[What is an SLO? What is it suitable for?]]></title><description><![CDATA[Recently, I&#8217;ve had the opportunity to help different organisations implement service-level objectives. The experience has been great, and the organisations are much better due to these clear boundaries (at least). But through this, a familiar series of questions or challenges have come up for each organisation. Today, I want to talk you through a service level objective and what they&#8217;re suitable for. Later, I&#8217;ll also publish some guidance on how you can practically implement a service-level objective in your organisation.]]></description><link>https://www.andrewhowden.com/p/what-is-an-slo-what-is-it-suitable</link><guid isPermaLink="false">https://www.andrewhowden.com/p/what-is-an-slo-what-is-it-suitable</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Tue, 01 Aug 2023 06:30:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f56249e3-6daa-4bcf-9064-e9d4c0838439_434x303.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, I&#8217;ve had the opportunity to help different organisations implement service-level objectives. The experience has been great, and the organisations are much better due to these clear boundaries (at least). But through this, a familiar series of questions or challenges have come up for each organisation. Today, I want to talk you through a service level objective and what they&#8217;re suitable for. Later, I&#8217;ll also publish some guidance on how you can practically implement a service-level objective in your organisation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Ooh, I bet this article is great! Then again, I&#8217;m biased; I wrote it. Still, maybe you want to receive more? Subscribe now!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>The road so far</h1><p>Most of my experience with service-level objectives (or &#8220;SLOs&#8221;) has been at Zalando. Zalando started with SLOs in 2016 and has been on an evolving path to try and improve their effectiveness. You can read more about that journey in an excellent article by my former colleague <a href="https://www.linkedin.com/in/pcalves/">Pedro Alves</a> on <a href="https://engineering.zalando.com/posts/2022/04/operation-based-slos.html">the Zalando Engineering Blog</a>. The journey hasn&#8217;t been smooth, and the organisation's handling of SLOs requires patience and enablement with engineers, managers, product colleagues and executives. You can learn more about how we use these in practice by <a href="https://www.youtube.com/watch?v=diUOjC109Mw">watching the SLOConf video.</a></p><p>This article is designed to boil down that seven years of experience into something you can practically leverage within your organisations.&nbsp;&nbsp;</p><h1>The fundamental problem</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!El4s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!El4s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 424w, https://substackcdn.com/image/fetch/$s_!El4s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 848w, https://substackcdn.com/image/fetch/$s_!El4s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 1272w, https://substackcdn.com/image/fetch/$s_!El4s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!El4s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png" width="434" height="303" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:303,&quot;width&quot;:434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40726,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!El4s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 424w, https://substackcdn.com/image/fetch/$s_!El4s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 848w, https://substackcdn.com/image/fetch/$s_!El4s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 1272w, https://substackcdn.com/image/fetch/$s_!El4s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3909fe4a-77a8-42cb-bec2-30a7b792a2a6_434x303.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When leveraged collectively, engineers can produce software that can fundamentally change the economics of a business, dramatically reducing the cost of a required business operation and opening new markets! However, engineers are some of the more expensive colleagues to hire, and the talent pool for engineers is limited. Additionally, for any given software, there&#8217;s a hard limit on how many engineers it's possible to add before the amount of work required to coordinate those engineers outweighs the additional capacity a single engineer adds.&nbsp;</p><p>Those of us responsible for the engineering time of ourselves and others agonise over the question:</p><div class="pullquote"><p><em>How do I spend my engineer's time to benefit the organisation as much as possible?</em></p></div><p>Even if we have engineering time, an engineer's work is more than adding new, exciting user features to our product. They also need to ensure the software:</p><ol><li><p>Continues to work as expected for users, especially when user demand changes or new features are released.</p></li><li><p>Remains secure as new vulnerabilities are discovered.</p></li><li><p>Is sufficiently clear and straightforward so that new colleagues can be onboarded and effectively contribute</p></li><li><p>It runs efficiently, so the business pays little for the underlying computing.</p></li></ol><p>Different organisations need to make different tradeoffs. A startup might not care as much about reliability or cost as it does about implementing the significant new features required to onboard a new client. The question is then how to <em>split </em>our engineering capacity amongst these tasks. We could choose it based on recent input, managerial decision or gut feeling, but there&#8217;s a better way &#8212; through data.</p><h1>Measuring what matters</h1><p>To establish a framework to govern engineering time, we need to be able to measure the value we get out of different kinds of engineering work. The deciding factor for where we spend engineering time is a critical business metric &#8212; financial return on investment, reduced risk of financial loss, customer lifetime value and engagement. To switch to reliability work, we need to be able to demonstrate what our current level of reliability is, as well as what the likelihood and business cost of unavailability will be.</p><p>The best way to do this is to try and measure the availability of the customer experience as close to the customer as possible. This could be at the edge of your software system (e.g. API Gateway) if you do not own the client device app, or directly in that device if you do. Try and your measurement up into segments that are meaningful to the business. We frequently use customer operations such as &#8220;add to cart&#8221; or &#8220;place order&#8221;. Each of these measurements becomes what we call a <em>service level indicator</em>.&nbsp;</p><p>Invariably, you&#8217;ll spot periods in which your reliability drops. Take a look at what happens to other critical customer metrics both during and after these periods, and see how much you&#8217;re losing as a consequence of unreliability. Keep track of it over 60 days (for example), and write a report for management, making it clear what the cost of unavailability was and what it would have been should we have kept other levels of reliability.</p><h1>Setting the target</h1><p>Once you&#8217;re armed with data, the next step is to work with management to make this data actionable. There are two things that you establish here:</p><h2><strong>The Target</strong></h2><p>The first thing to do is to recommend a specific target that, based on your data, is achievable without sacrificing too much product development (or other critical deliverables) but that will positively impact the customer experience and core business metrics. This target is the actual <em>service level objective. </em>The hint is in the name! It&#8217;s our objective</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wGHA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wGHA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 424w, https://substackcdn.com/image/fetch/$s_!wGHA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 848w, https://substackcdn.com/image/fetch/$s_!wGHA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 1272w, https://substackcdn.com/image/fetch/$s_!wGHA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wGHA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png" width="373" height="243" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63d645d2-2023-42d1-a733-141600713204_373x243.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:243,&quot;width&quot;:373,&quot;resizeWidth&quot;:373,&quot;bytes&quot;:17058,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wGHA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 424w, https://substackcdn.com/image/fetch/$s_!wGHA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 848w, https://substackcdn.com/image/fetch/$s_!wGHA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 1272w, https://substackcdn.com/image/fetch/$s_!wGHA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63d645d2-2023-42d1-a733-141600713204_373x243.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s often easiest to pick a number similar to the <em>median </em>historic availability &#8212; just be as available as you are &#8220;normally&#8221;. Suppose you&#8217;ve suffered some major issues in the meantime. In that case, there will be a difference in the <em>median </em>availability and the <em>mean &#8212; </em>the target already means that you need to spend more time on reliability work. It&#8217;s often much easier to sell management on continuing to achieve what you do <em>on average </em>already, and just fixing &#8220;those outliers&#8221;, and from a management perspective, it limits the maximal investment required.</p><p>An SLO is usually expressed over periods. For example:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;operation&gt; will have an availability of 99.5% on average over 28 days.</p><h2><strong>The culture</strong></h2><p>The second and more important thing to do is to establish a routine of reviewing the service level objectives with your management or engineering planning stakeholders and using it to prioritise work to improve reliability. After all, that&#8217;s the heart of the challenge we&#8217;re looking to solve and the very purpose we designed the SLO for! It&#8217;s also the part I frequently see engineering stakeholders skip.</p><p>The error budget is the best metaphor for understanding when to prioritise reliability over other work. It is essentially &#8220;1 minus the SLO of the service&#8221;. For example, if we have an SLO of 99.5% on our operation, we say we have a &#8220;0.5%&#8221; error budget. We <em>fully expect</em> to spend that error budget each month! We might introduce these errors during migrations, unexpected failures, bad deployments or any other issues that carry some technical risk.&nbsp;</p><p>So long as we remain within that 0.5% error budget, we do not need to add more capacity to reliability work. If we exceed that 0.5% error budget, we shift our engineering allocations to prioritize reliability work until the SLO returns to where we expect.</p><p>We need our management stakeholders to agree and buy into this direction. Ultimately they are the ones who are both accountable for and drive our work, and, fundamentally, they understand the value of this approach as well as build a culture where it is respected.</p><h1>Taking Action</h1><p>An SLO&#8217;s error budget can be quickly exhausted by periods of complete unavailability (a &#8220;fast burn&#8221; mode) as well as an issue that &#8220;slowly leaks&#8221; unavailability (a &#8220;slow burn&#8221; mode). They need different controls to take action.</p><h2><strong>Fast Burn</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i1Jg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i1Jg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 424w, https://substackcdn.com/image/fetch/$s_!i1Jg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 848w, https://substackcdn.com/image/fetch/$s_!i1Jg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 1272w, https://substackcdn.com/image/fetch/$s_!i1Jg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i1Jg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png" width="366" height="243" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bee87a79-5674-428a-9054-6693977f48ed_366x243.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:243,&quot;width&quot;:366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i1Jg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 424w, https://substackcdn.com/image/fetch/$s_!i1Jg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 848w, https://substackcdn.com/image/fetch/$s_!i1Jg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 1272w, https://substackcdn.com/image/fetch/$s_!i1Jg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbee87a79-5674-428a-9054-6693977f48ed_366x243.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For fast burn modes, the best thing to do is to set alerts on the burn rate of the error budget and forward those to an on-call team member to take action when they&#8217;re received. Google has already presented excellent work on <a href="https://sre.google/workbook/alerting-on-slos/#6-multiwindow-multi-burn-rate-alerts">the math of doing this efficiently</a>; the key takeaway for this article is that you should treat it as an emergency or &#8220;incident&#8221; and prioritise fixing it above all other work.</p><h2><strong>Slow Burn</strong></h2><p>For slow burn modes, there is far less urgency to the response. A slow burn issue will mean the error budget is exhausted, but it will take many days (or even weeks!) to do so. It&#8217;s most frequently introduced due to some deployment an engineer didn&#8217;t entirely pay as much attention to as they should.</p><p>To catch these, we can either rely on <a href="https://sre.google/workbook/alerting-on-slos/#6-multiwindow-multi-burn-rate-alerts">the same math Google provides but with a much longer window</a> or periodically review a projection of the SLO at the end of the period. If the SLO is projected to go outside its budget, we take action. If not, we continue with the same trade-offs we&#8217;re making now.</p><h1>In Conclusion</h1><p>Determining where to spend engineering time is at the heart of any modern, especially internet-based business. Service level objectives (or SLOs) are invaluable tools for helping us moderate where we spend that time clearly and objectively, moderated by the actual value of reliability for our business. We need to work hard to make sure we measure what is critical for the customer experience and, correspondingly, for the business to work rather than what is easy. We also need to work to establish the value of reliability by establishing the loss in its absence. If we do this, we can work with management to set a culture where this is prioritized and set routines both for fast and slow reliability challenges.</p><p>Or, we can get much more done with much less discussion.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/p/what-is-an-slo-what-is-it-suitable?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Hey, did you enjoy this? Great! Want more? Me too. Help me make it happen by sharing this with a friend or on your social? I appreciate you &#128591;</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/p/what-is-an-slo-what-is-it-suitable?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.andrewhowden.com/p/what-is-an-slo-what-is-it-suitable?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Help I'm now on call!]]></title><description><![CDATA[What to do if you find yourself responsible for production systems and you're not sure entirely what that means]]></description><link>https://www.andrewhowden.com/p/help-im-now-on-call</link><guid isPermaLink="false">https://www.andrewhowden.com/p/help-im-now-on-call</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Fri, 28 Jul 2023 06:46:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/939b46d2-fb2c-42ba-8b4c-e865ad850a9f_694x470.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s imagine for a minute that you suddenly find yourself being asked to go &#8220;on-call&#8221; for a given production service. You don&#8217;t quite know what being &#8220;on-call&#8221; is, except that many senior engineers do it, which seems necessary. You&#8217;re excited that someone asked you to be on-call, but you&#8217;re not sure you want to take on that responsibility and are worried about how it will affect your family time.</p><p>I have some excellent news: This makes you <strong>Perfectly Normal</strong>. Being on-call is a weird situation! I&#8217;m writing this guide for you, hoping you become more familiar with this responsibility and more ambitious to take it on yourself. It is an excellent way to further your engineering career, learn about production systems, and take responsibility for the customer experience.</p><p>I&#8217;ve been on call for most of my software engineering career. I&#8217;ve gone through many, many iterations &#8212; from being &#8220;unofficially&#8221; on-call (read: always on-call without compensation) to being part of an engineering team that&#8217;s set up and is managing a rotation to <a href="https://www.andrewhowden.com/p/establishing-a-shared-understanding-of-extremely-urgent-critical-business-issues-in-software-d9e25c54eaec">designing incident response processes</a> to being the &#8220;Incident Commander&#8221; for a billion dollar European fashion company. I&#8217;ve felt almost every part of being on-call, from the &#8220;Oh god&#8221; moment of breaking production systems, the 3 am &#8220;Not this bug again &#129318;&#8221; drag to the &#8220;Oh buddy! Don&#8217;t worry, we&#8217;ve got this&#8221; moment helping a responder recover from their production challenges.&nbsp;</p><p>To best prepare for 24x7, we should first understand why an organisation maintains this capability.</p><h1>TL, DR</h1><ul><li><p>All modern software businesses need on-call.</p></li><li><p>The key to successful on-call is preparation. Figure out your responsibilities, learn the process, figure out your surroundings, understand how to debug and adjust your service in production, understand the significant projects happening and ensure your equipment is prepared.</p></li><li><p>When the pager goes off, triage the issue. Figure out what is happening through the telemetry you studied earlier, and work with teams around you to figure out an intervention. Try it, and then go on. Be sure to communicate clearly as you&#8217;re responding.</p></li><li><p>When it&#8217;s all over, go through the process of learning from your experience. Document the impact, what happened when a causal tree of anything interesting and then a summary for executive readers.</p></li><li><p>Through preparation, you&#8217;ll be fine. Try it!!</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">You read the TL, DR! That&#8217;s basically the critical bit. Want more TLs and DRs? Subscribe now!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>The ever-present service offering</h1><p>Modern internet-based businesses are expected to be available at all hours of the day. In many cases, the time at which the majority of customers are accessing the service is outside the hours of those who are working on that service. A business might serve the vast majority of customers when no one is looking!</p><p>This means the <em>riskiest, highest profit period </em>is often when no one is at their desk! And if something <em>breaks, </em>the business is burning trust with far more customers than might have happened during the day. This is an untenable outcome for many companies; they will not survive burning their customer's trust in this way. Given this, it is essential to have someone tasked with responding to issues as they&#8217;re reported. As a result, if a business's customer group is primarily anchored around business hours, it's often not worth maintaining the 24x7 capability. It might still be worth having an <em>on-call team </em>&nbsp;&#8212; but one that operates close to business ours (e.g. 08:00&#8594; 18:00).</p><p>In my experience, the most effective on-call teams operate in groups of 5 - 6 people drawn from teams that maintain the application code and the infrastructure definitions of a given application. These team members are usually &#8220;senior&#8221; and have experience with many different states of the application (good and bad), and can debug an extensive range of failure modes. They often occupy other senior positions, such as writing the architectural guidance of a given application or making tradeoffs around technology choices. They work in shifts, typically for a week and are on-call once every 5 - 6 weeks (in rotation with their colleagues). They carry a dedicated mobile device on a high-quality network during this period. They can be in front of a computer debugging a production issue within 5 - 30 minutes of receiving a notification.</p><p>This is a substantial commitment from these colleagues; they <strong>should be financially compensated</strong> &#8212; especially if it is a commitment beyond the normal expectations of software engineering.</p><p>&gt; &#128161; If you&#8217;ve never done on-call, these colleagues can be intimidating. They are usually very experienced colleagues with opinions based on that experience. They can be stubborn about an approach because they ultimately pay the price for poor outcomes. However, it&#8217;s important to remember they&#8217;re ultimately human. The best way to join them is to try being on-call!</p><h1>The problem not solved.</h1><p>Today, we&#8217;ll discuss joining a healthy, high-performing team as a new on-call colleague. <em>Setting up a new on-call team is considerably more challenging</em>. Let me know if you&#8217;re interested in this in the comments section!</p><h1>Preparing our gear</h1><p>We usually think about being on-call as responding to production issues. However, in my experience, the key to being an influential on-call team member is the same as being an effective fire marshal or first aider &#8212; preparation. What happens in the incident itself is driven by how much time we spend in practice and not based on the skill or intellect of any given responder.</p><p>Things that you should look into before you go on call include:</p><h2><strong>Figure out your responsibilities</strong></h2><p>There are usually multiple on-call teams in any large organisation (i.e. more than 50 engineers). Each of these engineers is responsible for a <em>subset </em>of production systems and works with systems run by other teams. The first thing to look at is what your team is responsible for. There should be a list of the following:</p><ul><li><p>Applications (binaries you have running in production)</p></li><li><p>Endpoints (DNS endpoints and routes you have exposed)</p></li><li><p>Business Processes</p></li></ul><p>If you&#8217;re joining a team that has been there long, you may have to write or update this list. That&#8217;s fine &#8212; it&#8217;s an opportunity to learn the system's boundaries. You should figure out the stakeholders of each application, endpoint or business process and what the value of that process is to the business. This allows you to determine how urgently to intervene and how much risk you should take with the response.</p><blockquote><p>&#128129; I have a series of &#8220;canned responses&#8221; for various failures that I can copy-paste into chat, email or other communication tools as they happen. They&#8217;re just stored on disk, and I get them through &#8220;cat | xsel &#8211;clipboard&#8221;. I find these extraordinarily useful to get some critical information out quickly and clearly in a way I otherwise can&#8217;t while debugging these systems.</p></blockquote><h2><strong>Learn the process</strong></h2><p>Organisations tend to have a clear boundary of separation between things that are &#8220;kind of bad&#8221; and &#8220;incidents&#8221;. Incidents are extraordinary &#8212; we are encouraged to drop all other work no matter what time of day it is, we can requisition colleagues immediately, we&#8217;re prepared to accept more risk deploying changes, and we communicate in ways that might otherwise be considered rude.</p><p>We must <em>delimit when entering &#8220;Incident Response&#8221; </em>versus any normal part of the software delivery life-cycle. How to do this varies depending on the organisation, but it could be:</p><ul><li><p>The creation of an &#8220;Incident&#8221; artifact in something like OpsGenie, PagerDuty or Jira</p></li><li><p>Using a unique phrase (e.g. &#8220;This is an incident&#8221;) in a chat tool</p></li><li><p>Creating a new thread in a chat tool in a particular channel, or a channel dedicated to the purpose</p></li></ul><p>Frequently there are &#8220;chat ops&#8221; tools that make this transition easier. Once you&#8217;re in an incident process, there are other tasks that you&#8217;ll need to learn how to do to make the process run smoothly. Things like:</p><ul><li><p><strong>Involving another team</strong> if you figure out you need their assistance to resolve the issue</p></li><li><p><strong>Update a status page</strong> to let non-technical stakeholders know what the status of the problem is</p></li><li><p><strong>Notify colleagues o</strong>f discoveries or interventions to collaborate with them on finding a solution</p></li><li><p><strong>Mark the problem as repaired</strong> once you&#8217;ve made the system stable to return to &#8220;normal operations&#8221;.</p></li></ul><p>Figuring out this stuff beforehand will save you enormous stress in the incident and allow you to quickly find the people you need to help you mitigate an issue.</p><blockquote><p>&#128129; Recently, I&#8217;ve seen quite a few people struggle to interact with the &#8220;ChatOps&#8221; tools, or if the &#8220;ChatOps&#8221; tool is unavailable, be unable to manage an incident. This costs us time, which in turn costs us money. Try and get very familiar with these tools ahead of time!</p></blockquote><h2><strong>Feel out your surroundings</strong></h2><p>Once you&#8217;ve figured out your responsibilities and how to interact with the process, the next thing to do is figure out the duties of those <em>around you</em>. Teams that operate services on which your services depend, as well as stakeholders that are likely to reach out if they notice an issue. People who need to be notified in case something in your responsibility is unavailable.&nbsp;</p><p>In particular, you want to know how to communicate with these people <em>in an emergency</em>. If it's another on-call team, figure out what the team is called and what operation you need to do to include them in the response. If it is a stakeholder, figure out how they prefer to receive emergency updates and write a process to deliver it as they expect.&nbsp;</p><p>Lastly, please get to know these people and their perspectives. Meet them, and introduce yourself and how you will work during an incident process. Sit with them and review how they view their applications, tooling or function so that you can understand their position during a response.&nbsp;</p><p>This will allow you to build a mnemonic or playbook to manage interacting with the &#8220;in-anger&#8221; that balances what they need with the urgency of response. This also goes a tremendous way to salve feelings if you inadvertently communicate in a terse (or rude) way during an incident due to stress.</p><h2><strong>Understand your service in production.</strong></h2><p>So! You&#8217;ve figured out your area of responsibility, the process requirements and who you&#8217;ll be working with. The next thing to do is build expertise in the software or infrastructure that&#8217;s within the domain you&#8217;re responsible for. After all, you&#8217;ll need to debug it when something goes wrong!</p><p>Some of the ways I&#8217;ve done this in the past include:</p><ul><li><p><strong>Review all of the playbooks</strong>. Any playbooks written about the service are reviews of previous failures that someone has been kind enough to write guidance for! They are invaluable as both a preparation and response tool.</p></li><li><p><strong>Review the dashboards, logs and metrics. </strong>The telemetric data the application generates is the same data you&#8217;ll need to rely on when the system malfunctions. You&#8217;ll need to be familiar with it and be able to spot deviations from regular traffic.</p></li><li><p><strong>Review the configurable aspects of the application. </strong>The application configuration is &#8220;anything that can be changed outside a deployment&#8221; and includes anything from the number of replicas to whether or not a specific feature flag is enabled. You should be able to look at the current configuration, a history of how the configuration has changed, and confidently update values in the configuration.</p></li><li><p><strong>Deploy the application. </strong>Sometimes, when something goes wrong, the only thing that will address it is a change to the source code. Whether this is a rollback to a previous version or a &#8220;fix-forward&#8221; where you&#8217;re writing and merging a patch, deploying the application is a skill you&#8217;ll need to be familiar with.</p></li><li><p><strong>Review previous incidents. </strong>Hopefully, as our colleagues have had challenges with our applications, they&#8217;ve improved it so we do not have repeat issues. Still, incidents are beautiful opportunities to learn how our software deviates from what we expected. Reviewing past incidents can help us understand where the &#8220;sharp edges&#8221; of our systems are.&nbsp;</p></li></ul><p>Once you&#8217;ve tried these tasks, I encourage you to <em>try and improve them</em>. Try and write a new playbook for a failure mode you anticipate, improve a telemetry view or graph or improve the default for a configuration. As you drive these improvements, your conversations with colleagues will teach you more than just the artifacts.</p><h2><strong>Understand the significant projects in your area of responsibility.</strong></h2><p>One of the things that you&#8217;ll quickly learn as you go on call is the majority of issues with production systems are a result of some change that has been recently introduced. This is normal &#8212; software <a href="https://www.andrewhowden.com/p/dying-well-conducting-an-effective-post-mortem-7481b9654d19">can be incredibly complex</a>! It&#8217;s challenging to anticipate every change's consequences; the more significant the change, the larger the space for unanticipated consequences.&nbsp;</p><p>An excellent way to get ahead of the &#8220;likely future failures&#8221; is to keep an eye on things that will introduce significant change. Things like:</p><ul><li><p>Substantial changes to the customer behaviour</p></li><li><p>Significant architectures of the system</p></li><li><p>Major upgrades of runtimes, libraries, frameworks etc</p></li><li><p>Rewrites of service behind an API</p></li></ul><p>Large projects <a href="https://www.andrewhowden.com/p/the-inherent-difficulty-in-long-term-projects-51a20031ec3">also tend to run overdue</a>, so engineers are more likely to sacrifice reliability work to get the project delivered. As an on-call team member, your task is not to get in the way of such a release but to empower the team as much as possible to make the release safe. You can go a long way toward safety by ensuring the team has a clear plan to roll back the change if it goes wrong and when to invoke this rollback plan.</p><p>Even with the owning team taking a healthy level of responsibility for a change, changes tend to go live during &#8220;quiet periods&#8221; of the day, and the on-call team members are responsible for that exact change during the busiest, highest impact periods. You will likely be responsible for adjusting or rolling back this change during the response. You should prepare ahead of time by making sure the exit criteria and path are clear enough that <em>you </em>can execute them.</p><h2><strong>Get your hardware &amp; software prepared</strong></h2><p>Lastly, for preparation, there are things that we need to have to interact with production systems. These include</p><ul><li><p><strong>A functioning laptop</strong>. Ensure your laptop is charged and all updates are installed before the shift starts.</p></li><li><p><strong>A functioning phone to receive notifications. </strong>As with the laptop, ensure it's charged and updated.</p></li><li><p><strong>Chargers. </strong>Sometimes something goes wrong for a sufficiently long enough time that our devices run flat. We need to be able to plug them into a socket.</p></li><li><p><strong>Network access to production. </strong>Unless you&#8217;re sleeping at the office, you&#8217;ll likely be at home when you receive notifications! You should ensure a stable internet connection and, ideally, a cell-based backup connection.</p></li><li><p><strong>Permission to access production. </strong>At any modern corporation, permissions tend to degrade over time. Either a system will make you &#8220;less privileged&#8221; or remove your access to some systems entirely. This is a good and healthy <a href="https://en.wikipedia.org/wiki/Principle_of_least_privilege">implementation of the principle of least privilege</a>, but we need to validate we have sufficient permissions before we go on shift.</p></li></ul><p>If you&#8217;re a new colleague, having a checklist for these things that you physically mark off before the shift is good. More experienced colleagues tend to maintain this out of habit &#8212; but also, occasionally, forget.</p><h1>The unexpected adventure</h1><p>So! The day has come. Hopefully, you prepared as much as possible, but finally, something has broken so severely that it requires emergency intervention. Let&#8217;s talk about what to do next.</p><blockquote><p>&#128147; When you get that page it can be <em>extremely </em>stressful. All the more so if things do not go smoothly; maybe you have the manager asking questions and your teammates disappearing or maybe you&#8217;re alone at 04:00.</p><p><em><strong>This is normal</strong>. </em>It gets better after a few live incidents, but never entirely goes away. Take a minute to take a breath, compose yourself and then continue. No matter what happens next, you&#8217;ll be at your best with a clear(ish) head.</p></blockquote><h2><strong>Triage the issue</strong></h2><p>The first thing to do is understand the issue's scope and magnitude. That lets us decide what level of risk to tolerate when trying to fix it and how many people to wake up or assign to help address it.</p><p>Often, the incident process has multiple &#8220;levels&#8221;. If unsure, pick the more severe one &#8212; you can apologise later. Raise the incident at the appropriate &#8220;severity&#8221;, and communicate your understanding of what users are experiencing.</p><h2><strong>Intervene</strong></h2><p>Review the telemetry data from your application and leverage your engineering skills to understand the pathological condition.</p><p>The specifics of debugging production depend on the architecture of your system. There are many good heuristic models to understand systems (e.g. <a href="https://www.brendangregg.com/usemethod.html">USE</a>), but debugging is outside the scope of this article. Instead, what I want to mention is just that you&#8217;ll need <a href="https://en.wikipedia.org/wiki/OODA_loop">to go through the OODA loop</a>:</p><ul><li><p><strong>Observe</strong>: Figure out what you can understand by reviewing the telemetry from the system.</p></li><li><p><strong>Orient: </strong>Make that valuable information by leveraging your knowledge of the system and its context (e.g., is it a sales period or a significant release today).&nbsp;</p></li><li><p><strong>Decide: </strong>Figure out what to do with that information.&nbsp;</p></li><li><p><strong>Act: </strong>Intervene</p></li><li><p><strong>Repeat</strong></p></li></ul><p>As you&#8217;re going through the steps, periodically communicate. Most useful are if you&#8217;ve learned something new, you&#8217;re about to act, or you just acted. When you communicate, communicate <em>statelessly</em>. That means don&#8217;t assume that anyone reading your communication has been following along so far, understands the system or follows your hypothesis. As you&#8217;re supplying numbers, be specific (i.e. 300ms) rather than relative (&#8220;Huge latency&#8221;). Lastly, be kind but direct &#8212; be clear in what you&#8217;re saying, but don&#8217;t spend time with linguistic polish.</p><p>Lastly, focus your investigation only on <em>how to restore the production experience</em>. While how production broke is an important question, it is a question that&#8217;s distinct and less useful than how to restore the production experience.</p><blockquote><p>&#128129; I&#8217;ve seen quite a lot of incidents in which a change has materially changed the performance characteristics of an application. We don&#8217;t usually figure that out until peak traffic hits (or a sale). In that case, the question is not &#8220;What made the application slow&#8221;, is &#8220;How far can we scale this application out? What are the bottlenecks?&#8221;</p><p>The latter is much simpler and will lead you to restore production much faster.</p></blockquote><p>Once you&#8217;ve figured out a good intervention, do it (and communicate it). If it doesn&#8217;t work, roll it back, share that and try again. If you get stuck or need help from another team, include them!</p><h2><strong>Review</strong></h2><p>Hopefully, at this point, you&#8217;ve been able to make some changes to the production system so that the customer experience has been restored. You&#8217;re not quite sure why the system broke, but it's sufficiently stable that you can breathe.</p><p>Now, see if you can figure out how stable the system will be over the next few hours. Your goal now is to <em>buy time </em>to hand the problem back to the owning engineering team so that they can deal with it properly. If you need to intervene further to ensure this stability, do so, and communicate that.</p><p>If you&#8217;ve made changes to configuration, code or anything else, ensure these changes are reflected in version control. Having someone deploy and undo all your precious recovery doesn't feel great!</p><h2><strong>Repair</strong></h2><p>Once you&#8217;re confident the system is stable, mark it repaired and communicate that you do not expect further issues. Write down everything you think is relevant in some notes for reviewing the incident, and step away from the keyboard for a bit.</p><p>&#128241;Take your phone! While most systems behave after we&#8217;ve intervened, sometimes they do not. If they break again, you will be paged again.</p><h1>Learning and improving</h1><p>Whew! So far, we&#8217;ve gone through preparation and then leveraged that practice to restore our production issue. All done or?<br><br>So, as you might guess, you&#8217;re not off the hook just yet. Once the system has reached stability, we need to understand how it got into its failure condition so we can adjust it to be less likely to do that in future or adapt ourselves and our processes to restore the system more quickly. We go through this understanding <a href="https://www.andrewhowden.com/p/dying-well-conducting-an-effective-post-mortem-7481b9654d19">through something called a </a><em><a href="https://www.andrewhowden.com/p/dying-well-conducting-an-effective-post-mortem-7481b9654d19">postmortem.</a> </em>Check out the linked post for details!</p><h1>In Conclusion</h1><p>Being on call can be a pretty hectic experience. In this post, we covered the background of being on call, the preparation, what to do in an incident, and what to do after. I&#8217;m confident that if you go through this preparation yourselves, you&#8217;ll be far more capable of helping improve your user's experience than you would be if you just gave it a go. Hopefully, this post gives you tips to feel more confident as you take that pager.</p><p>If not, hit me up in the comments so I can help improve it. Thanks &#9829;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Gosh, that was a lot! If you&#8217;ve made it this far, congratulations &#128512; Maybe you&#8217;re really enjoying these posts. Or maybe you need to be on-call soon. Either way, subscribe for more helpful stuff! </p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Running an effective meeting]]></title><description><![CDATA[Making good use of everyone else time]]></description><link>https://www.andrewhowden.com/p/running-an-effective-meeting</link><guid isPermaLink="false">https://www.andrewhowden.com/p/running-an-effective-meeting</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Fri, 21 Jul 2023 16:39:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LF-e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of my colleagues said something incredibly insightful the other day. Something I fully intend to steal and shamelessly reuse:</p><blockquote><p>Routine meetings decay in quality &#8212; <a href="https://www.linkedin.com/in/lukas-wilhelm-b2402b177/">Lukas Wilhelm</a></p></blockquote><p>As I&#8217;ve gone through my career, I have been part of &#8230; many thousands of meetings.  Planning meetings, retro meetings, project meetings, 1:1s, and reviews are an invariable necessity of working with our peers.</p><p>However, not all meetings are created equal. Some of the meetings I&#8217;ve been in have been nothing but a monument to whoever organized it, without a clear purpose or buy-in from other attendees and certainly no clear value delivered at the end of it. Others have unlocked weeks worth of work in 30 minutes.</p><p>That begs the question: How do we conduct an <em>effective </em>meeting? How do we best use people&#8217;s limited time and attention to drive a positive organizational outcome?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Feel like your last meeting could have been an email? Good news, this one is! Want more? Subscribe!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>The utility of a meeting</h3><p>If you want to find out the utility of a meeting, you can do so quickly: Ask yourself what you changed due to being in that meeting. Did you adjust your own deliverables? The deliverables of someone else? Did that meeting <em>save time?</em></p><p>As a corollary, if you regularly join a series of meetings and do not adjust your actions, stop joining. You can have that conversation via email, or better yet &#8212; not at all.</p><p>Unless it&#8217;s a coffee, there&#8217;s always time for coffee.</p><h3>The tool for the job</h3><p>Many different kinds of meetings happen throughout an organization&#8217;s lifecycle.  For example: </p><ul><li><p><strong>Accountability Meetings.</strong> These are usually called &#8220;status meetings&#8221; or &#8220;project check-ins&#8221;, but are primarily designed to inform stakeholders about the state of a given project. Invariably, they&#8217;re also an opportunity for stakeholders to set expectations regarding where the project should be. This means people tend to work pretty hard just before whenever these meetings are scheduled.</p></li><li><p><strong>Decision Meetings</strong>. These are meetings where an organisational tradeoff needs to be made (usually by a senior leader), who gathers a set of stakeholders together to query and then makes that decision.</p></li><li><p><strong>Kickoff Meetings</strong>. These are where there&#8217;s a new project, process, team or other change that needs to be managed, and <a href="https://sre.google/workbook/organizational-change/">we need to build urgency</a> and a shared understanding of the new expected normal.</p></li><li><p><strong>Planning Meetings</strong>. These are routine meetings that review some work artifacts (e.g., tickets, operational data, performance data) and adjust how to work over the next period.</p></li><li><p><strong>Retrospectives</strong>. These are meetings designed to collaboratively review a team's performance, a project, or whatever and figure out how to evolve the approach going forward. </p></li><li><p><strong>1:1s</strong>. These meetings are designed for context exchange, to check in on how a colleague feels and their morale, and to help shape their specific contributions to a given team.</p></li><li><p><strong>Coffee / Beer</strong>. These meetings are deliberately unstructured and unrecorded, and their topics can range wildly. <em>However, </em>they are often where colleagues determine how to deliver the value of their work, rather than how to complete their assignments. </p></li><li><p><strong>Presentations</strong>. These meetings are mechanisms where a colleague will share their experience.</p></li></ul><p>These meetings are all beneficial. There&#8217;s a second class of meetings which I&#8217;ll briefly mention, which in my experience are less useful. </p><ul><li><p><strong>Brainstorming</strong>. Shared brainstorming is a suitable mechanism for achieving consensus but a bad mechanism for delivering quality insight. Instead, what tends to happen is the group shifts into groupthink as quickly as possible, and what comes out is the mean and not the valuable insight.</p></li><li><p><strong>Lecture</strong>. A meeting doesn&#8217;t tend to start out as a lecture. Still, it can shift into one as a participant dominates the conversation to fill the space until no argument is possible, rather than communicating to be listened to.</p></li></ul><p>Each of these meetings has a unique culture and set of expectations. The first step to maximizing the value of a given meeting is to understand what kind of meeting you&#8217;re in and to ensure that other participants joining the meeting have the same shared understanding.</p><h3>The minimum requirements</h3><p>Some things are familiar to most meetings &#8212; things you can do almost no matter the occasion. These include:</p><h4>Assign Responsibility</h4><p>Within a meeting, some people should have particular responsibilities within the meeting itself. These include:</p><ul><li><p><strong>Organizer</strong>. The person who writes and circulates an agenda, <em>ahead of time</em>. </p></li><li><p><strong>Chair</strong>. The person directing the meeting, and who is responsible for ensuring that the agenda is followed, we do not drift too far from the topic, specific individuals cannot monopolize time, and others cannot remain entirely reticent.</p></li><li><p><strong>Scribe</strong>. The person who will note down the actions we need to take as a result of this meeting. This allows us to hold each other accountable in the next meeting, and ensure this meeting actually has value.</p></li></ul><p>A single person generally cannot do all of these roles &#8212; they spend the time in the meeting switching between them, and one role (e.g. scribe) can come at the cost of another (e.g. chair).</p><h4>Prepare</h4><p><strong>The most crucial step in a successful meeting is preparing the meeting ahead of time.</strong></p><p>To deliver a meeting, there needs to be:</p><ul><li><p><strong>A clear vision</strong>. Some reason that it&#8217;s worth gathering all of the people together to address a given problem &#8212; a common purpose we&#8217;re all working toward. </p></li><li><p><strong>A direction</strong>. A path that we take toward our vision, through a set of (pre-made) strategic choices.</p></li><li><p><strong>Deliverables</strong>.  Things that specific people need to do by a specific time and are accountable to a specific leader.</p></li><li><p><strong>Help</strong>. A place that people can go when they invariably get lost or drift out of alignment with the group.</p></li></ul><p>A meeting &#8212; indeed, any organizational direction setting &#8212; without these tends to last only a limited period of time, or descend quickly into in-fighting with people motivated to solve their problems and not the problem of the group.</p><p>This is most easily done by preparing it as part of an Agenda document that&#8217;s prepared early and sent around ahead of time. If it can&#8217;t be sent around in time, schedule a 10-minute block at the start of the meeting for all stakeholders to read it.</p><p>My preferred Agenda template looks like</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LF-e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LF-e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 424w, https://substackcdn.com/image/fetch/$s_!LF-e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 848w, https://substackcdn.com/image/fetch/$s_!LF-e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 1272w, https://substackcdn.com/image/fetch/$s_!LF-e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LF-e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png" width="795" height="729" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:729,&quot;width&quot;:795,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95610,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LF-e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 424w, https://substackcdn.com/image/fetch/$s_!LF-e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 848w, https://substackcdn.com/image/fetch/$s_!LF-e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 1272w, https://substackcdn.com/image/fetch/$s_!LF-e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff46094a6-283d-41a3-93e5-ba21b3efa402_795x729.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It includes:</p><ul><li><p><strong>A goal </strong>describing the purpose of the meeting (or series of meetings)</p></li><li><p><strong>A section for each meeting</strong>, titled with the day / time the meeting happened.</p></li><li><p><strong>Attendees</strong>, so we know who joined this instance of the meeting</p></li><li><p><strong>Assignments</strong>, so we know who&#8217;s doing what. In this case, I&#8217;m usually both organizing and chairing the meeting so this is not assigned.</p></li><li><p><strong>Sections</strong>. Each section describes what should exist as a &#8220;pre-read&#8221;, and a section that allows us to add new information as it develops in the meeting. </p></li><li><p><strong>Action Items</strong>. Specific items for specific people.</p></li></ul><h4>Include the right stakeholders</h4><p>When setting up a meeting it is important to be clear as to who is a requirement for that meeting to be a success, and who is optional. As a rule, I target the lowest level decision maker that can confidently address the problem that I have in scope, and I ask them what support capabilities they need within the meeting. I&#8217;ll then add both them, and whatever I need.</p><p>Equally critical but less pleasant is who to <em>avoid </em>when scheduling a meeting. There are stakeholders that, while they might have the best of intentions, either do not have the experience in the topic, are ill-informed about the requirements or otherwise detail the conversion.</p><p>There&#8217;s a last class of people who will in future be part of these meetings. They&#8217;re generally on stretch assignments or are being coached to take over. I add them, but inform them ahead of time that the majority of their discussion should be outside this meeting with their &#8220;meeting sponsor&#8221;.</p><h3>Follow Up</h3><p>Earlier, we talked about the utility of a meeting is the amount of change it drives through an organization. In my experience, this change doesn&#8217;t happen unless there's a point in time at which the people responsible for it are held accountable &#8212; often in another meeting.</p><p>Given this, at the end of this meeting once responsibilities are assigned, schedule the next meeting and set the clear expectation that we need to adjust by this point in time.</p><h2>In Summary</h2><p>So far, I&#8217;ve not seen an organization that isn&#8217;t at least mostly driven through a series of check-in, kickoff or accountability meetings through all layers of management &#8212; at least, not a successful one. However, there&#8217;s a massive range between meetings that are truly useful and those that &#8230; well, in which our colleagues are secretly in chat laughing about something entirely off-topic.</p><p>Hopefully, this post has provided you with at least some value in thinking about how to drive these meetings more confidently and certainly more effectively.</p><p><em><strong>Post Script</strong>. I wanted to write a bit more here, but ran out of time today. I might try and extend this in future &#8212; I&#8217;ll just update the post in-place.</em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading this post I didn&#8217;t get time to finish! Want more half-finished content? Great! Its the internet, there&#8217;s plenty. But you can find more of mine by subscribing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The problem of SRE vs DevOps vs ... whatever]]></title><description><![CDATA[One of the well-intentioned but less valuable conversations that tend to happen around the discipline of &#8220;Site Reliability Engineering&#8221; is &#8220;What&#8217;s the difference between a Site Reliability Engineer (SRE) and DevOps&#8221;.]]></description><link>https://www.andrewhowden.com/p/the-problem-of-sre-vs-devops-vs-whatever</link><guid isPermaLink="false">https://www.andrewhowden.com/p/the-problem-of-sre-vs-devops-vs-whatever</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Thu, 13 Jul 2023 10:49:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!f51t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the well-intentioned but less valuable conversations that tend to happen around the discipline of &#8220;Site Reliability Engineering&#8221; is &#8220;What&#8217;s the difference between a Site Reliability Engineer (SRE) and DevOps&#8221;. There is an abundance of articles with helpful comparisons such as &#8220;<a href="https://www.knowledgehut.com/blog/devops/devops-vs-sre">DevOps use automation tools like Puppet or Chef to ensure consistency vs. SRE which avoids these as they do not scale, instead using languages like Python or Bash</a>&#8221; or &#8220;<a href="https://www.ibm.com/cloud/blog/three-differences-between-devops-and-sre">DevOps are the (people) writing code vs SRE which are more investigative</a>&#8221;. I usually answer the facetious &#8220;I&#8217;m an SRE, as that gets paid more&#8221;. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f51t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f51t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!f51t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!f51t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!f51t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f51t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png" width="460" height="287.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:460,&quot;bytes&quot;:170029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f51t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!f51t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!f51t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!f51t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6aea820f-fe69-4e5b-8074-5128b43cfbdd_2560x1600.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I don&#8217;t think any of this comparison is helpful. Instead, I want to provide a different way of looking at the problem that makes us much more accountable for improving our organization&#8217;s capacity to deliver a better customer experience.</p><p>The things we need to think about are:</p><ul><li><p>Mission</p></li><li><p>Problem Domains</p></li><li><p>Team Size &amp; Contribution Models</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Not convinced to subscribe yet? Pff, neither would I be. But just in case, here&#8217;s the subscribe box:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Mission</h2><p>As far as I can see, the mission of both &#8220;DevOps&#8221; and &#8220;SRE&#8221; still boils down the same way &#8212; to <a href="https://andrewhowdencom.substack.com/p/the-fundamental-aspects-of-reliability">ensure the customer experience remains reliable and we retain customers&#8217; trust</a> while enabling the business to further innovate on the customer experience.</p><h2>The Problem</h2><p>Ensuring the customer experience remains available and retaining customers&#8217; trust requires various capabilities. For example, we need to be able to:</p><ul><li><p>Determine when there&#8217;s a customer experience regression. Occasionally this goes under the banner of &#8220;Observability&#8221;, &#8220;Availability&#8221;, or &#8220;Bounce Rate&#8221; &#8212; it all boils down to &#8220;How many customers are there online now, and are they having a bad time&#8221;.</p></li><li><p>Determine where the performance regression was introduced. This is <em><strong>Observability</strong> </em>&#8212; the ability to reason through the (usually distributed) system&#8217;s internal state utilizing its external outputs. In practice, this means instrumenting the system with logs, traces, and metrics and using whatever active probing tools you need to understand what production is doing.</p></li><li><p>Respond to that customer experience regression &#8212; especially in an emergency. This is usually called &#8220;<em><strong>Incident Response</strong></em>&#8221;, meaning that an engineer (often with deep system knowledge and specialized training) will jump in and repair it at any given time of day.</p></li><li><p>Run the software on some computers (generally a public cloud) and expose that software to the world. This is frequently termed &#8220;<em><strong>infrastructure</strong></em>&#8221;, but in practice means defining what storage, computing, memory and network requirements a given application has and designing a system that facilitates these requirements.  Think &#8220;Kubernetes&#8221; or &#8220;Ansible&#8221; or &#8220;Saltstack&#8221; and so on. If you&#8217;re <em>really </em>big (or old), this can mean racking and stacking machinery.</p></li><li><p>Facilitate updates to the software running on that set of computers in a way that allows engineers to push updates to that software without fearing that the update process will result in a customer visible failure and without an absurd amount of work. This is generally &#8220;<em><strong>Continuous Integration</strong></em>&#8221; and &#8220;<em><strong>Continuous Deployment</strong></em>&#8221;,; if you&#8217;re lucky, with a healthy dose of &#8220;Feature Flagging&#8221; or &#8220;A/B Testing&#8221;.</p></li><li><p>Provides mechanisms to restore data that invariably becomes corrupted due to an accident or malicious intent. This includes things like &#8220;Point-in-time backups&#8221;, &#8220;Offiste Backups&#8221;, and the rarely invoked &#8220;Restoration Process&#8221;.</p></li></ul><p>While we need to provide these capabilities within the bounds of &#8220;Site Reliability Engineering&#8221;, there are many different ways to do so &#8212; each with its tradeoffs and whose utility depends on the context in which they&#8217;re being applied. However, there&#8217;s undoubtedly a typical pattern that is universal (as far as I can see) across all organizations.</p><h2>The general path to success</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ex5o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ex5o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 424w, https://substackcdn.com/image/fetch/$s_!ex5o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 848w, https://substackcdn.com/image/fetch/$s_!ex5o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 1272w, https://substackcdn.com/image/fetch/$s_!ex5o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ex5o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png" width="448" height="230.46153846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1456,&quot;resizeWidth&quot;:448,&quot;bytes&quot;:173363,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ex5o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 424w, https://substackcdn.com/image/fetch/$s_!ex5o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 848w, https://substackcdn.com/image/fetch/$s_!ex5o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 1272w, https://substackcdn.com/image/fetch/$s_!ex5o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed717e6-18b4-4837-b3d4-878c6433d7dc_1864x959.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Within any given organization (at least, in my experience), the customer-facing software only constitutes a small fraction of the actual &#8220;work&#8221; needed to make that customer experience available. Instead, large chunks of time go into the work <em>around </em>the work &#8212; defining the application scaffolding, the compute definitions, the release process and the telemetry required<em> </em>for a reliable, trustworthy customer experience but doesn&#8217;t make the experience itself.</p><p>Additionally, that class of work tends to be executed frequently across an organization with only minor adjustments in how its executed (e.g. Kubernetes versus ECS, CircleCI vs Drone, Lightstep versus Honeycomb). Fundamentally the problems that face each of these applications &#8212; the capabilities we need to expose &#8212; remain approximately the same. This work goes into a large bucket Amazon calls &#8220;<a href="https://docs.aws.amazon.com/wellarchitected/latest/framework/cost-dp.html">undifferentiated heavy lifting</a>&#8221;.</p><p>This means our capabilities to contribute to the business are enormous within SRE. We can impact every product, project, software or process in the org! There are several common patterns in the work we do:</p><h3>Reduce the &#8220;Marginal Cost&#8221; of a capability</h3><p>The capabilities the business needs to run come at a cost &#8212; usually, a cost to the engineering time spent rediscovering an independent solution to these problems. Our first and most crucial lever then as SREs is to identify a problem for our product development communities and solve it so it is as cheap for these communities to integrate and use as possible.</p><p>This requires that we identify the <em>right problem</em>. Identifying the right problem can be deeply challenging, as it requires us to leave our preconceptions of what constitutes a &#8220;good&#8221; design behind and instead work directly with the product community to understand their perspective. Once we deeply understand the problem, we can devise a solution that maximizes our future architectural choices while commodifying that capability for our product colleagues.</p><p>&#8220;Solving product engineering problems as cheaply as possible&#8221; sounds extraordinarily unsexy. Still, it&#8217;s essential to realize how powerful a change agent commodifying a capability can be. Reducing the marginal cost of text communication allowed a generation to develop a new language over &#8220;SMS&#8221;; something that still permeates our culture today. Reducing the marginal bandwidth cost allowed Netflix, Google Meet and the home office. Reducing the marginal cost of finding a good restaurant on a Friday night means a much happier life partner and a better date night. Reducing marginal cost is fantastic!</p><p>After that, we need people <em>actually to use</em> our capability.</p><h3>Standardizing the organization on an approach</h3><p>While we can build (or buy) capabilities we expose to the organization, the organization only derives value from these capabilities if they <em>use </em>them. To that end, we must work with our product colleagues to use our newly built capabilities.</p><p>This can be deeply challenging. What tends to happen here is that we&#8217;ve spent a lot of time building a new capability without interacting with the organization. Then when we go to the organization to advertise and integrate our capability, we figure out it&#8217;s a bad product market fit. <em><strong>It is critical to recognize this and kill the product that exposes the capability or use the feedback to evolve it until it is a good fit</strong></em><strong>. </strong>Simply wishing that the org or the engineers were different and &#8220;saw the wisdom&#8221; of our approach is a path to endless frustration.</p><p>Beyond that, standardizing the organization around a capability is the process of driving cultural change. There are many models to do this, but <a href="https://sre.google/workbook/organizational-change/">my preferred (Kotter&#8217;s) works by:</a></p><ul><li><p>Creating a sense of urgency</p></li><li><p>Building a coalition</p></li><li><p>Forming a strategic vision</p></li><li><p>Enlisting a volunteer army</p></li><li><p>Enabling action by removing barriers</p></li><li><p>Generating short-term wins</p></li><li><p>Sustaining acceleration</p></li><li><p>Instituting change</p></li></ul><p>The practical implementation of these change models is one for another article, but they&#8217;re a worthy investment of SRE time.</p><h3>Identifying and building differentiating capabilities</h3><p>When working within a given organization, there are usually a series of (ever-growing) commodity capabilities such as &#8220;CI/CD&#8221; or &#8220;Cloud&#8221;, and there usually isn&#8217;t a significant differentiator between one vendor and another (or a vendor versus producing it in-house).</p><p>A set of limited capabilities that aren&#8217;t available on the market or that are uniquely leverageable for your organization if they&#8217;re constructed especially for your organisation can be created.</p><p>It&#8217;s difficult to say where a &#8220;differentiating capability&#8221; comes from. It&#8217;s usually some insight that&#8217;s either only possible in your organization or only apparent to people who&#8217;ve had a unique amount of organizational experience and are in a position to shepherd this capability. Half the time, it comes from a conversation after work over a beer. Examples I&#8217;ve seen in the past include <a href="https://www.usenix.org/conference/srecon19emea/presentation/mineiro">Adaptive Paging</a> or <a href="https://www.youtube.com/watch?v=7TY8RaolprI&amp;themeRefresh=1">Meaningful Availability</a>.  These capabilities will meaningfully reduce the cost of something required or provide some compelling, valuable new insight that serves as a competitive advantage for the business.</p><p>Building a differentiating capability should generally be done in steps. The most successful versions I&#8217;ve seen go through:</p><ul><li><p><strong>Proof of Concept. </strong>Usually, one developer with a unique insight implements it in a weekend or hack week.</p></li><li><p><strong>Rallying a Team</strong>. The team of which that developer is a part pitches for and receives a (limited) amount of funding to build this new capability. Or they bury it in other projects.</p></li><li><p><strong>Proof, product development</strong>. The capability demonstrates value, and the organization happily endorses continued product work.</p></li></ul><p>The challenging part of a differentiating capability is that from an outside perspective, there&#8217;s very little difference between &#8220;a differentiating capability that would provide a competitive advantage&#8221; and &#8220;a wild idea that has no merit&#8221;. After all, if everyone understood it, chances are it would have been built!</p><p>Given this, these capabilities take (and should) much work to deliver. They take time, grit and vision.</p><h2>Team Size &amp; Contribution Models</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fa_k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fa_k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 424w, https://substackcdn.com/image/fetch/$s_!Fa_k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 848w, https://substackcdn.com/image/fetch/$s_!Fa_k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 1272w, https://substackcdn.com/image/fetch/$s_!Fa_k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fa_k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png" width="1456" height="234" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:234,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69345,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Fa_k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 424w, https://substackcdn.com/image/fetch/$s_!Fa_k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 848w, https://substackcdn.com/image/fetch/$s_!Fa_k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 1272w, https://substackcdn.com/image/fetch/$s_!Fa_k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115728c4-f110-4f86-a3a6-b2e34658ed5c_2018x325.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Suppose we all have the shared mission of ensuring the customer experience remains reliable. In that case, the question becomes how we service the required capabilities&#8212;the customer experience measurement, Observability, incident response, deployment, etc. </p><p>How we do this depends a bit on our organisational size and culture:</p><h3>Solo Operator</h3><p>In a startup (or very small) organization where there&#8217;s likely only 1 &#8220;SRE&#8221; to 5 - 10 engineers, the most valuable way to provide the capabilities is likely a combination of:</p><ul><li><p><strong>Judicious Vendor Selection</strong>: By looking at what is in the open market (especially in major cloud providers such as Google Cloud or Amazon Web Services), you&#8217;ll be able to expose capabilities for your colleagues that will enable them to solve their problems without relying on you.</p></li><li><p><strong>Education</strong>: Most of your colleagues will not be domain specialists in any of the capabilities we need to solve for &#8212; instead, they&#8217;ll probably know much more about &#8230; whatever the start specializes in. You&#8217;ll need to help them learn the <em>minimum required to operate services effectively so they can take up a sustainable load</em> and survive if you burn out or leave.</p></li><li><p><strong>Review</strong>: Exposing the capabilities of major providers to untrained colleagues often allows them to prototype their work &#8212; at a cost rapidly. Usually, a cloud bill is discovered way too late in the project lifecycle. You should work to control these costs, and teams do not inadvertently attempt something that will retrospectively be expensive.</p></li></ul><h3>Small Team</h3><p>In a small team (e.g. <a href="https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/two-pizza-teams.html">the standard &#8220;two pizza&#8221; team</a>), it is possible to build a certain level of redundancy in any given team member. Surviving team members leaving means that the SRE team can take responsibility away from the organization and run it solely within the SRE team.</p><p>This manifests itself in a few ways:</p><ul><li><p><strong>Prescribed Interventions: </strong>An SRE team can provide certain consulting services to an organization designed to leverage the domain expertise of those SREs, otherwise too inefficient to do within teams. These include things like &#8220;production readiness&#8221; checks, &#8220;postmortem reviews&#8221;, or &#8220;reliability task forces&#8221;.</p></li><li><p><strong>Productizing a Capability: </strong>An SRE team can expose a new capability through judicious vendor selection and recommendations or by developing that capability as a proof of concept.</p></li><li><p><strong>Centralizing Decision Making</strong>. Where a single SRE might need to align decisions across the organization with several stakeholders, a team of SREs can provide a &#8220;service layer&#8221; through the prescribed intervention or by productizing a capability. This layer of abstractions means the SRE team can iterate internally, improving a capability without needing to align outside that group.</p></li></ul><p>The capability of a single SRE team is limited in what it can solve, so it should be targeted at solving the most critical problems an organization has at any given time and letting the rest go away. This characteristic often means that this is an extremely fun &#8212; if challenging &#8212; time to be an SRE, as you will invariably be exposed to everything, and it&#8217;s always high pressure.</p><h3>Department</h3><p>As an organization grows, it&#8217;ll become more and more cost-efficient to build some capabilities in a sufficiently bespoke or organizationally optimized way&#8212;for example, incident response tooling, observability tooling that meets compliance requirements, reporting or infrastructure processes.</p><p>At the department level (i.e. 30 people), it is no longer to scale an approach based on interpersonal relationships (i.e., the &#8220;over beers&#8221; management style). Instead, it becomes critically important to articulate a vision of what the SRE department is trying to accomplish and to delegate parts of the execution of that vision to independent teams who are tasked with creating and exposing capabilities. Notably, at the department scale, team members can become more disconnected from their product delivery colleagues and hit the earlier struggle of &#8220;standardizing an approach&#8221;.</p><p>The department level also allows the aggregation of a layer of technical expertise (&#8220;staff&#8221; or &#8220;principal&#8221; engineering), which can form the &#8220;consultation&#8221; arm of such a department. These function as a feedback layer between the teams and the rest of the organization, ensuring we do not drift off course.</p><h3>Organization</h3><p>As the organization grows even further, the need to build progressively more capabilities grows parallel. To scale the approach, we need to delegate the vision into strategic buckets further each department can own. This requires a broader, less prescriptive vision and a limited set of strategic choices that guide departments in designing their approach.</p><p>The scale of the organization also means that it is possible to internal commodity processes to the organisation&#8217;s successful functioning &#8212; namely, the discovery and articulation of product requirements.</p><p>Given this, a well-functioning product process with high-level KPIs, a breakdown into the KPI tree, a process for prioritizing work and managing a portfolio of projects are all requirements to commodify the capabilities a large organization needs successfully.</p><h2>The Name</h2><p>The question at the end of all this is: What do we call the people tasked with ensuring we remain reliable and ensure customers&#8217; trust?</p><p>Well, call them whatever you like. In my experience, Site Reliability Engineering is a specialist domain within Software Engineering, like Distributed Systems engineering, Architecture, Developer Productivity, React, Spring and many others. Occasionally hiring people who specialise in these is more challenging, and convincing the organization to pay more if we give our prospective colleagues a unique name is more accessible.</p><p>Other than that, call us software developers.</p><p><strong>Additional Reading</strong></p><ol><li><p>https://cloud.google.com/blog/products/devops-sre/how-sre-teams-are-organized-and-how-to-get-started</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Wow, that was a lot of words! Hopefully, they&#8217;re useful for you. If you like these words and want to receive more, subscribe now!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The fundamental aspects of reliability]]></title><description><![CDATA[What is it that SRE needs to care for]]></description><link>https://www.andrewhowden.com/p/the-fundamental-aspects-of-reliability</link><guid isPermaLink="false">https://www.andrewhowden.com/p/the-fundamental-aspects-of-reliability</guid><dc:creator><![CDATA[Andrew howden]]></dc:creator><pubDate>Wed, 05 Jul 2023 17:17:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/-vm8bh0ztV8" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>Editors Note: </strong>More of a visual person? That&#8217;s cool, you can watch the video version of this talk. Prefer it in writing? That&#8217;s fine too! Read on below.</em></p><div id="youtube2--vm8bh0ztV8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-vm8bh0ztV8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-vm8bh0ztV8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>One of the earliest challenges of Site Reliability Engineering (or SRE) is determining the responsibility boundary between what SRE needs to care about and what should be deferred to &#8230; someone else.</p><p>In my experience, reliability affects the following aspects of production systems:</p><h3><strong>Availability</strong></h3><p>If a system becomes &#8220;unavailable&#8221;, it cannot do what its users expect, given &#8220;reasonable&#8221; user input. Availability across different systems depends on the precise implementation of that system, but essentially, given a well-constructed input message, the desired output message does not arrive. For example, </p><ul><li><p>Given a HTTP-based RPC system, the response message being a HTTP 503 &#8220;Bad Gateway&#8221; means the system is unavailable.</p></li><li><p>Given a HTTP-based RPC system, the response message being passed back after the client times out means the system is unavailable. </p></li><li><p>Given an event-based system, supplying an input event does not generate an output event across a &#8220;reasonable&#8221; time.</p></li></ul><h4>Measuring Availability</h4><p>Usually, we measure availability as a percentage like:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OllB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OllB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 424w, https://substackcdn.com/image/fetch/$s_!OllB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 848w, https://substackcdn.com/image/fetch/$s_!OllB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 1272w, https://substackcdn.com/image/fetch/$s_!OllB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OllB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png" width="529" height="102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:102,&quot;width&quot;:529,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11991,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OllB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 424w, https://substackcdn.com/image/fetch/$s_!OllB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 848w, https://substackcdn.com/image/fetch/$s_!OllB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 1272w, https://substackcdn.com/image/fetch/$s_!OllB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a42672-7e0f-4421-bd1b-3d7e48dd811e_529x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>We can then express that percentage over periods and set targets (or &#8220;Service Level Objectives&#8221;) on the average over those periods. For example, something like:</p><p><em>The service should respond with a successful message 99.9% of the time, averaging over a 28d rolling window.</em></p><h3>Performance</h3><p>The performance of a system is usually measured by assigning an &#8220;acceptable&#8221; time threshold for an operation to complete given a throughput. For example:</p><ul><li><p>Given a HTTP-based RPC system, a budget of 100ms to complete the RPC</p></li><li><p>Given an event-based system, a budget of 500ms for a completion event to appear when supplied a trigger event</p></li></ul><p>Systems do not generally sit on one side or another of a given performance time-bound. Rather, they approach the time bound as the throughput of operations increases until, at some point, they cannot process that throughput and the time of any given operation drifts outside that threshold.</p><h4>Measuring Performance</h4><p>For diagnostics purposes, it is usually better to measure performance in a histogram-like structure that puts each request into a &#8220;bucket&#8221; of performance:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DAQY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DAQY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 424w, https://substackcdn.com/image/fetch/$s_!DAQY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 848w, https://substackcdn.com/image/fetch/$s_!DAQY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 1272w, https://substackcdn.com/image/fetch/$s_!DAQY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DAQY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png" width="437" height="183" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:183,&quot;width&quot;:437,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43240,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DAQY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 424w, https://substackcdn.com/image/fetch/$s_!DAQY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 848w, https://substackcdn.com/image/fetch/$s_!DAQY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 1272w, https://substackcdn.com/image/fetch/$s_!DAQY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220b041e-6904-43ce-a2a9-2818591c1ed1_437x183.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p> The histogram distribution allows us to reason through the behaviour of a system. If a system is approaching its limit:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_LcJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_LcJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 424w, https://substackcdn.com/image/fetch/$s_!_LcJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 848w, https://substackcdn.com/image/fetch/$s_!_LcJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 1272w, https://substackcdn.com/image/fetch/$s_!_LcJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_LcJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png" width="437" height="183" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96098967-4316-428e-ab35-adedf707fff0_437x183.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:183,&quot;width&quot;:437,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49560,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_LcJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 424w, https://substackcdn.com/image/fetch/$s_!_LcJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 848w, https://substackcdn.com/image/fetch/$s_!_LcJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 1272w, https://substackcdn.com/image/fetch/$s_!_LcJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96098967-4316-428e-ab35-adedf707fff0_437x183.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A bottleneck process is likely being reached, but that has not transitioned into a failure just yet &#8212; we need to scale something. Conversely, if the distribution skews:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vdno!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vdno!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 424w, https://substackcdn.com/image/fetch/$s_!vdno!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 848w, https://substackcdn.com/image/fetch/$s_!vdno!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 1272w, https://substackcdn.com/image/fetch/$s_!vdno!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vdno!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png" width="437" height="183" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc87278c-6858-4446-ba58-7c4a960224c5_437x183.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:183,&quot;width&quot;:437,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49479,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vdno!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 424w, https://substackcdn.com/image/fetch/$s_!vdno!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 848w, https://substackcdn.com/image/fetch/$s_!vdno!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 1272w, https://substackcdn.com/image/fetch/$s_!vdno!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc87278c-6858-4446-ba58-7c4a960224c5_437x183.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The system is in a failure state and is unlikely to recover. Work needs to be dropped and the system scaled to allow it to recover.</p><p>More generally, to measure whether a system has an &#8220;acceptable performance&#8221;, it is simpler to measure the number of requests that are &#8220;in bound&#8221; versus those that are not &#8212; just like availability:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cb9l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cb9l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 424w, https://substackcdn.com/image/fetch/$s_!Cb9l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 848w, https://substackcdn.com/image/fetch/$s_!Cb9l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 1272w, https://substackcdn.com/image/fetch/$s_!Cb9l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cb9l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png" width="522" height="106" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:106,&quot;width&quot;:522,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9973,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Cb9l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 424w, https://substackcdn.com/image/fetch/$s_!Cb9l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 848w, https://substackcdn.com/image/fetch/$s_!Cb9l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 1272w, https://substackcdn.com/image/fetch/$s_!Cb9l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bfd2208-fa70-40bd-8892-465de6cf3ce7_522x106.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Enjoying this so far? Great! Want more? Subscribe already &#9829;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Correctness</h3><p>A given system might be <em>available </em>if, given an input message, it responds with a well-formed consumable response. However, a given system can respond with a <em>well-formed </em>but <em>incorrect</em> response.</p><p>This can be very simple, such as a system designed to sum numbers supplied &#8220;2, 2&#8221; subsequently returning &#8220;5&#8221;. This is relatively straightforward to detect and should be addressed by writing sufficient test coverage around the code that reproduces the issue than fixing it.</p><p>There is also a second class of &#8220;tolerable incorrectness&#8221; in a large distributed system. Consider a system that checks all postage carriers that serve a given region to determine how long a given package would take to be delivered through that carrier:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-7v8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-7v8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 424w, https://substackcdn.com/image/fetch/$s_!-7v8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 848w, https://substackcdn.com/image/fetch/$s_!-7v8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 1272w, https://substackcdn.com/image/fetch/$s_!-7v8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-7v8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png" width="398" height="327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:327,&quot;width&quot;:398,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84165,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-7v8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 424w, https://substackcdn.com/image/fetch/$s_!-7v8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 848w, https://substackcdn.com/image/fetch/$s_!-7v8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 1272w, https://substackcdn.com/image/fetch/$s_!-7v8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff94a9389-acaf-41d0-922b-c86e6d489a0c_398x327.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For such a system to have a definitive answer, all of the queries to its dependencies must be successful. However, such a system is only as reliable as its least reliable dependency.</p><p>Let&#8217;s imagine that our &#8220;C&#8221; dependency is having some trouble. Our system is now unavailable:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TOR2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TOR2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 424w, https://substackcdn.com/image/fetch/$s_!TOR2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 848w, https://substackcdn.com/image/fetch/$s_!TOR2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 1272w, https://substackcdn.com/image/fetch/$s_!TOR2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TOR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png" width="398" height="327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:327,&quot;width&quot;:398,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75484,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TOR2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 424w, https://substackcdn.com/image/fetch/$s_!TOR2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 848w, https://substackcdn.com/image/fetch/$s_!TOR2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 1272w, https://substackcdn.com/image/fetch/$s_!TOR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4cb66c-c426-4ec9-8ee9-b2c9df75337f_398x327.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With this design, we have failed all of our requests for delivery information just because there is a single carrier failure. This is a clearly intolerable condition! Given this, we modify our system to tolerate the failure of &#8220;C&#8221; and take the results of &#8220;A&#8221;, &#8220;B&#8221;, and &#8220;D&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZYSa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZYSa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 424w, https://substackcdn.com/image/fetch/$s_!ZYSa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 848w, https://substackcdn.com/image/fetch/$s_!ZYSa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 1272w, https://substackcdn.com/image/fetch/$s_!ZYSa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZYSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png" width="398" height="327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:327,&quot;width&quot;:398,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83111,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZYSa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 424w, https://substackcdn.com/image/fetch/$s_!ZYSa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 848w, https://substackcdn.com/image/fetch/$s_!ZYSa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 1272w, https://substackcdn.com/image/fetch/$s_!ZYSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf11ad5c-b6a9-4868-ae65-635ab82665f2_398x327.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>However, we now have a situation in which the request is only <em>mostly </em>correct.</p><h4>Measuring Correctness</h4><p>The only way in which I know how to measure binary correctness is to give the system an input (or a series of inputs) for which the outputs are already known, and validate the system returns those outputs when supplied those inputs. This is &#8220;end-to-end testing&#8221;, or if it is executed in production, &#8220;probes&#8221;. Measuring the correctness here is the same as availability:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RkIC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RkIC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 424w, https://substackcdn.com/image/fetch/$s_!RkIC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 848w, https://substackcdn.com/image/fetch/$s_!RkIC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 1272w, https://substackcdn.com/image/fetch/$s_!RkIC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RkIC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png" width="529" height="102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:102,&quot;width&quot;:529,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12083,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RkIC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 424w, https://substackcdn.com/image/fetch/$s_!RkIC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 848w, https://substackcdn.com/image/fetch/$s_!RkIC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 1272w, https://substackcdn.com/image/fetch/$s_!RkIC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10516a0-aef1-48cf-bee4-8a2d3e88eb82_529x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Measuring <em>mostly </em>correct requests is more challenging. It is possible to measure the total number of requests which have <em>any </em>regression by marking the request with metadata indicating the regression (e.g. HTTP header), after which correctness can be measured the same way:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!leES!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!leES!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 424w, https://substackcdn.com/image/fetch/$s_!leES!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 848w, https://substackcdn.com/image/fetch/$s_!leES!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 1272w, https://substackcdn.com/image/fetch/$s_!leES!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!leES!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png" width="529" height="102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:102,&quot;width&quot;:529,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12304,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!leES!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 424w, https://substackcdn.com/image/fetch/$s_!leES!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 848w, https://substackcdn.com/image/fetch/$s_!leES!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 1272w, https://substackcdn.com/image/fetch/$s_!leES!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21eeae2f-2d07-433b-93d7-5fc38a6d0816_529x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>However, hundreds of services can contribute to a given request in a large system. At any given time, some of them are always broken. Given this, it is more useful to count the specific regressions:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lgov!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lgov!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 424w, https://substackcdn.com/image/fetch/$s_!Lgov!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 848w, https://substackcdn.com/image/fetch/$s_!Lgov!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 1272w, https://substackcdn.com/image/fetch/$s_!Lgov!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lgov!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png" width="522" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:522,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Lgov!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 424w, https://substackcdn.com/image/fetch/$s_!Lgov!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 848w, https://substackcdn.com/image/fetch/$s_!Lgov!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 1272w, https://substackcdn.com/image/fetch/$s_!Lgov!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb61efb-e79c-4a3a-b92e-b4898de74aa2_522x191.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This can create a large number of time series. But it can also allow <em>weighting </em>the regressions so that more important things (e.g. &#8220;loyalty data&#8221;) contribute more to a &#8220;quality score&#8221; than less important things (e.g. &#8220;analytics data&#8221;)</p><h3>Data Recoverability</h3><p>Data is a challenging issue, as there are many ways in which data can drift. However, in practice, the most critical challenge to solve is to be able to reproduce production data that will otherwise become corrupted or deleted.</p><p>There are many ways to reproduce production data, such as:</p><ul><li><p>Reproduction from an event-based system</p></li><li><p>Reproduction from a state snapshot of that system, stored elsewhere.</p></li><li><p>Reconstruction of the data</p></li></ul><h4>Measuring Recoverability</h4><p>The only way to measure the recoverability of a system is to attempt to recover it and then validate that against the production dataset. Should the data be consistent, the recovery is successful.</p><p>An organization's measurement should be time since the last successful recovery.</p><h3>Machine Learning</h3><p>There are a number of interesting reliability challenges associated with machine learning. Things like:</p><ol><li><p>Making sure the model is trained on appropriate data and not overfit</p></li><li><p>Making sure the training data is of high quality and represents what it is designed to well</p></li><li><p>Making sure the input data is sufficiently close to the training data that the models output is still predictable</p></li><li><p>Makin sure the input data is not maliciously constructed</p></li></ol><p>However, these can be considered by thinking about the machine learning model as a &#8220;black box&#8221; and then thinking about its inputs within the lens of the other reliability measures &#8212; availability, correctness, performance and data recoverability.</p><h2>In Conclusion</h2><p>Site Reliability Engineering is a broad discipline. However, fundamentally (at least in my experience), the problems it seeks to solve are relatively clear and consistent across multiple system archetypes.</p><p>Hopefully, this post explains them and allows you to evaluate your own SRE work against these challenges. If not, @ me to tell me I&#8217;m wrong! </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.andrewhowden.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Enjoyed this? Great! Want the next one? Sign up here!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><br></p>]]></content:encoded></item></channel></rss>