<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohammad Jodeh</title>
    <description>The latest articles on DEV Community by Mohammad Jodeh (@mjodeh).</description>
    <link>https://dev.to/mjodeh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F237256%2F6a7b9cdb-383b-4f02-a681-455c77d1feba.png</url>
      <title>DEV Community: Mohammad Jodeh</title>
      <link>https://dev.to/mjodeh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mjodeh"/>
    <language>en</language>
    <item>
      <title>Product Engineering Alignment</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Sun, 23 Aug 2026 06:31:33 +0000</pubDate>
      <link>https://dev.to/mjodeh/product-engineering-alignment-lj</link>
      <guid>https://dev.to/mjodeh/product-engineering-alignment-lj</guid>
      <description>&lt;p&gt;A feature takes three days to code and three weeks to deliver. The difference is not always engineering capacity.&lt;/p&gt;

&lt;p&gt;A developer starts implementation and discovers that an eligibility rule is undefined. Product needs an answer from operations. A missing UX state appears next. Then engineering finds that the requested behavior conflicts with the current data model, which forces a scope decision.&lt;/p&gt;

&lt;p&gt;The code may still take three days. The delivery system takes three weeks.&lt;br&gt;
This is where &lt;strong&gt;product engineering alignment&lt;/strong&gt; becomes an engineering leadership problem. The visible work happens in code, but much of the elapsed time happens between decisions: waiting for clarification, resolving constraints, revisiting scope, and discovering assumptions that should have surfaced earlier.&lt;/p&gt;

&lt;p&gt;The common response is to improve requirements, add meetings, or demand better estimates. Those actions may help, but they do not address the core issue. Product-engineering alignment is primarily a &lt;strong&gt;decision-flow problem&lt;/strong&gt;.&lt;br&gt;
The useful question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are product and engineering communicating enough?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where does work stop because the person holding it cannot make the next decision?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question is more useful because it exposes where delivery actually slows down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Product and Engineering Become a Delivery Bottleneck
&lt;/h2&gt;

&lt;p&gt;Product and engineering approach the same feature with different knowledge. Product typically understands the customer problem, business priorities, stakeholder expectations, commercial constraints, and desired outcome. Engineering typically understands architecture, dependencies, operational risk, implementation alternatives, and the cost of changing the system. Neither side has the full picture, that is normal.&lt;/p&gt;

&lt;p&gt;The problem begins when the process assumes one side can finish its thinking before the other begins. Consider a requirement that appears simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Allow customers to cancel an order.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Engineering cannot implement that correctly without answering several questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Until what stage can an order be cancelled?&lt;/li&gt;
&lt;li&gt;What happens to a captured payment?&lt;/li&gt;
&lt;li&gt;When does inventory become available again?&lt;/li&gt;
&lt;li&gt;Can support override the restriction?&lt;/li&gt;
&lt;li&gt;What happens after fulfillment starts?&lt;/li&gt;
&lt;li&gt;Are some products excluded?
Some are business decisions. Some reveal technical constraints. Others may require operations, finance, or support. The issue is not that the requirement was badly written. The issue is that the requirement contains decisions that no single function can complete alone. That is where the queue forms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Product Engineering Handoff Is the Wrong Mental Model
&lt;/h2&gt;

&lt;p&gt;Many organizations still operate with an implicit flow like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Product defines → Engineering estimates → Engineering builds → Product accepts&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model is appealing because ownership appears clean. It is also misleading. Implementation is not just execution. It is also discovery.&lt;br&gt;
A developer may discover that the data required by the feature has never been stored. A proposed workflow may depend on an external API that cannot support it. A supposedly expensive feature may have a much cheaper technical alternative. Those discoveries change the product decision.&lt;br&gt;
That means the &lt;strong&gt;product engineering handoff&lt;/strong&gt; cannot be treated as a one-way transfer of finished information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements contain assumptions
&lt;/h3&gt;

&lt;p&gt;A requirement can be detailed and still be wrong. &lt;br&gt;
Suppose product specifies:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show customers their historical account balance for every month.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The statement looks precise. Engineering investigates and finds that the system stores only the current balance, while historical transaction data is incomplete before an earlier migration. The problem is no longer implementation. Now product must decide whether partial history is acceptable, whether another data source exists, or whether the feature itself should change. The requirement did not fail because it needed more documentation. It failed because an assumption remained invisible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical discovery continues after implementation starts
&lt;/h3&gt;

&lt;p&gt;Trying to remove all uncertainty before engineering begins creates another failure mode: teams spend excessive effort defining decisions that are cheap to change while still missing technical risks that only appear through investigation. The objective should not be zero iteration. The objective should be to avoid &lt;strong&gt;expensive late iteration&lt;/strong&gt;. That requires product engineering collaboration where uncertainty is costly, not everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Product Requirements Are Not Enough
&lt;/h2&gt;

&lt;p&gt;When delivery repeatedly breaks around unclear requirements, the natural response is to demand better PRDs, stricter acceptance criteria, or stronger definitions of ready. Those practices can help. But documentation is not the same as decision-making. A 15-page specification can preserve an unresolved question just as effectively as a three-line ticket.&lt;/p&gt;

&lt;p&gt;Suppose a requirement says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The dashboard must update in real time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The sentence is clear. The intent may not be. Engineering may find that true real-time updates require significant infrastructure work, while a 30-second refresh would satisfy the actual user need at much lower cost.&lt;br&gt;
If engineering is involved only after the solution is already committed, the conversation often becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why is engineering pushing back?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If engineering is involved while the solution is still flexible, the conversation becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the simplest reliable way to achieve the outcome?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a better product decision. Good &lt;strong&gt;product requirements&lt;/strong&gt; should create shared understanding. They should not function as contracts that transfer uncertainty from product to engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Misalignment Creates Software Delivery Bottlenecks
&lt;/h2&gt;

&lt;p&gt;Poor alignment rarely appears as one dramatic failure. It appears as repeated friction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Waiting
&lt;/h3&gt;

&lt;p&gt;Engineering reaches a business-rule question and stops. The developer may switch tasks, but the original feature continues ageing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rework
&lt;/h3&gt;

&lt;p&gt;Engineering makes a reasonable assumption because no decision is available. The assumption is later rejected. The implementation may be technically correct and still need to be replaced.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overbuilding
&lt;/h3&gt;

&lt;p&gt;Engineering solves a broader problem than the business actually needs. The team adds flexibility, configuration, or abstraction that never creates corresponding value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Underbuilding
&lt;/h3&gt;

&lt;p&gt;A business or operational constraint appears late and forces changes to workflows, APIs, storage, or validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scope churn
&lt;/h3&gt;

&lt;p&gt;A feature appears to expand throughout development. Sometimes that is genuine scope creep. Sometimes the original scope was never actually resolved. These are often diagnosed as estimation failures, productivity problems, or &lt;strong&gt;engineering communication&lt;/strong&gt; issues.&lt;/p&gt;

&lt;p&gt;But if work repeatedly stops around decisions, adding more developers will not remove the constraint. It will give you more developers waiting for the same answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product and Engineering Communication Problems Are Usually One of Three Things
&lt;/h2&gt;

&lt;p&gt;Before improving communication, identify what kind of problem you actually have. Many &lt;strong&gt;product and engineering communication problems&lt;/strong&gt; fall into three categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Missing information
&lt;/h3&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does someone already know the answer?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suppose engineering needs to know whether premium customers can bypass a transaction limit, and product already has an approved policy. That is not a decision problem. It is an information-access problem.&lt;/p&gt;

&lt;p&gt;The fix may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better documentation&lt;/li&gt;
&lt;li&gt;clearer tickets&lt;/li&gt;
&lt;li&gt;searchable decision records&lt;/li&gt;
&lt;li&gt;easier access to the responsible person&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not create a meeting to rediscover an answer that already exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Unresolved decisions
&lt;/h3&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Has the organization actually decided this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suppose the question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should happen when an order is partially fulfilled?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If nobody has decided, better documentation will not help. The team needs the right people to make the decision. That may involve product, engineering, operations, finance, or another owner.&lt;/p&gt;

&lt;p&gt;The key is to recognize the difference between missing information and missing decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hidden assumptions
&lt;/h3&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are both sides working from the same interpretation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Product may assume "cancel" means before fulfillment begins. Engineering may assume cancellation must work at any point before delivery. &lt;br&gt;
Nobody asks because both sides believe the requirement is obvious.&lt;/p&gt;

&lt;p&gt;Hidden assumptions are often more dangerous than unanswered questions because they do not look unresolved.&lt;/p&gt;

&lt;p&gt;A useful pre-implementation question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are we assuming in order to build this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That tends to reveal more risk than asking whether the ticket is clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improve Product Engineering Alignment by Moving the Right Decisions Earlier
&lt;/h2&gt;

&lt;p&gt;"Move decisions earlier" can easily become heavyweight upfront design. That is not the goal. Not every decision deserves the same amount of attention.&lt;/p&gt;

&lt;p&gt;A better model is to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the cost of discovering later that this decision was wrong?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Resolve high-cost uncertainty early
&lt;/h3&gt;

&lt;p&gt;Investigate early when a mistake could invalidate a large part of the implementation.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the required data exists&lt;/li&gt;
&lt;li&gt;core business rules&lt;/li&gt;
&lt;li&gt;external-system dependencies&lt;/li&gt;
&lt;li&gt;regulatory constraints&lt;/li&gt;
&lt;li&gt;data ownership&lt;/li&gt;
&lt;li&gt;major API contracts&lt;/li&gt;
&lt;li&gt;architecture choices that are difficult to reverse&lt;/li&gt;
&lt;li&gt;performance requirements that affect system design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer could fundamentally change scope, cost, or feasibility, it deserves early attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep cheap decisions flexible
&lt;/h3&gt;

&lt;p&gt;Other decisions are inexpensive to change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copy&lt;/li&gt;
&lt;li&gt;minor validation behavior&lt;/li&gt;
&lt;li&gt;internal implementation details&lt;/li&gt;
&lt;li&gt;small layout choices&lt;/li&gt;
&lt;li&gt;whether a confirmation appears inline or in a modal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trying to freeze all of these before development creates process without reducing meaningful risk.&lt;/p&gt;

&lt;p&gt;A practical rule is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Resolve expensive uncertainty early. Preserve flexibility where change is cheap.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is one of the most effective ways to &lt;strong&gt;improve product engineering alignment&lt;/strong&gt; without making the delivery process heavier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replace Handoffs With Decision Ownership
&lt;/h2&gt;

&lt;p&gt;Reducing handoffs does not mean everyone participates in every decision. That would create another bottleneck. Healthy collaboration still requires clear ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product owns the problem and priority
&lt;/h3&gt;

&lt;p&gt;Product should be able to explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who has the problem&lt;/li&gt;
&lt;li&gt;what outcome matters&lt;/li&gt;
&lt;li&gt;why it matters now&lt;/li&gt;
&lt;li&gt;which constraints are non-negotiable&lt;/li&gt;
&lt;li&gt;what can be traded&lt;/li&gt;
&lt;li&gt;how success will be evaluated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Product does not need to prescribe every implementation detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering owns technical feasibility and trade-offs
&lt;/h3&gt;

&lt;p&gt;Engineering should expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architectural constraints&lt;/li&gt;
&lt;li&gt;dependencies&lt;/li&gt;
&lt;li&gt;operational risks&lt;/li&gt;
&lt;li&gt;implementation alternatives&lt;/li&gt;
&lt;li&gt;major differences in cost&lt;/li&gt;
&lt;li&gt;technical decisions that will be difficult to reverse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering should not hide those choices behind a single estimate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared decisions still need an owner
&lt;/h3&gt;

&lt;p&gt;Some decisions require input from both sides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reduce scope or delay delivery&lt;/li&gt;
&lt;li&gt;choose a temporary solution or a long-term design&lt;/li&gt;
&lt;li&gt;accept slower performance or invest in infrastructure&lt;/li&gt;
&lt;li&gt;simplify UX to avoid disproportionate implementation complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collaboration improves the information available to the decision-maker. It does not remove accountability. A team can disagree and still be aligned if ownership is clear, the trade-off is understood, and the work can continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Healthy Product Engineering Collaboration Looks Like
&lt;/h2&gt;

&lt;p&gt;Healthy collaboration is visible in delivery behavior, not meeting count. Engineering is involved while important solution choices are still flexible.&lt;br&gt;
Product can question technical complexity without treating engineering estimates as resistance.&lt;br&gt;
Engineers can challenge requirements without being treated as blockers.&lt;br&gt;
Important decisions and their rationale are recorded.&lt;br&gt;
Teams distinguish required outcomes from proposed implementations.&lt;br&gt;
Unresolved decisions are escalated before they sit silently inside tickets.&lt;br&gt;
When engineering discovers something that materially changes the cost or feasibility of a feature, product can revisit scope.&lt;br&gt;
None of this requires permanent synchronization.&lt;/p&gt;

&lt;p&gt;The objective is not more communication. It is lower &lt;strong&gt;decision latency&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-Assisted Development Moves the Constraint Upstream
&lt;/h2&gt;

&lt;p&gt;AI-assisted development can accelerate some implementation work, but the effect varies by task, codebase, tooling, and review requirements. That limitation matters.&lt;br&gt;
Even so, when coding becomes faster for a particular class of work, the surrounding delays become more visible. Imagine an AI coding agent implements a well-written ticket quickly. The implementation passes review. A stakeholder then points out that the ticket encoded the wrong refund policy. The organization has produced the wrong software faster.&lt;br&gt;
The coding tool did not create the problem. The unresolved assumption entered the system before implementation. This is why faster code generation does not automatically remove &lt;strong&gt;software delivery bottlenecks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Approval, prioritization, requirement clarification, architecture decisions, stakeholder input, and ownership can still move at the same speed.&lt;/p&gt;

&lt;p&gt;As implementation becomes cheaper in some areas, deciding what to build and validating the assumptions behind it become relatively more important. AI can reduce parts of the cost of producing software. It does not automatically reduce the cost of deciding what software should be produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Way to Find the Real Bottleneck
&lt;/h2&gt;

&lt;p&gt;Engineering leaders do not need to redesign the entire product process to diagnose this problem. Start with one feature that felt slower than it should have been. Reconstruct its path from request to production.&lt;/p&gt;

&lt;p&gt;Record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;active implementation time&lt;/li&gt;
&lt;li&gt;waiting time&lt;/li&gt;
&lt;li&gt;clarification cycles&lt;/li&gt;
&lt;li&gt;decision points&lt;/li&gt;
&lt;li&gt;scope changes&lt;/li&gt;
&lt;li&gt;rework&lt;/li&gt;
&lt;li&gt;approval delays&lt;/li&gt;
&lt;li&gt;stakeholder rejection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then inspect every meaningful pause and ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why could this feature not move forward?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Classify the answer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Technical execution&lt;/strong&gt; — engineering genuinely needed more time to build or validate the change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing information&lt;/strong&gt; — the answer existed but was not available to the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unresolved decision&lt;/strong&gt; — someone needed to make a choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External dependency&lt;/strong&gt; — another team, vendor, or system blocked progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval&lt;/strong&gt; — a decision existed but required authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacity constraint&lt;/strong&gt; — the required person or team could not take the work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then repeat the exercise across several features.&lt;/p&gt;

&lt;p&gt;Do not focus on isolated delays. Look for recurring patterns.&lt;br&gt;
If every pricing change waits for one executive, the bottleneck is decision authority.&lt;br&gt;
If architectural choices queue behind one principal engineer, the bottleneck is technical decision capacity.&lt;br&gt;
If features repeatedly reopen because business rules appear after implementation, the bottleneck is discovery and requirement shaping.&lt;br&gt;
If teams commit dates before investigating external dependencies, the bottleneck is sequencing.&lt;/p&gt;

&lt;p&gt;Those are system problems. Asking individual teams to communicate better will not fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alignment Is About Flow, Not More Meetings
&lt;/h2&gt;

&lt;p&gt;Effective &lt;strong&gt;product engineering alignment&lt;/strong&gt; does not require perfect requirements, permanent agreement, or product and engineering attending every discussion together.&lt;/p&gt;

&lt;p&gt;It requires a delivery system where important decisions reach the right people before uncertainty becomes expensive code, rework, or waiting. That changes the leadership question.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why is engineering taking so long?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where did this feature spend time unable to move forward, and what decision was it waiting for?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer really will be engineering capacity.&lt;br&gt;
Sometimes the architecture is the constraint.&lt;br&gt;
Sometimes the feature is simply difficult.&lt;/p&gt;

&lt;p&gt;But when implementation is not the bottleneck, adding developers, expanding PRDs, or creating more status meetings will not increase delivery speed.&lt;br&gt;
Sometimes the fastest way to ship more software is to shorten the distance between a question and the person who can decide it.&lt;br&gt;
&lt;strong&gt;Discussion question:&lt;/strong&gt; Where does work most often stop in your organization: implementation, missing information, unresolved decisions, or approval?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>Get $175 Free Claude Code Credits</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Sat, 22 Aug 2026 05:41:39 +0000</pubDate>
      <link>https://dev.to/mjodeh/get-175-free-claude-code-credits-32dm</link>
      <guid>https://dev.to/mjodeh/get-175-free-claude-code-credits-32dm</guid>
      <description>&lt;p&gt;Claude Code is extremely useful for software development, but heavy API usage can become expensive.&lt;/p&gt;

&lt;p&gt;If you want to try Claude Code without immediately paying for Anthropic API usage, &lt;strong&gt;AgentRouter&lt;/strong&gt; provides another option.&lt;/p&gt;

&lt;p&gt;By registering through my referral link &lt;strong&gt;using your GitHub account&lt;/strong&gt;, you can get &lt;strong&gt;$175 in free AgentRouter credits&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://agentrouter.org/register?aff=hZk2" rel="noopener noreferrer"&gt;Register with AgentRouter using GitHub and get $175 in free credits&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use your AgentRouter balance with supported coding agents including &lt;strong&gt;Claude Code and Codex&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This is my referral link, so I may also receive referral benefits when you register through it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Is AgentRouter?
&lt;/h2&gt;

&lt;p&gt;AgentRouter acts as an API gateway between coding agents and AI models.&lt;/p&gt;

&lt;p&gt;Instead of Claude Code sending requests directly to Anthropic, you can configure it to send requests through AgentRouter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code
     ↓
AgentRouter
     ↓
AI Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You create an AgentRouter account, generate an API token, and temporarily configure Claude Code to use AgentRouter.&lt;/p&gt;

&lt;p&gt;The advantage of using temporary configuration is that it only affects the terminal session where you set it.&lt;/p&gt;

&lt;p&gt;Close the terminal, and your normal Claude Code configuration remains unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Register with Your GitHub Account and Get $175 in Free Credits
&lt;/h2&gt;

&lt;p&gt;Open my referral link:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://agentrouter.org/register?aff=hZk2" rel="noopener noreferrer"&gt;https://agentrouter.org/register?aff=hZk2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When registering, &lt;strong&gt;sign up using your GitHub account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is important for the signup credit, so do not create the account using another sign-in method if you want to receive the promotional credits through the referral.&lt;/p&gt;

&lt;p&gt;After registration, log in to AgentRouter and check your account balance.&lt;/p&gt;

&lt;p&gt;You should receive &lt;strong&gt;$175 in free credits&lt;/strong&gt; that can be used with supported tools such as Claude Code and Codex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create an AgentRouter API Token
&lt;/h2&gt;

&lt;p&gt;After logging in to AgentRouter, create an API token.&lt;/p&gt;

&lt;p&gt;It should look similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sk-xxxxxxxxxxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the token somewhere safe.&lt;/p&gt;

&lt;p&gt;Do not commit it to Git or store it inside your source code.&lt;/p&gt;

&lt;p&gt;You will use this token to temporarily configure Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Install Claude Code
&lt;/h2&gt;

&lt;p&gt;If Claude Code is already installed, you can skip this step.&lt;/p&gt;

&lt;p&gt;Otherwise, install it using npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Configure Claude Code Temporarily on macOS or Linux
&lt;/h2&gt;

&lt;p&gt;Open a terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://agentrouter.org/
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxx
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sk-xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with your actual AgentRouter API token.&lt;/p&gt;

&lt;p&gt;Then navigate to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and start Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code will now use AgentRouter for requests made from that terminal session.&lt;/p&gt;

&lt;p&gt;The important part is that &lt;code&gt;export&lt;/code&gt; only changes the environment of the current shell.&lt;/p&gt;

&lt;p&gt;Once you close the terminal, these variables disappear.&lt;/p&gt;

&lt;p&gt;Your normal Claude Code configuration is not permanently changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Configure Claude Code Temporarily on Windows PowerShell
&lt;/h2&gt;

&lt;p&gt;On Windows PowerShell, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://agentrouter.org/"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-xxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-xxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sk-xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with your AgentRouter API token.&lt;/p&gt;

&lt;p&gt;Then navigate to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my-project&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and start Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;claude&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Claude Code will use AgentRouter for as long as this PowerShell session remains open.&lt;/p&gt;

&lt;p&gt;If you close the PowerShell window, the environment variables disappear.&lt;/p&gt;

&lt;p&gt;This means you don't have to modify your system-wide environment variables or permanently replace your existing Claude Code configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching Back to Your Normal Claude Code Setup
&lt;/h2&gt;

&lt;p&gt;Because the configuration is temporary, switching back is simple.&lt;/p&gt;

&lt;p&gt;Just close the terminal where you configured AgentRouter.&lt;/p&gt;

&lt;p&gt;Then open a new terminal and start Claude Code normally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The new terminal will not contain the temporary AgentRouter environment variables.&lt;/p&gt;

&lt;p&gt;This makes it easy to switch between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Terminal 1
Claude Code → AgentRouter

Terminal 2
Claude Code → Your normal configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without continuously changing system settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Codex?
&lt;/h2&gt;

&lt;p&gt;AgentRouter also supports &lt;strong&gt;Codex&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I am not including the Codex configuration here because its setup is different from Claude Code and may change as Codex and AgentRouter evolve.&lt;/p&gt;

&lt;p&gt;For the current Codex configuration, follow the AgentRouter documentation directly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/agentrouter-org/docs/blob/main/start.md" rel="noopener noreferrer"&gt;AgentRouter Documentation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same AgentRouter credits can be used across supported tools, so the &lt;strong&gt;$175 signup credit&lt;/strong&gt; is not limited to Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Security Consideration
&lt;/h2&gt;

&lt;p&gt;AgentRouter is a third-party API gateway.&lt;/p&gt;

&lt;p&gt;When you configure Claude Code this way, requests go through AgentRouter rather than directly to Anthropic.&lt;/p&gt;

&lt;p&gt;That is important if you are working with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proprietary company source code&lt;/li&gt;
&lt;li&gt;customer information&lt;/li&gt;
&lt;li&gt;credentials or secrets&lt;/li&gt;
&lt;li&gt;confidential documents&lt;/li&gt;
&lt;li&gt;security-sensitive projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those environments, review AgentRouter's privacy, security, and data-retention policies before routing sensitive information through the service.&lt;/p&gt;

&lt;p&gt;For personal projects, experiments, and non-sensitive repositories, the free credits can be a convenient way to experiment with Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get $175 in Free AgentRouter Credits
&lt;/h2&gt;

&lt;p&gt;If you want to try Claude Code or use AgentRouter with other supported coding agents such as Codex, you can start with the &lt;strong&gt;$175 free registration credit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Register through my referral link &lt;strong&gt;using your GitHub account&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://agentrouter.org/register?aff=hZk2" rel="noopener noreferrer"&gt;Register with GitHub and get $175 in free AgentRouter credits&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then the process is simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open the referral link
   ↓
Sign up with GitHub
   ↓
Get $175 in credits
   ↓
Create an AgentRouter API token
   ↓
Temporarily configure Claude Code
   ↓
Start coding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude Code, the temporary configuration is:&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS / Linux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://agentrouter.org/
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxx
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxx
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://agentrouter.org/"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-xxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-xxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;claude&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Close the terminal when you're finished, and your normal configuration remains untouched.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Software Team Scaling: Why More Developers Can Slow Delivery</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Fri, 14 Aug 2026 19:36:07 +0000</pubDate>
      <link>https://dev.to/mjodeh/software-team-scaling-why-more-developers-can-slow-delivery-467n</link>
      <guid>https://dev.to/mjodeh/software-team-scaling-why-more-developers-can-slow-delivery-467n</guid>
      <description>&lt;p&gt;A project is six weeks late. The deadline has not moved. Leadership asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How many developers do we need to add to get back on schedule?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question assumes the delay is caused by insufficient coding capacity.&lt;/p&gt;

&lt;p&gt;Sometimes it is. Often it is not.&lt;/p&gt;

&lt;p&gt;A late project may already be constrained by architecture decisions, unresolved requirements, code review, testing, integration, or a small number of engineers who hold critical knowledge. Adding developers increases theoretical capacity, but it also creates more demand on those constraints.&lt;/p&gt;

&lt;p&gt;That is the central problem in &lt;strong&gt;software team scaling&lt;/strong&gt;: headcount and delivery capacity are not the same thing.&lt;/p&gt;

&lt;p&gt;Before adding engineers, leaders need to answer a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is limiting delivery, and can another developer remove that limitation without creating more coordination than useful work?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Adding Developers Can Slow a Project
&lt;/h2&gt;

&lt;p&gt;A new developer does not enter an existing project as additional net capacity.&lt;/p&gt;

&lt;p&gt;At first, they consume some of it.&lt;/p&gt;

&lt;p&gt;They need to learn the architecture, domain rules, development environment, deployment process, testing conventions, and the decisions that were never written down.&lt;/p&gt;

&lt;p&gt;The people best equipped to teach those things are usually the engineers already carrying the most valuable project knowledge.&lt;/p&gt;

&lt;p&gt;Consider a five-person team approaching a difficult release. Three engineers are added.&lt;/p&gt;

&lt;p&gt;The new developers need help understanding where changes belong, why certain interfaces exist, how production deployments work, and which parts of the system are dangerous to modify.&lt;/p&gt;

&lt;p&gt;The team now has eight developers, but its experienced engineers are spending more time answering questions and reviewing unfamiliar changes.&lt;/p&gt;

&lt;p&gt;Headcount went up immediately.&lt;/p&gt;

&lt;p&gt;Useful capacity may not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coordination becomes part of the work
&lt;/h3&gt;

&lt;p&gt;Growing the team also changes the amount of coordination required to deliver a change.&lt;/p&gt;

&lt;p&gt;The familiar expression for possible pairwise communication paths is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;n(n − 1) / 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is only an illustration. Real teams do not communicate equally through every possible connection.&lt;/p&gt;

&lt;p&gt;But the engineering problem behind it is real: as more people work on related parts of a system, more effort can be spent aligning decisions, resolving dependencies, reviewing changes, and avoiding conflicting implementations.&lt;/p&gt;

&lt;p&gt;The relevant question is therefore not how many people can be assigned to a project.&lt;/p&gt;

&lt;p&gt;It is how many people can make meaningful progress &lt;strong&gt;independently&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faster implementation can simply move the queue
&lt;/h3&gt;

&lt;p&gt;Suppose the extra developers eventually start producing code quickly.&lt;/p&gt;

&lt;p&gt;That still does not guarantee faster delivery.&lt;/p&gt;

&lt;p&gt;Imagine twelve engineers producing changes that depend on two senior engineers for approval. Implementation accelerates, but review capacity does not.&lt;/p&gt;

&lt;p&gt;Pull requests accumulate.&lt;/p&gt;

&lt;p&gt;The organization has successfully increased coding throughput and failed to increase delivery throughput.&lt;/p&gt;

&lt;p&gt;The same thing can happen in QA, integration, security review, deployment, or product decision-making.&lt;/p&gt;

&lt;p&gt;This distinction matters because &lt;strong&gt;engineering team productivity&lt;/strong&gt; should be measured at the level of completed work, not merely implementation activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Brooks's Law Actually Tells Us
&lt;/h2&gt;

&lt;p&gt;Brooks's law is commonly summarized as the idea that adding people to a late software project can make it later.&lt;/p&gt;

&lt;p&gt;Its value is not that it gives leaders a rule to reject additional staffing.&lt;/p&gt;

&lt;p&gt;Its value is that it exposes three costs that headcount planning can overlook:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;onboarding&lt;/li&gt;
&lt;li&gt;coordination&lt;/li&gt;
&lt;li&gt;work that cannot be divided safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mistake is turning Brooks's law into “never add developers to a late project.”&lt;/p&gt;

&lt;p&gt;That conclusion is too broad.&lt;/p&gt;

&lt;p&gt;Suppose four external integrations must be completed. Each has a stable API, separate tests, little shared code, and clear ownership.&lt;/p&gt;

&lt;p&gt;Those workstreams can run largely in parallel. Adding experienced developers may genuinely shorten delivery time.&lt;/p&gt;

&lt;p&gt;The more useful interpretation is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adding people helps when the amount of independently executable work grows faster than the coordination required to perform it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the real scaling constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Team Scaling Depends on Parallel Work
&lt;/h2&gt;

&lt;p&gt;Imagine two eight-person teams.&lt;/p&gt;

&lt;p&gt;The first works on a tightly coupled application. Most changes touch the same shared modules, database schema, test environment, and release pipeline.&lt;/p&gt;

&lt;p&gt;The second owns distinct components connected through stable contracts.&lt;/p&gt;

&lt;p&gt;The teams have identical headcount. Their ability to work in parallel is very different.&lt;/p&gt;

&lt;p&gt;This is why architecture affects organizational scalability.&lt;/p&gt;

&lt;p&gt;A well-structured modular monolith may allow teams to move more independently than a poorly designed microservice architecture where one feature requires changes across four services and three teams.&lt;/p&gt;

&lt;p&gt;The architectural style is not the important part.&lt;/p&gt;

&lt;p&gt;The important properties are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stable interfaces&lt;/li&gt;
&lt;li&gt;clear ownership&lt;/li&gt;
&lt;li&gt;limited cross-team dependencies&lt;/li&gt;
&lt;li&gt;predictable contracts&lt;/li&gt;
&lt;li&gt;tests that can run without coordinating the entire system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A backlog containing 100 tasks does not necessarily contain 100 pieces of parallel work.&lt;/p&gt;

&lt;p&gt;A better question for engineering leaders is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which of these tasks can proceed without waiting for the same people, decisions, components, or environments?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That tells you much more about scaling potential than backlog size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the Bottleneck Before You Add Developers
&lt;/h2&gt;

&lt;p&gt;Adding developers to projects only solves one class of problem: insufficient implementation capacity.&lt;/p&gt;

&lt;p&gt;Before increasing headcount, map the actual delivery flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirement → design → implementation → review → testing → integration → deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then look for where work waits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Knowledge bottleneck
&lt;/h3&gt;

&lt;p&gt;One engineer understands a legacy billing component.&lt;/p&gt;

&lt;p&gt;Every change involving billing eventually reaches that person.&lt;/p&gt;

&lt;p&gt;Adding four developers who all need that engineer's help increases pressure on the bottleneck instead of removing it.&lt;/p&gt;

&lt;p&gt;A better intervention might be pairing another experienced engineer with the specialist, documenting the subsystem, or separating work that does not require billing changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision bottleneck
&lt;/h3&gt;

&lt;p&gt;Developers repeatedly stop because product rules are unresolved.&lt;/p&gt;

&lt;p&gt;Adding people gives the organization more engineers waiting for the same decision.&lt;/p&gt;

&lt;p&gt;The solution is not additional implementation capacity. It is faster or clearer decision-making.&lt;/p&gt;

&lt;h3&gt;
  
  
  Review bottleneck
&lt;/h3&gt;

&lt;p&gt;Developers finish code quickly, but a small number of senior engineers review every important change.&lt;/p&gt;

&lt;p&gt;Before hiring more implementers, ask whether review ownership can be distributed or whether boundaries can be changed so every modification no longer needs the same approval path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing or deployment bottleneck
&lt;/h3&gt;

&lt;p&gt;If every feature waits for one shared environment or a manual release process, more implementation may only increase work in progress.&lt;/p&gt;

&lt;p&gt;This is why developer busyness is a weak argument for increasing team size.&lt;/p&gt;

&lt;p&gt;People can be extremely busy inside a system that still spends most of its elapsed time waiting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Adding Engineers to a Late Project Is Especially Risky
&lt;/h2&gt;

&lt;p&gt;Timing changes the equation.&lt;/p&gt;

&lt;p&gt;A developer who becomes valuable over the next year can still be the wrong intervention for a deadline six weeks away.&lt;/p&gt;

&lt;p&gt;Late projects commonly have several problems at once: unfinished work, unresolved dependencies, rushed technical decisions, unstable requirements, and overloaded senior engineers.&lt;/p&gt;

&lt;p&gt;New developers enter that environment with two clocks running.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;time to contribution&lt;/strong&gt;: how long before they can complete useful work independently?&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;time remaining&lt;/strong&gt;: how long before the delivery deadline?&lt;/p&gt;

&lt;p&gt;If the first approaches or exceeds the second, adding engineers may improve future capacity without improving the current project.&lt;/p&gt;

&lt;p&gt;This is the practical explanation for &lt;strong&gt;why adding developers slows projects&lt;/strong&gt; that are already late.&lt;/p&gt;

&lt;p&gt;The benefit is delayed. The coordination cost starts immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Adding More Engineers Actually Works
&lt;/h2&gt;

&lt;p&gt;Additional capacity is most useful when it can be directed at work that does not create another dependency on the critical path.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a well-defined external integration&lt;/li&gt;
&lt;li&gt;a separate migration&lt;/li&gt;
&lt;li&gt;an isolated reporting component&lt;/li&gt;
&lt;li&gt;test automation that removes manual validation&lt;/li&gt;
&lt;li&gt;tooling that eliminates repetitive release work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Specialists can also be more valuable than additional general capacity.&lt;/p&gt;

&lt;p&gt;If releases are blocked by database problems, an experienced database engineer may have more impact than several application developers.&lt;/p&gt;

&lt;p&gt;If deployments repeatedly fail, strengthening reliability or release engineering may be the better investment.&lt;/p&gt;

&lt;p&gt;Internal transfers also deserve different treatment from new hires. An engineer who already knows the domain, systems, and organizational conventions may reach useful independence much faster.&lt;/p&gt;

&lt;p&gt;So the staffing question should not be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can we add three developers?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What capability is missing at the current constraint?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A Five-Question Test Before Increasing Headcount
&lt;/h2&gt;

&lt;p&gt;Before approving additional engineers for a delayed project, answer these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Where does work spend the most time waiting?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Look beyond implementation. Check decisions, review, testing, integration, and deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Can another engineer own useful work independently?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Identify a concrete workstream rather than assuming the backlog can be divided.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Who will absorb the onboarding cost?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If the answer is the same senior engineers already on the critical path, include that cost in the decision.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Can downstream stages absorb more implementation?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
More code is not useful if review, QA, or deployment cannot process it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Will the added engineer become productive before the deadline matters?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Separate long-term hiring decisions from short-term recovery decisions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If those answers are mostly positive, additional engineers may help.&lt;/p&gt;

&lt;p&gt;If they are unclear, restructure the work first.&lt;/p&gt;

&lt;p&gt;If they are mostly negative, headcount is unlikely to fix the current delay.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Scale a Software Team Without Scaling Coordination
&lt;/h2&gt;

&lt;p&gt;When growth is necessary, prepare the system to absorb it.&lt;/p&gt;

&lt;p&gt;Stabilize interfaces before putting more people behind them. Agree on API contracts, module responsibilities, acceptance criteria, and ownership boundaries early enough that developers can act without repeatedly reopening the same decisions.&lt;/p&gt;

&lt;p&gt;Reduce onboarding dependence on individuals. Make local setup repeatable. Document the architecture decisions that actually affect implementation. Keep examples of established patterns close to the code.&lt;/p&gt;

&lt;p&gt;Increase downstream capacity alongside implementation capacity. If you grow development while leaving review, testing, security, and deployment unchanged, expect the bottleneck to move.&lt;/p&gt;

&lt;p&gt;And when possible, add people gradually.&lt;/p&gt;

&lt;p&gt;You are not merely testing whether new engineers can code. You are testing whether the delivery system can absorb additional contributors without increasing queues and dependencies faster than throughput.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Makes This More Important, Not Less
&lt;/h2&gt;

&lt;p&gt;AI-assisted development can reduce the time required for some implementation tasks. Developers can often generate boilerplate, explore unfamiliar code, create tests, draft documentation, or implement clearly specified changes faster.&lt;/p&gt;

&lt;p&gt;That changes part of the capacity equation.&lt;/p&gt;

&lt;p&gt;It does not remove the system around coding.&lt;/p&gt;

&lt;p&gt;Requirements can still conflict. Interfaces can still be unstable. Architectural decisions still need ownership. Changes still need validation, integration, and safe deployment.&lt;/p&gt;

&lt;p&gt;If implementation becomes significantly faster while those stages remain unchanged, the bottleneck simply becomes easier to see.&lt;/p&gt;

&lt;p&gt;Teams adopting AI-assisted development should therefore ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If we increase the rate at which changes are produced, can the organization increase the rate at which changes are safely accepted?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Faster coding is useful only when the rest of the delivery system can keep up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sometimes the Fastest Scaling Decision Is to Reduce Scope
&lt;/h2&gt;

&lt;p&gt;There is another lever that receives less attention than headcount: reduce the amount of work required before the deadline.&lt;/p&gt;

&lt;p&gt;Suppose a release contains ten features, but only six are necessary for the business outcome.&lt;/p&gt;

&lt;p&gt;Moving four into the next release may shorten the critical path more reliably than introducing several new developers in the final month.&lt;/p&gt;

&lt;p&gt;Other recovery options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;splitting the release into phases&lt;/li&gt;
&lt;li&gt;removing unnecessary dependencies&lt;/li&gt;
&lt;li&gt;freezing nonessential work&lt;/li&gt;
&lt;li&gt;resolving ambiguous requirements immediately&lt;/li&gt;
&lt;li&gt;assigning experienced engineers to critical-path work&lt;/li&gt;
&lt;li&gt;automating a testing or deployment bottleneck&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is not to keep the maximum number of developers occupied.&lt;/p&gt;

&lt;p&gt;The objective is to move valuable software through the delivery system sooner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Team Scaling Is a Throughput Problem
&lt;/h2&gt;

&lt;p&gt;Successful &lt;strong&gt;software team scaling&lt;/strong&gt; is not about maximizing headcount. It is about increasing the amount of work that can move independently through the system.&lt;/p&gt;

&lt;p&gt;When a project is late, first find the constraint. Then determine which work can actually run in parallel, reduce dependencies around the critical path, and add capacity where it changes throughput rather than activity.&lt;/p&gt;

&lt;p&gt;More developers increase the amount of software an organization could produce.&lt;/p&gt;

&lt;p&gt;The structure of the delivery system determines how much of it can actually ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When a project falls behind in your organization, what evidence do you use to decide whether the bottleneck is engineering capacity—or the system around it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why “Move Fast” Is Not an Engineering Strategy</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Mon, 03 Aug 2026 13:57:03 +0000</pubDate>
      <link>https://dev.to/mjodeh/why-move-fast-is-not-an-engineering-strategy-4m3n</link>
      <guid>https://dev.to/mjodeh/why-move-fast-is-not-an-engineering-strategy-4m3n</guid>
      <description>&lt;p&gt;When a release slips, the usual response is predictable: shorten the deadline, add more work to the sprint, and ask engineering to move faster.&lt;/p&gt;

&lt;p&gt;That response confuses urgency with strategy.&lt;/p&gt;

&lt;p&gt;A team can increase activity without improving delivery. Developers can open more pull requests, managers can increase sprint commitments, and product leaders can mark more work as urgent. None of that guarantees that a useful, reliable change reaches production sooner.&lt;/p&gt;

&lt;p&gt;“Move fast” describes a business need. It does not explain how engineering should respond.&lt;/p&gt;

&lt;p&gt;A credible &lt;strong&gt;software delivery strategy&lt;/strong&gt; must answer harder questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What outcome matters most?&lt;/li&gt;
&lt;li&gt;What work should stop?&lt;/li&gt;
&lt;li&gt;Where is delivery actually slowing down?&lt;/li&gt;
&lt;li&gt;Which risks are acceptable?&lt;/li&gt;
&lt;li&gt;Which quality boundaries cannot be crossed?&lt;/li&gt;
&lt;li&gt;How will the organization know whether it became faster?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The central argument is simple: engineering speed is a property of the delivery system, not a personality trait of the people inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Move Fast” Is Too Vague to Guide Engineering Decisions
&lt;/h2&gt;

&lt;p&gt;The instruction to move fast leaves the most important decisions unresolved.&lt;/p&gt;

&lt;p&gt;Does the organization need to release more frequently? Validate a product assumption earlier? Recover from incidents faster? Meet a fixed regulatory deadline? Reduce the time required to onboard customers?&lt;/p&gt;

&lt;p&gt;These are different problems.&lt;/p&gt;

&lt;p&gt;A team trying to validate demand may need a narrow prototype and limited rollout. A team trying to improve reliability may need better observability and rollback procedures. A team trying to deliver a committed roadmap may need to stop lower-priority work.&lt;/p&gt;

&lt;p&gt;Using the same response for every form of urgency usually creates the wrong optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define the type of speed required
&lt;/h3&gt;

&lt;p&gt;Before changing the engineering process, leaders should identify the result they need.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster learning:&lt;/strong&gt; Reduce the time between an idea and evidence from users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster releases:&lt;/strong&gt; Reduce the time between completed code and production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster delivery:&lt;/strong&gt; Reduce the full time from an approved need to a usable outcome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster recovery:&lt;/strong&gt; Reduce the time required to detect and resolve production failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster response:&lt;/strong&gt; Reduce the time needed to react to market, customer, or regulatory changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A team may improve one while making another worse.&lt;/p&gt;

&lt;p&gt;Releasing more frequently does not guarantee faster learning if nobody measures user behavior. Coding faster does not improve recovery time if the system is difficult to observe. Starting more initiatives does not improve delivery if shared dependencies block all of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make trade-offs explicit
&lt;/h3&gt;

&lt;p&gt;Urgent work usually requires a trade-off. The mistake is pretending that no trade-off exists.&lt;/p&gt;

&lt;p&gt;A team may reduce scope while keeping reliability requirements intact. It may accept a temporary manual operation to validate demand before automating it. It may choose a reversible implementation instead of a more elegant long-term design.&lt;/p&gt;

&lt;p&gt;Those choices can be responsible.&lt;/p&gt;

&lt;p&gt;The irresponsible version is allowing teams to infer that testing, security, maintainability, or operational readiness should be reduced because the date has not changed.&lt;/p&gt;

&lt;p&gt;Engineering leaders should state clearly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What can be reduced&lt;/li&gt;
&lt;li&gt;What can be deferred&lt;/li&gt;
&lt;li&gt;What must remain unchanged&lt;/li&gt;
&lt;li&gt;Who accepts the resulting risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this, “move fast engineering” becomes an exercise in hidden risk transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding Speed Is Not Software Delivery Speed
&lt;/h2&gt;

&lt;p&gt;Engineering organizations often focus on coding because it is visible.&lt;/p&gt;

&lt;p&gt;Pull requests can be counted. Tickets can be closed. Story points can be discussed in planning meetings. Waiting is harder to see.&lt;/p&gt;

&lt;p&gt;Consider a feature that requires ten working days of implementation but takes eight weeks to reach production.&lt;/p&gt;

&lt;p&gt;The remaining time may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Five days waiting for product clarification&lt;/li&gt;
&lt;li&gt;One week waiting for another team’s API&lt;/li&gt;
&lt;li&gt;Four days waiting for code review&lt;/li&gt;
&lt;li&gt;One week waiting for a stable test environment&lt;/li&gt;
&lt;li&gt;Several days waiting for security approval&lt;/li&gt;
&lt;li&gt;One week waiting for a release window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this example, asking developers to implement the feature 20% faster saves two days. Removing one approval delay may save a week.&lt;/p&gt;

&lt;p&gt;That is the difference between local productivity and end-to-end &lt;strong&gt;software delivery speed&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measure where work waits
&lt;/h3&gt;

&lt;p&gt;A useful delivery review should reconstruct the actual path of completed work.&lt;/p&gt;

&lt;p&gt;For a small sample of recent features, record:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When the work was requested&lt;/li&gt;
&lt;li&gt;When it became clear enough to start&lt;/li&gt;
&lt;li&gt;When implementation began&lt;/li&gt;
&lt;li&gt;When the first review was requested&lt;/li&gt;
&lt;li&gt;When review completed&lt;/li&gt;
&lt;li&gt;When testing completed&lt;/li&gt;
&lt;li&gt;When the change became deployable&lt;/li&gt;
&lt;li&gt;When it reached production&lt;/li&gt;
&lt;li&gt;When meaningful feedback became available&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is not to create a perfect measurement system. The goal is to find the largest delays.&lt;/p&gt;

&lt;p&gt;This often reveals that the main constraint is not engineering capacity. It may be unclear ownership, unavailable environments, centralized approvals, or too many concurrent priorities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use velocity metrics carefully
&lt;/h3&gt;

&lt;p&gt;Story points can help a team plan its own work. They are weak evidence of organizational productivity.&lt;/p&gt;

&lt;p&gt;A team can increase reported velocity by changing estimation behavior, splitting work differently, or taking on more predictable tasks. None of those necessarily improve customer outcomes.&lt;/p&gt;

&lt;p&gt;Engineering leaders should prefer a balanced view that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lead time&lt;/li&gt;
&lt;li&gt;Cycle time&lt;/li&gt;
&lt;li&gt;Time waiting for review&lt;/li&gt;
&lt;li&gt;Time blocked by dependencies&lt;/li&gt;
&lt;li&gt;Deployment delay&lt;/li&gt;
&lt;li&gt;Rework&lt;/li&gt;
&lt;li&gt;Release predictability&lt;/li&gt;
&lt;li&gt;Production failure patterns&lt;/li&gt;
&lt;li&gt;Time to restore service&lt;/li&gt;
&lt;li&gt;Evidence of customer or business impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics should diagnose the system. They should not be used to rank individual developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Can Accelerate Work and Still Slow Delivery
&lt;/h2&gt;

&lt;p&gt;AI-assisted development changes implementation capacity, but it does not remove the rest of the delivery process.&lt;/p&gt;

&lt;p&gt;A team may use AI to generate code, tests, migration scripts, or documentation faster. That can be valuable.&lt;/p&gt;

&lt;p&gt;But imagine that the team doubles its pull-request volume while senior review capacity remains unchanged. The review queue grows. Integration conflicts increase. Test environments become busier. More generated code requires architectural validation.&lt;/p&gt;

&lt;p&gt;Implementation became faster. Delivery did not.&lt;/p&gt;

&lt;p&gt;The correct question is therefore not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How much code did AI generate?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did AI reduce the total time required to deliver a correct, maintainable, production-ready change?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This distinction matters for organizations adopting AI-assisted software development. AI can improve engineering velocity when it reduces a real constraint. It can also move the constraint into review, testing, architecture, security, or production support.&lt;/p&gt;

&lt;p&gt;A practical approach is to introduce AI into a specific part of the workflow and measure the effect on the entire path.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If AI generates tests faster, did review time fall or rise?&lt;/li&gt;
&lt;li&gt;If AI drafts migrations, did deployment confidence improve?&lt;/li&gt;
&lt;li&gt;If AI creates more pull requests, did lead time decrease?&lt;/li&gt;
&lt;li&gt;If AI supports code review, did defect escape increase?&lt;/li&gt;
&lt;li&gt;If AI helps with debugging, did recovery time improve?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benefit should be measured at the system level, not only at the point where the tool is used.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Software Delivery Strategy Must Contain
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;software delivery strategy&lt;/strong&gt; should turn urgency into a set of operating decisions.&lt;/p&gt;

&lt;p&gt;It does not need to be a large transformation document. It needs to define how work will move from an identified need to production feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A clear outcome
&lt;/h3&gt;

&lt;p&gt;Every significant initiative should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem are we solving?&lt;/li&gt;
&lt;li&gt;Who is affected?&lt;/li&gt;
&lt;li&gt;What evidence would show improvement?&lt;/li&gt;
&lt;li&gt;What is the smallest valuable result?&lt;/li&gt;
&lt;li&gt;Which assumption is most likely to be wrong?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents teams from delivering a large amount of functionality before discovering that the original assumption was weak.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A real priority order
&lt;/h3&gt;

&lt;p&gt;If five initiatives are all called critical, none of them is truly prioritized.&lt;/p&gt;

&lt;p&gt;Real prioritization requires leadership to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which work receives capacity now&lt;/li&gt;
&lt;li&gt;Which work is paused&lt;/li&gt;
&lt;li&gt;Which work is reduced in scope&lt;/li&gt;
&lt;li&gt;Which commitments are displaced by new urgent work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding a new priority without removing an old one is not prioritization. It is queue growth.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Limits on concurrent work
&lt;/h3&gt;

&lt;p&gt;Too much work in progress creates context switching, coordination overhead, and dependency queues.&lt;/p&gt;

&lt;p&gt;Suppose five initiatives all need the same platform engineer and the same test environment. Starting all five does not increase throughput. It creates five partially completed streams competing for the same constraint.&lt;/p&gt;

&lt;p&gt;A more effective decision may be to finish two initiatives before starting the remaining three.&lt;/p&gt;

&lt;p&gt;This can feel slower because fewer projects are visibly active. It is often faster because valuable work reaches completion sooner.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Smaller delivery units
&lt;/h3&gt;

&lt;p&gt;Large changes delay feedback and increase the cost of failure.&lt;/p&gt;

&lt;p&gt;Teams should look for ways to release:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thin vertical slices&lt;/li&gt;
&lt;li&gt;Smaller pull requests&lt;/li&gt;
&lt;li&gt;Backward-compatible API changes&lt;/li&gt;
&lt;li&gt;Incremental migrations&lt;/li&gt;
&lt;li&gt;Features behind flags&lt;/li&gt;
&lt;li&gt;Limited-audience rollouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is not to split work into meaningless technical tasks. Each slice should either deliver value, validate an assumption, or reduce a known risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Clear decision ownership
&lt;/h3&gt;

&lt;p&gt;Work often waits because nobody knows who can decide.&lt;/p&gt;

&lt;p&gt;A delivery strategy should distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decisions teams can make independently&lt;/li&gt;
&lt;li&gt;Decisions requiring consultation&lt;/li&gt;
&lt;li&gt;Decisions requiring explicit approval&lt;/li&gt;
&lt;li&gt;Decisions that must be escalated immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a team may be free to choose an implementation approach within agreed architectural and security boundaries. A change to shared customer data may require broader approval.&lt;/p&gt;

&lt;p&gt;This reduces unnecessary escalation without removing governance.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Non-negotiable quality boundaries
&lt;/h3&gt;

&lt;p&gt;Teams should not renegotiate basic safety for every deadline.&lt;/p&gt;

&lt;p&gt;Typical non-negotiable boundaries may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication and authorization&lt;/li&gt;
&lt;li&gt;Data integrity&lt;/li&gt;
&lt;li&gt;Backward compatibility&lt;/li&gt;
&lt;li&gt;Critical automated tests&lt;/li&gt;
&lt;li&gt;Monitoring and alerting&lt;/li&gt;
&lt;li&gt;Rollback capability&lt;/li&gt;
&lt;li&gt;Regulatory requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact boundaries depend on the system. A marketing experiment and a payment service should not receive identical treatment.&lt;/p&gt;

&lt;p&gt;The principle is to match assurance to risk, reversibility, and impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. A feedback loop
&lt;/h3&gt;

&lt;p&gt;The strategy should define how the organization will learn whether the change worked.&lt;/p&gt;

&lt;p&gt;Shipping is not the end of delivery. The team needs evidence.&lt;/p&gt;

&lt;p&gt;That may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adoption&lt;/li&gt;
&lt;li&gt;Conversion&lt;/li&gt;
&lt;li&gt;Reduced operational effort&lt;/li&gt;
&lt;li&gt;Fewer support requests&lt;/li&gt;
&lt;li&gt;Lower failure rates&lt;/li&gt;
&lt;li&gt;Faster processing&lt;/li&gt;
&lt;li&gt;Improved customer completion rates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without feedback, the organization can become faster at delivering the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Engineering Teams Move Faster in Practice
&lt;/h2&gt;

&lt;p&gt;The most useful question is not, “How can the team work faster?”&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What causes work to wait, expand, or return?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question leads to practical interventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduce work before increasing capacity
&lt;/h3&gt;

&lt;p&gt;Start by listing active initiatives and assigning each one a clear status:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continue&lt;/li&gt;
&lt;li&gt;Pause&lt;/li&gt;
&lt;li&gt;Reduce&lt;/li&gt;
&lt;li&gt;Cancel&lt;/li&gt;
&lt;li&gt;Complete before starting new work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is often more effective than immediately hiring more developers.&lt;/p&gt;

&lt;p&gt;Additional engineers help when implementation capacity is the main constraint. They may make matters worse when the bottleneck is review, product clarification, architecture ownership, or deployment.&lt;/p&gt;

&lt;p&gt;Hiring into the wrong constraint increases coordination without increasing throughput.&lt;/p&gt;

&lt;h3&gt;
  
  
  Replace large releases with thin slices
&lt;/h3&gt;

&lt;p&gt;Suppose a team plans a three-month customer onboarding redesign.&lt;/p&gt;

&lt;p&gt;Instead of releasing the entire flow at once, it could first release one improved step for a limited customer segment. That may reveal whether the expected drop-off point was correctly identified.&lt;/p&gt;

&lt;p&gt;The result informs the rest of the investment.&lt;/p&gt;

&lt;p&gt;This is a concrete way to improve delivery speed without sacrificing quality: reduce the size of the decision, not the level of care.&lt;/p&gt;

&lt;h3&gt;
  
  
  Move routine decisions closer to the team
&lt;/h3&gt;

&lt;p&gt;If every security, architecture, and deployment question requires a committee meeting, work will wait.&lt;/p&gt;

&lt;p&gt;Create reusable boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Approved implementation patterns&lt;/li&gt;
&lt;li&gt;Standard threat checks&lt;/li&gt;
&lt;li&gt;Defined data classifications&lt;/li&gt;
&lt;li&gt;Deployment templates&lt;/li&gt;
&lt;li&gt;Service ownership rules&lt;/li&gt;
&lt;li&gt;Clear escalation triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team should not need executive involvement for a decision it makes repeatedly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automate the path that blocks delivery
&lt;/h3&gt;

&lt;p&gt;Automation should be selected based on delay, not enthusiasm.&lt;/p&gt;

&lt;p&gt;If deployments are manual and risky, automate deployment and rollback.&lt;/p&gt;

&lt;p&gt;If developers wait days for environments, automate environment creation.&lt;/p&gt;

&lt;p&gt;If a slow test suite delays every pull request, improve test execution before adding more coding tools.&lt;/p&gt;

&lt;p&gt;If product clarification causes repeated rework, automation is not the first answer. Better decision-making is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Review the system regularly
&lt;/h3&gt;

&lt;p&gt;Once per month, select a few completed and delayed items and examine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where they waited&lt;/li&gt;
&lt;li&gt;Why they returned for rework&lt;/li&gt;
&lt;li&gt;Which dependencies blocked them&lt;/li&gt;
&lt;li&gt;Which decisions arrived late&lt;/li&gt;
&lt;li&gt;Which controls added value&lt;/li&gt;
&lt;li&gt;Which controls added delay without reducing risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then improve the largest current constraint.&lt;/p&gt;

&lt;p&gt;Do not launch ten process initiatives at once. The improvement system can suffer from the same excessive work in progress as the delivery system.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Move Fast Without Breaking Things
&lt;/h2&gt;

&lt;p&gt;The phrase “move fast without breaking things” is sometimes treated as unrealistic.&lt;/p&gt;

&lt;p&gt;It is realistic only when “without breaking things” does not mean eliminating every failure.&lt;/p&gt;

&lt;p&gt;Complex systems will fail. The practical goal is to reduce the probability, impact, and recovery cost of failure.&lt;/p&gt;

&lt;p&gt;Teams can do this by making changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller&lt;/li&gt;
&lt;li&gt;Easier to observe&lt;/li&gt;
&lt;li&gt;Safer to reverse&lt;/li&gt;
&lt;li&gt;Continuously validated&lt;/li&gt;
&lt;li&gt;Released to limited audiences first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small change behind a feature flag can be tested with a limited group and disabled quickly. A large tightly coupled release has a wider failure surface and fewer recovery options.&lt;/p&gt;

&lt;p&gt;Quality and speed are not automatically aligned. Poorly designed quality gates can create delay without reducing meaningful risk. Weak quality practices can also create incidents and rework that destroy delivery speed.&lt;/p&gt;

&lt;p&gt;The engineering task is to apply the right level of assurance to the specific risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Engineering Leaders Should Say Instead
&lt;/h2&gt;

&lt;p&gt;Leaders do not need to remove urgency. They need to make it actionable.&lt;/p&gt;

&lt;p&gt;Instead of saying, “Move faster,” ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the main constraint on this work?&lt;/li&gt;
&lt;li&gt;What should stop so this becomes the priority?&lt;/li&gt;
&lt;li&gt;What is the smallest valuable release?&lt;/li&gt;
&lt;li&gt;Which assumption should we test first?&lt;/li&gt;
&lt;li&gt;Where is the work waiting?&lt;/li&gt;
&lt;li&gt;Which dependency requires leadership intervention?&lt;/li&gt;
&lt;li&gt;Which risks are reversible?&lt;/li&gt;
&lt;li&gt;Which quality boundaries cannot change?&lt;/li&gt;
&lt;li&gt;How will we know the outcome was achieved?&lt;/li&gt;
&lt;li&gt;What did we learn from the last delayed initiative?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions convert pressure into decisions.&lt;/p&gt;

&lt;p&gt;They also make accountability clearer. Engineering owns technical execution and risk. Product owns problem clarity and value. Leadership owns priority conflicts, organizational constraints, and accepted trade-offs.&lt;/p&gt;

&lt;p&gt;Speed improves when those responsibilities are explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Do Not Ask for Speed Before Finding the Constraint
&lt;/h2&gt;

&lt;p&gt;“Move fast” is a valid expression of urgency. It is not a plan.&lt;/p&gt;

&lt;p&gt;A strong &lt;strong&gt;software delivery strategy&lt;/strong&gt; does not begin by asking developers to produce more. It begins by identifying why valuable work is not reaching production sooner.&lt;/p&gt;

&lt;p&gt;Sometimes the answer is implementation capacity.&lt;/p&gt;

&lt;p&gt;Often it is something else: unclear priorities, too much concurrent work, late decisions, shared dependencies, unstable environments, manual release processes, or feedback that arrives too late.&lt;/p&gt;

&lt;p&gt;The practical sequence is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the outcome.&lt;/li&gt;
&lt;li&gt;Map the delivery path.&lt;/li&gt;
&lt;li&gt;Find the largest delay.&lt;/li&gt;
&lt;li&gt;Improve that constraint.&lt;/li&gt;
&lt;li&gt;Measure the end-to-end effect.&lt;/li&gt;
&lt;li&gt;Repeat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before asking an engineering team to move faster, find the place where the work has stopped moving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discussion question:&lt;/strong&gt; What is the largest source of delay in your delivery system today: implementation, decisions, dependencies, validation, or release?&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>programming</category>
      <category>product</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Hidden Cost of Starting Development Too Early</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Fri, 31 Jul 2026 17:53:24 +0000</pubDate>
      <link>https://dev.to/mjodeh/the-hidden-cost-of-starting-development-too-early-1hgj</link>
      <guid>https://dev.to/mjodeh/the-hidden-cost-of-starting-development-too-early-1hgj</guid>
      <description>&lt;p&gt;On Monday, a feature moves to &lt;strong&gt;In Progress&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By Tuesday, the repository has a new module, a database migration, and a set of endpoints. On Wednesday, the first pull request is open. By Friday, the happy path works in a demo.&lt;/p&gt;

&lt;p&gt;The work looks healthy. The board is moving. Code is accumulating.&lt;/p&gt;

&lt;p&gt;But the team still has not agreed on what should happen when a request is repeated, a dependency times out, an event arrives out of order, or a user changes state halfway through the operation.&lt;/p&gt;

&lt;p&gt;That is not a small planning gap. It means implementation began before the product's behaviour was defined.&lt;/p&gt;

&lt;p&gt;Early coding often creates an illusion of progress because it produces visible artifacts: commits, screens, endpoints, and passing tests. At the same time, it quietly converts unresolved decisions into implementation assumptions.&lt;/p&gt;

&lt;p&gt;And code is one of the most expensive places to store ambiguity.&lt;/p&gt;

&lt;h2&gt;
  
  
  A ticket can be detailed and still not be decision-ready
&lt;/h2&gt;

&lt;p&gt;Many tickets describe the &lt;em&gt;shape&lt;/em&gt; of a feature without defining its behaviour.&lt;/p&gt;

&lt;p&gt;Consider a seemingly simple operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /subscriptions/{id}/activate

202 Accepted
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That contract looks implementable. It is not—not yet.&lt;/p&gt;

&lt;p&gt;The endpoint says nothing about the questions that determine the real system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is activation synchronous, asynchronous, or eventually consistent?&lt;/li&gt;
&lt;li&gt;Is the operation idempotent? What happens when the client retries after a timeout?&lt;/li&gt;
&lt;li&gt;Can a subscription be cancelled while payment is pending?&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;payment.succeeded&lt;/code&gt; arrives after cancellation, which transition wins?&lt;/li&gt;
&lt;li&gt;Are events delivered at most once, at least once, or without an ordering guarantee?&lt;/li&gt;
&lt;li&gt;Which service owns the authoritative state?&lt;/li&gt;
&lt;li&gt;What does the caller observe during partial failure?&lt;/li&gt;
&lt;li&gt;What evidence proves the feature is accepted?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two experienced engineers can implement the same ticket correctly and still build incompatible systems because each filled in those blanks differently.&lt;/p&gt;

&lt;p&gt;The problem is not coding ability. The problem is that a product decision was allowed to masquerade as an implementation detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four agreements should exist before production implementation
&lt;/h2&gt;

&lt;p&gt;A team does not need a hundred-page specification before writing code. It does need enough shared precision to prevent each engineer from inventing a different product.&lt;/p&gt;

&lt;p&gt;At minimum, four things should be agreed.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Behaviour
&lt;/h3&gt;

&lt;p&gt;Behaviour defines what the system does from the user's or caller's perspective.&lt;/p&gt;

&lt;p&gt;For stateful features, prose is rarely enough. Make the transitions explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;draft -&amp;gt; pending_payment -&amp;gt; active
                    |          |
                    v          v
                 cancelled   suspended
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then challenge the diagram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which commands are valid in each state?&lt;/li&gt;
&lt;li&gt;Which transitions are reversible?&lt;/li&gt;
&lt;li&gt;What happens on duplicate, late, or out-of-order events?&lt;/li&gt;
&lt;li&gt;Which outcomes are visible to the user?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the team cannot answer those questions consistently, the behaviour is not yet ready to encode.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Constraints
&lt;/h3&gt;

&lt;p&gt;Constraints are the invariants and operating limits the implementation must preserve.&lt;/p&gt;

&lt;p&gt;They include business rules—such as plan limits, permission boundaries, and legal restrictions—but also system properties such as latency budgets, data residency, transaction boundaries, availability targets, and compatibility requirements.&lt;/p&gt;

&lt;p&gt;A technically correct implementation can still be unusable if it violates a constraint that surfaced too late. Discovering after development that an operation must be atomic across two stores, complete within 200 milliseconds, or run without transferring data across regions is not refinement. It is redesign.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Integration contracts
&lt;/h3&gt;

&lt;p&gt;An integration contract is more than a request and response schema.&lt;/p&gt;

&lt;p&gt;It should define ownership, versioning, failure semantics, timeout behaviour, retry policy, idempotency, ordering guarantees, and compatibility expectations. For event-driven systems, it should also answer who may emit an event, what makes it unique, how consumers recover, and how schema evolution is handled.&lt;/p&gt;

&lt;p&gt;The happy-path payload is usually the cheapest part of an integration. The expensive part is everything that happens when the network behaves like a network.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Acceptance criteria
&lt;/h3&gt;

&lt;p&gt;Acceptance criteria should make success observable and falsifiable.&lt;/p&gt;

&lt;p&gt;“The user can activate a subscription” is a summary, not a testable criterion. Stronger criteria describe the initial state, the action, the expected outcome, and the important failure cases.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="nf"&gt;Given &lt;/span&gt;a subscription is pending payment
&lt;span class="nf"&gt;And &lt;/span&gt;the user has cancelled it
&lt;span class="nf"&gt;When &lt;/span&gt;a delayed payment-success event is received
&lt;span class="nf"&gt;Then &lt;/span&gt;the subscription remains cancelled
&lt;span class="nf"&gt;And &lt;/span&gt;the payment is queued for refund exactly once
&lt;span class="nf"&gt;And &lt;/span&gt;the decision is visible in the audit trail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single scenario aligns product behaviour, the domain state machine, integration semantics, idempotency, and observability. It removes far more uncertainty than another day of speculative implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why early coding feels faster
&lt;/h2&gt;

&lt;p&gt;Implementation has a psychological advantage: it is concrete.&lt;/p&gt;

&lt;p&gt;A team can count pull requests, story points, endpoints, components, and passing tests. Agreement work produces fewer visible artifacts, even when it removes the uncertainty most likely to delay delivery.&lt;/p&gt;

&lt;p&gt;That makes it easy to confuse activity with progress.&lt;/p&gt;

&lt;p&gt;Early implementation also tends to move quickly because engineers choose convenient defaults for every unanswered question. The first version may look efficient precisely because it has not yet encountered the decisions it postponed.&lt;/p&gt;

&lt;p&gt;Tests can reinforce the illusion. A test suite proves that the code behaves as its authors expected. It does not prove that those expectations were shared, complete, or correct. If the team never agreed on the behaviour, green tests may simply preserve the wrong assumption more rigorously.&lt;/p&gt;

&lt;p&gt;The branch is moving. The decision graph is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rework grows across surfaces, not files
&lt;/h2&gt;

&lt;p&gt;The cost of an unresolved decision is not limited to rewriting a function.&lt;/p&gt;

&lt;p&gt;A useful engineering heuristic is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected rework ~= unresolved decisions
                  x affected surfaces
                  x cost of reversal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose the team initially treats subscription activation as synchronous, then later agrees that it must be asynchronous and resilient to duplicate delivery. That decision can change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the domain state model;&lt;/li&gt;
&lt;li&gt;database schema and existing records;&lt;/li&gt;
&lt;li&gt;public API responses;&lt;/li&gt;
&lt;li&gt;event schemas and consumer logic;&lt;/li&gt;
&lt;li&gt;client-side loading and error states;&lt;/li&gt;
&lt;li&gt;retry and idempotency mechanisms;&lt;/li&gt;
&lt;li&gt;tests and test data;&lt;/li&gt;
&lt;li&gt;metrics, alerts, and operational runbooks;&lt;/li&gt;
&lt;li&gt;analytics definitions and support documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, calling the work “a refactor” understates it. The team is reversing a distributed decision that has already propagated through the system.&lt;/p&gt;

&lt;p&gt;This is why a small ambiguity at the start can become a large delivery cost later. The ambiguity stayed constant; its blast radius grew.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer is not heavyweight specification
&lt;/h2&gt;

&lt;p&gt;The alternative to premature implementation is not months of analysis or a demand for perfect certainty.&lt;/p&gt;

&lt;p&gt;The goal is a &lt;strong&gt;decision-ready slice&lt;/strong&gt;: the smallest set of artifacts that lets engineering start without inventing product behaviour inside the codebase.&lt;/p&gt;

&lt;p&gt;For many features, that can be lightweight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a few concrete examples covering the main and failure paths;&lt;/li&gt;
&lt;li&gt;a state transition sketch for stateful behaviour;&lt;/li&gt;
&lt;li&gt;explicit invariants and non-functional constraints;&lt;/li&gt;
&lt;li&gt;versioned request, response, or event schemas;&lt;/li&gt;
&lt;li&gt;documented timeout, retry, and idempotency semantics;&lt;/li&gt;
&lt;li&gt;testable acceptance criteria;&lt;/li&gt;
&lt;li&gt;a short list of remaining unknowns, each with an owner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These artifacts should be reviewed together, not produced by separate functions and thrown across handoff boundaries. Product, design, engineering, and dependent teams need to see the same behaviour from their respective angles.&lt;/p&gt;

&lt;p&gt;The objective is not to eliminate learning. It is to decide which uncertainty is acceptable before the cost of changing it multiplies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploration code and commitment code are different
&lt;/h2&gt;

&lt;p&gt;Sometimes coding early is exactly the right move.&lt;/p&gt;

&lt;p&gt;A time-boxed spike can test whether a library supports a required protocol, whether a query can meet the latency budget, or whether an external API behaves as documented. A prototype can expose usability questions faster than a meeting.&lt;/p&gt;

&lt;p&gt;But exploratory code needs an explicit contract of its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What question is it answering?&lt;/li&gt;
&lt;li&gt;How long will the exploration run?&lt;/li&gt;
&lt;li&gt;What evidence will it produce?&lt;/li&gt;
&lt;li&gt;Is the code disposable?&lt;/li&gt;
&lt;li&gt;What decision must be made before it becomes production implementation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without those boundaries, prototypes have a habit of becoming foundations. Temporary assumptions acquire users, data, and dependencies. The team then has to preserve decisions it never consciously made.&lt;/p&gt;

&lt;p&gt;Exploration code can start early. Commitment code should wait until the team knows what it is committing to.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical start-development gate
&lt;/h2&gt;

&lt;p&gt;Before a feature enters production implementation, I would expect the team to answer these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can we describe the user-visible outcome in the same words?&lt;/li&gt;
&lt;li&gt;Are the important states and transitions explicit, including retries and out-of-order events?&lt;/li&gt;
&lt;li&gt;Are business and technical invariants documented?&lt;/li&gt;
&lt;li&gt;Do integration contracts define failure semantics, not only payloads?&lt;/li&gt;
&lt;li&gt;Are acceptance criteria objective enough to become tests and observable enough to operate in production?&lt;/li&gt;
&lt;li&gt;Are the remaining unknowns named, owned, and deliberately accepted?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answer is no, the next step is not necessarily “stop.” It may be a short behaviour workshop, a contract review, or a targeted technical spike.&lt;/p&gt;

&lt;p&gt;But it should not be production code pretending the decision has already been made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipping sooner starts with deciding sooner
&lt;/h2&gt;

&lt;p&gt;Starting development early can improve a schedule on paper while making the real delivery date less predictable. The first week looks fast because the team is borrowing time from later weeks—when assumptions collide, interfaces change, data must be repaired, and tests have to be rewritten.&lt;/p&gt;

&lt;p&gt;High-performing teams do not delay implementation for ceremony. They delay irreversible commitments until the relevant decisions are explicit.&lt;/p&gt;

&lt;p&gt;The best time to discover that two teams mean different things by “activated” is before both definitions are running in production.&lt;/p&gt;

&lt;p&gt;The gap between intent and implementation—where behaviour, constraints, contracts, and evidence either align or drift—is the problem space I am exploring with &lt;strong&gt;Lopeline&lt;/strong&gt;. I will share more about that soon.&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>programming</category>
      <category>product</category>
      <category>ai</category>
    </item>
    <item>
      <title>Teaching Agents to Slow Down Where It Matters</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Sun, 19 Jul 2026 09:20:53 +0000</pubDate>
      <link>https://dev.to/mjodeh/teaching-agents-to-slow-down-where-it-matters-39fa</link>
      <guid>https://dev.to/mjodeh/teaching-agents-to-slow-down-where-it-matters-39fa</guid>
      <description>&lt;p&gt;Say "fable-mode" (or "operate carefully," or "high-judgment mode" or "think like fable") in a Claude Code or Codex session, and one line buried in the skill file does most of the work: &lt;em&gt;"Never promote 'plausible' to 'confirmed' in your summary."&lt;/em&gt; That single rule is the whole philosophy in miniature — don't let something that merely looks right pass as something that was checked.&lt;/p&gt;

&lt;p&gt;Fable-mode is not a tool, a model swap, or a set of new commands. It's a behavioral overlay — a skill file at &lt;code&gt;~/.claude/skills/fable-mode/SKILL.md&lt;/code&gt; or &lt;code&gt;~/.codex/skills/fable-mode/SKILL.md&lt;/code&gt; or any other agent you use, that gets loaded into the turn and changes how the agent scopes work, verifies its own claims, and reports results. Nothing about &lt;em&gt;what&lt;/em&gt; Agents can do changes. What changes is the discipline around using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changes
&lt;/h2&gt;

&lt;p&gt;The skill is organized into seven blocks, and each one targets a specific failure mode that shows up in normal agent use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judgment before action.&lt;/strong&gt; The first move is classification: is this a question, a problem description, or a change request? For the first two, the deliverable is an assessment — investigate and stop, don't start editing files nobody asked you to edit. Irreversible actions (deletes, pushes, overwrites) require a stop-and-confirm, and specifically: "before deleting or overwriting anything, actually look at the target."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification as the non-negotiable core.&lt;/strong&gt; This is the section that does the heavy lifting. Every "done" claim needs evidence produced &lt;em&gt;after&lt;/em&gt; the last edit — a test run before your final change proves nothing about your final change. Claims get graded on a three-tier scale: &lt;strong&gt;Confirmed&lt;/strong&gt; (you ran it and saw the result), &lt;strong&gt;Plausible&lt;/strong&gt; (the code reads right but you haven't executed it), &lt;strong&gt;Assumed&lt;/strong&gt; (inherited from the user's description). The rule is that you report the grade you actually earned, not the one that sounds better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning habits.&lt;/strong&gt; Hold two hypotheses before committing to a diagnosis. Treat your memory of a library's API as a prior, not a fact, and check the installed version when correctness depends on it. When a result contradicts what you expected, that's flagged as "the most information-dense moment of the task" — chase it instead of smoothing over it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anti-patterns as hard stops.&lt;/strong&gt; Eight explicit bans, including "declare success without a post-change verification run," "fix a bug you can't explain," and "hedge a known failure ('should work now') — either you verified it or you report it as unverified."&lt;/p&gt;

&lt;p&gt;The skill closes with a five-item checklist the agent is meant to run before ending any turn — essentially a self-audit against the rules above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verification stops being optional.&lt;/strong&gt; The "read before you write" and "check you didn't break the neighbors" rules mean the agent greps for other callers of a function it just changed instead of assuming the diff is self-contained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports get honest, not optimistic.&lt;/strong&gt; The Confirmed/Plausible/Assumed grading forces a specific kind of intellectual honesty that's easy to skip under normal operation, where "should work" and "verified working" tend to blur together in the final summary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope stays tight.&lt;/strong&gt; "Prefer the smallest change that fully solves the problem" combined with "expand scope without flagging it" being a hard stop means less unrequested refactoring riding along with a bug fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Root-cause bias.&lt;/strong&gt; The rule that a fix needs a one-sentence causal explanation before it's applied catches the class of fix that happens to make a symptom disappear without addressing why it occurred.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Effort matches stakes.&lt;/strong&gt; "A one-line fix does not need a design document. A schema migration does not get done on vibes" — the skill explicitly scales its own overhead down for trivial tasks, so it isn't uniformly slower.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Disadvantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's a self-reported discipline, not an enforced one.&lt;/strong&gt; There's no external checker validating that the agent actually ran the test it claims to have run — the whole system depends on the model correctly following its own instructions and honestly grading itself. A model that misjudges "confirmed" vs. "plausible" produces the same failure mode fable-mode was meant to prevent, just with more confident-sounding labels attached.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More tool calls per task.&lt;/strong&gt; Verifiable increments, post-change re-runs, and neighbor-checking all mean more intermediate steps than an agent optimizing purely for speed. On tasks where the user genuinely wants a fast, rough pass, this overhead is friction, not value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No built-in tool selection guidance.&lt;/strong&gt; The skill is explicit that it "governs how work is scoped, verified, and reported — not what tools to use." It won't tell the agent which agent, MCP, or command to reach for; that judgment still comes from elsewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depends on activation.&lt;/strong&gt; It's opt-in per session via trigger phrase. A user who forgets to say "fable-mode" on a high-stakes task gets none of it — there's no persistent always-on variant described in the file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checklist compliance can become theater.&lt;/strong&gt; A five-item checklist run by the same agent that did the work is a weaker guarantee than an independent review pass; it catches self-aware gaps, not blind spots the agent doesn't know it has.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to actually expect
&lt;/h2&gt;

&lt;p&gt;Turn fable-mode on for the tasks where being wrong is expensive: schema migrations, auth changes, anything touching shared code, or a bug you don't yet understand. Expect the final report to distinguish what was actually tested from what merely compiles, expect fewer "while I was in there, I also…" surprises in the diff, and expect the agent to stop and ask before anything destructive rather than assuming consent. Don't expect it to make trivial tasks faster — for a one-line CSS fix, the skill's own "match depth to stakes" rule means it should behave close to normal anyway. The gain isn't speed; it's a report you can trust at face value, on the tasks where that trust is worth paying the extra verification steps for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skill File to download
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mjodeh/agentic/blob/master/skills/fable-mode/" rel="noopener noreferrer"&gt;fable-mode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to contribute&lt;/p&gt;

</description>
      <category>agentskills</category>
      <category>agents</category>
    </item>
    <item>
      <title>Why faster typing rarely produces faster delivery</title>
      <dc:creator>Mohammad Jodeh</dc:creator>
      <pubDate>Sat, 18 Jul 2026 08:55:32 +0000</pubDate>
      <link>https://dev.to/mjodeh/why-faster-typing-rarely-produces-faster-delivery-2863</link>
      <guid>https://dev.to/mjodeh/why-faster-typing-rarely-produces-faster-delivery-2863</guid>
      <description>&lt;p&gt;&lt;strong&gt;A developer finishes the change on Tuesday. The customer sees it three Tuesdays later. What happened in between is the real story of software delivery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When delivery slows, the instinct is almost always the same: push the engineering team to move faster. Increase velocity. Add developers. Introduce another coding assistant. Reduce the estimate. Ship more story points.&lt;br&gt;
It sounds rational because code is the most visible artifact in software development. But code is only one station on a much longer line. Most delays happen before the first line is written or after the last pull request is merged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The delivery flow&lt;/strong&gt; from idea to impact:&lt;br&gt;
 &lt;strong&gt;DEFINE&lt;/strong&gt; (Clarity) -&amp;gt;  &lt;strong&gt;DECIDE&lt;/strong&gt; (Approvals) -&amp;gt; &lt;strong&gt;BUILD&lt;/strong&gt; (Code) -&amp;gt; &lt;strong&gt;CONNECT&lt;/strong&gt; (Dependencies) -&amp;gt; &lt;strong&gt;PROVE&lt;/strong&gt; (Validation) -&amp;gt; &lt;strong&gt;RELEASE&lt;/strong&gt; (Ownership).&lt;/p&gt;

&lt;p&gt;Only one stage is primarily about typing code. Every stage can slow delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The keyboard is rarely the constraint&lt;/strong&gt;&lt;br&gt;
Imagine a feature that requires two days of focused development. It waits three days for a product decision, four days for another team to expose an API, two days for review, and five days for a shared test environment. Making the coding twice as fast saves one day. Fixing the surrounding flow can save fourteen.&lt;br&gt;
That is why teams can become better at producing code without becoming better at delivering outcomes. They optimize the activity while leaving the system untouched.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLARITY&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Unclear requirements are rework in disguise&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The team starts moving before everyone agrees where it is going.&lt;br&gt;
A vague requirement does not disappear when development begins. It simply changes form. It becomes a Slack thread, an assumption embedded in the code, a late design debate, or a feature that technically works but solves the wrong problem.&lt;br&gt;
This creates the illusion of progress: tickets move, commits appear, demos happen. Then the questions arrive. What should happen in the edge case? Which system owns the data? Who is the real user? What does success look like? The team rewrites what it already built because it began with motion instead of clarity.&lt;br&gt;
A short, difficult conversation before coding is often faster than a long, expensive correction afterward.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DECISIONS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Approval delays create a hidden queue&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Work can be complete and still be nowhere near delivered. A security review waits for a specialist. A product decision waits for a meeting. A pull request waits for someone with the right context. A release request waits for a change window. None of this looks like active engineering work, yet all of it belongs to the delivery timeline.&lt;br&gt;
Most delivery dashboards are excellent at &lt;strong&gt;counting activity&lt;/strong&gt; and poor at &lt;strong&gt;measuring silence&lt;/strong&gt;.&lt;br&gt;
They show how long a task was in development, not how long it sat untouched between people. But customers experience the whole clock, including the waiting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DEPENDENCIES&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Local speed cannot defeat a system dependency&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One team finishes. The outcome remains blocked. Modern software is a web of services, data contracts, platforms, vendors, environments, and specialist teams. A team may complete its part quickly and still wait for an API, a schema change, infrastructure capacity, legal language, or a partner release.&lt;br&gt;
This is the trap of local optimization: every group can report that its own work is on track while the customer-facing outcome is late. Delivery speed lives in the handoffs. Define contracts early, reduce unnecessary coupling, and make escalation paths explicit.&lt;br&gt;
&lt;strong&gt;The better question&lt;/strong&gt;&lt;br&gt;
How much time did the work spend moving - and how much time did it spend waiting?&lt;br&gt;
That ratio reveals more about delivery performance than typing speed or story points.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;REWORK&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The fastest first draft can still be the slowest route&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Work returns because feedback arrived after commitment.&lt;br&gt;
Rework is not merely another edit. It reopens design, implementation, review, testing, documentation, and approval. The team pays for the same decision several times because the right people or the right evidence appeared too late.&lt;br&gt;
The aim is not to make the first version perfect. It is to make it directionally correct - by testing assumptions early, reviewing thin slices, exposing risks before they harden into architecture, and letting users react before the solution becomes expensive to change.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OWNERSHIP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Work slows down in the space between teams&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When everyone contributes but nobody carries the outcome.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who resolves conflicting requirements?&lt;/li&gt;
&lt;li&gt;Who owns the integration?&lt;/li&gt;
&lt;li&gt;Who decides whether a defect blocks release?&lt;/li&gt;
&lt;li&gt;Who notices that the approval has been waiting for four days?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When those answers are unclear, work becomes organizational luggage left between gates.&lt;br&gt;
Ownership does not mean one person performs every task. It means one person remains accountable for the journey: clarifying the next decision, surfacing the blocker, finding the owner, and keeping the outcome from becoming an orphan.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VALIDATION&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Late validation turns feedback into a bottleneck&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Testing at the end makes learning expensive.&lt;br&gt;
When quality assurance, security, accessibility, compliance, and user acceptance are treated as final gates, they become queues. The team discovers fundamental problems only after the solution feels finished. Every finding now threatens a deadline and triggers a larger cycle of rework.&lt;br&gt;
High-flow teams pull validation forward. Acceptance criteria exist before development. Automated checks run while code is changing. Security and operations review risky choices early. Stakeholders see small increments. Releases are observable and reversible. Earlier feedback is not extra process; it is less expensive process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimize the journey, not the keystrokes&lt;/strong&gt;&lt;br&gt;
If leaders want faster delivery, they need to manage the flow from idea to customer impact. That means looking beyond sprint velocity and asking where time, confidence, and accountability are being lost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WAIT&lt;/strong&gt;
Where does work sit untouched the longest?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DECIDE&lt;/strong&gt;
Which decisions repeatedly arrive after implementation has begun?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEPEND&lt;/strong&gt;
Which handoffs or dependencies create the most uncertainty?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RETURN&lt;/strong&gt;
Why does supposedly finished work come back for another cycle?&lt;/li&gt;
&lt;li&gt;OWN
At what moments does nobody clearly own the next move?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROVE&lt;/strong&gt;
Which validations happen only when change is most expensive?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI coding tools can accelerate implementation. More engineers can add capacity. Better development practices matter. But those investments create meaningful speed only when coding is the constraint. Otherwise, they simply send more work into the same queues faster.&lt;br&gt;
&lt;strong&gt;THE LEADERSHIP SHIFT&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Typing is an activity. Delivery is a system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fastest teams create clarity early, make decisions quickly, manage dependencies deliberately, assign ownership visibly, and shorten every feedback loop.&lt;/p&gt;

&lt;p&gt;Before asking developers to code faster, follow one feature from idea to production. The keyboard may be the easiest part of the journey.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>leadership</category>
      <category>product</category>
    </item>
  </channel>
</rss>
