<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Articles on CTO Field Notes</title><link>https://avivzaken.com/docs/</link><description>Recent content in Articles on CTO Field Notes</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 05 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://avivzaken.com/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Staying One Step Ahead</title><link>https://avivzaken.com/docs/staying-one-step-ahead/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/staying-one-step-ahead/</guid><description>The CTO’s job is not to see the future. It is to reduce surprise by building systems that detect weak signals early, convert ambiguity into decisions, and act before friction compounds.</description><content:encoded><![CDATA[<p><strong>The CTO’s job is not to see the future. It is to reduce surprise.</strong></p>
<p>Startups rarely fall behind all at once. They fall behind gradually, then suddenly.</p>
<p>At first, the signals are small. Pull requests get larger. Deployments become more stressful. Engineers start avoiding certain parts of the codebase. Product debates become more opinion-driven. Customer feedback reaches the team too late. Planning meetings get longer, but decisions do not get better.</p>
<p>Nothing looks broken yet. But the system is already losing speed, clarity, and resilience.</p>
<p>By the time the roadmap slips, the warning signs have usually been visible for weeks or months<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. By the time reliability becomes a company-level concern, the patterns have already appeared in incidents, alerts, retries, and manual workarounds. By the time technical debt becomes urgent, engineers have already been paying interest on it for a long time<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>This is why one of the CTO’s most important responsibilities is staying one step ahead.</p>
<p>Not by predicting the future. Not by chasing every new tool. Not by turning the engineering organization into a playground for whatever is trending this week.</p>
<p>Staying one step ahead means building a system that notices change early, learns quickly, and acts before friction compounds. Most leaders discover problems when they become expensive. CTOs need to discover them while they are still cheap.</p>
<hr>
<h2 id="tools-extend-the-organizations-senses">Tools Extend the Organization’s Senses<a class="anchor" href="#tools-extend-the-organizations-senses">#</a></h2>
<p>A CTO cannot personally inspect every pull request, customer conversation, roadmap decision, incident, architecture tradeoff, hiring bottleneck, or production anomaly.</p>
<p>At some point, the job is no longer to see everything directly. The job is to design systems that see.</p>
<p>This is where tools matter.</p>
<p>Not because tools are inherently valuable. Most tools are noise unless they change behavior.</p>
<p>Tools matter when they extend the organization’s ability to sense, decide, act, and learn. Observability shows what production is actually doing. Product analytics show what users are actually doing. CI surfaces whether the system still tolerates change. Feature flags keep decisions reversible. Customer feedback tools expose where assumptions are breaking. Planning systems reveal whether commitments are based on evidence or hope. Internal knowledge systems show whether the team can reuse what it already knows. AI assistants change how cheaply the team can explore, summarize, prototype, and compare options.</p>
<p>The point is not to accumulate more dashboards, workflows, or reports. The point is to reduce the time between signal and action.</p>
<p>A good tool makes reality harder to ignore. A great tool makes the right action easier to take.</p>
<hr>
<h2 id="the-ctos-leverage-stack">The CTO’s Leverage Stack<a class="anchor" href="#the-ctos-leverage-stack">#</a></h2>
<p>The best CTOs do not simply accumulate tools. They build leverage.</p>
<p>A tool is something you introduce. Leverage is what changes the slope of the organization.</p>
<p>The CTO’s job is to understand the current constraint and apply the right form of leverage against it—technical, organizational, architectural, or cultural.</p>
<p>There are five loops every CTO should continuously strengthen.</p>
<hr>
<h2 id="1-sense-earlier">1. Sense Earlier<a class="anchor" href="#1-sense-earlier">#</a></h2>
<p>The first advantage is noticing weak signals before they become visible failures.</p>
<p>Most expensive problems begin as cheap signals. Reliability issues start as noisy alerts or repeated manual fixes. Delivery issues start as larger pull requests, slower reviews, or unclear ownership. Product issues start as customer confusion or low adoption. Team issues start as decision bottlenecks or prolonged onboarding.</p>
<p>The CTO needs mechanisms that surface these signals early: observability, analytics, feedback loops, engineering metrics, incident reviews, deployment data, and decision records.</p>
<p>But the tool is not the point.</p>
<p><strong>What would we know earlier because this exists?</strong></p>
<p>If the answer is unclear, the tool is probably theater.</p>
<hr>
<h2 id="2-decide-faster">2. Decide Faster<a class="anchor" href="#2-decide-faster">#</a></h2>
<p>Sensing without decision-making is wasted signal.</p>
<p>Many organizations collect data but still move slowly. They have dashboards without owners, metrics without thresholds, and discussions without decisions.</p>
<p>Good CTOs create decision systems: RFCs for explicit tradeoffs, architecture reviews for irreversible choices, metrics for grounding debates, and decision logs to capture reasoning.</p>
<p>The goal is not perfect decisions. It is timely, explicit, and reversible decisions.</p>
<p>A slow decision is not more thoughtful. Often, it is avoidance disguised as rigor.</p>
<hr>
<h2 id="3-act-smaller">3. Act Smaller<a class="anchor" href="#3-act-smaller">#</a></h2>
<p>The larger the action, the harder it is to learn.</p>
<p>Large releases obscure causality. Large rewrites obscure risk. Large migrations obscure sequencing problems.</p>
<p>To stay ahead, organizations must operate in smaller units: feature flags, canary releases, trunk-based development, automated tests, and safe rollback paths.</p>
<p>These are not conveniences. They are strategic tools that reduce blast radius and preserve optionality.</p>
<p>The same applies beyond engineering. Test demand before building fully. Migrate incrementally. Pilot organizational changes before scaling them.</p>
<p>Small actions keep the cost of being wrong low. And when the cost of being wrong is low, learning accelerates<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<hr>
<h2 id="4-learn-continuously">4. Learn Continuously<a class="anchor" href="#4-learn-continuously">#</a></h2>
<p>Shipping without learning is not speed—it is output<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</p>
<p>The real loop is:</p>
<blockquote class='book-hint '>
<p>observe → decide → act → learn → adjust</p>
</blockquote><p>Every system should tighten this loop.</p>
<p>After shipping, do we know adoption? After incidents, do we reduce recurrence? After refactors, did change become easier? After planning, where were we wrong?</p>
<p>Learning requires more than instrumentation. It requires behavior change. If nothing changes, nothing was learned.</p>
<hr>
<h2 id="5-compound-knowledge">5. Compound Knowledge<a class="anchor" href="#5-compound-knowledge">#</a></h2>
<p>Scaling organizations often fail by relearning.</p>
<p>Solutions stay local. Decisions are repeated. Lessons are lost.</p>
<p>Knowledge must be captured and reusable: decision records, architecture notes, onboarding paths, runbooks, postmortems, and searchable internal systems.</p>
<p>The goal is not documentation. It is reuse at the moment of need.</p>
<p>Compounding knowledge is quiet leverage—but over time, it separates teams that scale from teams that stall.</p>
<hr>
<h2 id="ai-changes-the-cost-of-exploration">AI Changes the Cost of Exploration<a class="anchor" href="#ai-changes-the-cost-of-exploration">#</a></h2>
<p>AI lowers the cost of many previously expensive actions: exploring options, summarizing data, drafting plans, and analyzing systems.</p>
<p>This is a real shift.</p>
<p>But cheaper exploration increases the importance of judgment.</p>
<p>When generating options becomes trivial, selecting the right ones becomes the bottleneck. Without strong judgment, teams produce more code, more plans, and more noise—faster.</p>
<p>That is not progress. That is scaled confusion.</p>
<p>The key question is not:</p>
<p><strong>Can we do this faster with AI?</strong></p>
<p>It is:</p>
<p><strong>Does this improve decisions, reduce risk, or accelerate learning?</strong></p>
<p>If yes, use it aggressively. If not, it is likely accelerating waste.</p>
<hr>
<h2 id="tools-amplify-the-system-you-already-have">Tools Amplify the System You Already Have<a class="anchor" href="#tools-amplify-the-system-you-already-have">#</a></h2>
<p>Tools feel like progress because they are tangible. But they do not fix broken systems—they amplify them.</p>
<p>AI amplifies code quality—good or bad. Dashboards amplify ownership gaps. Planning tools amplify prioritization issues. Documentation amplifies maintenance discipline.</p>
<p>A tool is only useful when tied to behavior.</p>
<p>Visibility without ownership creates anxiety. Ownership without visibility creates surprises.</p>
<p>You need both.</p>
<hr>
<h2 id="staying-ahead-means-designing-for-optionality">Staying Ahead Means Designing for Optionality<a class="anchor" href="#staying-ahead-means-designing-for-optionality">#</a></h2>
<p>The best CTOs do not predict better. They stay adaptable.</p>
<p>They keep deployments small, decisions reversible, feedback loops short, systems understandable, and knowledge accessible.</p>
<p>They preserve optionality<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>.</p>
<p>That is what staying ahead really means—not certainty, but readiness while the cost of preparation is still low.</p>
<hr>
<h2 id="the-cto-question">The CTO Question<a class="anchor" href="#the-cto-question">#</a></h2>
<p>Every CTO should regularly ask:</p>
<p><strong>What are we going to wish we had noticed earlier?</strong></p>
<p>This question forces proactive thinking. It shifts focus from reacting to anticipating.</p>
<p>It also reframes how tools are evaluated.</p>
<p>The right tool is not the newest or most popular. It is the one that improves sensing, decision-making, action, learning, or knowledge reuse.</p>
<p>Everything else is optional.</p>
<hr>
<h2 id="closing">Closing<a class="anchor" href="#closing">#</a></h2>
<p>Staying one step ahead is not intuition. It is discipline.</p>
<p>It means building systems where signals surface early, decisions are explicit, actions are reversible, and learning compounds.</p>
<p>The CTO’s job is not to see the future.</p>
<p>The CTO’s job is to reduce surprise.</p>
<p>And the best way to reduce surprise is to build systems that learn faster than problems compound.</p>
<hr>
<h2 id="references">References<a class="anchor" href="#references">#</a></h2>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Predictable Delivery in an Unpredictable World</em>. <a href="https://avivzaken.com/docs/predictable-delivery-in-an-unpredictable-world/">https://avivzaken.com/docs/predictable-delivery-in-an-unpredictable-world/</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><em>Technical Debt Is a Tool</em>. <a href="https://avivzaken.com/docs/technical-debt-is-a-tool/">https://avivzaken.com/docs/technical-debt-is-a-tool/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><em>De-Risking Big Bets Without Killing Innovation</em>. <a href="https://avivzaken.com/docs/derisking-big-bets-without-killing-innovation/">https://avivzaken.com/docs/derisking-big-bets-without-killing-innovation/</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><em>Velocity Is the Product</em>. <a href="https://avivzaken.com/docs/velocity-is-the-product/">https://avivzaken.com/docs/velocity-is-the-product/</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><em>Shipping in Uncertainty: Field Notes on Startup SDLC</em>. <a href="https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/">https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The Roadmap Problem No One Admits</title><link>https://avivzaken.com/docs/roadmap-problem-no-one-admits/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/roadmap-problem-no-one-admits/</guid><description>Most teams confuse motion with delivery. The roadmap isn't a list of things you want to do - it's a list of trade-offs you're willing to commit to finishing.</description><content:encoded><![CDATA[<p>A few weeks ago, I sat down with a founding team that felt something was off.</p>
<p>They weren’t stuck. Quite the opposite - they were moving fast. There was activity everywhere: features in progress, decisions being made, code being written.</p>
<p>But nothing seemed to <em>land</em>.</p>
<p>Features dragged. Decisions lingered. Shipping felt inconsistent.</p>
<p>&ldquo;We’re slower than we should be,&rdquo; one of them said.</p>
<p>From the outside, nothing obvious was broken. The team was strong. The product direction made sense. There was no chaos.</p>
<p>So I asked a simple question:</p>
<p><strong>&ldquo;What’s supposed to ship in the next two weeks?&rdquo;</strong></p>
<p>They started listing things - onboarding improvements, a new API direction, analytics, infrastructure cleanup.</p>
<p>It sounded like momentum.</p>
<p>Then I asked again:</p>
<p><strong>&ldquo;No - what is actually expected to be <em>done</em>?&rdquo;</strong></p>
<p>That’s when things got quiet.</p>
<hr>
<h2 id="the-illusion-of-progress">The Illusion of Progress<a class="anchor" href="#the-illusion-of-progress">#</a></h2>
<p>We pulled up their board. Nine active items.</p>
<p>At a glance, it looked healthy - work in motion, engineers engaged, no obvious bottlenecks.</p>
<p>But as we went through each item, a pattern emerged. The onboarding work was &ldquo;almost there,&rdquo; but still missing edge cases. The API effort was split between two directions, neither resolved. Analytics had backend work, but no usable surface. Infrastructure had been &ldquo;improved,&rdquo; but not stabilized.</p>
<p>Nothing was blocked. Nothing was abandoned.</p>
<p>But nothing was finished.</p>
<p>So I told them:</p>
<p><strong>&ldquo;You don’t have nine projects. You have zero.&rdquo;</strong></p>
<p>Individually, everything had progressed. Code existed. Effort was real.</p>
<p>But at the level that matters - what users experience, what the business can rely on - none of it existed yet.</p>
<p>This is the subtle failure mode where teams confuse motion with delivery. And once you fall into it, velocity starts to look intact while actually degrading underneath<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<hr>
<h2 id="how-teams-end-up-here">How Teams End Up Here<a class="anchor" href="#how-teams-end-up-here">#</a></h2>
<p>This state rarely comes from bad decisions. It comes from <em>non-decisions</em>.</p>
<p>At some point, someone says: we should improve onboarding, we’ll probably need a better API here, can someone look into analytics, we should clean this up at some point.</p>
<p>These aren’t commitments. They’re signals.</p>
<p>But in small teams, signals are enough. Someone picks it up, starts exploring, opens a branch, pushes things forward.</p>
<p>Work begins.</p>
<p>But no one ever decides that it needs to end.</p>
<p>So it accumulates.</p>
<p>In practice, this is what &ldquo;shipping in uncertainty&rdquo; looks like when it’s unmanaged - continuous bets being placed, without a clear mechanism for deciding which ones actually need to resolve<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<hr>
<h2 id="what-this-does-to-execution">What This Does to Execution<a class="anchor" href="#what-this-does-to-execution">#</a></h2>
<p>The cost isn’t obvious at first.</p>
<p>From the outside, the team looks productive. There are updates, pull requests, and visible movement across multiple fronts.</p>
<p>But internally, something breaks.</p>
<p>There’s no clear center of gravity. Engineers start their day without a single dominant objective. They move between tasks, resume half-finished work, and switch context as soon as friction appears.</p>
<p>Work stops converging.</p>
<p>Instead of pushing one thing to completion, the team advances several things slightly. You get a steady stream of partial progress - and almost no finished outcomes.</p>
<p>Over time, quality degrades. Not because people are careless, but because nothing stays in focus long enough to be done properly.</p>
<p>This is the inverse of what high-velocity teams optimize for. They don’t maximize activity - they maximize completed, shippable outcomes<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<hr>
<h2 id="the-reset">The Reset<a class="anchor" href="#the-reset">#</a></h2>
<p>With this team, we did something simple - and uncomfortable.</p>
<p>We took every active item and asked a single question:</p>
<p><strong>&ldquo;Are we committed to finishing this in the next two weeks?&rdquo;</strong></p>
<p>Not whether it was important. Not whether it might matter later.</p>
<p>Only whether we were willing to <em>finish it now</em>.</p>
<p>If yes, it stayed.</p>
<p>If not, it stopped - completely. No background progress, no partial ownership, no &ldquo;we’ll keep chipping away.&rdquo;</p>
<p>This is the same discipline behind small bets and fast learning: forcing work into a form where it can actually resolve, instead of lingering indefinitely<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<hr>
<h2 id="where-it-gets-hard">Where It Gets Hard<a class="anchor" href="#where-it-gets-hard">#</a></h2>
<p>This is the point where most teams hesitate.</p>
<p>Every item comes with a justification. You’ve already invested time. It will likely matter soon. You’re close to something useful. Dropping it feels wasteful.</p>
<p>All of that is true. None of it is relevant.</p>
<p>The real question isn’t whether something is valuable - it’s whether you’re willing to delay everything else for it.</p>
<p>That’s what being on the roadmap actually means.</p>
<hr>
<h2 id="what-changed">What Changed<a class="anchor" href="#what-changed">#</a></h2>
<p>They ended up keeping three items. Everything else was paused.</p>
<p>At first, it felt slower. There were fewer updates, fewer parallel threads, less visible activity.</p>
<p>But within two weeks, the difference was obvious. One feature shipped cleanly, end-to-end. The API direction converged. Infrastructure issues were actually resolved.</p>
<p>Nothing about the team changed.</p>
<p>No new process. No new tools.</p>
<p>Just fewer things, taken seriously.</p>
<hr>
<h2 id="the-role-of-no">The Role of &ldquo;No&rdquo;<a class="anchor" href="#the-role-of-no">#</a></h2>
<p>Early-stage teams tend to avoid saying no. It feels like giving up optionality, like slowing down.</p>
<p>In reality, it’s the opposite.</p>
<p>Every &ldquo;yes&rdquo; adds surface area: more coordination, more dependencies, more decisions deferred into the future.</p>
<p>Without constraint, the system becomes harder to reason about - and eventually, harder to trust.</p>
<p>Saying &ldquo;no&rdquo; isn’t about rejecting ideas.</p>
<p>It’s about protecting the conditions required to finish them.</p>
<p>This is also why breaking work into smaller, committed slices matters. Without that discipline, you don’t just take on more work - you take on more unresolved risk<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</p>
<hr>
<h2 id="what-a-roadmap-actually-represents">What a Roadmap Actually Represents<a class="anchor" href="#what-a-roadmap-actually-represents">#</a></h2>
<p>Most teams treat the roadmap as a list of things they want to do.</p>
<p>In practice, it’s a list of trade-offs.</p>
<p>Every item carries an implicit statement:</p>
<p><strong>This is more important than everything we are not doing right now.</strong></p>
<p>If that trade-off isn’t explicit, the roadmap loses meaning.</p>
<p>Execution becomes reactive - driven by momentum, interruptions, and partially completed work.</p>
<hr>
<h2 id="a-simple-test">A Simple Test<a class="anchor" href="#a-simple-test">#</a></h2>
<p>If you want to know whether your roadmap is real, don’t look at priorities.</p>
<p>Look at what’s currently in progress.</p>
<p>For each item, ask:</p>
<p><strong>&ldquo;Are we committed to finishing this?&rdquo;</strong></p>
<p>If the answer isn’t clearly yes, you’re not prioritizing.</p>
<p>You’re accumulating.</p>
<hr>
<h2 id="closing">Closing<a class="anchor" href="#closing">#</a></h2>
<p>The teams that move fastest aren’t the ones that generate the most ideas.</p>
<p>They’re the ones willing to ignore most of them.</p>
<p>Because in practice, speed doesn’t come from doing more.</p>
<p>It comes from finishing what you start - and being deliberate about what you never start at all.</p>
<hr>
<h2 id="references">References<a class="anchor" href="#references">#</a></h2>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Velocity Is the Product</em>. <a href="https://avivzaken.com/docs/velocity-is-the-product/">https://avivzaken.com/docs/velocity-is-the-product/</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><em>Shipping in Uncertainty: Field Notes on Startup SDLC</em>. <a href="https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/">https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><em>De-Risking Big Bets Without Killing Innovation</em>. <a href="https://avivzaken.com/docs/derisking-big-bets-without-killing-innovation/">https://avivzaken.com/docs/derisking-big-bets-without-killing-innovation/</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><em>4 Musts of Building a New Feature</em>. <a href="https://avivzaken.com/docs/4-musts-of-feature-dev/">https://avivzaken.com/docs/4-musts-of-feature-dev/</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Predictable Delivery in an Unpredictable World</title><link>https://avivzaken.com/docs/predictable-delivery-in-an-unpredictable-world/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/predictable-delivery-in-an-unpredictable-world/</guid><description>Startups don’t fail because they move slowly. They fail because they lose control of their velocity.</description><content:encoded><![CDATA[<p>Startups don’t fail because they move slowly.
They fail because they lose control of their velocity.</p>
<p>In the early days, speed feels like momentum. You ship fast, customers respond, features pile up. You knowingly cut corners - tests can wait, architecture can evolve later, observability is “good enough for now.” And for a while, it works.</p>
<p>Until it doesn’t.</p>
<p>A small change breaks something unrelated. Estimates become fiction. Engineers warn each other before touching certain parts of the codebase. Releases feel tense. You are still shipping - technically - but every deployment feels like defusing a bomb.</p>
<p>This is tech-debt hell.</p>
<p>And the way out isn’t to slow down.
It’s to redefine what velocity actually means - and build a system that protects it.</p>
<hr>
<h2 id="velocity-is-the-product">Velocity Is the Product<a class="anchor" href="#velocity-is-the-product">#</a></h2>
<p>In <em>Velocity Is the Product</em>, I argued that velocity is not a byproduct of engineering work - it <em>is</em> the product of a healthy engineering system<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Velocity is not story points per sprint.
It’s not features per quarter.
It’s not raw speed.</p>
<p>Velocity is the rate at which your organization can safely turn ideas into validated learning.</p>
<p>When velocity is healthy:</p>
<ul>
<li>Changes behave as expected.</li>
<li>Feedback loops are tight.</li>
<li>Risk is surfaced early.</li>
<li>Engineers are confident making modifications.</li>
</ul>
<p>When velocity degrades, something deeper is wrong. And most of the time, unmanaged technical debt is the underlying cause.</p>
<p>In <em>Technical Debt Is a Tool</em>, I reframed debt as information<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. Debt signals where we intentionally traded long-term safety for short-term progress. That trade-off is often rational. The mistake is pretending the trade-off doesn’t exist.</p>
<p>Debt becomes dangerous when it stops being visible.</p>
<p>Once confidence drops, velocity drops - even if output temporarily appears high. The system becomes fragile. And fragile systems cannot deliver predictably.</p>
<hr>
<h2 id="why-tech-debt-turns-into-chaos">Why Tech Debt Turns Into Chaos<a class="anchor" href="#why-tech-debt-turns-into-chaos">#</a></h2>
<p>Every feature increases complexity. That’s unavoidable.</p>
<p>New code interacts with old assumptions.
Edge cases multiply.
Implicit coupling becomes explicit pain.</p>
<p>In a healthy system, complexity is absorbed. Tests fail fast. Monitoring surfaces regressions. Refactoring reduces fragility before it compounds.</p>
<p>In an unhealthy system, complexity accumulates silently. Features are patched over symptoms. “Temporary” fixes become permanent. Knowledge becomes tribal. Each release increases the blast radius of the next one.</p>
<p>At this point, teams misdiagnose the problem. They think they need:</p>
<ul>
<li>Better estimation.</li>
<li>Stricter process.</li>
<li>More planning.</li>
<li>Harder deadlines.</li>
</ul>
<p>But estimation doesn’t reduce fragility.
Process doesn’t compensate for missing feedback loops.
Pressure doesn’t restore confidence.</p>
<p>What restores confidence is redesigning the system of delivery itself.</p>
<hr>
<h2 id="shipping-in-uncertainty">Shipping in Uncertainty<a class="anchor" href="#shipping-in-uncertainty">#</a></h2>
<p>In <em>Shipping in Uncertainty</em>, I described the SDLC as a learning engine - not a ceremony checklist<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>Uncertainty is not an exception in startups. It is the default state.</p>
<p>If your SDLC assumes clarity, it will break under reality.</p>
<p>A resilient SDLC optimizes for:</p>
<ul>
<li>Small batch sizes.</li>
<li>Frequent integration.</li>
<li>Early validation.</li>
<li>Tight feedback loops.</li>
</ul>
<p>Large features feel efficient on paper. In practice, they defer risk discovery. By the time the feature ships, assumptions are outdated and complexity is entrenched.</p>
<p>Small slices, by contrast, reduce both technical and product uncertainty. They expose hidden dependencies earlier. They allow course correction before complexity calcifies.</p>
<p>Predictable delivery is not about predicting everything upfront.
It’s about reducing the time between assumption and feedback.</p>
<p>The shorter that loop, the more controllable your system becomes.</p>
<hr>
<h2 id="from-firefighting-to-managed-debt">From Firefighting to Managed Debt<a class="anchor" href="#from-firefighting-to-managed-debt">#</a></h2>
<p>Moving out of tech-debt hell requires a mental shift:</p>
<p>Stop treating debt as something you “pay down later.”
Start treating it as a continuous signal.</p>
<p>Managed debt looks like this:</p>
<ul>
<li>Engineers can articulate where the fragile areas are.</li>
<li>Refactoring happens alongside feature work.</li>
<li>Tests and observability provide fast failure signals.</li>
<li>Risk is discussed explicitly during planning.</li>
</ul>
<p>Unmanaged debt looks like this:</p>
<ul>
<li>No one wants to touch certain modules.</li>
<li>Refactoring is perpetually postponed.</li>
<li>Features require excessive coordination.</li>
<li>Surprises happen late.</li>
</ul>
<p>The key operational shift is simple but powerful:</p>
<blockquote class='book-hint '>
<p>Refactor toward safety before adding behavior.</p>
</blockquote><p>When touching a fragile area, first improve its structure. Strengthen tests. Reduce coupling. Clarify interfaces. Only then add the new feature.</p>
<p>This prevents complexity from compounding exponentially.</p>
<p>You don’t escape debt through heroic clean-up efforts.
You escape it through disciplined, continuous micro-improvements.</p>
<p>Debt becomes manageable when it is integrated into daily delivery, not isolated into “future cleanup.”</p>
<hr>
<h2 id="scoping-as-risk-management">Scoping as Risk Management<a class="anchor" href="#scoping-as-risk-management">#</a></h2>
<p>Most scoping failures aren’t effort failures - they’re risk failures.</p>
<p>Teams scope features as delivery commitments instead of learning hypotheses.</p>
<p>A healthier framing asks:</p>
<ul>
<li>What assumption are we testing?</li>
<li>What is the smallest deployable increment that tests it?</li>
<li>What technical risk are we introducing?</li>
<li>What will we learn if this fails?</li>
</ul>
<p>This aligns directly with the idea that velocity equals learning<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. If a feature doesn’t reduce uncertainty, it’s not increasing velocity - it’s increasing complexity.</p>
<p>Proper scoping also prioritizes reversibility:</p>
<ul>
<li>Merge is decoupled from release.</li>
<li>Feature flags reduce blast radius.</li>
<li>Rollback paths are tested.</li>
<li>Observability is in place before exposure.</li>
</ul>
<p>When rollback is cheap, experimentation is safe.
When rollback is expensive, fear dictates design decisions.</p>
<p>Predictable delivery is not about eliminating mistakes.
It’s about ensuring mistakes are survivable.</p>
<hr>
<h2 id="the-core-shift-from-output-to-system-design">The Core Shift: From Output to System Design<a class="anchor" href="#the-core-shift-from-output-to-system-design">#</a></h2>
<p>The deepest change required is not technical - it’s conceptual.</p>
<p>Most organizations optimize for output: more features, faster timelines, visible progress.</p>
<p>But predictable delivery is not an output problem.
It’s a system design problem.</p>
<p>Here’s the real shift.</p>
<h3 id="1-from-speed-to-stability-of-change">1. From Speed to Stability of Change<a class="anchor" href="#1-from-speed-to-stability-of-change">#</a></h3>
<p>Speed without stability creates volatility.
Stable change creates sustained velocity.</p>
<p>Ask:</p>
<ul>
<li>How often do changes behave as expected?</li>
<li>How quickly can we detect regressions?</li>
<li>How easy is it to reverse a bad decision?</li>
</ul>
<p>If these answers are weak, increasing speed will amplify instability.</p>
<p>Stability of change - not raw throughput - determines long-term velocity.</p>
<hr>
<h3 id="2-from-feature-delivery-to-risk-reduction">2. From Feature Delivery to Risk Reduction<a class="anchor" href="#2-from-feature-delivery-to-risk-reduction">#</a></h3>
<p>Every feature should reduce uncertainty somewhere:</p>
<ul>
<li>Product uncertainty (will users care?)</li>
<li>Technical uncertainty (will this scale? integrate?)</li>
<li>Operational uncertainty (can we monitor and support this?)</li>
</ul>
<p>If a feature increases uncertainty without reducing any, it is accumulating debt.</p>
<p>Predictable organizations explicitly track risk reduction as part of delivery. They celebrate learning milestones, not just release milestones.</p>
<hr>
<h3 id="3-from-local-optimizations-to-system-thinking">3. From Local Optimizations to System Thinking<a class="anchor" href="#3-from-local-optimizations-to-system-thinking">#</a></h3>
<p>Teams often optimize locally:</p>
<ul>
<li>Faster coding.</li>
<li>More parallel work.</li>
<li>Larger sprint commitments.</li>
</ul>
<p>But if integration, testing, deployment, or observability lag behind, the entire system slows.</p>
<p>Predictable delivery requires viewing engineering as a single flow system:</p>
<p>Idea → Implementation → Integration → Deployment → Observation → Learning.</p>
<p>A bottleneck anywhere reduces overall velocity. Fixing code speed while ignoring deployment safety doesn’t improve the system.</p>
<hr>
<h3 id="4-from-heroics-to-boring-excellence">4. From Heroics to Boring Excellence<a class="anchor" href="#4-from-heroics-to-boring-excellence">#</a></h3>
<p>Tech-debt hell rewards heroics: late nights, emergency fixes, “save the release” moments.</p>
<p>Predictable systems eliminate the need for heroics.</p>
<p>Releases become routine.
Failures are contained.
Improvements are incremental.</p>
<p>This feels less dramatic - but it’s vastly more powerful.</p>
<p>Boring excellence compounds.</p>
<hr>
<h3 id="5-from-slogans-to-mechanisms">5. From Slogans to Mechanisms<a class="anchor" href="#5-from-slogans-to-mechanisms">#</a></h3>
<p>The shift only works if supported by mechanisms:</p>
<ul>
<li>Continuous integration with real signal.</li>
<li>Mandatory code review with structural focus.</li>
<li>Observability as part of feature definition.</li>
<li>Capacity reserved for structural improvements.</li>
<li>Postmortems that lead to system changes, not blame.</li>
</ul>
<p>Without mechanisms, principles decay into slogans.</p>
<p>With mechanisms, discipline becomes default behavior.</p>
<hr>
<h2 id="predictable-in-an-unpredictable-world">Predictable in an Unpredictable World<a class="anchor" href="#predictable-in-an-unpredictable-world">#</a></h2>
<p>You cannot eliminate uncertainty in startups. Markets change. Users surprise you. Assumptions break.</p>
<p>But you can build an engineering system that absorbs change instead of amplifying it.</p>
<p>Tech debt is not the enemy.
Unmanaged risk is.</p>
<p>Speed is not the goal.
Sustainable velocity is.</p>
<p>Predictable delivery emerges when:</p>
<ul>
<li>Debt is visible and managed.</li>
<li>Scope is framed as risk reduction.</li>
<li>Batch sizes stay small.</li>
<li>Feedback loops stay tight.</li>
<li>Leadership rewards system health, not output theater.</li>
</ul>
<p>When that happens, features stop feeling dangerous.
Estimates become directional rather than fictional.
Shipping becomes routine rather than dramatic.</p>
<p>Velocity becomes real.</p>
<p>And in an unpredictable world, that stability of delivery is your competitive advantage.</p>
<hr>
<h2 id="references">References<a class="anchor" href="#references">#</a></h2>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Velocity Is the Product</em>. <a href="https://avivzaken.com/docs/velocity-is-the-product/">https://avivzaken.com/docs/velocity-is-the-product/</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><em>Technical Debt Is a Tool</em>. <a href="https://avivzaken.com/docs/technical-debt-is-a-tool/">https://avivzaken.com/docs/technical-debt-is-a-tool/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><em>Shipping in Uncertainty: Field Notes on Startup SDLC</em>. <a href="https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/">https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>De-Risking Big Bets Without Killing Innovation</title><link>https://avivzaken.com/docs/derisking-big-bets-without-killing-innovation/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/derisking-big-bets-without-killing-innovation/</guid><description>De-risking innovation isn't about avoiding failure - it's about learning faster through small bets, clear metrics, and structured experiments that keep creativity alive.</description><content:encoded><![CDATA[<p>Innovation and big bets are the lifeblood of startups - the only way you escape commoditization and create new paradigms. But those bets come with risk: uncertainty, unknown unknowns, and the possibility that a huge investment of time, capital, and attention delivers very little value in return.</p>
<p>The challenge leaders face isn’t <strong>avoiding risk</strong> - it’s <strong>managing uncertainty in a way that preserves creativity and learning</strong>.</p>
<p>At its core, de-risking isn’t about insuring every decision against failure. It’s about discovering what <em>must</em> be true for a big idea to succeed, validating those assumptions early, and structuring your organization so that you learn more than you build. The teams that innovate well are the ones that <strong>learn the fastest</strong> - not necessarily the ones that build the most.</p>
<hr>
<h2 id="1-risk-and-innovation-are-the-same-conversation">1. Risk and Innovation Are the Same Conversation<a class="anchor" href="#1-risk-and-innovation-are-the-same-conversation">#</a></h2>
<p>The vocabulary of risk often makes teams think in terms of “bad things that might happen” - technical debt, schedule slips, shifting markets. But in innovation, risk and learning are two sides of the same coin.</p>
<p>Every feature, product, or business model carries assumptions:</p>
<ul>
<li>Will customers care?</li>
<li>Can we build it?</li>
<li>Is it technically feasible at scale?</li>
</ul>
<p>These are not questions you answer by guessing well. They are questions you answer by <strong>turning assumptions into experiments</strong>.</p>
<p>If your first instinct is a giant effort plan, you’ve already placed your bet.</p>
<p>Instead, start with risk - not the solution.</p>
<p><strong>Effort vs. Risk framing:</strong></p>
<ul>
<li><strong>Low effort, low risk</strong> → build</li>
<li><strong>Low effort, high risk</strong> → experiment</li>
<li><strong>High effort, high risk</strong> → reduce uncertainty before committing</li>
</ul>
<p>This reframing forces teams to ask the most important question in innovation:</p>
<blockquote class='book-hint '>
<p><em>What do we not know - and how will we find out?</em></p>
</blockquote><hr>
<h2 id="2-small-bets-big-learning">2. Small Bets, Big Learning<a class="anchor" href="#2-small-bets-big-learning">#</a></h2>
<p>Innovation doesn’t happen in monolithic chunks. It happens in <strong>small, deployable increments</strong> that expose assumptions to reality as early as possible.</p>
<p>Large projects hide feedback.
Small slices reveal it.</p>
<p>When work is structured this way:</p>
<ul>
<li>Feedback loops shorten</li>
<li>Mistakes surface when they’re cheap</li>
<li>Decisions stay reversible</li>
<li>Teams optimize for <strong>learning velocity</strong>, not delivery velocity</li>
</ul>
<p>This isn’t dogmatic agility - it’s survival strategy.</p>
<p>Cheap failures are <strong>data</strong>, not embarrassment.</p>
<p>Feature flags, incremental rollouts, and thin vertical slices of value all serve one purpose:
<strong>reduce the cost of being wrong.</strong></p>
<p>That is what de-risking actually means.</p>
<hr>
<h2 id="3-build-metrics-before-you-build-product">3. Build Metrics Before You Build Product<a class="anchor" href="#3-build-metrics-before-you-build-product">#</a></h2>
<p>A product without success metrics isn’t a product - it’s speculation in code form.</p>
<p>If you can’t define how you’ll measure success <em>before</em> writing a single line of code, you’re not ready to build.</p>
<p>Good success metrics are:</p>
<ul>
<li><strong>Measurable</strong> - observable and instrumented</li>
<li><strong>Actionable</strong> - tied to real decisions</li>
<li><strong>Aligned</strong> - connected to actual user or business outcomes</li>
</ul>
<p>Metrics are not reporting tools.
They are <strong>learning objectives</strong>.</p>
<p>They tell you when to double down, pivot, or stop.</p>
<p>Without them, you’re flying blind - and blind bets are expensive.</p>
<hr>
<h2 id="4-design-learning-not-hype">4. Design Learning, Not Hype<a class="anchor" href="#4-design-learning-not-hype">#</a></h2>
<p>Innovation isn’t a sprint.
It’s a <strong>structured exploration under uncertainty</strong>.</p>
<p>Shipping something is not the same as succeeding.</p>
<p>Practical principles:</p>
<ul>
<li>Validate assumptions before execution</li>
<li>Separate discovery from delivery</li>
<li>Make decisions reversible for as long as possible</li>
<li>Stop when the data tells you to stop</li>
</ul>
<p>In startups, the SDLC isn’t about shipping software.
It’s a <strong>decision-making framework under uncertainty</strong>.</p>
<p>Treat it as such.</p>
<hr>
<h2 id="5-preserve-innovation-while-managing-risk">5. Preserve Innovation While Managing Risk<a class="anchor" href="#5-preserve-innovation-while-managing-risk">#</a></h2>
<p>De-risking should never mean risk-aversion.</p>
<p>Without risk, there is no upside.
Without upside, innovation dies quietly.</p>
<p>The goal isn’t to eliminate risk - it’s to make risk <strong>intentional and informed</strong>, not accidental and blind.</p>
<p>That means:</p>
<ul>
<li>Lean experiments before big builds</li>
<li>High-fidelity learning before heavy engineering</li>
<li>Evidence before executive certainty</li>
<li>Feedback loops instead of forecasts</li>
</ul>
<p>This is how you protect innovation <em>without</em> suffocating it.</p>
<hr>
<h2 id="6-learn-faster-than-the-world-changes">6. Learn Faster Than the World Changes<a class="anchor" href="#6-learn-faster-than-the-world-changes">#</a></h2>
<p>The best innovation organizations don’t fail less.
They <strong>fail better</strong>.</p>
<p>They extract signal from every experiment - success or failure - and feed it forward into smarter decisions.</p>
<p>Big bets don’t disappear.
They become <strong>smart bets</strong>.</p>
<p>And in a world where change is the only constant, your ability to de-risk intelligently determines your ability to innovate meaningfully.</p>
]]></content:encoded></item><item><title>Velocity Is the Product</title><link>https://avivzaken.com/docs/velocity-is-the-product/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/velocity-is-the-product/</guid><description>Velocity is the product, not the metric. It's the rate at which you learn and ship features. It's the rate at which you can make changes to the system without breaking it.</description><content:encoded><![CDATA[<h2 id="speed-is-not-a-metric--its-the-mission">Speed Is Not a Metric — It’s the Mission<a class="anchor" href="#speed-is-not-a-metric--its-the-mission">#</a></h2>
<p>Startups don’t exist to write elegant code.
They exist to learn faster than everyone else.</p>
<p>Feature delivery velocity is simply the visible symptom of that learning rate. When velocity drops, insight slows. When insight slows, the company drifts — even if everything still “works.”</p>
<p>This is why speed cannot be treated as a secondary concern, something to optimize once the system is mature. By the time a startup is scaling, <strong>speed is already the most fragile asset it has</strong>.</p>
<p>Every decision either compounds velocity or quietly taxes it.</p>
<hr>
<h2 id="when-growth-turns-against-you">When Growth Turns Against You<a class="anchor" href="#when-growth-turns-against-you">#</a></h2>
<p>Hyper-growth feels like success, but it carries a hidden cost.</p>
<p>The product expands. The team grows. The surface area of the system explodes. And suddenly, the behaviors that once felt responsible begin to suffocate progress.</p>
<p>Releases become infrequent because they are risky.
Risk grows because releases are infrequent.</p>
<p>It shows up in subtle ways:</p>
<ul>
<li>Features wait “until the next release”</li>
<li>Branches live too long</li>
<li>Teams coordinate instead of acting</li>
<li>Shipping becomes ceremonial</li>
</ul>
<p>The organization slows not because people are careless — but because <strong>they are rationally afraid of breaking something important</strong>.</p>
<p>This is the inflection point where many startups lose their edge.</p>
<hr>
<h2 id="making-production-the-default-state">Making Production the Default State<a class="anchor" href="#making-production-the-default-state">#</a></h2>
<p>The solution isn’t to be more careful.
It’s to change what “careful” means.</p>
<p>Careful does not mean batching work.
Careful means reducing the cost of change.</p>
<p>When code is pushed to production continuously, something important happens:
each individual change becomes small enough to reason about.</p>
<p>Small changes are reviewable.
Small changes are testable.
Small changes are reversible.</p>
<p>Production stops being a cliff and starts being a stream.</p>
<p>This isn’t about moving fast at all costs. It’s about building a system where <strong>speed and safety are no longer in tension</strong>.</p>
<hr>
<h2 id="separating-building-from-releasing">Separating Building from Releasing<a class="anchor" href="#separating-building-from-releasing">#</a></h2>
<p>One of the most powerful — and underused — ideas in modern product engineering is this:</p>
<p><strong>Engineers should decide when code is safe.
Product should decide when it is live.</strong></p>
<p>Feature flags are the boundary between those two worlds.</p>
<p>Once a feature is merged and deployed behind a flag, engineering has done its job. The code exists. It’s tested. It’s observable. It’s stable.</p>
<p>From that moment on, product teams should own:</p>
<ul>
<li>When a feature is enabled</li>
<li>Who sees it</li>
<li>How quickly it rolls out</li>
<li>Whether it should be turned off</li>
</ul>
<p>This separation eliminates waiting, negotiation, and redeployments. It allows learning to happen independently of engineering cycles — which is exactly where velocity multiplies.</p>
<hr>
<h2 id="what-you-reward-is-what-you-get">What You Reward Is What You Get<a class="anchor" href="#what-you-reward-is-what-you-get">#</a></h2>
<p>Culture doesn’t come from mission statements.
It comes from incentives.</p>
<p>If you praise big launches, you’ll get big launches — and long gaps between them.
If you celebrate heroics, you’ll get fragile systems.
If you reward “saving the release,” you’ll keep creating near-failures.</p>
<p>Velocity-driven teams reward different things:</p>
<ul>
<li>Shipping in small increments</li>
<li>Deleting unused code</li>
<li>Killing ideas early</li>
<li>Reducing scope without ego</li>
<li>Deploying quietly and often</li>
</ul>
<p>These behaviors feel unremarkable in the moment. That’s the point.</p>
<p>When progress becomes boring, it becomes sustainable.</p>
<hr>
<h2 id="the-quiet-advantage">The Quiet Advantage<a class="anchor" href="#the-quiet-advantage">#</a></h2>
<p>The fastest teams rarely look frantic.</p>
<p>They don’t rush.
They don’t announce.
They don’t wait.</p>
<p>They push code continuously.
They expose features deliberately.
They learn in public and iterate in private.</p>
<p>In hyper-growth, this quiet discipline is the difference between scaling momentum and scaling friction.</p>
<p>Speed isn&rsquo;t what you do when things are simple.
<strong>Speed is what remains when things get hard.</strong></p>
<p>And the only way to keep it is to design for it — on purpose.</p>
<hr>
<h2 id="references-and-further-reading">References and Further Reading<a class="anchor" href="#references-and-further-reading">#</a></h2>
<ol>
<li>
<p><strong>Continuous Deployment</strong>: Jez Humble and David Farley, <em>Continuous Delivery</em> (2010) - the seminal work on automated deployment pipelines and making release a non-event</p>
</li>
<li>
<p><strong>Small Batch Releases</strong>: Nicole Forsgren et al., <em>Accelerate</em> (2018) - DORA research showing that high performers deploy more frequently with better outcomes</p>
</li>
<li>
<p><strong>Feature Flags</strong>: Pete Hodgson, &ldquo;Feature Toggles&rdquo; (martinfowler.com, 2017); also <em>Effective Feature Management</em> by LaunchDarkly on separating deploy from release</p>
</li>
<li>
<p><strong>Speed and Safety Together</strong>: Gene Kim et al., <em>The DevOps Handbook</em> (2016) on how modern practices align speed with reliability, not trade them off</p>
</li>
<li>
<p><strong>Learning Rate</strong>: Eric Ries, <em>The Lean Startup</em> (2011) on learning as the fundamental unit of progress; validated learning over vanity metrics</p>
</li>
<li>
<p><strong>Risk from Infrequent Releases</strong>: Michael Nygard, <em>Release It!</em> (2017, 2nd edition) on how batch deployments increase risk and blast radius</p>
</li>
<li>
<p><strong>Cultural Incentives</strong>: Daniel Pink, <em>Drive</em> (2009) on motivation and what organizations actually reward; also Westrum&rsquo;s organizational culture research</p>
</li>
<li>
<p><strong>Progressive Delivery</strong>: Split.io and LaunchDarkly resources on percentage rollouts, canary releases, and gradual feature exposure</p>
</li>
<li>
<p><strong>Trunk-Based Development</strong>: Paul Hammant on trunkbaseddevelopment.com - the practice of working on main branch with short-lived feature branches and feature flags</p>
</li>
</ol>
]]></content:encoded></item><item><title>Shipping in Uncertainty: Field Notes on Startup SDLC</title><link>https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/shipping-in-uncertainty-sdlc/</guid><description>A candid take on how startups ship software while everything is still unclear - why process is a bet, feedback is truth, and confidence is built, not assumed.</description><content:encoded><![CDATA[<p>Startups don’t fail because they lack process.
They fail because they adopt the <strong>wrong process too early</strong>, or worse - believe process will save them from uncertainty.</p>
<p>In a fast-growing startup, SDLC isn’t a methodology.
It’s a <strong>series of bets</strong> you place under incomplete information, changing constraints, and real deadlines. The goal isn’t to be “correct.” The goal is to <strong>stay alive long enough to learn</strong>.</p>
<h2 id="1-being-agile-isnt-about-speed---its-about-optionality">1. Being Agile Isn’t About Speed - It’s About Optionality<a class="anchor" href="#1-being-agile-isnt-about-speed---its-about-optionality">#</a></h2>
<p>Most teams confuse agility with velocity.</p>
<p>Shipping fast is easy when nothing matters.
Shipping fast <em>repeatedly</em>, when users depend on you and the product keeps changing - that’s the hard part.</p>
<p>Agile process in startups is about <strong>keeping options open</strong>:</p>
<ul>
<li>Short planning horizons because long ones lie</li>
<li>Small batch sizes because big bets hide mistakes</li>
<li>Lightweight rituals because heavy ones calcify too early</li>
</ul>
<p>The mistake isn’t “no process.”
The mistake is <strong>locking yourself into decisions before reality forces you to</strong>.</p>
<p>Your SDLC should answer one question every week:</p>
<blockquote class='book-hint '>
<p><em>What can we safely change our mind about next week?</em></p>
</blockquote><p>If your process can’t absorb change without breaking people, morale, or production - it’s already too rigid.</p>
<h2 id="2-feedback-is-the-only-truth-that-matters-and-its-often-uncomfortable">2. Feedback Is the Only Truth That Matters (And It’s Often Uncomfortable)<a class="anchor" href="#2-feedback-is-the-only-truth-that-matters-and-its-often-uncomfortable">#</a></h2>
<p>In early startups, opinions are loud and feedback is quiet.</p>
<p>Executives debate. Engineers speculate. Roadmaps get polished.
Meanwhile, the only signal that actually matters - <strong>user behavior</strong> - trickles in slowly and inconveniently.</p>
<p>A healthy startup SDLC is built to <strong>embarrass your assumptions quickly</strong>.</p>
<p>That means:</p>
<ul>
<li>Shipping before you’re comfortable</li>
<li>Measuring before you’re confident</li>
<li>Listening before you’re defensive</li>
</ul>
<p>Feedback isn’t validation.
It’s <strong>friction</strong> - and friction is information.</p>
<p>The faster your SDLC turns friction into learning, the less time you spend building the wrong thing exceptionally well.</p>
<h2 id="3-process-evolves-with-the-code---tests-are-how-you-buy-courage">3. Process Evolves With the Code - Tests Are How You Buy Courage<a class="anchor" href="#3-process-evolves-with-the-code---tests-are-how-you-buy-courage">#</a></h2>
<p>Early on, you move fast because nothing is stable.
Later, you slow down because everything is connected.</p>
<p>This is where many startups stall - not because they lack talent, but because <strong>every change feels dangerous</strong>.</p>
<p>Tests aren’t about correctness.
They’re about <strong>courage</strong>.</p>
<ul>
<li>Courage to refactor instead of rewrite</li>
<li>Courage to say yes instead of “let’s be careful”</li>
<li>Courage to let new engineers touch old code</li>
</ul>
<p>As the product evolves, your SDLC must evolve with it:</p>
<ul>
<li>Manual checks turn into automated tests</li>
<li>Tribal knowledge turns into repeatable pipelines</li>
<li>Heroics turn into systems</li>
</ul>
<p>The moment your team starts asking “what might break?” before every change is the moment you realize you waited too long.</p>
<h2 id="4-decision-making-under-uncertainty-is-the-real-sdlc">4. Decision-Making Under Uncertainty Is the Real SDLC<a class="anchor" href="#4-decision-making-under-uncertainty-is-the-real-sdlc">#</a></h2>
<p>Frameworks don’t make decisions.
People do - usually with partial data and full responsibility.</p>
<p>In startups, <strong>every technical decision is made too early</strong>:</p>
<ul>
<li>Architecture before scale is known</li>
<li>Abstractions before usage is clear</li>
<li>Tooling before constraints are real</li>
</ul>
<p>So the goal isn’t to avoid wrong decisions.
It’s to <strong>make reversible ones cheap</strong>.</p>
<p>A good startup SDLC optimizes for:</p>
<ul>
<li>Fast feedback on irreversible choices</li>
<li>Clear ownership when tradeoffs are made</li>
<li>Systems that surface risk early instead of hiding it</li>
</ul>
<p>Confidence doesn’t come from certainty.
It comes from knowing <strong>how quickly you can recover when you’re wrong</strong>.</p>
<h2 id="closing-thought-process-is-a-living-system">Closing Thought: Process Is a Living System<a class="anchor" href="#closing-thought-process-is-a-living-system">#</a></h2>
<p>The biggest SDLC mistake startups make is freezing process in time.</p>
<p>What worked at 5 engineers will choke you at 50.
What saved you at MVP will sink you at scale.</p>
<p>Process isn’t a badge of maturity.
It’s a <strong>tool for learning, alignment, and survival</strong>.</p>
<p>The right question isn’t:</p>
<blockquote class='book-hint '>
<p><em>“Are we doing Agile correctly?”</em></p>
</blockquote><p>It’s:</p>
<blockquote class='book-hint '>
<p><em>“Is our SDLC helping us learn faster than the market is changing?”</em></p>
</blockquote><p>If the answer is yes - keep going.
If not - change the process before reality does it for you.</p>
<hr>
<h2 id="references-and-further-reading">References and Further Reading<a class="anchor" href="#references-and-further-reading">#</a></h2>
<ol>
<li>
<p><strong>Agile as Optionality</strong>: Kent Beck et al., <em>Agile Manifesto</em> (2001); also Mary and Tom Poppendieck, <em>Lean Software Development</em> (2003) on &ldquo;deciding at the last responsible moment&rdquo;</p>
</li>
<li>
<p><strong>Small Batch Sizes</strong>: Donald Reinertsen, <em>The Principles of Product Development Flow</em> (2009) on batch size and cycle time; also core lean manufacturing principle adapted to software</p>
</li>
<li>
<p><strong>Build-Measure-Learn</strong>: Eric Ries, <em>The Lean Startup</em> (2011) on validated learning and pivoting based on feedback</p>
</li>
<li>
<p><strong>Tests as Courage</strong>: Kent Beck, <em>Test Driven Development: By Example</em> (2002) - TDD gives confidence to refactor; also Ron Jeffries on tests as &ldquo;courage enabler&rdquo;</p>
</li>
<li>
<p><strong>Reversible vs. Irreversible Decisions</strong>: Jeff Bezos&rsquo;s concept of &ldquo;Type 1 and Type 2 decisions&rdquo; from Amazon shareholder letters; also discussed in <em>Working Backwards</em> (2021)</p>
</li>
<li>
<p><strong>Fast Feedback Loops</strong>: Jez Humble and David Farley, <em>Continuous Delivery</em> (2010) on reducing cycle time and getting rapid feedback</p>
</li>
<li>
<p><strong>Process Evolution</strong>: Alistair Cockburn, <em>Agile Software Development: The Cooperative Game</em> (2006) on adapting methodology to context</p>
</li>
<li>
<p><strong>Decision-Making Under Uncertainty</strong>: Douglas Hubbard, <em>How to Measure Anything</em> (2010) on probabilistic thinking and reducing uncertainty through experimentation</p>
</li>
</ol>
]]></content:encoded></item><item><title>Technical Debt Is a Tool</title><link>https://avivzaken.com/docs/technical-debt-is-a-tool/</link><pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/technical-debt-is-a-tool/</guid><description>Technical debt isn't the main problem-loss of trust is; continuous, small refactors keep teams confident and fast.</description><content:encoded><![CDATA[<p>Teams rarely slow down because their engineers suddenly become less capable.
They slow down because their software systems become harder to reason about.</p>
<p>Technical debt is often blamed for this slowdown, but that diagnosis is incomplete. Debt itself is not the fundamental problem. The real issue is whether the team can still make changes with a reasonable level of confidence.</p>
<p>The fastest teams are not those that eliminate technical debt entirely.
They are the teams that prevent debt from turning into uncertainty.</p>
<hr>
<h2 id="shortcuts-are-how-software-is-made">Shortcuts Are How Software Is Made<a class="anchor" href="#shortcuts-are-how-software-is-made">#</a></h2>
<p>Every non-trivial system begins with shortcuts.</p>
<p>At the start, teams lack information.
They do not know which features will persist.
They do not know which abstractions will hold.
They do not know what scale or usage patterns will emerge.</p>
<p>Attempting to design a clean, extensible architecture in this environment is usually an exercise in speculative generality.</p>
<p>Instead, teams hard-code values.
They duplicate logic.
They accept designs that are clearly provisional.</p>
<p>This is not negligence; it is pragmatism.</p>
<p>Early systems move quickly not because they are well-designed, but because they accurately reflect what the team currently understands. The structure of the code mirrors the structure of knowledge at the time it was written.</p>
<p>The difficulty arises when the system continues to embody assumptions that the team has already outgrown.</p>
<hr>
<h2 id="how-trust-quietly-erodes">How Trust Quietly Erodes<a class="anchor" href="#how-trust-quietly-erodes">#</a></h2>
<p>Most teams encounter a transition phase, often without realizing it.</p>
<p>Changes begin to take longer.
Certain areas of the code are approached with caution.
Engineers add verbal warnings: <em>“Be careful when touching this.”</em></p>
<p>Nothing appears broken. Tests still pass. Deployments still occur. Yet the system no longer feels predictable.</p>
<p>In response, engineers adapt their behavior.</p>
<p>They route around risky components rather than through them.
They add new behavior on top of old structures instead of reshaping them.
They optimize for minimizing surprise rather than reducing complexity.</p>
<p>Development continues, but with increasing resistance.</p>
<p>When teams say <em>“technical debt is slowing us down,”</em> they are rarely referring to messy code in isolation. They are describing the experience of working in a system whose behavior is no longer well understood.</p>
<p>At that point, the problem is not debt.
It is loss of trust.</p>
<hr>
<h2 id="refactoring-as-ongoing-design">Refactoring as Ongoing Design<a class="anchor" href="#refactoring-as-ongoing-design">#</a></h2>
<p>Refactoring is often framed as cleanup: something to do after the “real work” is finished.</p>
<p>Teams that sustain high delivery speed over time see it differently. For them, refactoring is how the system stays aligned with reality.</p>
<p>As requirements change and understanding deepens, the code must change shape accordingly. Earlier decisions are revisited. Temporary structures are either reinforced or removed. Concepts that were once implicit become explicit.</p>
<p>This work is rarely dramatic. There are no large ceremonies or special initiatives. Instead, there is a continuous process of small adjustments that keep the system coherent.</p>
<p>Externally, this appears as discipline.
Internally, it feels like maintaining orientation.</p>
<hr>
<h2 id="when-the-system-starts-to-decide">When the System Starts to Decide<a class="anchor" href="#when-the-system-starts-to-decide">#</a></h2>
<p>When this continuous realignment stops, the effects emerge gradually.</p>
<p>Engineers become more cautious.
Estimates become less dependable.
Product discussions begin with <em>“if this is possible”</em> rather than <em>“when we do this.”</em></p>
<p>Over time, architectural constraints begin to shape product decisions. Not deliberately, but through accumulated friction.</p>
<p>Features are deferred not because they lack value, but because they intersect with fragile parts of the system. Eventually, the codebase exerts a quiet veto over change.</p>
<p>This is typically when rewrites are proposed.</p>
<p>Rewrites are rarely motivated by aesthetics. They are attempts to regain a system that feels comprehensible. Most fail - not because rewriting is infeasible, but because the underlying practices that allowed trust to decay remain unchanged.</p>
<hr>
<h2 id="the-role-of-leadership">The Role of Leadership<a class="anchor" href="#the-role-of-leadership">#</a></h2>
<p>As teams slow down, management pressure often increases.</p>
<p>More planning.
Tighter timelines.
Greater urgency.</p>
<p>Unfortunately, pressure does not restore trust. It accelerates its erosion.</p>
<p>When every change already feels risky, urgency encourages defensive behavior. Engineers avoid destabilizing areas, add protective layers, and further entrench complexity. The system becomes heavier at an increasing rate.</p>
<p>The teams that remain effective are not those granted time for large-scale cleanup. They are the teams allowed to improve the system while continuing to deliver value.</p>
<p>That permission is seldom stated explicitly - but its absence is immediately apparent.</p>
<hr>
<h2 id="speed-emerges-from-confidence">Speed Emerges from Confidence<a class="anchor" href="#speed-emerges-from-confidence">#</a></h2>
<p>High-performing teams are not reckless.</p>
<p>They move quickly because they trust:</p>
<ul>
<li>that changes will behave approximately as expected</li>
<li>that the code represents current understanding</li>
<li>that problems can be corrected incrementally</li>
</ul>
<p>This confidence is not achieved by avoiding technical debt.</p>
<p>It is achieved by continually engaging with it.</p>
<p>Shortcuts are unavoidable.
Allowing them to persist beyond their usefulness is not.</p>
<p>The distinction is rarely about technology.
It is about whether the team preserves the conditions required to move with confidence.</p>
<hr>
<h2 id="references-and-further-reading">References and Further Reading<a class="anchor" href="#references-and-further-reading">#</a></h2>
<ol>
<li>
<p><strong>Technical Debt Origin</strong>: Ward Cunningham&rsquo;s original 1992 OOPSLA talk introducing the debt metaphor; see also his 2009 clarification on what he actually meant by the term</p>
</li>
<li>
<p><strong>Debt vs. Trust</strong>: Steve McConnell, &ldquo;Technical Debt&rdquo; (IEEE Software, 2007) distinguishes between deliberate and inadvertent debt; this article extends that to focus on confidence erosion</p>
</li>
<li>
<p><strong>Speculative Generality</strong>: Martin Fowler, <em>Refactoring</em> (2018) - one of his code smells; also discussed in <em>Extreme Programming Explained</em> on YAGNI (You Aren&rsquo;t Gonna Need It)</p>
</li>
<li>
<p><strong>Continuous Refactoring</strong>: Michael Feathers, <em>Working Effectively with Legacy Code</em> (2004) on characterization tests and safe refactoring; also Fowler&rsquo;s <em>Refactoring</em> on opportunistic refactoring</p>
</li>
<li>
<p><strong>System Comprehension</strong>: Fred Brooks, &ldquo;No Silver Bullet&rdquo; (1986) discusses essential vs. accidental complexity; Peter Naur, &ldquo;Programming as Theory Building&rdquo; (1985) on understanding as the core asset</p>
</li>
<li>
<p><strong>Architecture and Velocity</strong>: Martin Fowler, &ldquo;Design Stamina Hypothesis&rdquo; (martinfowler.com) on how good design enables sustained speed</p>
</li>
<li>
<p><strong>Why Rewrites Fail</strong>: Joel Spolsky, &ldquo;Things You Should Never Do, Part I&rdquo; (2000) on the dangers of ground-up rewrites; also Chad Fowler, &ldquo;The Big Rewrite&rdquo; (2006)</p>
</li>
<li>
<p><strong>Pressure and Quality</strong>: Gerald Weinberg, <em>Quality Software Management</em> series (1992-1997) on how organizational pressure affects development practices</p>
</li>
</ol>
]]></content:encoded></item><item><title>Refactoring Is How You Keep Moving Fast</title><link>https://avivzaken.com/docs/refactoring-to-move-fast/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/refactoring-to-move-fast/</guid><description>How continuous refactoring prevents engineering slowdowns and keeps the cost of change flat over time. Refactoring isn't a cleanup phase—it's the mechanism that preserves feature velocity.</description><content:encoded><![CDATA[<p>Refactoring isn’t a ceremony. It’s not a cleanup phase. It’s not something you “schedule for later.”</p>
<p>It’s how you prevent your team from slowing to a crawl while still shipping features.</p>
<p>Most codebases don’t die because of bad ideas. They die because every new feature costs more than the last one. The system becomes fragile, changes get risky, and engineers start working <em>around</em> the code instead of <em>with</em> it.</p>
<p>Refactoring is the mechanism that keeps the cost of change flat over time.</p>
<p>Not zero. Flat.</p>
<hr>
<h2 id="refactoring-is-about-preserving-behavior-while-changing-structure">Refactoring Is About Preserving Behavior While Changing Structure<a class="anchor" href="#refactoring-is-about-preserving-behavior-while-changing-structure">#</a></h2>
<p>Refactoring has a very specific meaning:</p>
<blockquote class='book-hint '>
<p>You change how the code is structured <strong>without changing what it does</strong>.</p>
</blockquote><p>That constraint matters.</p>
<p>It forces discipline:</p>
<ul>
<li>Small steps</li>
<li>Clear intent</li>
<li>Continuous verification</li>
</ul>
<p>You’re not “improving things” in the abstract. You’re reshaping the code so that <strong>the next change is easy</strong>, obvious, and low-risk.</p>
<p>If behavior changes, you’re no longer refactoring—you’re developing a feature or fixing a bug. Mixing those two is how systems break.</p>
<hr>
<h2 id="why-refactoring-is-a-feature-development-tool">Why Refactoring Is a Feature Development Tool<a class="anchor" href="#why-refactoring-is-a-feature-development-tool">#</a></h2>
<p>Every feature exposes the truth about your system.</p>
<p>If adding something simple requires:</p>
<ul>
<li>Touching 12 files</li>
<li>Copy-pasting logic</li>
<li>Adding conditionals “just this once”</li>
</ul>
<p>That’s not bad luck. That’s feedback.</p>
<p>The system is telling you its current shape no longer matches the product you’re building.</p>
<p>Refactoring is how you realign the system with reality.</p>
<p>Before adding a feature, I ask:</p>
<blockquote class='book-hint '>
<p><em>Is the code already structured to make this change easy?</em></p>
</blockquote><p>If the answer is no, I refactor <em>first</em>.</p>
<p>This almost always makes the overall work faster—not slower—because it removes incidental complexity before it compounds.</p>
<hr>
<h2 id="refactoring-is-continuous-not-a-phase">Refactoring Is Continuous, Not a Phase<a class="anchor" href="#refactoring-is-continuous-not-a-phase">#</a></h2>
<p>Healthy teams refactor:</p>
<ul>
<li>While reading code they don’t understand</li>
<li>While extracting logic they need elsewhere</li>
<li>After a feature works but feels unclear</li>
<li>When duplication starts to appear</li>
<li>When responsibilities blur</li>
</ul>
<p>This is not hero work. It’s maintenance of velocity.</p>
<p>The goal isn’t “clean code.”
The goal is <strong>code that future you can change without fear</strong>.</p>
<p>If you find yourself thinking:</p>
<blockquote class='book-hint '>
<p>“I’ll remember how this works later”</p>
</blockquote><p>You won’t.</p>
<p>Refactor now. Your future self is busy shipping.</p>
<hr>
<h2 id="small-steps-are-the-only-way-this-works">Small Steps Are the Only Way This Works<a class="anchor" href="#small-steps-are-the-only-way-this-works">#</a></h2>
<p>Big rewrites feel productive and usually fail.</p>
<p>Refactoring works because each step is:</p>
<ul>
<li>Small</li>
<li>Behavior-preserving</li>
<li>Reversible</li>
<li>Verifiable</li>
</ul>
<p>You keep the system working at all times. That’s non-negotiable.</p>
<p>This is why tests matter—not because of ideology, but because they make refactoring safe. When tooling exists (IDEs, automated refactors), use it. When it doesn’t, slow down and shrink the steps.</p>
<p>Speed comes from control, not recklessness.</p>
<hr>
<h2 id="tools-help-but-discipline-matters-more">Tools Help, But Discipline Matters More<a class="anchor" href="#tools-help-but-discipline-matters-more">#</a></h2>
<p>Modern IDEs can rename, extract, inline, and move code safely. That’s great. Use them.</p>
<p>LLM-based code assistants are also powerful tools. They can suggest refactorings, spot duplication, and accelerate mechanical transformations. Used well, they reduce friction and help you move faster.</p>
<p>But tools don’t replace judgment.</p>
<p>An IDE doesn’t understand your system. An LLM doesn’t understand your product.</p>
<p>They don’t know which invariants matter, which abstractions are stable, or which shortcuts will become tomorrow’s bottlenecks. They optimize for plausibility and local correctness, not long-term system shape.</p>
<p>You still need to decide:</p>
<ul>
<li>What responsibility belongs where</li>
<li>What abstraction actually reduces complexity</li>
<li>What should be deleted instead of generalized</li>
</ul>
<p>If you can’t explain why a refactoring was done, you probably shouldn’t merge it—no matter how clean it looks.</p>
<p>LLMs are best treated like very fast junior engineers: great at execution, dangerous without context, and ineffective without clear direction.</p>
<p>Refactoring is thinking, not formatting.</p>
<hr>
<h2 id="refactoring-is-an-investment-strategy">Refactoring Is an Investment Strategy<a class="anchor" href="#refactoring-is-an-investment-strategy">#</a></h2>
<p>Refactoring is how you:</p>
<ul>
<li>Keep feature velocity predictable</li>
<li>Reduce cognitive load across the team</li>
<li>Prevent “expert-only” areas of the codebase</li>
<li>Avoid long stabilization phases</li>
<li>Scale engineering without scaling pain</li>
</ul>
<p>If your roadmap assumes constant delivery speed but your codebase gets harder to change every month, the plan is already broken.</p>
<p>Refactoring is how you close that gap.</p>
<hr>
<h2 id="the-real-test">The Real Test<a class="anchor" href="#the-real-test">#</a></h2>
<p>Here’s the litmus test I use:</p>
<blockquote class='book-hint '>
<p>Can a new engineer make a meaningful change in this area without asking for help?</p>
</blockquote><p>If not, refactoring is already overdue.</p>
<p>Not because the code is &ldquo;ugly,&rdquo; but because it&rsquo;s taxing future execution.</p>
<p>And execution is the whole game.</p>
<hr>
<h2 id="references-and-further-reading">References and Further Reading<a class="anchor" href="#references-and-further-reading">#</a></h2>
<ol>
<li>
<p><strong>Refactoring Definition</strong>: Martin Fowler, <em>Refactoring: Improving the Design of Existing Code</em> (2018, 2nd edition) - the definitive work on behavior-preserving code transformations</p>
</li>
<li>
<p><strong>Keeping the Cost of Change Flat</strong>: Kent Beck, <em>Extreme Programming Explained</em> (2004) on the &ldquo;cost of change curve&rdquo; and how XP practices flatten it</p>
</li>
<li>
<p><strong>Make the Change Easy</strong>: Kent Beck&rsquo;s famous tweet (2012): &ldquo;for each desired change, make the change easy (warning: this may be hard), then make the easy change&rdquo;</p>
</li>
<li>
<p><strong>Tests as Safety Net</strong>: Michael Feathers, <em>Working Effectively with Legacy Code</em> (2004) on using tests to enable safe refactoring</p>
</li>
<li>
<p><strong>Continuous Refactoring</strong>: Joshua Kerievsky, <em>Refactoring to Patterns</em> (2004) on refactoring as ongoing design activity, not a phase</p>
</li>
<li>
<p><strong>Small Steps</strong>: Martin Fowler&rsquo;s refactoring catalog emphasizes &ldquo;small, behavior-preserving steps&rdquo; as the core discipline</p>
</li>
<li>
<p><strong>Code as Liability</strong>: Kevlin Henney&rsquo;s talks on &ldquo;The Forgotten Art of Structured Programming&rdquo; discuss how less code often means better code</p>
</li>
<li>
<p><strong>LLMs in Development</strong>: GitHub Copilot research (2022) and OpenAI Codex papers on AI-assisted coding tools; also Anthropic&rsquo;s work on Claude for code assistance</p>
</li>
</ol>
]]></content:encoded></item><item><title>4 Musts of Building a New Feature</title><link>https://avivzaken.com/docs/4-musts-of-feature-dev/</link><pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate><guid>https://avivzaken.com/docs/4-musts-of-feature-dev/</guid><description>Four critical principles for successful feature development: evaluating effort vs. risk, breaking features into deployable parts, failing fast on purpose, and defining measurable KPIs. A CTO's guide to reducing waste and shipping what matters.</description><content:encoded><![CDATA[<p><em>A CTO&rsquo;s guide to reducing waste, increasing learning, and shipping what matters</em></p>
<hr>
<p>As CTOs, we like to believe that building features is a technical problem. If the architecture is clean, the code is solid, and the team is strong, success should follow.</p>
<p>Reality disagrees.</p>
<p>Most failed features don’t fail because of bad code. They fail because we invested heavily before we learned enough. We optimized execution before validating direction. We treated uncertainty as something to be managed later, instead of the core problem to solve first.</p>
<p>Over the years, I’ve learned that successful feature development is less about brilliance and more about discipline. There are a few non-negotiable principles that, when applied consistently, dramatically increase the odds that a feature will deliver real value.</p>
<p>This article outlines a few of those principles.</p>
<hr>
<h2 id="1-start-with-effort-vs-risk---not-with-the-solution">1. Start With Effort vs. Risk - Not With the Solution<a class="anchor" href="#1-start-with-effort-vs-risk---not-with-the-solution">#</a></h2>
<p>Every new feature carries two independent dimensions that are often confused: <strong>effort</strong> and <strong>risk</strong>.</p>
<p><strong>Effort</strong> is the cost we can reasonably estimate upfront:</p>
<ul>
<li>Engineering time</li>
<li>Number of people involved</li>
<li>Infrastructure changes</li>
<li>Coordination overhead</li>
</ul>
<p><strong>Risk</strong>, on the other hand, is about uncertainty.</p>
<ul>
<li>How “researchy” is this problem?</li>
<li>How many assumptions are we making?</li>
<li>How confident are we that this will work - technically and for users?</li>
</ul>
<p>Both can usually be classified as <strong>low</strong>, <strong>medium</strong>, or <strong>high</strong>.</p>
<p>The mistake many teams make is assuming that high effort automatically implies high risk, or worse, ignoring risk entirely. In practice, risk is what causes effort to explode.</p>
<p>A feature that looks like “medium effort” can quietly turn into a multi-quarter project if the underlying assumptions are wrong.</p>
<p>Before committing to a solution, I insist on explicitly placing the work on an <strong>effort–risk matrix</strong>:</p>
<ul>
<li>Low effort, low risk: execute quickly.</li>
<li>High effort, low risk: plan carefully, but proceed.</li>
<li>Low effort, high risk: perfect candidate for experiments.</li>
<li>High effort, high risk: stop. Break it down or reduce uncertainty first.</li>
</ul>
<p>This framing forces a critical shift: <strong>our first job is not to build, but to learn</strong>.</p>
<hr>
<h2 id="2-break-the-feature-until-it-can-be-deployed">2. Break the Feature Until It Can Be Deployed<a class="anchor" href="#2-break-the-feature-until-it-can-be-deployed">#</a></h2>
<p>Large features fail in predictable ways. They take too long, hide feedback, and accumulate irreversible decisions.</p>
<p>The antidote is deceptively simple: <strong>never build a feature as a single unit</strong>.</p>
<p>Instead of asking, “How do we deliver this feature?”, ask:</p>
<blockquote class='book-hint '>
<p>“What is the smallest version of this that we can deploy to production?”</p>
</blockquote><p>This is not about cutting corners. It’s about <strong>vertical slicing</strong> - delivering thin, end-to-end increments that work in the real system.</p>
<p>This step is also <strong>iterative with the effort vs. risk assessment</strong>.
Breaking a feature apart is often how hidden risk reveals itself. What initially looked like a single medium-effort task may turn out to contain a high-risk component that deserves its own experiment, or a low-risk slice that can be shipped immediately.</p>
<p>Each slice should:</p>
<ul>
<li>Be deployable on its own</li>
<li>Reduce uncertainty</li>
<li>Move the system closer to the final vision</li>
</ul>
<p>Sometimes the first slice delivers no visible user value. That’s fine. Internal value counts too:</p>
<ul>
<li>A backend capability behind a flag</li>
<li>A new data pipeline with no UI</li>
<li>A manual workflow that validates demand</li>
</ul>
<p>If it can’t be deployed, it’s too big.</p>
<p>Breaking work into small components does more than improve delivery speed. It changes how teams think. Progress becomes measurable. Risk becomes localized. Decisions become reversible.</p>
<hr>
<h2 id="3-fail-fast-fail-often---on-purpose">3. Fail Fast, Fail Often - On Purpose<a class="anchor" href="#3-fail-fast-fail-often---on-purpose">#</a></h2>
<p>Failure has a bad reputation in engineering cultures, usually because it arrives late and costs too much.</p>
<p>But failure itself isn’t the problem. <strong>Delayed failure is</strong>.</p>
<p>When we break features into deployable parts, we unlock the ability to fail early - when failure is cheap and informative.</p>
<p>Failing fast means:</p>
<ul>
<li>Shipping before we feel “ready”</li>
<li>Exposing assumptions to real users</li>
<li>Letting reality correct our plans</li>
</ul>
<p>This requires operational discipline:</p>
<ul>
<li>Feature flags to control exposure</li>
<li>Incremental rollouts</li>
<li>Monitoring from day one</li>
</ul>
<p>It also requires cultural discipline. Teams must understand that early negative signals are not a sign of incompetence, but a sign that the system is working.</p>
<p>The goal is not to avoid failure. The goal is to <strong>maximize learning per unit of effort</strong>.</p>
<hr>
<h2 id="4-define-measurable-kpis-before-you-write-code">4. Define Measurable KPIs Before You Write Code<a class="anchor" href="#4-define-measurable-kpis-before-you-write-code">#</a></h2>
<p>A feature without success metrics is not a feature - it’s a hypothesis.</p>
<p>Before implementation begins, we must be able to answer a simple question:</p>
<blockquote class='book-hint '>
<p>“How will we know if this worked?”</p>
</blockquote><p>Good KPIs are:</p>
<ul>
<li><strong>Measurable</strong>: based on observable data</li>
<li><strong>Actionable</strong>: they inform a decision</li>
<li><strong>Aligned</strong>: they reflect real user or business value</li>
</ul>
<p>Examples include:</p>
<ul>
<li>Adoption rate</li>
<li>Frequency of use</li>
<li>Retention impact</li>
<li>Performance or cost improvements</li>
<li>Time saved for users</li>
</ul>
<p>Vanity metrics don’t count. “It feels useful” is not a KPI.</p>
<p>One often-overlooked detail: <strong>KPIs are not free</strong>.
Tracking them requires instrumentation, logging, dashboards, and ongoing maintenance. That effort must be part of the feature’s cost from day one — not an afterthought.</p>
<p>If a metric is important enough to define success, it is important enough to build proper visibility for.</p>
<p>KPIs serve a second, equally important role: <strong>they give us permission to stop</strong>.</p>
<p>If a feature fails to move its metrics after sufficient iteration, the data gives us cover to deprecate it. This is how organizations avoid accumulating dead weight disguised as progress.</p>
<hr>
<h2 id="the-system-matters-more-than-any-feature">The System Matters More Than Any Feature<a class="anchor" href="#the-system-matters-more-than-any-feature">#</a></h2>
<p>These four principles are not independent. They reinforce each other.</p>
<p>Evaluating effort vs. risk pushes us to reduce uncertainty early.
Breaking features into small deployable parts enables fast learning.
Failing fast shortens feedback loops.
KPIs anchor decisions in reality.</p>
<p>Together, they form a system designed for learning, not heroics.</p>
<p>As CTOs, our real responsibility is not to ship features. It is to build organizations that can discover what to ship - efficiently, repeatedly, and with humility.</p>
<p>In the long run, the teams that win are not the ones that build the most. They are the ones that learn the fastest.</p>
<hr>
<h2 id="references-and-further-reading">References and Further Reading<a class="anchor" href="#references-and-further-reading">#</a></h2>
<ol>
<li>
<p><strong>Vertical Slicing</strong>: Alistair Cockburn, &ldquo;Walking Skeleton&rdquo; pattern in <em>Crystal Clear: A Human-Powered Methodology for Small Teams</em> (2004)</p>
</li>
<li>
<p><strong>Effort vs. Risk Assessment</strong>: Similar to the Eisenhower Matrix adapted for engineering; see also <em>The Lean Startup</em> by Eric Ries (2011) on validated learning and hypothesis testing</p>
</li>
<li>
<p><strong>Feature Flags &amp; Progressive Delivery</strong>: Pete Hodgson, &ldquo;Feature Toggles (aka Feature Flags)&rdquo; (martinfowler.com, 2017); LaunchDarkly&rsquo;s <em>Effective Feature Management</em> (2020)</p>
</li>
<li>
<p><strong>Fail Fast Philosophy</strong>: Jim Shore, &ldquo;Fail Fast&rdquo; in <em>The Art of Agile Development</em> (2007); also related to the &ldquo;Build-Measure-Learn&rdquo; feedback loop from Lean Startup methodology</p>
</li>
<li>
<p><strong>Measurable KPIs</strong>: Dan Olsen, <em>The Lean Product Playbook</em> (2015), Chapter 7 on metrics that matter; Cagan &amp; Jones, <em>Empowered</em> (2020) on product team accountability</p>
</li>
<li>
<p><strong>Incremental Development</strong>: Kent Beck, <em>Extreme Programming Explained</em> (2004) on small releases and continuous integration</p>
</li>
<li>
<p><strong>Learning as Core Practice</strong>: Jez Humble et al., <em>Lean Enterprise</em> (2014) on creating a culture of experimentation and learning</p>
</li>
</ol>
]]></content:encoded></item></channel></rss>