<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dark-Launch on Coffee or Blog</title>
    <link>/tags/dark-launch/</link>
    <description>Recent content in Dark-Launch on Coffee or Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 30 Sep 2025 00:00:00 +0000</lastBuildDate><atom:link href="/tags/dark-launch/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Decoupling Deployment from Release: An Architectural Imperative</title>
      <link>/posts/decoupling-deployment-from-release/</link>
      <pubDate>Tue, 30 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>/posts/decoupling-deployment-from-release/</guid>
      <description>Photo by Patrick Konior on Unsplash
We need to talk about how we ship software. Not because we&amp;rsquo;re doing it wrong, but because we can do it so much better, for our customers, for our colleagues, and for ourselves.
The Core Problem: Deployment Isn&amp;rsquo;t Release Here&amp;rsquo;s the shift we need to make: deploying code and releasing features are not the same thing, and they shouldn&amp;rsquo;t happen at the same moment.</description>
      <content>&lt;p&gt;&lt;img alt=&#34;Control room overview&#34; src=&#34;/images/decoupling-deployment/hero-control-room.jpg&#34;&gt;
&lt;em&gt;Photo by &lt;a href=&#34;https://unsplash.com/@patrickkonior&#34;&gt;Patrick Konior&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/a-view-of-a-control-room-from-above-FwHJ6mJjVd4&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We need to talk about how we ship software. Not because we&amp;rsquo;re doing it wrong, but because we can do it so much better, for our customers, for our colleagues, and for ourselves.&lt;/p&gt;
&lt;h2 id=&#34;the-core-problem-deployment-isnt-release&#34;&gt;The Core Problem: Deployment Isn&amp;rsquo;t Release&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the shift we need to make: &lt;strong&gt;deploying code and releasing features are not the same thing, and they shouldn&amp;rsquo;t happen at the same moment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deployment vs. Release Timeline diagram&#34; src=&#34;/images/decoupling-deployment/deployment-vs-release-timeline.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;When we conflate deployment with release, we create unnecessary risk and friction. We deploy code to production, and suddenly a feature is live, ready or not. If something goes wrong, we scramble. We hotfix. We roll back entire deployments, potentially affecting unrelated changes. We make our product and support teams reactive instead of strategic.&lt;/p&gt;
&lt;p&gt;There is a better way.&lt;/p&gt;
&lt;h2 id=&#34;why-this-matters-safety-first&#34;&gt;Why This Matters: Safety First&lt;/h2&gt;
&lt;p&gt;Our customers trust us with their business. Our colleagues across product, support, and operations depend on stable, predictable releases. When we tie deployment directly to feature availability, we put both at risk.&lt;/p&gt;
&lt;p&gt;Safe software releases mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our customers experience fewer disruptions&lt;/li&gt;
&lt;li&gt;Our support team can prepare for changes before they go live&lt;/li&gt;
&lt;li&gt;Our product team can control the narrative and timing of new features&lt;/li&gt;
&lt;li&gt;Our engineers can deploy confidently, knowing they have safety nets in place&lt;/li&gt;
&lt;li&gt;We can see the impact of our changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&amp;rsquo;t about adding bureaucracy. It&amp;rsquo;s about adding control.&lt;/p&gt;
&lt;h2 id=&#34;the-mindset-shift-for-engineers&#34;&gt;The Mindset Shift for Engineers&lt;/h2&gt;
&lt;p&gt;I know what some of you are thinking: &amp;ldquo;This sounds like more process. More overhead. More barriers between my code and production.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Let me reframe it: What if deployment was &lt;strong&gt;easier&lt;/strong&gt; because it was &lt;strong&gt;safer&lt;/strong&gt;? What if you could push code to production multiple times a day without the anxiety of &amp;ldquo;did we just break something for customers?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This requires us to think differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code goes to production &lt;strong&gt;dark&lt;/strong&gt;, deployed but not activated&lt;/li&gt;
&lt;li&gt;Features are controlled by flags, not by deployment timing&lt;/li&gt;
&lt;li&gt;Your code can live in production for days or weeks before anyone uses it&lt;/li&gt;
&lt;li&gt;When issues arise, you flip a switch instead of rolling back a deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;Dark launch diagram&#34; src=&#34;/images/decoupling-deployment/dark-launch.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;This is actually &lt;strong&gt;more&lt;/strong&gt; engineering control, not less. You own the technical deployment. Product and support teams own the feature release timing. Everyone wins.&lt;/p&gt;
&lt;h2 id=&#34;empowering-product-and-support&#34;&gt;Empowering Product and Support&lt;/h2&gt;
&lt;p&gt;Our product managers understand customer needs, market timing, and strategic rollout. Our support team knows when they&amp;rsquo;re ready to handle inquiries about new features. Our documentation should be created in production.&lt;/p&gt;
&lt;p&gt;When we give them control over feature flags, we put release decisions in the hands of the people best positioned to make them. Engineering provides the capability; product and support control the activation.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t about taking power away from engineering, it&amp;rsquo;s about giving everyone the right kind of power.&lt;/p&gt;
&lt;h2 id=&#34;stop-removing-what-people-still-use&#34;&gt;Stop Removing What People Still Use&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve all been there: a feature is marked for deprecation, so we rip it out. Then we discover customers were still using it, or they needed more transition time.&lt;/p&gt;
&lt;p&gt;With feature flags and dual code paths, we can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run old and new implementations side by side&lt;/li&gt;
&lt;li&gt;Give customers time to migrate naturally&lt;/li&gt;
&lt;li&gt;Gather actual usage data before removal&lt;/li&gt;
&lt;li&gt;Roll back feature changes without rolling back deployments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We keep both paths alive until we &lt;strong&gt;know&lt;/strong&gt; the old one isn&amp;rsquo;t needed. Data drives decisions, not assumptions.&lt;/p&gt;
&lt;h2 id=&#34;creating-dual-code-paths&#34;&gt;Creating Dual Code Paths&lt;/h2&gt;
&lt;p&gt;The technical pattern is straightforward:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;if (featureFlag.isEnabled(&amp;#39;new-checkout-flow&amp;#39;)) {
  // New implementation
  return enhancedCheckout();
} else {
  // Current implementation
  return traditionalCheckout();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt=&#34;Dual code paths diagram&#34; src=&#34;/images/decoupling-deployment/dual-code-paths.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;This enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rapid feature releases, toggle a flag, feature goes live&lt;/li&gt;
&lt;li&gt;Instant rollbacks, toggle it back if issues arise&lt;/li&gt;
&lt;li&gt;Gradual rollouts, enable for 10% of users, then 50%, then 100%&lt;/li&gt;
&lt;li&gt;A/B testing, compare new vs. old with real data&lt;/li&gt;
&lt;li&gt;Safe deprecation, maintain the old path until usage drops to zero&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![[Excalidraw/Rollback Comparison.excalidraw]]&lt;/p&gt;
&lt;p&gt;![[Excalidraw/Progressive Rollout.excalidraw]]&lt;/p&gt;
&lt;p&gt;Yes, you maintain two paths temporarily. But the flexibility and safety are worth it.&lt;/p&gt;
&lt;h2 id=&#34;we-already-test-in-production-lets-do-it-right&#34;&gt;We Already Test in Production, Let&amp;rsquo;s Do It Right&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s an uncomfortable truth: we all test in production. Even with the best staging environments, production has data patterns, load characteristics, and edge cases we can&amp;rsquo;t fully replicate.&lt;/p&gt;
&lt;p&gt;Feature flags let us test in production &lt;strong&gt;safely&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable new features for internal users first&lt;/li&gt;
&lt;li&gt;Roll out to beta customers who opt in&lt;/li&gt;
&lt;li&gt;Gradually expand to broader audiences&lt;/li&gt;
&lt;li&gt;Monitor in real time and react instantly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of pretending we don&amp;rsquo;t test in production, let&amp;rsquo;s acknowledge it and build systems that make it safe and controlled.&lt;/p&gt;
&lt;h2 id=&#34;making-monitoring-and-observability-easier&#34;&gt;Making Monitoring and Observability Easier&lt;/h2&gt;
&lt;p&gt;When features are flag-controlled, monitoring becomes clearer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dashboard metrics tagged by feature flag status&lt;/li&gt;
&lt;li&gt;Alerts that distinguish between feature issues and infrastructure issues&lt;/li&gt;
&lt;li&gt;A/B comparison of performance between flag states&lt;/li&gt;
&lt;li&gt;Clear correlation between flag changes and system behaviour&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![[Excalidraw/Observability Dashboard.excalidraw]]&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll spend less time debugging &amp;ldquo;what changed?&amp;rdquo; because you&amp;rsquo;ll know exactly what changed and when.&lt;/p&gt;
&lt;h2 id=&#34;this-is-about-your-value&#34;&gt;This Is About Your Value&lt;/h2&gt;
&lt;p&gt;Every engineer brings immense value. You solve complex problems. You build systems that serve customers. You keep the platform running.&lt;/p&gt;
&lt;p&gt;This approach amplifies your impact:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deploy more frequently without stress&lt;/li&gt;
&lt;li&gt;Spend less time on hotfixes and emergency rollbacks&lt;/li&gt;
&lt;li&gt;Focus on building new capabilities instead of managing release logistics&lt;/li&gt;
&lt;li&gt;See your features succeed because they&amp;rsquo;re released at the right time, to the right users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your technical expertise deserves better tools. Feature-flagged releases are those better tools.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;We don&amp;rsquo;t need to transform everything overnight. Here&amp;rsquo;s how we can begin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with your next major feature&lt;/strong&gt;, wrap it in a feature flag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrate flags into your monitoring&lt;/strong&gt;, make flag status visible in dashboards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coordinate with product and support&lt;/strong&gt;, let them control release timing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gather data before deprecation&lt;/strong&gt;, keep old code paths until usage proves they&amp;rsquo;re unnecessary&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share what works&lt;/strong&gt;, as teams succeed with this approach, spread the practices&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a journey, not a destination. Each team can adopt at their own pace.&lt;/p&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Separating deployment from release isn&amp;rsquo;t just a technical practice, it is a philosophy of safety, control, and collaboration. It acknowledges that great software delivery involves engineering excellence &lt;strong&gt;and&lt;/strong&gt; thoughtful release management.&lt;/p&gt;
&lt;p&gt;We have the talent. We have the technical capability. Now let&amp;rsquo;s build the practices that let us ship with confidence.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s deploy fearlessly and release deliberately. Our customers, our colleagues, and our code deserve nothing less.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
