<?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[Duncan Pierce]]></title><description><![CDATA[Reflections from 40 years in software]]></description><link>https://blog.duncanpierce.org</link><image><url>https://blog.duncanpierce.org/img/substack.png</url><title>Duncan Pierce</title><link>https://blog.duncanpierce.org</link></image><generator>Substack</generator><lastBuildDate>Wed, 24 Jun 2026 18:04:19 GMT</lastBuildDate><atom:link href="https://blog.duncanpierce.org/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Duncan Pierce]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[duncanpierce@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[duncanpierce@substack.com]]></itunes:email><itunes:name><![CDATA[Duncan Pierce]]></itunes:name></itunes:owner><itunes:author><![CDATA[Duncan Pierce]]></itunes:author><googleplay:owner><![CDATA[duncanpierce@substack.com]]></googleplay:owner><googleplay:email><![CDATA[duncanpierce@substack.com]]></googleplay:email><googleplay:author><![CDATA[Duncan Pierce]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Actionable agreement]]></title><description><![CDATA[Changing the focus when there is disagreement]]></description><link>https://blog.duncanpierce.org/p/actionable-agreement</link><guid isPermaLink="false">https://blog.duncanpierce.org/p/actionable-agreement</guid><dc:creator><![CDATA[Duncan Pierce]]></dc:creator><pubDate>Thu, 17 Oct 2024 07:01:09 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" 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://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6192" height="4128" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4128,&quot;width&quot;:6192,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A group of men standing around each other in a room&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="A group of men standing around each other in a room" title="A group of men standing around each other in a room" srcset="https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1726250873230-5bccf790a886?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3NHx8cGVvcGxlJTIwYXJndWluZ3xlbnwwfHx8fDE3MjkwMDc4MTR8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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><figcaption class="image-caption">Photo by <a href="true">Mushvig Niftaliyev</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p><em>(I&#8217;m going to talk about professional disagreements here, rather than interpersonal or domestic ones, although I think there is much overlap)</em></p><p>It seems to be human nature that we place a lot of our focus on the things we cannot agree on - even in situations where there is a lot we <em>do</em> agree on. Often this distracts us from taking action that moves us forward. The disagreement can become increasingly entrenched as two (or more) sides rehearse it, often covering the same ground repeatedly but seeing it differently.</p><h2>Why does it happen?</h2><p>I think in many cases, it&#8217;s not very clear what the problem is or what is the best thing to do.</p><div class="pullquote"><p>The objective ambiguity can drive subjective disagreement.</p></div><p>There is <a href="https://en.wikipedia.org/wiki/Confirmation_bias">a cognitive bias</a> that causes us to tend to interpret ambiguous evidence as supporting our position. So when the &#8220;other side&#8221; presents not-very-substantive arguments to support their position we can see it (or elements of it) as supporting ours. The other party experiences our not-very-substantive arguments the same way, driving both parties further from agreement. Sometimes we get lucky and some important point is made that lands and settles the matter, but once a disagreement has got going, this becomes increasingly unlikely.</p><p>I guess what happens is the area of disagreement becomes an emotive topic and becomes <a href="https://en.wikipedia.org/wiki/Salience_(neuroscience)#Salience_bias">more salient</a> in our minds than the other possible areas in which we could move forward. We are all to some extent competitive and if an entrenched disagreement goes on too long or goes too deep, it can become about &#8220;winning&#8221;. I think it&#8217;s important to avoid this outcome, because it can be difficult to repair.</p><p>I have a theory that the longer a party spends constructing a conceptual paradigm to support their argument, the harder it is for them to accept disconfirming evidence or argumentation.</p><h2>What to do?</h2><p>Beyond some initial discussion, once it becomes clear there is a fundamental disagreement and no quick resolution, there is not much point staying on the same ground: both parties will dig in.</p><div class="pullquote"><p>Focus on finding something <em>you can agree on</em> <em><strong>and</strong> <strong>action</strong></em>.</p></div><p>In order to move past the disagreement you will need to listen to the other side. Often they will have an emotional need to feel heard, particularly if things have become heated. It may be that you do too. It&#8217;s important to get past these <a href="https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow">System 1</a> emotional blockers or you will not be able to have a rational System 2 conversation. If it&#8217;s not working, try another time. Pushing the topic just seems to entrench the disagreement.</p><p>When you are talking rationally and both sides have dealt with their need to feel heard, there is often not much point in going back to the area of disagreement. I try to simply acknowledged it and move on to try to find things we can agree on that we can take action on.</p><h2>Why we need to take action</h2><p>Professional disagreements are often about ambiguous situations where it is not clear what is the best course to take. Consequently, all courses have pros and cons and different courses will be selected by different people. If you can&#8217;t agree what to do relatively quickly, you probably need to perform small, low-risk experiments. These should either seek to shed more light on the matter or take a small step forward that can be reviewed (whether successful or not) and potentially built upon.</p><p>You can start by trying to identify areas you do agree on, e.g. we agree X is risky, we agree Y would be a bad outcome. Given all this, what do we agree we can do, even if it is just a small step that clearly doesn&#8217;t solve the whole problem - and might not even work?</p><p>It&#8217;s important to find an action we can agree to take for 2 reasons:</p><ol><li><p>It takes the focus off what is coming between us (the disagreement) and places it onto what we are doing together about it. In effect, it helps put us on the same side with the same goal, albeit a limited one. Hopefully, we can build upon the goal, its outcome and the process of working together.</p></li><li><p>The situation is probably ambiguous. We probably need more information. We need to learn more about what works and what doesn&#8217;t in this situation. With more knowledge, we may be able to drive away some of the ambiguity and expand the area in which agreement and further action are possible.</p></li></ol><p>Sometimes, of course, it turns out the thing we are trying to do is not tractable. Often we find this is a bit disappointing or see it as a failure but it is better to learn this and move on than be stuck arguing hypotheticals.</p>]]></content:encoded></item><item><title><![CDATA[Serverless solutions are cheaper… right?]]></title><description><![CDATA[When infinitesimal cost X infinite scalability = serious money]]></description><link>https://blog.duncanpierce.org/p/serverless-solutions-are-cheaper</link><guid isPermaLink="false">https://blog.duncanpierce.org/p/serverless-solutions-are-cheaper</guid><dc:creator><![CDATA[Duncan Pierce]]></dc:creator><pubDate>Tue, 15 Oct 2024 11:52:48 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Serverless solutions can save money - especially the extra costs of ownership that come with having to look after infrastructure you don&#8217;t even need most of the time. A talented solution architect I've been working with just said he&#8217;d heard serverless can be up to <em>4x as expensive</em> as running servers.</p><div class="pullquote"><p>Serverless can be <em><strong>way</strong> <strong>more expensive</strong></em> than 4x.</p></div><h3>Once upon a time&#8230;.</h3><p>I was the technology director for a famous author&#8217;s ecommerce site. We had ~800 rarely-changing images in S3 that users download often, so I asked the development team to set a cache header on each one to save our bandwidth costs.</p><p>The team, who were excellent, suggested putting CloudFront in front of S3, but I thought the knock-on effect of changing the download URL wasn't worth it. So they decided to use AWS Lambda, just for this one small thing.</p><p>Using Lambda for a tiny task like this is perfect - we&#8217;re just paying for when we run it, which was going to be hardly ever. We couldn&#8217;t even work out how cheap it was going to be.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4608" height="2592" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2592,&quot;width&quot;:4608,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;seashore under nimbus clouds&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="seashore under nimbus clouds" title="seashore under nimbus clouds" srcset="https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1506455352093-5ca9cdcbbea1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdG9ybSUyMGNsb3VkcyUyMGdhdGhlcmluZ3xlbnwwfHx8fDE3Mjg5OTI5NDd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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><figcaption class="image-caption">Photo by <a href="true">Andras Kovacs</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h3>Just one small thing</h3><p>There is an event when an object is changed in S3 and you can invoke a Lambda that sets the cache header. One simple step, completed almost instantly. They tested it on Friday morning on a single S3 object - and it worked. Because it was a Friday, they didn't make the change for the other 800 objects. Good decision.</p><p>By Monday morning we&#8217;d spent <strong>$3,000</strong> on setting <strong>one header</strong> attribute on <strong>one S3 object</strong>.</p><h3>Wait&#8230; what?</h3><p>When you set the cache header, the S3 object is considered updated, which fires the event, which runs the Lambda, which sets the header, around in a very fast loop that nobody can see. Your servers don&#8217;t slow down. Your website doesn&#8217;t crash. So you don&#8217;t really notice. Who would worry about wiring such a tiny piece of functionality into their observability stack?</p><div class="pullquote"><p>If we had rolled out this change fully on Friday we&#8217;d have <strong>spent $2.4m that weekend</strong> - enough to endanger the company.</p></div><p>This is about 500 times what we were spending on servers annually, all of which had vast spare capacity for setting those headers.</p><p>When things run wild, run silently and you have ~infinite scalability, you can spend a lot of money, fast, even on incredibly small, cheap operations.</p><h3>Happily ever after</h3><p>Amazon hadn't documented that setting an S3 object header fires the object change event, so the team quite reasonably assumed the event was only for <em>content</em> updates. They challenged Amazon, which very kindly agreed to write the $3,000 off.</p><p>It could have been a painful, expensive and possibly terminal lesson, though.</p><div class="pullquote"><p>Infinitesimal cost X infinite scalability = serious money.</p></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.duncanpierce.org/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. I hope you enjoyed it. Please subscribe for free to receive new posts.</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></p>]]></content:encoded></item><item><title><![CDATA[3 years with Kubernetes]]></title><description><![CDATA[I've been using Kubernetes for 3 years for a high profile, high traffic site. Here's why and what I learned.]]></description><link>https://blog.duncanpierce.org/p/3-years-with-kubernetes</link><guid isPermaLink="false">https://blog.duncanpierce.org/p/3-years-with-kubernetes</guid><dc:creator><![CDATA[Duncan Pierce]]></dc:creator><pubDate>Sun, 02 Jan 2022 16:59:00 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I sometimes hear quite polarised opinions about Kubernetes.  Understandably, perhaps - it can be complicated but it can also be quite simple... and because it&#8217;s well-known there are a lot of opinions out there.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="3840" height="2160" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2160,&quot;width&quot;:3840,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a close-up of a game&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="a close-up of a game" title="a close-up of a game" srcset="https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1667372525822-d226d23018dc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcyOTAwNzgyM3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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><figcaption class="image-caption">Photo by <a href="true">Growtika</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h3>Declarative deployment</h3><p>I wanted a fabric into which we could deploy a mix of apps declaratively that would not require much management. I like to be able to &#8220;phoenix&#8221; an app and its infrastructure - tear it down and rebuild it declaratively without manual intervention. Being able to do so implies that you do actually know how to build and deploy the app.</p><p>That&#8217;s easy for version 1 but many systems I&#8217;ve worked with over the years have left the impression on me that if we lost version 798 somehow we&#8217;d never get it back because of the accumulation of little manual fixes in deployed infrastructure that are impossible to surface and reproduce.</p><h3>Everything in source control</h3><p>Closely related to declarative deployment. I can check in everything that matters. Rebuilding everything from scratch requires (almost) no manual intervention. Every change to the infrastructure can be found in version control and I can relate the infrastructure changes to a comment, a date, the person who committed them and any other code changes that happened at that time.</p><h3>Vendor independence</h3><p>I wanted to be able to move to another vendor without too much trouble and I didn&#8217;t really want to own the lowest layers of the infrastructure.</p><h3>Legacy workloads</h3><p>We had a new app to develop and deploy but it had to run alongside and work with a lot of legacy technology while we performed a complex migration. I wanted it all on one platform so supporting legacy apps was important. This was relatively straightforward once we&#8217;d containerised our workloads. Most of the effort there was learning how to do Docker builds, push and give Kubernetes credentials to pull from our private Docker repository. 95% of the conversion effort is for the first app; after that it&#8217;s straightforward to repeat.</p><h3>Bin packing</h3><p>We had started with some complicated legacy workloads that we&#8217;ve simplified over time. I&#8217;d previously worked in an environment where bin-packing became a major problem. When you have 700 AWS servers because you have many deployed microservices but no bin-packing solution, it gets really expensive. The mistake there was to give each service its own server cluster even though they were generally lightly loaded services that could have shared infrastructure.</p><p>Kubernetes is reasonably good at packing containers onto servers. It&#8217;s possible to spread workloads across servers for resilience.</p><p>We have about 50 containers running, usually on 3 servers, and we use Kubernetes namespaces to represent our different environments (test, staging and production). The servers are fairly small so it&#8217;s a cost-effective setup.</p><h3>Self healing</h3><p>Most features of Kubernetes work via reconciliation loops: processes that monitor the state of the cluster and act to resolve discrepancies between what's declared and what is found in reality. For example, if you delete a load balancer but retain the Kubernetes ingress resource it realises, Kubernetes will re-create the load balancer. If you remove one of the backend servers from the load balancer&#8217;s backend group, Kubernetes will re-add it. This philosophy makes Kubernetes clusters quite self-healing. This was important to me because we run a small team with many demands on our time, so we need to level our workload as much as possible.</p><h2>Apps don&#8217;t know they&#8217;re in Kubernetes</h2><p>Or, more accurately, apps don't <em>need</em> to know about Kubernetes.</p><p>An app can access the Kubernetes API but it&#8217;s only really necessary to orchestrate Kubernetes itself. Configuration and secrets can be injected into apps via environment variables and files and other services can be discovered through DNS. None of the 7 apps we have deployed know they&#8217;re running in Kubernetes. So for us it&#8217;s a fabric in which apps can run rather than a deeply embedded architectual element.</p><h2>The alternatives</h2><h3>Heroku</h3><p>Expensive, locked-in and limited options. We actually moved away from Heroku. We&#8217;d accumulated some of those little off-system changes that stop you re-creating your infrastructure from scratch.</p><h3>Terraform</h3><p>A bit too low level, I didn&#8217;t really care about the servers - just deploying the apps. But the right kind of declarative model.</p><h3>Containers in Google/AWS</h3><p>At the time, Google&#8217;s App Engine Flex was pretty close but we had long-running legacy batch jobs and Google would only let them run for 10 minutes max. Aside from this issue, I feel App Engine deserves more attention than it gets. It&#8217;s well thought-through.</p><p>AWS Fargate seemed like it was just running a server per container under the covers. It was slow to provision and I couldn&#8217;t really see the point of it at the time.</p><h2>Is it difficult to use?</h2><p>Kubernetes is neither very easy nor particularly difficult to use. One way to view it is as a vendor-independent &#8220;cloud API in a box&#8221;. Most apps are simply a mix of standard Kubernetes resource types:</p><ul><li><p><strong>deployment</strong> - N stateless replicas of a containerised app</p></li><li><p><strong>stateful set</strong> - N stateful replicas of a containerised app with persistent disks attached</p></li><li><p><strong>service</strong> - service discovery implemented at the network layer</p></li><li><p><strong>job</strong> - one-shot, recoverable, run-to-completion task with optional parallelism</p></li><li><p><strong>cronjob</strong> - job run on a regular schedule</p></li><li><p><strong>ingress</strong> - an external-facing load balancer</p></li></ul><p>We used all the above resource types except stateful set. We didn&#8217;t need that one because database-as-a-service from Google and AWS S3 covered our needs for holding state. There are other resource types and Kubernetes can be fairly easily extended with custom resource types. We use cert-manager to automate provisioning of Let&#8217;s Encrypt certificates and it creates and uses several custom resource definitions including Certificate.</p><p>Ultimately, all workloads are run as a &#8220;pod&#8221;. A pod is a group of Docker containers running together on a single virtual IP address. Kubernetes includes an overlay network for pods that means you don&#8217;t need to worry about networking or IP address allocation. It also has good service discovery features. It&#8217;s quite easy to create movable, location-independent workloads using labels and service discovery.</p><h2>How reliable is it?</h2><p>In practice, much will depend on how good the provider of the managed Kubernetes infrastructure is. In my experience, Google&#8217;s managed service is very robust.</p><p>We&#8217;ve replaced servers during routine maintenance hundreds of times. Google don&#8217;t upgrade in place. Instead, they provision a new server, already upgraded, add it to the Kubernetes cluster, then drain the workloads from one of the old servers.</p><p>Draining a server node causes the Kubernetes scheduler to cordon the node so no new workloads will be scheduled there and assigns workloads on the old server a new server to run on. Once the old server has been drained, Google decommission it.</p><p>Once they&#8217;ve cycled over all the servers, the entire cluster has been replaced. I like this approach.</p><h3>Server independence</h3><p>Your workloads need to be server-independent because they will be moved automatically by Kubernetes. This is fairly easy to achieve for most workloads but it&#8217;s simpler if your workloads are stateless or their state is held externally.</p><p>Stateful workloads are possible (and fairly easily implemented in Kubernetes using a StatefulSet) but you need to think about the time gap between a stateful workload stopping on one server and restarting on another. We wanted a low maintenance infrastructure, so we&#8217;d already chosen to use a managed external database, which meant our state lived outside the Kubernetes cluster.</p><h2>How much effort is required?</h2><p>It's fairly easy to get started deploying to Kubernetes if you've got a Docker-containerised app, and they are not too difficult to make.</p><h2>It&#8217;s declarative</h2><p>Kubernetes has a very declarative model: you write (usually in YAML) what you want and Kubernetes creates it for you and keeps it in sync with your declaration. The entire structure of our apps are YAML files in Git.</p><p>If you change the number of replicas of a container, Kubernetes will start/stop containers to match. If it finds containers die / go missing / are on a server that dies, it will run new ones until the reality again matches your declaration. Load balancers will be re-wired to match cluster changes and persistent disks will be attached to servers as needed by their workloads.</p><h3>Declarative isn&#8217;t always best</h3><p>Usually this declarative model works <em>for</em> you but occasionally it works <em>against</em> you. One example is: we run database schema migration as a job in Kubernetes and a job can only run once which means each job must be uniquely named or you must delete and recreate the migration job. Either option is a nuisance when you&#8217;re used to a more procedural deployment model. But I think in all other situations the declarative model has worked better.</p><h3>It can be verbose</h3><p>Kubernetes resources typically offer a lot of options and Kubernetes is relatively unopinionated about how to use them. It generally favours configuration over convention. As a result, I found I did a lot more reading than was really necessary to get started. The downside of the many options is that you can get some pretty bloated YAML files describing all the bits of your app. But at least you can check them into Git and they are not difficult to read - just verbose. There isn&#8217;t any practical limit to the complexity of the architecture you can build within the Kubernetes fabric (or at least I haven&#8217;t hit one), so you aren&#8217;t likely to box yourself into a corner.</p><h3>Stateless apps are easier</h3><p>This goes with declarative nature of Kubernetes and the moveable/expendable nature of workloads. But stateful apps aren&#8217;t particularly difficult to write. Kubernetes will manage disks, recover from failures, move workloads, etc. Add-ons (e.g. <a href="https://opensource.zalando.com/postgres-operator/">Postgres operator</a>) exist to provide managed databases.</p><h2>It's kind of serverless... kind of...</h2><p>I often see &#8220;serverless&#8221; equated with AWS Lambda (and similar offerings). </p><p>I think we should take a broader view. We know stuff is always running on servers somewhere - the question is: how much do I have to care about those servers?</p><p>Lambda does a pretty good job of relieving you of the burden of caring about servers but it&#8217;s not the only solution. I think other kinds of hosted platforms offer similar benefits: hosted low/no-code application platforms, &#8220;mash-ups&#8221; of cloud services, SalesForce&#8217;s Lightning platform or an app deployed on Heroku are all good examples.</p><h3>Serverless to use</h3><p>Kubernetes is &#8220;kind of&#8221; serverless but there&#8217;s a caveat: only if you use a managed Kubernetes service provided by someone else.</p><p>We use Google&#8217;s, which is very mature. Rather than upgrading servers in place, they replace each with a new one. In the last 3 years our servers have been replaced hundreds of times via upgrades and we have never seen any service interruption. Kubernetes makes it easy to shift workloads around and rewire load balancers when backend servers are replaced during upgrades, so the process is transparent.</p><p>We haven&#8217;t experienced any downtime. We&#8217;ve never provisioned a server, we&#8217;ve never logged into any of the servers and we&#8217;ve never run updates. They&#8217;re simply places to run our workloads. I care about the servers only to the extent they need to be big enough and numerous enough to run our workloads (although you can rely on autoscaling to relieve you of the burden of decided how many servers).</p><h3>Not serverless to manage yourself</h3><p>Kubernetes feels a lot less serverless if you&#8217;re managing your own Kubernetes clusters. Even with newer setup tools like Kubeadm and K3s, it&#8217;s not easy to manage a cluster over the long term. You have to worry about server failures, software updates, availability zones, updating Kubernetes itself - all the usual stuff that comes with managing servers yourself.</p><p>Setting up the Kubernetes overlay network requires a bit of reading, particularly if you are exposing your servers to the Internet. Some Kubernetes distributions can help with all this to an extent, e.g. CoreOS Tectonic, Rancher K3s.</p><p>I wouldn&#8217;t advise setting up and managing your own Kubernetes cluster unless you have a lot of resources to dedicate to it. Managed Kubernetes services are available from dozens of 1st and 2nd tier cloud companies.</p><h2>Would I recommend it?</h2><p>Yes, definitely - if it suits your infrastructure strategy.</p><p>If you like to assemble applications from a collection of managed AWS or Azure services, Kubernetes might not provide much value, particularly if you&#8217;re using some other declarative infrastructure system such as Terraform.</p><p>If you have a web app with a simple &#8220;flat&#8221; deployment model, Google App Engine or Heroku might be better - more convention over configuration, less to read, less to manage.</p><p>If you just want someone else to manage everything and you want to work well above functions as a level of abstraction, something like Salesforce&#8217;s Lightning platform might be a better solution.</p><p>If you&#8217;re looking for a portable, declarative, &#8220;cloud in a box&#8221;, Kubernetes is worth considering.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.duncanpierce.org/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. I hope you enjoyed it. Please subscribe for free to receive new posts.</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></p>]]></content:encoded></item><item><title><![CDATA["Noise" in organizational decision-making]]></title><description><![CDATA[Daniel Kahneman's work on "fast" and "slow" decision-making is famous. With Olivier Sibony and Cass Sunstein, he explores inconsistencies in professional judgement and how it affects organisations.]]></description><link>https://blog.duncanpierce.org/p/noise-in-organizational-decision</link><guid isPermaLink="false">https://blog.duncanpierce.org/p/noise-in-organizational-decision</guid><dc:creator><![CDATA[Duncan Pierce]]></dc:creator><pubDate>Sun, 02 Jan 2022 16:19:00 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kahneman, Sibony and Sunstein identify what they call <strong>noise</strong> - persistent inconsistencies in professional decision-making. Their book is <a href="https://www.goodreads.com/book/show/55339408-noise">Noise: a flaw in human judgment</a> and there is an interview in New Scientist: <a href="https://www.newscientist.com/article/mg25033391-200-the-biggest-flaw-in-human-decision-making-and-how-to-fix-it/">The biggest flaw in human decision-making and how to fix it</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6000" height="4000" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4000,&quot;width&quot;:6000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;woman in blue and black striped long sleeve shirt&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="woman in blue and black striped long sleeve shirt" title="woman in blue and black striped long sleeve shirt" srcset="https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1621882722395-634daa391300?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxub2lzZXxlbnwwfHx8fDE3Mjg5NDM0MDl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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><figcaption class="image-caption">Photo by <a href="true">Elyas Pasban</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Noise is variability of conclusions among highly skilled professionals like doctors and judges when presented with the same information.</p><div class="pullquote"><p>&#8220;[Organisations] are designed to sweep the problem under the rug and to create the illusion of consensus. They are not looking for the correct answer.&#8221;</p></div><p>While they acknowledge it&#8217;s expected that individual judgements will differ, they demonstrate that they vary far more than expected. In a standardised test of insurance underwriters, they expected their judgements would be around 10 percent different on average but they varied by 55 percent. Similar results were found for sentencing decisions by judges (50%).</p><h2>Noise versus bias</h2><p>Bias can apply to a single case, and it may be possible to identify sources of bias. Noise is the statistical variability among cases, where the judgements should be very similar, it turns out they aren't. This has implications for the quality of outcomes and fairness of decision-making across an organisation.</p><h2>Hiding the noise</h2><blockquote><p>You have to ask: why don&#8217;t organisations realise this problem? Why doesn&#8217;t the insurance company realise it? Why doesn&#8217;t the judicial system become aware of so much variability? Why don&#8217;t hospitals become aware of the fact that doctors have, quite often, very different diagnoses of the same patient? You would think it&#8217;s in their interest.</p></blockquote><p>The most striking passage in Kahneman and Sibony's New Scientist interview is this (my emphasis):</p><blockquote><p>We think part of the answer is that <strong>organisations are designed to suppress evidence of noise</strong>. They&#8217;re designed to sweep the problem under the rug and to create the illusion of consensus. <strong>They are not looking for the correct answer</strong>. One way to do that is never ask people for their opinions separately. You bring them into a meeting and you ask them to discuss it. Which, of course, gives a strong incentive to the second speaker to agree with the first one, and the third person to agree with the first two, and so on.</p></blockquote><h2>Some thoughts on the implications</h2><p>I am not sure this is true of every organisation but I can relate their conclusions to my experiences.</p><ul><li><p>The <a href="https://en.wikipedia.org/wiki/Delphi_method">Delphi method</a> predates this work and tries to provide a structured way to address the issues Kahneman, Sibony and Sunstein raise.</p></li><li><p><a href="https://en.wikipedia.org/wiki/Trade_study">Trade-off studies</a>.</p></li><li><p><a href="https://en.wikipedia.org/wiki/Robust_decision-making">Robust Decision-Making</a>.</p></li><li><p>Companies should carefully consider their diversity and inclusion efforts to help maximise their chances of making robust and fair decisions and ultimately benefiting the company as a whole.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.duncanpierce.org/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 &#8220;Like magic&#8221;. Please subscribe for free to receive new posts.</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></channel></rss>