<?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[Human Systems]]></title><description><![CDATA[Hey folks, I’m Frederik Dudzik! I work as an DevSecOps Tech Lead and write about my experience. If you’d like to hear from me regularly, sign up for my newsletter. You can also find me as dudzik_co on X.]]></description><link>https://humansystems.dudzik.co</link><image><url>https://substackcdn.com/image/fetch/$s_!_W8D!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6a7ad4-d40b-4f70-9b36-44db2aa50fbd_397x397.png</url><title>Human Systems</title><link>https://humansystems.dudzik.co</link></image><generator>Substack</generator><lastBuildDate>Tue, 06 Oct 2026 05:25:10 GMT</lastBuildDate><atom:link href="https://humansystems.dudzik.co/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Frederik Dudzik]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[frederikdudzik@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[frederikdudzik@substack.com]]></itunes:email><itunes:name><![CDATA[Frederik Dudzik]]></itunes:name></itunes:owner><itunes:author><![CDATA[Frederik Dudzik]]></itunes:author><googleplay:owner><![CDATA[frederikdudzik@substack.com]]></googleplay:owner><googleplay:email><![CDATA[frederikdudzik@substack.com]]></googleplay:email><googleplay:author><![CDATA[Frederik Dudzik]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Fixing CI contention caused by agentic coding]]></title><description><![CDATA[How coding agents pushed a one-person project into CI scaling problems]]></description><link>https://humansystems.dudzik.co/p/when-agents-make-ci-the-bottleneck</link><guid isPermaLink="false">https://humansystems.dudzik.co/p/when-agents-make-ci-the-bottleneck</guid><dc:creator><![CDATA[Frederik Dudzik]]></dc:creator><pubDate>Fri, 21 Aug 2026 15:59:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/130e4307-23c8-4e7e-bc32-c7cecd462cd3_1774x887.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The last time I had to think seriously about CI throughput, I was working on the CI/CD team at Shopify. I didn&#8217;t expect to run into the same kind of scaling problem on a hobby project with one engineer. But coding agents helped push one of my projects to roughly 500,000 lines of code, and I hit it much sooner than I expected.</p><p>Changes were arriving faster than CI could verify them. They also tended to be larger, and several could be ready during the roughly 20 minutes it took CI to verify one of them. Once one landed, the others often had to be rebased and run through CI again. Waiting created overlapping work, overlapping work created rebases, and those rebases created more CI work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://humansystems.dudzik.co/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 Human Systems! 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><p>One engineer with coding agents was enough to make CI a bottleneck I had previously associated with much larger engineering organizations.</p><p>I addressed it by reducing how much CI each change triggered. By selecting only the tests a change could affect, many changes went from occupying the runner for around 20 minutes to taking a couple of minutes or skipping the suite entirely.</p><h1><strong>Why more CI capacity wasn&#8217;t the answer</strong></h1><p>At first, I paid for more CI capacity. I burned through GitHub Actions&#8217; free minutes quickly, and the bill went from about $10 to $20 to $50 a month. It was still growing. I didn&#8217;t want CI costs to scale with the amount of work the agents produced.</p><p>I moved the workload to a dedicated runner on a generic VM provider and deliberately limited myself to one machine. One VM had enough total compute. A 20-minute suite was manageable overnight, when agents could take multiple turns without me waiting for each result. The problem was the 20-minute feedback loop during active development.</p><p>I could have added more runners, but I&#8217;d seen that approach at much greater scale at Shopify. More runners increase throughput, but every change still triggers the same amount of work. As the rate of changes grows, the required capacity grows with it.</p><p>I decided to reduce the work each change triggered instead.</p><h1><strong>Selecting only the tests a change can affect</strong></h1><p>The approach was one we had also used at Shopify: instead of running the entire test suite for every change, figure out which tests the change could affect and run only those.</p><p>I combine two pieces of information. Full test runs record which parts of the application each test uses. When a change enters CI, a TypeScript dependency graph shows which parts of the application the changed files can affect. CI combines those two sets of information to select the relevant tests.</p><p>Most of that work does not happen on every CI run. Scheduled full-suite runs collect the runtime information, while the TypeScript dependency graph takes only a few seconds to rebuild. A localized change may select only a handful of tests. A broadly shared change can still select most or all of the suite.</p><p>At Shopify, much of the codebase was Ruby, so we relied more heavily on runtime tracing to understand what each test touched. At that scale, collecting and processing those traces was expensive enough that we spent significant effort making it faster. TypeScript makes part of this much cheaper because the compiler can tell me how source files depend on one another without running the application.</p><p>The selection is deliberately conservative. If CI sees a changed source file that it cannot confidently connect to existing test coverage, it records that uncertainty instead of assuming the change is safe.</p><p>I still run the complete suite every night. Those runs also refresh the runtime information used for future test selections. This keeps the development loop fast while the nightly run provides broader coverage without blocking me.</p><p>Test selection does not guarantee that a skipped test could never fail. It avoids spending 20 minutes rerunning unrelated tests when CI has enough information to select a much smaller set.</p><h1><strong>Making test selection useful</strong></h1><p>Test selection only works well if the codebase has useful boundaries. If every part of the application depends on everything else, an accurate selector will still conclude that a small change can affect most of the test suite.</p><p>In this application, each page has a route file, and each group of backend operations has an API file. Larger parts of the application are also separated into packages. These boundaries give the selector useful connection points between a source change and the tests that cover it.</p><p>Some changes naturally cross those boundaries. Shared test setup, global styles, build configuration, and dependency changes can affect much of the application, so those changes still select most or all of the suite.</p><p>The selector also exposed weak boundaries in the codebase. If a small change consistently selected a large part of the test suite, too much code usually depended on the area being changed. Tightening those boundaries reduced the number of selected tests. It also helped with concurrent agent work because changes in separate parts of the system were less likely to overlap and require rebasing.</p><p>I also found work that looked parallel in the CI configuration but was serial in practice. Two E2E jobs competed for the same runner, so they repeated setup without reducing wall time. I combined them into one job that builds the application and prepares a local database once. Within that job, state-changing tests remain serial, while isolated visual tests can run at the same time.</p><p>Now the order of operations is: skip tests that cannot be relevant, make the remaining work cheaper, improve code boundaries when small changes still select too much, and only then consider adding runners.</p><p>The aim is for the cost of verification to match the scope of the change.</p><h1><strong>What changed in practice</strong></h1><p>The changes helped even in the worst case, when the selector still chose the full pull-request suite.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;34fa50ef-0e7a-47fa-9848-eecfe94a5db8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Metric                       Before    After     Reduction
---------------------------------------------------------
Total CI wall time           ~21 min   ~13 min   ~40%
E2E lane                     ~12 min   ~4 min    ~65%
Browser-test execution       ~10 min   &lt;3 min    ~70%
Critical-path contention     ~14 min   ~6 min    ~60%</code></pre></div><p>The selector itself adds about 15 seconds.</p><p>The slowest runs improved much more. Across successful pull-request runs that started E2E, p95 E2E time fell from about 23 minutes to 6 minutes, a 74 percent reduction. Including queue time, p95 total CI time fell from about 7 hours 35 minutes to 35 minutes, a 92 percent reduction.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jnwS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jnwS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 424w, https://substackcdn.com/image/fetch/$s_!jnwS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 848w, https://substackcdn.com/image/fetch/$s_!jnwS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 1272w, https://substackcdn.com/image/fetch/$s_!jnwS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jnwS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png" width="1456" height="739" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:739,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot 2026-08-20 at 10.26.55&#8239;PM.png&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="Screenshot 2026-08-20 at 10.26.55&#8239;PM.png" title="Screenshot 2026-08-20 at 10.26.55&#8239;PM.png" srcset="https://substackcdn.com/image/fetch/$s_!jnwS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 424w, https://substackcdn.com/image/fetch/$s_!jnwS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 848w, https://substackcdn.com/image/fetch/$s_!jnwS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.png 1272w, https://substackcdn.com/image/fetch/$s_!jnwS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8890abe-788b-4d8a-9f37-72d2881bea7d_1572x798.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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"><strong>Why contention grows nonlinearly.</strong> As a single runner approaches full utilization, small increases in incoming work can cause disproportionately large increases in queue time.</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SV9q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SV9q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 424w, https://substackcdn.com/image/fetch/$s_!SV9q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 848w, https://substackcdn.com/image/fetch/$s_!SV9q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 1272w, https://substackcdn.com/image/fetch/$s_!SV9q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SV9q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot 2026-08-20 at 10.45.03&#8239;PM.png&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="Screenshot 2026-08-20 at 10.45.03&#8239;PM.png" title="Screenshot 2026-08-20 at 10.45.03&#8239;PM.png" srcset="https://substackcdn.com/image/fetch/$s_!SV9q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 424w, https://substackcdn.com/image/fetch/$s_!SV9q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 848w, https://substackcdn.com/image/fetch/$s_!SV9q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.png 1272w, https://substackcdn.com/image/fetch/$s_!SV9q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630eb578-dd17-4f6d-99ff-f0a0173b8cf0_1566x876.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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"><em>Illustrative queueing behavior, not measured project data. With a fixed arrival rate, small reductions in test work can produce much larger reductions in queue time when the runner is close to full utilization.</em></figcaption></figure></div><p>The 92 percent reduction mostly came from queueing, not faster tests. Some pre-change runs spent hours waiting for the single runner. Near capacity, queueing is nonlinear: a modest reduction in the work each change requires can free enough runner capacity to reduce wait times by much more than the test-time improvement itself.</p><p>These are historical before-and-after measurements, not a controlled benchmark. They show two different effects: less unnecessary work improved typical runs, while less runner contention had a much larger effect on the slowest runs.</p><h1><strong>What I&#8217;d do next</strong></h1><p>At this point, one runner is enough again. Most pull requests only pay for the tests they can plausibly affect, while the full suite runs overnight.</p><p>If the workload eventually exceeds one machine, I can add runners after removing the work that does not need to happen. Otherwise I would be spending more money to run tests that are unrelated to the change.</p><p>The larger lesson is about arrival rate rather than headcount. One engineer working with coding agents produced changes fast enough to recreate a CI scaling problem I had previously encountered on a large engineering team. As agents increase the rate of change, verification has to become more selective or the infrastructure behind it has to grow at the same rate.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://humansystems.dudzik.co/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 Human Systems! 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[Share your work]]></title><description><![CDATA[You are doing great work, and there is a lot of value in sharing it, especially outside your team.]]></description><link>https://humansystems.dudzik.co/p/share-your-work</link><guid isPermaLink="false">https://humansystems.dudzik.co/p/share-your-work</guid><dc:creator><![CDATA[Frederik Dudzik]]></dc:creator><pubDate>Fri, 09 Dec 2022 03:15:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!i_cA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg" 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_!i_cA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i_cA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i_cA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i_cA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i_cA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i_cA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/f213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1132516,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&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_!i_cA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i_cA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i_cA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i_cA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff213835b-29b9-46d2-82ac-bbc0a904b85a_6720x4480.jpeg 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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://humansystems.dudzik.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://humansystems.dudzik.co/subscribe?"><span>Subscribe now</span></a></p><p>You are doing great work, and there is a lot of value in sharing it, especially outside your team. Sharing can be daunting or feel like it is distracting from solving problems. At least, that&#8217;s how I used to feel about it. I only grasped the effects sharing has when I became a manager.</p><h2>Isn&#8217;t my manager supposed to share the team&#8217;s work?</h2><p>As a manager, I ensure my team is doing work that matches the organization&#8217;s priorities. This process involves conversations with other teams. I share what we work on, how it might affect them, and if there are any actions to take.</p><p>Sharing context and building relationships need a lot of work. When my reports post their work on slack, present, or write blog articles, the shared context travels through the organization. This results in less time explaining what we do and how it might affect them. Often, teams affected by my team&#8217;s work will reach out themselves, saving even more time.</p><p>Even though there are different roles in a team, everybody works towards the same outcome. It is a collaborative process, making lines of responsibility murky in places. You would pair, mentor, or pick up tasks from your team members to achieve team goals. Your manager is the same.</p><h2>Why can&#8217;t my manager keep up with my work?</h2><p>I used to believe my work should speak for itself. Instead of indulging in it, I could spend more time solving problems. But this isn&#8217;t realistic. Everybody relies on someone else to catch their attention. Your work needs to be approachable so people understand its value. Especially your manager.</p><p>As a manager, I need help to keep up with my team. If I have six reports, each working 40 hours a week, that&#8217;s 240 hours to stay on top of. The only way to keep up is for my reports to help me understand what they&#8217;re doing.</p><h2>What if sharing my work feels sleazy?</h2><p>I struggled to share my work because I thought I was selling it. It felt sleazy. But I realized that it is more like celebrating an achievement. Overcoming a challenge is worth feeling good about and celebrating. The work doesn&#8217;t have to be finished either. Hitting a milestone, de-risking a project with a prototype, or learning something new are all worth sharing.</p><p>Sometimes it can feel awkward to be in the limelight, especially when it is a team effort. But when you share the team's work, you lift everyone up. It creates more awareness of their achievements, and if you share publicly, your team members can reference it in their resume.</p><h2>What if I only want to code?</h2><p>The more important question is how much impact you want to have. Most problems worth solving are a team effort. You increase your impact by working through your team, which requires sharing your work. Other people can learn from you and take a similar approach, which is part of technical leadership. </p><p>You will also build a reputation for solving problems. And as a consequence, build trust to address more impactful problems. Which also makes it easier for me to promote you and raise your salary.</p><p>Another aspect to consider is avoiding micro-management. The most impactful teams I&#8217;ve worked on were self-organizing. We built trust with our manager by producing good work and advocating for it across the organization. They only stepped in when things weren't working as expected, and we needed coaching.</p><h2>What if I'm not comfortable sharing?</h2><p>It&#8217;s normal to feel awkward when learning something new. The trick is finding a way to talk yourself into it. Everybody is a bit different and needs their own narrative. The one that clicked for me was when a company I worked for went through a round of layoffs. I realized if I didn&#8217;t share what my team shipped, nobody would know why our work mattered, and we would be laid off. The pressure from big challenges and preventing downside risks motivate me. Some people get paralyzed by pressure and need a positive narrative. Others get motivated by how they affect other people.</p><p>I also like asking my team members for their thoughts when I&#8217;m unsure about something I want to share. Their feedback helps me make a decision. And they can help me through the creation process. I like sharing drafts and presentations early to rapidly iterate on them, which makes it much faster to produce and less daunting to share.</p><h2>Who should I share with?</h2><p>Generally, the broader the audience, the less detail is needed. I can share much more detail within my team than with people outside it. For them, more detail is better because your team members can apply it. But if I share my work with my department, I will share what I shipped, how it would affect them, and what they can learn from it.</p><p>Creating awareness of what goes into our work across the organization is a powerful tool. For example, it is valuable for the marketing team to know that an app will need downtime for maintenance. They don&#8217;t need to know the details. It is enough for them to be aware of the constraints affecting them. This helps coordinate when campaigns happen and when downtime is scheduled.</p><p>A great way to get your point across faster is to cut down on jargon. For example, someone with a background in marketing will understand "we want to improve our newsletter's CTR with a better CTA design" to mean "we want to increase the rate of how many people sign up for our newsletter, and we believe tweaking the signup form will help". But people outside their domain need the more explicit version. Likewise, people outside your team won't understand your jargon.</p><p>On the flip side, it helps to adopt your audience's language. I like reading through my audience's writing and presentations to integrate their concepts into my content. This approach makes it easier for my audience to understand me.</p><h2>Wrapping up</h2><p>Sharing your work creates awareness across the organization. It helps your manager coordinate with other teams and gives you more autonomy. You will be trusted to solve more impactful problems, which makes it easier for your manager to promote you. It can be uncomfortable to share. You can get help from your team to find interesting topics and progressively increase the audience. People are interested in your work, but you have to try to meet them where they are. </p><p>I would love to hear your thoughts on the topic. Feel free to message me <a href="http://twitter.com/dudzik_eth">on Twitter</a> and if you want to hear more from me, make sure to follow.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://frederikdudzik.substack.com/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Human Systems&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://frederikdudzik.substack.com/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Human Systems</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://humansystems.dudzik.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://humansystems.dudzik.co/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is Human Systems, a newsletter about Software Engineering Management.]]></description><link>https://humansystems.dudzik.co/p/coming-soon</link><guid isPermaLink="false">https://humansystems.dudzik.co/p/coming-soon</guid><dc:creator><![CDATA[Frederik Dudzik]]></dc:creator><pubDate>Thu, 08 Dec 2022 04:41:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_W8D!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6a7ad4-d40b-4f70-9b36-44db2aa50fbd_397x397.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>This is Human Systems</strong>, a newsletter about Software Engineering Management.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://humansystems.dudzik.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://humansystems.dudzik.co/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>