<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Bryan Finster on Medium]]></title>
        <description><![CDATA[Stories by Bryan Finster on Medium]]></description>
        <link>https://medium.com/@bdfinst?source=rss-dd7cba7bb329------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*NdtqyBRXUooVySDZTRqVoQ.jpeg</url>
            <title>Stories by Bryan Finster on Medium</title>
            <link>https://medium.com/@bdfinst?source=rss-dd7cba7bb329------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 10 Nov 2026 05:48:41 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@bdfinst/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Moving to Substack]]></title>
            <link>https://bdfinst.medium.com/moving-to-substack-e846ee5a3824?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/e846ee5a3824</guid>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Sat, 10 Jan 2026 14:41:25 GMT</pubDate>
            <atom:updated>2026-01-10T14:41:25.399Z</atom:updated>
            <content:encoded><![CDATA[<p>I’m moving my writing to Substack. <br>Honestly, I like Medium’s writing experience better, but the reader experince is better on Substack.</p><p>I’m tired of people being required to have an account here to read information that I never paywall and Substack has better notifications.</p><p>So, to improve reader experience, I’m moving there. Hope to see you.</p><p>You can check out my latest post there.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*_gkf-iCoS-lh8gF-zlrFaA.jpeg" /><figcaption><a href="https://bryanfinster.substack.com">https://bryanfinster.substack.com</a></figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e846ee5a3824" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CD Pipelines: Operational Control, Not a Delivery Convenience]]></title>
            <link>https://bdfinst.medium.com/cd-pipelines-operational-control-not-a-delivery-convenience-1a83362e2121?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/1a83362e2121</guid>
            <category><![CDATA[software-supply-chain]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[devsecops]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Fri, 19 Dec 2025 12:56:13 GMT</pubDate>
            <atom:updated>2025-12-19T12:58:49.049Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f03r3oDW0ff6iC2w_NUhPw.png" /></figure><p>We need to stop talking about Continuous Delivery as a way to ship features faster. That mindset drives the wrong outcomes and entirely misses the point. It also causes some to believe that CD is only for “move fast and break things” development and should not be used for critical systems. That’s entirely wrong.</p><p>For systems that matter, CD pipelines are <strong>operational safety mechanisms</strong>. They exist to protect stability, enable rapid recovery, and enforce a defensible security posture. Speed is just a fortunate side effect.</p><p>If your pipeline cannot be trusted on demand, you don’t have a delivery system. You have a liability that just hasn’t been exercised under stress yet.</p><h3>Stability Is Muscle Memory</h3><p>In an incident, nobody rises to the level of their architecture diagrams. They fall to the level of their practiced execution.</p><p>This is where teams bleed. When production is on fire, panic sets in. Teams improvise new delivery processes on the fly. Tests get skipped “temporarily.” Security checks are bypassed “just this once.” Someone runs a script by hand that hasn’t been touched in six months.</p><p>Each decision feels reasonable in isolation. Together, they turn a bad situation into a prolonged outage.</p><p>A working CD pipeline provides a deterministic path from change to production. It replaces judgment calls with automated verification. It allows you to deploy fixes quickly <em>without</em> increasing risk. But this only works if the pipeline you use in an emergency is the same one you use on a quiet Tuesday.</p><p>If you can’t confidentially say, <em>“We can deploy a fix right now using our normal process,”</em> your operational risk is unacceptably high. You’ve just been lucky so far.</p><h3>Pipelines Are Your Security Boundary</h3><p>Security is the most difficult quality attribute because it doesn’t stay solved. It rots.</p><p>Performance problems announce themselves. Availability problems page you. Security problems sit quietly as the ground shifts beneath your assumptions. A dependency that was safe last quarter has a critical CVE today. A base image approved last year is now a supply-chain liability. Nothing in your system changed, but the risk did.</p><p><strong>If you aren’t continuously re-validating your assumptions, you are already out of date; you just don’t know it yet.</strong></p><p>This is why CD matters. The pipeline is the only place where security is enforced continuously rather than periodically. It is where dependencies are re-evaluated, policies are applied, and drift is detected before it becomes production reality. Anything outside the pipeline is guidance; the pipeline is enforcement.</p><p>The most dangerous security failures aren’t zero-days. They are stale guarantees. “We scanned that months ago” is not a defense.</p><p>When pipelines aren’t exercised regularly, security controls decay. Scans stop failing builds. Exceptions accumulate without ownership. Policies get loosened and never tightened. Eventually, teams stop trusting the signal. Security becomes theater: green dashboards backed by false confidence.</p><h3>Green Pipelines Are Not a Vanity Metric</h3><p>A green pipeline is not a badge of honor. It is a prerequisite for trust.</p><p>Red pipelines that stay red are telling you something critical: your feedback loop is broken. Tests are brittle. Environments aren’t reproducible. Ownership is unclear. Ignoring that signal is like driving with the check-engine light on and calling it “normal.”</p><p>Teams that take operations seriously treat pipeline health the same way they treat production health. <strong>Broken pipelines stop the line.</strong> Fixing them is priority zero. Feature work resumes only after confidence is restored.</p><p>You wouldn’t accept a production system that only works “most of the time.” Don’t accept it from the system that decides what is allowed into production.</p><h3>Exercise It or Lose It</h3><p>Pipelines degrade when they aren’t used. Credentials expire. Dependencies drift. Entropy sets in.</p><p>If you want a pipeline you can rely on in a crisis, you have to exercise it deliberately. This means deploying regularly, even if the changes are trivial. It means practicing rollbacks, not just forward motion. It means treating pipeline execution time as an operational constraint, not an inconvenience.</p><p>Think of it like a fire drill. You don’t want to discover the exits are blocked when the building is actually on fire.</p><p>Teams that only run pipelines for “major” releases are doing the opposite of risk management. They are optimizing for the quiet days and gambling on the loud ones.</p><h3>CD Is How You Buy Down Risk</h3><p>The real value of CD isn’t velocity. It is risk reduction.</p><p>Small, frequent, validated changes are easier to reason about, easier to secure, and easier to recover from. When something breaks — and it will — teams that practice CD don’t panic. Not because they are smarter, but because they have engineered a system where failure is survivable.</p><p>For critical systems, the ability to deploy safely is not optional. It is <strong>feature zero</strong>. Everything else depends on it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1a83362e2121" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: Spec-Driven Development Isn’t New]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-spec-driven-development-isnt-new-3a5c552efc95?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/3a5c552efc95</guid>
            <category><![CDATA[vibe-coding]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[agile]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Thu, 13 Nov 2025 12:41:26 GMT</pubDate>
            <atom:updated>2025-11-13T12:55:11.932Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*raG2kM_1mR_w0I9KsCq9sA.png" /></figure><p>…It’s BDD that someone just discovered… again.</p><p>When someone declares a core Agile principle “obsolete” because they’ve rediscovered something experienced teams have been doing for decades, while demonstrating that they never understood agile in the first place, it’s a good reminder of how few people study how to do the work better.</p><p>The latest example showed up in my LinkedIn feed recently</p><blockquote>A core principle of Agile is soon to be obsolete: One of the holiest lines in the Agile Manifesto is “Working software over comprehensive documentation.” But in the era of Agentic Spec-Driven Development, this is flipping on its head.</blockquote><p>This sounds futuristic until you realize we solved this problem twenty years ago. We call it <strong>Behavior-Driven Development</strong>. SDD is not a revolution. It’s not “flipping Agile on its head” because you have detailed specifications. It’s just BDD with branding.</p><p>First, let’s clarify some things.</p><h3>“Working software over comprehensive documentation.”</h3><p>This never meant “don’t document.”</p><p>What it meant was that we didn’t spend months creating a Business Requirements Document and a System Requirements Document for the “finished” project. We don’t create detailed architecture, process flow diagrams, data designs, and low-level technical specifications for everything before we <strong>finally</strong> begin coding.</p><p>It meant <strong>don’t pretend to know everything up front</strong>. Write enough to align people, then prove it works by actually building something and validating it with the end-user.</p><h3>Behavior Driven Development</h3><p>BDD is the practice of having a conversation about how a feature should work.</p><p>BDD is:</p><ul><li>Concrete examples</li><li>Expressed in plain language</li><li>Agreed upon by product, QA, and development</li><li>And executable as tests</li></ul><pre>Feature: I want to be able to add items to a shopping cart so that I can purchase them<br><br>Scenario: Adding a new item to an empty cart<br>Given the cart is empty<br>When I add item 123 to the cart<br>Then the cart should contain item 123<br>And the quantity should be 1<br><br>Scenario: Increasing quantity for an item already in the cart<br>Given the cart contains item 123 with quantity 1<br>When I add same item again<br>Then the quantity should be 2</pre><p>When we begin coding, we implement using TDD using the BDD output to define the tests.</p><pre>import { Cart } from &#39;../src/cart&#39;; // adjust path as needed<br><br>describe(&#39;Shopping Cart&#39;, () =&gt; {<br>  describe(&#39;Adding a new item to an empty cart&#39;, () =&gt; {<br>    let cart;<br><br>    beforeEach(() =&gt; {<br>      cart = new Cart();<br>    });<br><br>    it(&#39;should contain item 123 after adding it to an empty cart&#39;, () =&gt; {<br>      cart.addItem(123);<br>      expect(cart.contains(123)).toBe(true);<br>    });<br><br>    it(&#39;should set quantity to 1 when the item is added for the first time&#39;, () =&gt; {<br>      cart.addItem(123);<br>      expect(cart.getQuantity(123)).toBe(1);<br>    });<br>  });<br><br>  describe(&#39;Increasing quantity for an item already in the cart&#39;, () =&gt; {<br>    let cart;<br><br>    beforeEach(() =&gt; {<br>      cart = new Cart();<br>      cart.addItem(123); // quantity = 1<br>    });<br><br>    it(&#39;should increase the quantity to 2 when the same item is added again&#39;, () =&gt; {<br>      cart.addItem(123); // quantity becomes 2<br>      expect(cart.getQuantity(123)).toBe(2);<br>    });<br>  });<br>});</pre><p>Voilà, “spec-driven development.” This is a fundamental quality process for agile development, not a new invention for agentic-assisted development.</p><h3>Disposable Code</h3><p>Another hot take:</p><blockquote>In the era of agents, the Spec becomes the asset. The code becomes disposable.</blockquote><p>Reality check: <strong>that’s always been true</strong>.</p><p>If I have good acceptance tests, I can rewrite your entire system in another language, architecture, or stack. No drama.</p><p>If I only have code and no tests, I’ve inherited a dangerous artifact I can’t change safely.</p><p>Tests describe behavior. Behavior drives code. Code is the implementation detail.</p><p>This isn’t AI-era thinking. This is <strong>modern software engineering 101</strong>.</p><p>Teams that learned this years ago are not shocked by any of this.</p><h3>“We’ll regenerate the whole codebase every time. No more refactoring!”</h3><p>That’s not how agent-assisted development works. We add, modify, or remove behaviors as we deliver and learn. AI makes it much faster and cheaper to mutate the code to meet those behavior changes. We aren’t rebuilding the entire system on every commit.</p><ul><li>Small batches</li><li>Driven by tests</li><li>Continuously integrated with the rest of the team’s changes</li><li>Continuously delivered and validated</li></ul><p>That’s the work, whether a human types the code or an agent spits it out.</p><h3>What people think is new is what they avoided learning for 20 years</h3><p>I’ve seen this pattern repeat endlessly:</p><ul><li>People skip the “conversation first” part.</li><li>They treat requirements as gospel instead of hypotheses.</li><li>They ship quarterly bundles of misunderstood features.</li><li>Then they declare Agile broken because the slogans didn’t save them.</li></ul><p>If you want a taste of the real deal, try BDD and ATDD, then add agents. Now you get acceleration <strong>and</strong> safety.</p><p>If you skip the discipline, you get vibe coding with prettier marketing.</p><h3>AI doesn’t eliminate engineering discipline…</h3><p>It amplifies whatever you already are.</p><p>AI-assisted development works beautifully for teams with strong fundamentals — clear behavior definitions, fast feedback loops, small steps, and real continuous integration. I’ve written extensively about this.</p><p>And it works terribly for teams who lean on process theater, vague requirements, slow integration, and giant batches. They’ll blame AI. But it’s not AI. It’s them.</p><p>As I’ve said many times:</p><p><strong>AI amplifies your discipline or your dysfunction. Your choice.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3a5c552efc95" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: Solving the CD Talent Problem]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-solving-the-cd-talent-problem-1940302449ee?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/1940302449ee</guid>
            <category><![CDATA[scaled-agile-framework]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[agile]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Thu, 06 Nov 2025 21:10:09 GMT</pubDate>
            <atom:updated>2025-11-06T21:10:09.272Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yNWrTrUvFFjOaK9-tbaGsw.png" /></figure><p>In 2014, our warehouse management system was a nightmare of complexity. A 25MLOC monstrosity that was so tightly coupled that all 900ish applications had to be deployed at the same time, and each release meant a week in a 24x7 war room and many sleepless nights after that. it was a major business problem that needed to be solved.</p><p>Four years later, Accelerate came out and asserted:</p><blockquote>“Continuous delivery improves both delivery performance and quality, and also helps improve culture and reduce burnout and deployment pain.”</blockquote><blockquote><strong>– <em>Accelerate</em> by Nicole Forsgren Ph.D., Jez Humble &amp; Gene Kim</strong></blockquote><p>I didn’t need the book to tell me that — it had already changed my life. It&#39;d been a few years since our first CD pilot in Walmart Logistics, and I knew firsthand it was a much better way to live. Since then, I’ve worked to help many teams learn the engineering and teamwork required for CD because I believe every team should experience what we did during that pilot.</p><p>I’ve heard many excuses for “why CD won’t work here.” I’ve been told that their teams aren’t mature enough for CD, that their testing isn’t good enough, or that their teams lack the engineering talent.</p><blockquote>“We’ll try it once they get good enough.”</blockquote><p><strong>Fail!</strong></p><p>You don’t learn to ride a bike by waiting until you’re good enough. You remove the training wheels and find relatively safe places to fall.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/533/1*bJ0DTgscLANTml5Uo4TiYg.png" /></figure><p>If you want better engineering and better business outcomes, use your daily work to improve how you do daily work. Solve the problem of “why can&#39;t we CD?”</p><h3>Embracing the Suck</h3><p>When we began our journey, our teams were organized into <em>feature teams</em> with no domain boundaries. Each picked up whatever story was next in the backlog, regardless of where it lived in the system. The result was a codebase no one truly owned and everyone could break.</p><p>We were trying to manage this chaos with the Scaled Agile Framework (SAFe). It gave us structure, but also friction. Every feature required coordination across dozens of teams and languages, all coupled through a single shared database. Our lead time for change — the time from business request to production — was roughly <strong>a year</strong>.</p><p>Releases were massive, high-risk events. Deploying slightly less than once a quarter felt like a victory, even though each one hours of downtime at each distribution center, a week of 24x7 support in the office for each pilot, and weeks of recovery work afterward.</p><p>We weren’t just suffering from technical debt; we were drowning in <em>organizational</em> debt. Everyone knew the system was unsustainable, but no one could see a path out of it. Something had to change.</p><h3>The Moonshot Challenge</h3><p>Our saving grace was leadership. Our SVP, Randy Salley, and Senior Director, Kim Bowen, were outward-looking leaders who cared deeply about both results and people. Randy had been reading <em>Team of Teams</em> and <em>The Phoenix Project</em> and decided we needed to try something new. He gathered the senior engineers and said:</p><blockquote><em>“I need you to figure out how we can deliver every two weeks.”</em></blockquote><p>Challenge accepted — except we decided daily was a better goal. Go big or go home.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8FFMOyE7vfJuIFi4Qeby4g.jpeg" /></figure><p>I’ve written elsewhere (“<a href="https://www.infoq.com/articles/replace-process-dogma-engineering/">Agile Rehab</a>”) about the strategic steps we took to shift from project to product teams, so I won’t repeat that here. Enabling CD was one thing; <em>executing</em> it was another. We had so much to learn</p><h3>“You keep talking theory…”</h3><p>From our ivory tower, we began preaching: <em>90% test coverage! Test-driven development! Continuous integration!</em></p><p>Teams dutifully wrote tests—and we learned not to treat test coverage as a goal.</p><p>You know what’s more terrifying than no tests? Tests that cover hundreds of lines of code with:</p><pre>assertTrue(true);</pre><p>During my 1-on-1 with my manager, he challenged me about our lack of progress. “You all keep talking theory. How will we execute?”</p><p>I responded, “Leadership pulled all of the tech leads off of the teams into a centralized design team. Now, instead of direct responsibility for outcomes, we only have influence and no visibility into the real challenges. Put me back on a development team!”</p><p>So, they put four of us back as tech leads on the first four pilot teams.</p><h3>Walking the Talk</h3><p>You don’t know what you don’t know until you try it. I got to learn firsthand how to apply what we thought we knew by facing each problem as it came and staying one chapter ahead of the team.</p><p>The team wasn’t hand-picked. We were average: 13 developers, a business analyst, a scrum master, and a product owner from the business side. Developers ranged from me (19 years of WMS experience) to new college grads. Most had little domain knowledge, having worked in feature teams for a decade, responsible for turning specs into code. They had no exposure to real business problems. Now they owned a critical business process and were learning on the fly.</p><p>Later, that became an important data point: if an average team could become high-performing just by changing how they worked, excuses about “talent” collapse.</p><h3>Why Can’t We CI?</h3><p>CD is a big elephant to carve up, so we needed some smaller bites. We’d been pushing teams on CI for months, with no traction. Using the CD Maturity Model from <a href="https://continuousdelivery.com/">Continuous Delivery</a>, I created a dependency diagram of behaviors and platform capabilities that we needed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/673/1*i6Nbt0q56REdL5FMJ-vKmw.png" /></figure><p>This gave me a reasonably solid roadmap of what to tackle. We’d created a small platform team to create templates for our core tech stacks to reduce the cognitive load of every team learning Jenkins, so my focus was on the blue and green boxes.</p><p>First, we needed to solve CI before moving on to CD. To do that, we needed to define CI clearly. So, I wrote the rules on a piece of paper and hung it up in the area.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1W38dUGl6FMnfW_tEbuZCg.png" /></figure><p>Then we used that as our North Star:</p><blockquote>“What’s stopping us from doing that today?”</blockquote><h3>So Many problems</h3><p>To resolve the CI issue, we needed to address some issues.</p><ul><li><strong>Testing Knowledge:</strong> We needed to make testing a leading activity performed before and during development, rather than a lagging activity done by our (soon-to-be-obsolete) testing team.</li><li><strong>Business Knowledge:</strong> We needed to spread business knowledge to make the testing effective and to take some of the load off me to explain the reasons for every change.</li><li><strong>Process Overhead:</strong> People were SAFe trained and used to long-lived branches, delivering complete stories, and managing to story points. The level of SAFe process was an impediment.</li><li><strong>Me:</strong> I also didn’t know how to test or how to deliver partially complete changes continuously. I had a copy of Continuous Delivery, Google, and a goal: daily production delivery.</li></ul><p>The SAFe overhead was a real problem. We had a drive-by scrum master in the beginning who was there to make sure we followed the SAFe process. Step one on our journey was when I told the team, “From now on, we are using minimal viable process. We will start with zero process and only add things that help us reach our North Star.” The scrum master didn’t like it. I didn’t care.</p><p>The testing problem was the most critical. To meet our goal, we needed to be able to commit a change and have the pipeline certify that it was production-deployable. Everything about how we tested had to change. The problem was that we were playing the same game most teams play: get a story from the PO with some vague acceptance criteria, code it, and ask the PO, “Is this the rock you meant?” Coding tests in that environment feels like a huge waste of time. Also, we didn’t have enough testing knowledge on the team for everyone to write effective tests.</p><p>The solution came from the book: behavior-driven development (BDD).</p><h3>Given I don’t know what we’re building…</h3><p>BDD was the key that unlocked many other capabilities. I’d consider it foundational to all the improvements that followed.</p><p>BDD aligns technical work with business outcomes using structured “Given-When-Then” scenarios to guide development. It ensures a shared understanding between developers, testers, and business people and opens the door to automated acceptance tests using <a href="https://www.youtube.com/watch?v=NsOUKfzyZiU">acceptance test-driven development</a> (ATDD).</p><p>Using BDD enabled us to achieve a shared understanding of the business process for each feature.</p><ul><li>It helped the team build testing skills as we went through positive and negative scenarios.</li><li>It provided natural points to slice work up since each small scenario is a deliverable behavior. In fact, our definition of “ready to start” was that anyone could pick up any test scenario and that the team could complete the story in 2 days or less.</li><li>Everything became 1 story point, and we eliminated the face-palmingly, silly process of debating story points with cards.</li></ul><p>So now we had thin slices of work that the team could swarm with test scenarios they defined. Automating those became an implementation detail instead of making tests up on the fly.</p><p>To improve this further, we’d define the behavior changes of each of our several services using the same process. We’d also define any contract changes between services as tests, so multiple people could work on the same task across different services without worrying about integration issues.</p><p>Steadily, the team improved their testing muscles and soon surpassed the skills of the testing team assigned to us. In fact, they became an impediment. I had them removed from my team.</p><h4>Designing Tests for the Pipeline</h4><p>CD requires a specific design from a test suite. It needs to be very fast, 100% deterministic, and comprehensive. In addition, we had an architectural rule we had to follow: any service can deploy independently of any other service and in any sequence. This not only enables extreme agility, but also makes every change, including emergency changes, less risky.</p><p>While the testing team&#39;s default was to build an E2E regression suite, that wouldn’t work for CD. Instead, we had layers of tests: some unit tests, more sociable unit tests, contract tests, tests for contract mocks, etc. All of these were stateless. Any flake was terminated with extreme prejudice. Since everything we did was aligned with domain-driven design, none of our services mutated information from any other service. We knew that if our contracts were solid, the components would integrate together correctly.</p><p>All of these improvements enabled us to meet and exceed our first goal, daily integration to the trunk.</p><h3>Why Can’t We CD?</h3><p>Months of improvement paid off. I built a Grafana dashboard to display integration frequency trends to the team, and we were ripping through work. But we couldn’t yet deploy to production — partly because we were waiting on our new database, mostly because of <strong>fear</strong>.</p><p>The business didn’t trust us. Stability had been a chronic issue for years, and now we were doing something radically different that they didn’t understand.</p><p>It took months of patient persuasion, demos, and evidence. Finally, they let us deploy our new, low-risk screen. After that success, I assumed permission to continue — and we did, every week at first due to the process overhead of change control and CAB.</p><p>Later, when our platform team automated change control, we deployed multiple times per day. My dashboard had us averaging five deploys per day and frequently exceeding that.</p><h3>It Changed Us</h3><p>We deployed updates, alerted beta users in Slack, and got feedback instantly. If users spotted an issue, we hardened tests, fixed it, and redeployed. If they had an idea, we could design, code, and ship it in under two days.</p><p>A few months after I left the team, I went back and saw they were tracking their development cycle time (from start to delivery) on their whiteboard. In numbers about a foot tall, it said,</p><blockquote>“0.8 days.”</blockquote><p>The team was excited to do demos. They had ideas to improve the application. They had pride and the highest morale I’d ever experienced on a development team. They were good and they knew it. They weren’t 10X developers. They were a <strong>10x team</strong>.</p><h3>When our teams are good enough…</h3><p>Teams’ inability to execute CD has nothing to do with talent. Any team, given clarity, safety, and purpose, can learn CD and improve its engineering in the process.</p><p>The gap isn’t people — it’s <strong>leadership</strong>.</p><p>None of this could have happened without the support and trust of our SVP and Sr. Director.</p><p>You don’t need better talent.</p><p>You already have the talent.</p><p><strong>Give them hard problems to solve, the support to solve them, and set them free.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1940302449ee" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: CD Won’t Work Here]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-cd-wont-work-here-85556cef9fef?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/85556cef9fef</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Thu, 30 Oct 2025 12:26:24 GMT</pubDate>
            <atom:updated>2025-10-30T14:14:21.311Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*efOiyccAd1WHvCytjCi3Tg.png" /></figure><p>When people try to help an organization move toward continuous delivery or engineers advocate for the better outcomes that come with it, we hear the same excuses. The words change, but the message is consistent.</p><p>Some of the greatest hits we hear:</p><blockquote>“There’s more than one way to deliver software.”<br>“We’re not Amazon.”<br>“Our team doesn’t have enough experience.” “That won’t work here.”<br>“Our best developers will quit.”<br>“That seems risky.”<br>“We don’t have time to make changes.”</blockquote><p>Each one sounds reasonable until you unpack what it really means: <em>“We’re not ready to improve.”</em></p><h3>“There’s more than one way to deliver software.”</h3><p>True — like there’s more than one way to land a plane. Some end better than others.<br>If your delivery method can’t safely get features from idea to user quickly and repeatedly, maybe it’s time to stop defending it.</p><h3>“We’re not Amazon.”</h3><p>No one said you were. But you <em>do</em> have users who expect stable systems, faster feedback, and fewer incidents.<br>Continuous delivery isn’t about being Amazon; <strong>it’s about being able to respond to the needs of the business and to the unexpected safely, quickly, and without drama.</strong></p><h3>“Our team doesn’t have enough experience.”</h3><p>Then leadership’s job is to fix that. The longer you delay, the less experience you’ll have when you finally need those skills.</p><h3>“That won’t work here.”</h3><p>Translation: <em>“We don’t want to do the work required to make it work here.”</em><br>The laws of feedback and flow apply everywhere. The details change, but the physics don’t.</p><h3>“Our best developers will quit.”</h3><p>If your “best developers” refuse to improve how they deliver, they aren’t your best developers.<br>They’re your best at preserving the status quo.</p><h3>“That seems risky.”</h3><p>You’re right. Change is risky. So is running a system where every deploy is an act of faith.<br>Continuous delivery reduces <em>real</em> risk by exposing problems faster and limiting the blast radius of mistakes.</p><h3>“We don’t have time to make changes.”</h3><p>Then you’ve locked yourself into a death spiral. Continuous delivery is how you <em>get</em> time back — <br>by turning large, unpredictable failures into small, recoverable ones.</p><h3>“Too much overhead.”</h3><p>If improving safety, speed, and stability is “overhead,” your definition of efficiency is upside down.</p><p>Continuous delivery eliminates the overhead of firefighting, manual approval chains, and waiting for integration failures in production.</p><h3>“Customers can’t keep up.”</h3><p>That’s what feature flags, canary releases, and progressive rollouts are for.</p><p>The goal of CD isn’t to flood customers with features — it’s to *enable* controlled, reversible change when the business needs it.</p><p>Delivery frequency is about feedback, not feature fatigue.</p><p>Leadership often confuses <strong>disruption of comfort</strong> with <strong>introduction of risk</strong>.<br>Continuous delivery doesn’t add risk; it exposes the risk that was already there.</p><p>The right question isn’t <em>“Will CD work here?”</em><br>It’s <em>“Do we want to know the truth about how we deliver?”</em></p><p>Because CD will show you — whether you like the answer or not.</p><p>Starting your journey? This may help: <a href="https://practices.minimumcd.org/?_gl=1*h0xtt9*_ga*NjA4NzI1MTkxLjE3NjE3Njk1NDM.*_ga_KVLFMQXEF1*czE3NjE4MzM1OTEkbzIkZzAkdDE3NjE4MzM1OTEkajYwJGwwJGgw">https://practices.minimumcd.org/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=85556cef9fef" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: Why SAFe Fails to Deliver CD at Scale]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-why-safe-fails-to-deliver-cd-at-scale-1308f6a63591?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/1308f6a63591</guid>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[enterprise-software]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[scaled-agile-framework]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Tue, 28 Oct 2025 10:30:28 GMT</pubDate>
            <atom:updated>2025-10-28T10:30:28.416Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hnnrNRjfLvFATCc1MMjMTA.png" /></figure><p>I was asked recently why SAFe fails. Here’s one major reason.</p><p>The Scaled Agile Framework (SAFe) is the best-marketed framework sold to executives by the Agile Industrial Complex. Its goal is to improve delivery, starting with solving the problem of coordination at scale by managing dependencies through process. Instead of reducing coupling between teams, it formalizes it. SAFe layers synchronization meetings, planning cycles, and roles such as the “Release Train Engineer” across the organization to keep everyone aligned.</p><p>On paper and to the uninformed, that sounds a reasonable way to handle complexity. In practice, it locks in the very dependencies that prevent continuous delivery.</p><p><strong>What SAFe advocates say:</strong> “That’s just the starting point. You’re expected to move beyond that.”</p><p>I’ve lived through a SAFe implementation and witnessed several others firsthand, and I know exactly why they fail to move beyond that.</p><p><strong>Reality:</strong> It’s ironic that a group of people who are supposed to be resolving issues at scale seem to have so little clue about how things work at scale.</p><h3>The Coordination Trap</h3><p>For SAFe to “work,” everyone needs to be trained on the same process, and all the teams in a release train need to operate in lockstep. The “release train engineer” and “scrum of scrums” tightly couple teams around synchronized delivery and process. While this may seem to reduce chaos in the short term, that coupling is the exact opposite of what you need for continuous delivery.</p><p>In SAFe, every team must ask permission to make changes that affect anything beyond its local scope. Improvement becomes a group decision, and group decisions at enterprise scale move slower than glaciers. Even if a team sees a better way, it can’t simply act; it must align, escalate, and get consensus.</p><p>Continuous delivery, by contrast, depends on <strong>independent, decoupled teams</strong> that can improve their flow immediately and deliver value safely without waiting for the train schedule. CD requires us to use engineering to handle dependencies. In fact, if we take the constructive constraints of CD seriously, we cannot help but improve the engineering to enable that.</p><h3>The Training Paradox</h3><p>SAFe’s defenders often say the model is just a “starting point.” But because SAFe requires everyone to be trained on the same standardized process to maintain consistency across hundreds or thousands of people, the “starting point” becomes the destination.</p><p>When turnover happens — and it always does — new hires are trained on the official, baseline SAFe process, not whatever “improved” variant someone hopes to evolve toward. The improvement loop is broken because the training system anchors everyone to the original design.</p><p>The cost of formal change is high — retraining, documentation, governance updates, and alignment across roles — so improvements don’t happen organically. Unless change is driven from the top, it doesn’t happen at all. And executives are typically the farthest from the work, so the changes they drive are often counterproductive.</p><h3>The Management Self-Preservation Problem</h3><p>Continuous delivery demands <strong>decoupling teams</strong> — breaking dependencies so each can deliver independently. But in SAFe, those dependencies give structure and purpose to management roles like the Release Train Engineer.</p><p>Real improvement would mean shrinking the RTE’s responsibilities until the role disappears. That’s not a technical problem — it’s a political one. You’re asking people to dismantle the coordination system that justifies their position. Unsurprisingly, they resist.</p><p>When your operating model depends on preserving layers of coordination that continuous delivery renders unnecessary, you’ve built a system that’s optimized for self-preservation, not improvement.</p><h3>Scaling Dysfunction</h3><p>The entire premise of SAFe is to manage complexity through hierarchy and synchronization. But effective scaling isn’t about adding more layers of coordination; it’s about removing dependencies so teams can move safely on their own.</p><p>Continuous delivery scales by improving <strong>flow</strong> and <strong>feedback</strong>, not by adding more meetings to coordinate bad flow. Every added synchronization point adds latency, every shared dependency adds risk, and every “train” schedule adds drag.</p><p>SAFe’s mechanisms for control — the trains, the ceremonies, the alignment meetings — are precisely what prevent continuous delivery from emerging.</p><h3>The Outcome</h3><p>SAFe scales coordination, not delivery. It turns what should be local learning loops into enterprise-level governance processes. The result is predictably slow, brittle, and expensive.</p><p>It delivers the illusion of progress — more charts, more ceremonies, more roles — but not the one metric that actually matters: the ability to deliver working software safely and continuously.</p><p>If you want to deliver continuously at scale, don’t scale SAFe.</p><p><strong>Scale learning, autonomy, and flow instead.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1308f6a63591" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: Growing New Developers in an AI World]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-growing-new-developers-in-an-ai-world-d53d260321ae?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/d53d260321ae</guid>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Fri, 19 Sep 2025 20:51:27 GMT</pubDate>
            <atom:updated>2025-09-19T20:51:27.620Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lf8SC-gXvy3KAbvd9yh_Aw.png" /></figure><p>I was speaking at DevOpsDays Dallas this week about AI-assisted development, how to do it, how it allows me to deliver much faster, and why most organizations won’t see any benefit. I also had a lot of good conversations about the topic because, as you can imagine, it’s top of mind for people in the industry.</p><p>One topic that has been haunting many of us is “how do we train junior developers in the age of AI?” I’ve been thinking about this quite a bit, and I’m embarrassed I didn’t have an answer sooner. It should have been obvious to me, considering my work history and the operating models I advocate.</p><p>First, let’s consider the main concern many people have about using AI for writing code. It’s easy to get in a hurry and not pay close attention to the code being generated. I’ve done it myself. I will come back and refactor the code (with AI assistance) later, but sometimes I just want to get something done. If you aren’t cleaning as you go or you stop paying attention to the code, it’s easy to drive up tech debt and to build systems you don’t understand and cannot fix when they have defects.</p><p>Next, let’s consider what makes someone a senior developer. Is it time in grade? The ability to write code fast? Is it how many patterns they can name or how fast they can invert a binary tree? No. It’s their experience trying things, failing at things, and succeeding at things. They know how to continue learning, have good engineering habits, help others avoid repeating their failures, and mentor the next generation. They can look at the code and see that it’s hard to maintain and hard to fix because they’ve had a lot of experience changing and fixing code they didn’t write.</p><p>So, what is the solution?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qMHs1SHJgFivtOCnQkq52Q.png" /></figure><p>“You build it, you run it!”</p><p>This has always been a best practice. The people who built a system should be the experts at supporting it, and this concept has always been core to DevOps. Quality is an outcome of how quickly you can detect that there is a quality issue, and it requires ownership. The team needs to own the problem they are solving, own how it is solved, and own the consequences of their decisions. This operating model changes coders into software engineers who think twice before committing garbage code. It makes teammates think twice before spending 30 seconds to comment “LGTM” on a code review for an 800-line delta. The team members are incentivized to help spread knowledge and take ownership, regardless of whether the code is written by them, a teammate, or a robot.</p><p>So, if you are concerned about quality and how you can grow new developers into senior software engineers, first make sure you have some seniors who believe their job description includes cloning themselves, and then shift to a DevOps operating model. No team should be developing code with the expectation that Ops will clean up their mess.</p><p>Some organizations are banning new developers from using AI. That’s dumb. All it does is create a class system and block learning. Teach everyone how to use AI correctly, starting by driving acceptance test-driven development and continuous integration as the workflow. No one should be coding until the team defines the outcome, and all changes should be small and integrated very frequently. Not working this way causes pain. Without AI, the pain is often like a low-grade ache. People live with it and become used to it. With AI, it’s like breaking your leg because AI amplifies everything.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d53d260321ae" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: AI is Taking Our Jobs!! Pt. 3]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-ai-is-taking-our-jobs-pt-3-9aa721cdec46?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/9aa721cdec46</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[developer-productivity]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 13:01:53 GMT</pubDate>
            <atom:updated>2026-10-11T16:48:12.999Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R7JA5dmZfh2B1dk9qTA2lw.png" /></figure><p>In <a href="https://medium.com/@bdfinst/5-minute-devops-ai-is-taking-our-jobs-pt-2-4fe02d4ccae3">part 2 of this series</a>, I wrote about my experience developing with AI using no handwritten code and the skills required to get good outcomes. The short version: the same rigor required for continuous integration is required for AI-assisted development. Working with agents will expose weaknesses in that rigor faster than ever. GIGO, only accelerated.</p><p>Some claim AI is only useful for greenfield projects or proofs of concept. They’re wrong. I use these tools daily for new features, refactoring, improving legacy code, writing tests, debugging, and more. With the right skills and development discipline, AI lets you deliver solutions faster. But does this actually improve organizational outcomes? For most companies, I doubt it.</p><h3>AI Intensifies Your Personality</h3><p>In my youth, I saw a stand-up routine about cocaine</p><blockquote>I said to a guy, “Tell me, what is it about cocaine that makes it so wonderful,” and he said, “Because it intensifies your personality.” I said, “Yes, but what if you’re an a**hole?”</blockquote><p>AI development is like that. If you lack discipline, AI will amplify that. You’ll see hallucinations, unexpected changes, mounting tech debt, and rising defect rates. Before long, you’ll be on social media declaring AI useless, blaming the tool instead of your practices.</p><p>However, if you have discipline — clear testable requirements, test-driven development, small batches, and tight feedback loops — AI amplifies those practices. You deliver faster, with less effort, and focus more on solving problems rather than wrestling with implementation.</p><h3>Speed of Development ≠ Speed to Value</h3><p>Software delivery is a system. Coding is just one part. A typical flow looks like this:</p><ul><li>A product owner throws features with unclear or incomplete acceptance criteria over the wall to a development team.</li><li>The team breaks down these large chunks of work into “stories” that are still weeks of effort.</li><li>Developers code the stories but frequently need to stop and ask for more clarity on the change, or use their best judgment and play “is this the rock you wanted?” with the product owner. Changesets are large and merges are infrequent because the cost of change is high.</li><li>Because the original requirements were unclear, the developers could not drive development using tests. Testing becomes an activity that occurs, if at all, after development is complete, often conducted by a separate testing team with differing opinions on how the feature should function.</li><li>Before deploying, a Change Advisory Board that meets weekly insists on reviewing all of the documentation that “proves” everything was done correctly and that there is a valid plan for reversing the change if things go too sideways.</li><li>Ops is terrified of deployments because every deployment is large and risky, and always results in excessive support, regardless of what the CAB documentation says.</li></ul><p>This isn’t hyperbole. I’ve measured this across multiple teams. It’s a common experience that others have reported too. When you map the process, coding is only a fraction of the overall flow. Adding AI to write code faster doesn’t fix the real bottlenecks. It just creates waste faster.</p><h3>Faster Coding Without Faster Feedback Is Dangerous</h3><p>Industry conversations obsess over “developer productivity,” as if faster coding equals progress. But speed without feedback is just digging the hole deeper.</p><p>AI can generate code, but it can’t validate whether it solves the right problem. It doesn’t fix vague requirements, broken testing practices, or heavyweight governance. Without upstream clarity and downstream automation, faster coding leads to more defects, more rework, and more outages per delivery.</p><p>We’ve seen this before. Organizations chased deployment frequency because <em>Accelerate</em> said high performers ship more often. But deployment frequency was a <strong>signal</strong> of healthy flow, not the goal. Shipping faster without guardrails isn’t progress; it’s chaos.</p><h3>The Whole Value Stream Has to Improve</h3><p>Real speed comes from improving the entire value stream:</p><ul><li><strong>Upstream:</strong> Clear problem statements, smaller work items, collaborative product teams.</li><li><strong>Development:</strong> Teamwork, single-piece flow, test-first practices, and continuous integration.</li><li><strong>Downstream:</strong> Automated, <a href="https://minimumcd.org/#continuous-delivery">deterministic pipelines</a>, no manual approvals disguised as “governance,” and rapid recovery when things break.</li></ul><p>That’s what Continuous Delivery is about — not developers typing faster, but value moving faster, safer, and with less risk. AI doesn’t change that truth.</p><h3>Fix the Right Problems</h3><p>Here’s the uncomfortable reality: developer productivity doesn’t matter in isolation. The bottleneck in most organizations isn’t how long it takes to write code — it’s everything else.</p><p>AI is an amplifier. If your delivery system is healthy, AI makes it better. If it’s broken, AI makes it worse.</p><p>Map your value stream. Find the real constraints. Fix those. Only then will faster coding translate to faster delivery of value.</p><p>The choice is yours.</p><h3>Follow-ups</h3><ul><li><a href="https://bdfinst.medium.com/5-minute-devops-ai-is-taking-our-jobs-7ce302bc1d28?postPublishedType=repub">Part 1</a></li><li><a href="https://bdfinst.medium.com/5-minute-devops-ai-is-taking-our-jobs-pt-2-4fe02d4ccae3?postPublishedType=repub">Part 2</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9aa721cdec46" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5-Minute DevOps: AI is Taking Our Jobs!! Pt. 2]]></title>
            <link>https://bdfinst.medium.com/5-minute-devops-ai-is-taking-our-jobs-pt-2-4fe02d4ccae3?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/4fe02d4ccae3</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[aiinsoftwaredevelopment]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[continous-delivery]]></category>
            <category><![CDATA[test-driven-development]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Wed, 03 Sep 2025 12:39:30 GMT</pubDate>
            <atom:updated>2026-10-11T16:47:42.130Z</atom:updated>
            <content:encoded><![CDATA[<p>In February 2024, <a href="https://medium.com/defense-unicorns/5-minute-devops-ai-is-taking-our-jobs-7ce302bc1d28">I wrote about my journey </a>from <em>“AI coding is BS”</em> to realizing <em>“I’d better learn how to do this if I want to stay relevant.”</em> Since then, AI-assisted development has matured quickly. Tools are more capable, patterns for using them are emerging, and — predictably — some people are drawing the wrong lessons.</p><p>Some things have not changed over the past two years. The nay-sayers are saying “nay” even more vociferously with even worse arguments, usually philosophical rather than engineering. I’m sure the job market will sort that out. Survival is optional when you don’t consider learning to be a requirement. I’ve been using more machine-generated code, doing more machine-executed refactoring, and learning from pain what not to do.</p><p><a href="https://medium.com/defense-unicorns/5-minute-devops-ai-is-taking-our-jobs-7ce302bc1d28">In my previous article</a>, I predicted that Behavior-Driven Development and the skill of defining business features as acceptance tests would become more critical for developers in the coming years. Recently, I wanted to see how far I could push building something with nothing but acceptance tests. It went really well.</p><h3>Why I Needed to Scrape Medium</h3><p>I have a problem. I have years of content on Medium that I’d like to make more portable. I want to extract my Medium blogs in markdown with frontmatter metadata so that I can also post them elsewhere, use them as content for a self-hosted blog, or even train a model on the content. Medium won’t let you do that through an API, the RSS feed is only good for the last 20 posts, and the download you can request seems designed to thwart reusability. That leaves screen scraping. So, let’s build a tool.</p><h3><em>Using ATDD with Claude</em></h3><p>We needed an overall plan that we could implement in small steps, along with defined outcomes. I could have spent time writing the behavior tests myself, but I was curious about what would happen if I asked Claude to create the behaviors. Here&#39;s my initial prompt to Claude.</p><pre>I want to create an application that will scan all of my published blogs on medium.com and download them as markdown<br>with frontmatter. Medium does not provide an API to do this. Their RSS feed only shows the last 20 posts, but I need all<br>of the posts. I cannot use a chrome plugin. Medium requires a user to be logged in to see content and uses Google&#39;s SSO,<br>so the tool should allow me to login with my google credentials.<br><br>Technical constraints:<br>We should use vanilla JS with es modules, functional programming, and arrow functions.<br><br>Create a prompt and feature file to use with Claude Code<br><br>I want claude code reference the feature file and use acceptance test driven development.<br>It should use eslint and prettier and should fix any linting and style issues after each test passes.w</pre><p>After a few seconds, Claude generated a <a href="https://github.com/bdfinst/medium-download/blob/2196bf34df081aeb19d83010619552078afae5d4/CLAUDE.md">file that defines the working rules</a> (TDD, functional programming, etc.), a file for <a href="https://github.com/bdfinst/medium-download/blob/2196bf34df081aeb19d83010619552078afae5d4/SETUP.md">instructions for setting up the project</a>, and <a href="https://github.com/bdfinst/medium-download/blob/2196bf34df081aeb19d83010619552078afae5d4/features/medium-scraper.feature">a feature file for the features Claude suggested</a>.</p><p>After reviewing the working instructions, I wanted to emphasize more clearly that quality processes were not optional. I’ve seen Claude “forget” those when not instructed otherwise. I ended up with these instructions.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4ac4f2501912f64df4a63c02813da6a4/href">https://medium.com/media/4ac4f2501912f64df4a63c02813da6a4/href</a></iframe><p>Next, I reviewed the <a href="https://github.com/bdfinst/medium-download/blob/2196bf34df081aeb19d83010619552078afae5d4/features/medium-scraper.feature">generated feature file</a>. This was quite good. In fact, I only requested changes after I had an MVP and could play with the results</p><h3>Set Course and Engage!</h3><p>For this, the prompt was simple:</p><pre>Setup the project and implement the first scenario</pre><p>Then I watched the agent work, reviewing and approving the steps as needed, while sipping my coffee and responding to LinkedIn comments. Once each scenario was complete, I manually validated it. For example, once the Google login feature passed tests, I tried logging in. It worked on the first try.</p><h4>Discovery and Problem Solving</h4><p>When we started on the next scenario, <em>Discover All Published Posts</em>, we hit our first issues. Since I didn’t define clearly how to identify a post URL, Claude identified every link on the profile page as a blog post. So, I provided an example blog URL, it updated its search logic, and the irrelevant links were filtered out. Now it was finding 3 of my 70+ posts. Well, that’s a start. It turns out that Medium uses an infinite scroll to display the blogs, so we need to navigate that.</p><p>I’ve no personal experience scraping a webpage that uses infinite scroll (my primary skill is backend), but I know it’s a solved problem in the world, so I tried the simplest thing. I updated the scenario with:</p><pre>And it should handle pagination or infinite scroll to load all posts</pre><p>That change resulted in finding more, but not all of my posts. Hmmm.</p><p>Next, I discovered that the URL for posts sent to publications can have a few different formats and are different from the pattern for non-publication posts. So, with some more prompting to add those formats to the tests, we had a more complete scenario:</p><pre>    Scenario: Handle Posts Submitted to Publications<br>        Given I have published posts both on my profile and to Medium publications<br>        When I navigate to my Medium profile page<br>        Then the scraper should identify posts on my profile with URLs like:<br>            | URL Format                                  | Description            |<br>            | https://username.medium.com/post-title-123  | Personal profile posts |<br>            | https://medium.com/@username/post-title-456 | Personal profile posts |<br>        And the scraper should also identify posts submitted to publications with URLs like:<br>            | URL Format                                         | Description               |<br>            | https://publication-name.com/post-title-789        | Custom publication domain |<br>            | https://medium.com/publication-name/post-title-abc | Medium-hosted publication |<br>        And all posts should be attributed to the correct author<br>        And publication information should be captured in metadata<br>        When I process publication posts<br>        Then the scraper should extract content from the publication URL<br>        And it should preserve the original publication context<br>        And it should include publication name in the frontmatter metadata</pre><p>After this, everything else was straightforward. We implemented each scenario, always starting with a failing acceptance test. After I had a passing scenario, I committed the change and went to the next. Lather, rinse, repeat until I had <strong><em>enough</em></strong> functionality for my purposes.</p><p>If you compare the <a href="https://github.com/bdfinst/medium-download/blob/2196bf34df081aeb19d83010619552078afae5d4/features/medium-scraper.feature">original acceptance tests</a> to the <a href="https://github.com/bdfinst/medium-download/blob/master/features/medium-scraper.feature">version in the last commit</a>, you’ll see the plan changed as more was learned about the problem. Every change was small and focused on solving the next small problem. In fact, not all scenarios were implemented because I stopped when the feature set met the need. It was interesting, though, that Claude suggested features to deliver a more robust solution. Things like restarting a download that failed in the middle, rate limit handling, and incremental updates. I didn’t ask for those, and I don’t need them today, but this was not the first time that Claude has suggested useful improvements.</p><p>All in, this took about four hours, starting with my first prompt.</p><h3>Learning the Wrong Lessons</h3><p>In the above example, I used a disciplined approach to rapid development. I knew what my goals were, I had an idea about how to get there, and I worked in small steps to achieve my goal. I spent about 15 minutes planning and a few hours guiding the agent through my features with tests, learning as I went. This is no different than how I would work with a human team. However, anti-patterns are emerging that are driven by the same misunderstanding that is rampant in the industry: people believe the work of a developer is to write code.</p><h4>Vibe Coding</h4><p>Vibe coding hasn’t stabilized as a definition yet. Some use it as a pejorative, and others use it to mean a new form of sustainable software development. However, the most common understanding of the term “vibe coding” is “tell the bot what you want and run what it builds.” With the current generation of tools, you can rapidly prototype something that looks useful and seems to work in just a few days this way. However, putting that solution into production and making it critical to the mission is the same mistake people have been making forever with POCs. Someone has a “brilliant” idea, they build a proof of concept rapidly without standard quality processes, there’s a business decision to go forward, and instead of keeping the lessons from the POC and throwing away the code, they deploy mountains of tech debt into production, bury themselves in operational issues, and then try to fix it while also adding features to the garbage they built. I’m not a fan.</p><p>There is far more to delivering reliable software than writing code. For example:</p><blockquote>“Replit deleted my database and lied!”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*OT48_s_DhC5nGv3qzEi7tQ.png" /></figure><p>If we were to do a postmortem on this, the conclusion I would come to would not be “Replit did the wrong thing.” The CORRECT lesson that should drive their improvement process is “we gave Replit production access with no pipeline to validate changes.” Also, “we did not have a process for backing up critical data.”</p><blockquote>“The AI made a change and deleted months of my code! How do I get it back?”</blockquote><p>This is also becoming a complaint we are seeing more often on social media. When you make it easy to build things that require no knowledge of the fundamentals, like <strong><em>version control</em></strong>, people will get burned.</p><p>These examples highlight an important point: AI is not less error-prone than humans. It’s important we have the quality processes in place (test-driven development, work in small batches, rapid feedback) to catch errors before they become incidents.</p><p>Vibe coding makes it faster and cheaper to increase operational expenses. No matter how fast or how inexpensively we can generate code, the work is and has always been delivering sustainable solutions, not code. Establishing and maintaining a solid quality process, including the quality of the information about the features, has always been fundamental to the work. Many organizations are behind the curve on software quality processes and have created entire QA organizations focused on testing after development to try to “inspect quality in at the end.” I suppose one of the advantages of machine-generated code is that, like anything else that accelerates feedback, it highlights the gaps in our processes when things begin to break. Quality is a process, not a step.</p><h4>Waterfall is the Best Way!</h4><p>I recently came across someone who claimed that waterfall project management is the best way to work with AI. Define all the requirements upfront, and the AI will generate the working code. We can then test the output against these requirements. Simple! Machines writing code do not change the fundamental problems we face when developing new products:</p><ul><li>The requirements do not match the users’ needs</li><li>They will be misunderstood during development</li><li>The need will change before we deliver</li></ul><p>The only solution is to deliver in small steps and get feedback as rapidly as possible. AI-assisted development helps us accelerate the feedback loop. It in no way replaces the need for feedback.</p><h3>The Right Lessons</h3><p>The techniques I used for this example are exactly the same techniques I had to learn to be effective at continuous delivery. I used BDD to define the acceptance criteria. This provided the information I needed to code acceptance tests and then write code to make the tests pass. Continuous integration requires that we only commit tested code, and BDD with ATDD makes this much easier. I worked in small steps, validating each one as I went to confirm or adjust the plan. When I had a small step working, I committed the change to prevent the next step from breaking something. Early on, I thought there would be new patterns to learn. It turns out that the best pattern to use with AI is continuous delivery.</p><p>More people are coming to the same conclusion that you can get really good outcomes from AI assistants when you pair them with modern software engineering methods like XP and continuous delivery. The opposite is also very true.</p><p>I’ve seen many developers complaining that AI is either no help at all or worse than useless. However, I’ve yet to hear about someone skilled at XP struggling to use the tools effectively. There appears to be a strong correlation between knowledge of modern software engineering practices and positive outcomes with AI. If you get bad outcomes, you’re probably bad at the fundamentals. Griping about it is only telling on yourself.</p><p>The optimist in me hopes that the pressure to stay relevant will drive more people to finally stop arguing about practices like test-driven development and continuous integration and will decide to level up instead. The pessimist in me predicts people will learn the wrong lessons, and we’ll see more dramatic incidents in the future. Time will tell.</p><h3>Next Steps</h3><p>The tools will keep evolving, but the fundamentals of engineering won’t. My experiment showed me that AI can accelerate development dramatically — <em>if</em> you pair it with practices like ATDD, CI, and small, validated steps. Without those, you don’t get productivity; you just get faster paths to failure.</p><p>That’s the lesson many are missing. AI doesn’t replace the need for software engineering discipline; it makes it more necessary than ever. The people getting the best outcomes with AI aren’t the ones writing the flashiest prompts — they’re the ones already skilled in modern practices like XP and continuous delivery. I suggest starting by learning more about the workflow of continuous delivery, starting with Behavior Driven Development. Practice driving your code with tests before adding a robot into the mix.</p><p>If you want to thrive in the AI era, don’t start by asking, <em>“How do I prompt better?”</em> Start by asking, <em>“How do I deliver software better?”</em> AI is an amplifier. Whether it amplifies your discipline or your dysfunction is entirely up to you.</p><h3>Follow-ups</h3><ul><li><a href="https://bdfinst.medium.com/5-minute-devops-ai-is-taking-our-jobs-7ce302bc1d28?postPublishedType=repub">Part 1</a></li><li><a href="https://bdfinst.medium.com/5-minute-devops-ai-is-taking-our-jobs-pt-3-9aa721cdec46">Part 3</a></li></ul><h3>References</h3><ul><li><a href="https://minimumcd.org/">MinimumCD.org</a></li><li><a href="https://www.davefarley.net/?p=352">Modern Software Engineering — Dave Farley</a></li><li><a href="https://www.oreilly.com/library/view/extreme-programming-explained/0201616416/">eXtreme Programming Explained — Kent Beck</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4fe02d4ccae3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Agile Rehab: Replacing Process Dogma with Engineering to Achieve True Agility]]></title>
            <link>https://bdfinst.medium.com/agile-rehab-replacing-process-dogma-with-engineering-to-achieve-true-agility-2fc74ad2680f?source=rss-dd7cba7bb329------2</link>
            <guid isPermaLink="false">https://medium.com/p/2fc74ad2680f</guid>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[scrum]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Bryan Finster]]></dc:creator>
            <pubDate>Thu, 05 Jun 2025 14:48:08 GMT</pubDate>
            <atom:updated>2025-06-05T14:48:08.639Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rSNX-9nI1JcYccLdLF22_g.png" /></figure><p><em>This was originally </em><a href="https://www.infoq.com/articles/replace-process-dogma-engineering/"><em>posted on InfoQ</em></a><em>.</em></p><p>In 2014, I had my first experience implementing the changes needed for continuous delivery. That experience and the lessons learned have guided my thoughts since.</p><h3>Replacing Agile with Engineering</h3><p>We had a problem. After years of “Agile Transformation,” including the rollout of the Scaled Agile Framework, we were not delivering any better results. In fact, we delivered less frequently with bigger failures than when we had no defined processes. We had to find a way to deliver better value to the business. SAFe, with all of the ceremonies and process overhead that comes with it, wasn’t getting that done. Our VP read The Phoenix Project, got inspired, and asked the senior engineers in the area to solve the problem. We became agile by implementing the necessary engineering changes to support Continuous Delivery (CD).</p><p>Initially, our lead time to deliver a new capability to the business averaged 12 months, from request to delivery. We had to fix that. The main problem, though, is that creating a PI plan for a quarter, executing it in sprints, and delivering whatever passes tests at the end of the quarter ignores the entire reason for agile product development: uncertainty.</p><p>Here is the reality: the requirements are wrong, we will misunderstand them during implementation, or the end users’ needs will change before we deliver. One of those is always true. We need to mitigate that with smaller changes and faster feedback to more rapidly identify what’s wrong and change course. Sometimes, we may even decide to abandon the idea entirely. The only way we can do this is to become more efficient and reduce the delivery cost. That requires focusing on everything regarding how we deliver and engineering better ways of doing that.</p><h3>Why Continuous Delivery?</h3><p>We wanted the ability to deliver more frequently than 3–4 times per year. We believed that if we took the principles and practices described in Continuous Delivery by Jez Humble and Dave Farley seriously, we’d be able to improve our delivery cadence, possibly even push every code commit directly to production. That was an exciting idea to us as developers, especially considering the heavy process we wanted to replace.</p><p>When we began, the minimum time to deliver a normal change was three days. It didn’t matter if it was a one-line change to modify a label or a month’s worth of work — the manual change control process required at least three days. In practice, it was much worse. Since the teams were organized into feature teams and the system was tightly coupled, the entire massive system had to be tested and released as a single delivery. So, today’s one-line change will be delivered, hopefully, in the next quarterly release unless you miss the merge window.</p><p>We knew if we could fix this, we could find out faster if we had quality problems, the problems would be smaller and easier to find, and we’d be able to add regression tests to the pipeline to prevent re-occurrence and move quickly to the next thing to deliver. When we got there, it was true. However, we got something more.</p><p>We didn’t expect how much better it would be for the people doing the work. I didn’t expect it to change my entire outlook on the work. When you don’t see your work used, it’s joyless. When you can try something, deliver it, and get rapid feedback, it brings joy back to development, even more so when you’ve improved your test suite to the point where you don’t fear every keystroke. Getting into a CD workflow made me intolerant of working the way we were before. I feel process waste as pain. I won’t “test it later when we get time.” I won’t work that way ever again. Work shouldn’t suck.</p><h3>Descale and Decouple for Speed</h3><p>We knew we’d never be able to reach our goals without changing the system we were delivering. It was truly monstrous. It was the outcome of taking three related legacy systems and a fourth unrelated legacy system and merging them, with some splashy new user interfaces, into a bigger legacy system. A couple of years before this improvement effort, my manager asked how many lines of code the system had. Without comments, it was 25 million lines. Calling the architecture “spaghetti” would be a dire insult to pasta. Where there were web services, the service boundaries were defined by how big the service was. When it became “too big,” a new service, such as Service040, would be created.</p><p>We needed to break it up to make it easier to deliver and modernize the tech stack. Step one involved using Domain-Driven Design to start untangling the business capabilities within the current system. We aimed to define specific capabilities and assign each to a product team. We knew about Conway’s Law, so we decided that if we were going to get the system architecture we needed, we needed to organize the teams to mirror that architecture. Today, people call that the “reverse Conway maneuver.” We didn’t know it had a name. I’ve heard people say it doesn’t work. They are wrong. We got the system architecture we wanted by starting with the team structure and assigning each a product sub-domain. The internal architecture of each team’s domain was up to them. However, they were also encouraged to use and taught how to design small services for the sub-domains of their product.</p><p>We also wanted to ensure every team could deliver without the need to coordinate delivery with any other team. Part of that was how we defined the teams’ capabilities, but having the teams focus on Contract Driven Development (CDD) and evolutionary coding was critical. CDD is the process where teams with dependencies collaborate on API contract changes and then validate they can communicate with that new contract before they begin implementing the behaviors. This makes integration the first thing tested, usually within a few days of the discussion. Also important is how the changes are coded.</p><p>The consumer needs to write their component in a way that allows their new feature to be tested and delivered with the provider’s new contract but not activated until that contract is ready to be consumed. The provider needs to make changes that do not break the existing contract. Working this way, the consumer or provider can deliver their changes in any order. When both are in place, the new feature is ready to release to the end user.</p><p>By deliberately architecting product boundaries, the teams building each product, focusing on evolutionary coding techniques, and “contract first” delivery, we enabled each team to run as fast as possible. SAFe handles dependencies with release trains and PI planning meetings. We handled them with code. For example, if we had a feature that also required another team to implement a change, we could deploy our change and include logic that would activate our feature when their feature was delivered. We could do that either with a configuration change or, depending on the feature, simply have our code recognize the new properties in the contract were available and activate automatically.</p><h3>Accelerating Forces Learning</h3><p>It took us about 18 months after forming the first pilot product teams to get the initial teams to daily delivery. I learned from doing CD in the real world that you are not agile without CD. How can you claim to be agile if it takes two or more weeks to validate an idea? You’re emotionally invested by then and have spent too much money to let the idea go.</p><p>You cannot execute CD without continuous integration (CI). Because we took CI seriously, we needed to make sure that all of the tests required to validate a change were part of the commit for that change. We had to test during development. However, we were blocked by vague requirements. Focusing on CI pushed the team to understand the business needs and relentlessly remove uncertainty from acceptance criteria.</p><p>On my team, we decided that if we needed to debate story points, it was too big and had too much uncertainty to test during development. If we could not agree that anyone on the team could complete something in two days or less, we decomposed the work until we agreed. By doing this, we had the clarity we needed to stop doing exploratory development and hoping that was what was being asked for. Because we were using Behavior Driven Development (BDD) to define the work, we also had a more direct path from requirement to acceptance tests. Then, we just had to code the tests and the feature and run them down the pipeline.</p><p>You need to dig deep into quality engineering to be competent at CD. Since the CD pipeline should be the only method for determining if something meets our definition of “releasable,” a culture of continuous quality needs to be built. That means we are not simply creating unit tests. We are looking at every step, starting with product discovery, to find ways to validate the outcomes of that step. We are designing fast and efficient test suites. We are using techniques like BDD to validate that the requirements are clear. Testing becomes the job. Development flows from that.</p><p>This also takes time for the team to learn, and the best thing to do is find people competent at discovery to help them design better tests. QA professionals who think, “What could go wrong?” and help teams create strategies to detect that, instead of the vast majority who are trained to write test automation, are gold. However, under no circumstances should QA be developing the tests because they become a constraint rather than a force multiplier. CD can’t work that way.</p><p>The most important thing I learned was that it’s a more humane way of working. There’s less stress, more teamwork, less fear of breaking something, and much more certainty that we are probably building the right thing. CD is the tool for building high-performing teams.</p><h3>Optimize for Operations</h3><p>All pipelines should be designed for operations first. Life is uncertain — production breaks. We need the ability to fix things quickly without throwing gasoline on a dumpster fire. I carried a support pager for 20 years. The one thing that was true for most of that time was that we always had some workaround process for delivering things in an emergency. This means that the handoffs we had for testing for normal changes were bypassed for an emergency. Then, we would be in a dumpster fire, hoping our bucket contained water and not gasoline.</p><p>With CD, that’s not allowed. We have precisely one process to deliver any change: the pipeline. The pipeline should be deterministic and contain all the validations to certify that an artifact meets our definition of “releasable.” Since, as a principle, we never bypass or deactivate quality gates in the pipeline for emergencies, we must design good tests for all of our acceptance criteria and continue to refine them to be fast, efficient, and effective as we learn more about possible failure conditions. This ensures hotfixes are safe while also driving improvement in feature delivery. This takes time, and the best thing to do is to define all of the acceptance criteria and measure how long it takes to complete them all, even the manual steps. Then, use the cycle time of each manual process as a roadmap for what to automate next.</p><p>What we did was focus on the duration of our pipeline and ensure we were testing everything required to deliver our product. We, the developers, took over all of the test automation. This took a lot of conversation with our Quality Engineering area since the pattern before was for them to write all the tests. However, we convinced them to let us try our way. The results proved that our way was better. We no longer had tests getting out of sync with the code, the tests ran faster, and they were far less likely to return false positives. We trusted our tests more every day, and they proved their value later on when the team was put under extreme stress by an expanding scope, shrinking timeline, “critical project.”</p><p>Another critical design consideration was that we needed to validate that each component was deliverable without integrating the entire system. Using E2E tests for acceptance testing is a common but flawed practice. If we execute DDD correctly, then any need to do E2E for acceptance testing can be viewed as an architecture defect. They also harm our ability to address impacting incidents.</p><p>For example, if done with live services, one of the tests we needed to run required creating a dummy purchase order in another system, flowing that PO through the upstream supply chain systems, processing that PO with the legacy system we were breaking apart, and then running our test. Each test run required around four hours. That’s a way to validate that our acceptance tests are valid occasionally, but not a good way to do acceptance testing, especially not during an emergency. Instead, we created a virtual service. That service could return a mock response when we sent a test header so we could validate we were integrating correctly. That test required milliseconds to execute rather than hours.</p><p>We could run it every time we made a change to the trunk (multiple times per day) and have a high level of confidence that we didn’t break anything. That test also prevented a problem from becoming a bigger problem. My team ran our pipeline, and that test failed. The other team had accidentally broken their contract, and the test caught it within minutes of it happening and before that break could flow to production. Our focus on DDD resulted in faster, more reliable tests than any of the attempts at E2E testing that the testing area attempted. Because of that, CD made operations more robust.</p><h3>Engineering Trumps Scaling Frameworks</h3><p>We loved development again when we were able to get CD off the ground. Delivery is addictive, and the more frequently we can do that, the faster we learn. Relentlessly overcoming the problems that prevent frequent delivery also lowers process overhead and the cost of change. That, in turn, makes it economically more attractive to try new ideas and get feedback instead of just hoping your investment returns results. You don’t need SAFe’s PI planning when you have product roadmaps and teams that handle dependencies with code. PI plans are static.</p><p>Roadmaps adjust from what we learn after delivering. Spending two days planning how to manage dependencies with the process and keeping teams in lock-step means every team delivers at the pace of the slowest team. If we decouple and descale, teams are unchained. Costs decrease. Feedback loops accelerate. People are happier. All of these are better for the bottom line.</p><p>On the first team where we implemented CD, we improved our delivery cadence from monthly (or less) to several times per day. We had removed so much friction from the process that we could get ideas from the users, decompose them, develop them, and deliver them within 48 hours. Smaller tweaks could take less than a couple of hours from when we received the idea from the field. That feedback loop raised the quality and enjoyment level for us and our end users.</p><h3>Measure the Flow!</h3><p>Metrics is a deep topic and one I talk about frequently. One big mistake we made was not measuring the impact of our improvements on the business. When management changed, we didn’t have a way to show what we were doing was better. To be frank, the new management had other ideas — poorly educated ideas. Things degraded, and the best people left. Since then, I’ve become a bit obsessed with measuring things correctly.</p><p>For a team wanting to get closer to CD, focus on a few things first:</p><ol><li>How frequently are we integrating code into the trunk? For CI, this should be at least once per day per team member on average. Anything less is not CI. CI is a forcing function for learning to break changes into small, deliverable pieces.</li><li>How long does it take for us, as a team, to deliver a story? We want this to be two days maximum. Tracking this and keeping it small forces us to get into the details and reduce uncertainty. It also makes it easy for us to forecast delivery and identify when something is trending later than planned. Keep things small.</li><li>How long does it take for a change to reach the end of our pipeline? Pipeline cycle time is a critical quality feedback loop and needs to keep improving.</li><li>How many defects are reported week to week? It doesn’t matter if they are implementation errors, “I didn’t expect it to work this way,” or “I don’t like this color.” Treat them all the same. They all indicate some failure in our quality process. Quality starts with the idea, not with coding.</li></ol><p>Since this journey, I’ve become passionate about continuous delivery as a forcing function for quality. I’ve seen on multiple teams in multiple organizations what a positive impact it has on everything about the work and the outcomes. As a community, we have also seen many organizations not take a holistic approach, throw tools at the problem, ignore the fact that this is a quality initiative, and hurt themselves. It’s important that people understand the principles and <a href="http://minimumcd.org/">recommended practices</a> before diving in headfirst.</p><p>You won’t be agile by focusing on agile frameworks. Agility requires changing everything we do, beginning with engineering our systems for lower delivery friction. By asking ourselves, “Why can’t we deliver today’s work today?” and then relentlessly solving those problems, we improve everything about how we work as an organization. Deploy more and sleep better.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2fc74ad2680f" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>