<?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: Jacques Montagne</title>
    <description>The latest articles on DEV Community by Jacques Montagne (@jmontagne).</description>
    <link>https://dev.to/jmontagne</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3664946%2F80acd9fe-de6b-4f62-9712-20a3b40c9495.png</url>
      <title>DEV Community: Jacques Montagne</title>
      <link>https://dev.to/jmontagne</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jmontagne"/>
    <language>en</language>
    <item>
      <title>AI is an Amplifier. Are You Amplifying Engineering or Dysfunction?</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Tue, 10 Feb 2026 20:37:13 +0000</pubDate>
      <link>https://dev.to/jmontagne/ai-is-an-amplifier-are-you-amplifying-engineering-or-dysfunction-1o81</link>
      <guid>https://dev.to/jmontagne/ai-is-an-amplifier-are-you-amplifying-engineering-or-dysfunction-1o81</guid>
      <description>&lt;p&gt;Dave Farley recently shared results from a controlled study of 150 developers using AI tools. The data confirms a hard truth that the "vibe coding" crowd ignores: AI is a multiplier, not a magic wand.&lt;/p&gt;

&lt;p&gt;The study revealed that while AI increases coding speed by 30-55%, it doesn't inherently fix code quality. In fact, the outcome depends entirely on who is holding the tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Slop" Myth vs. Economic Reality
&lt;/h3&gt;

&lt;p&gt;We hear constantly that AI creates unmaintainable "slop." Farley’s data shows this is false—but with a catch. &lt;br&gt;
For experienced developers, AI actually &lt;em&gt;improved&lt;/em&gt; maintainability. Why? Because seasoned engineers don't let the LLM drive the architecture. They use AI to generate boring, idiomatic, and predictable code that fits into a rigorous design.&lt;/p&gt;

&lt;p&gt;However, for those without strong engineering discipline, AI simply accelerates the creation of technical debt. &lt;/p&gt;

&lt;h3&gt;
  
  
  Automating the Dysfunction
&lt;/h3&gt;

&lt;p&gt;This brings us to the core problem in the Enterprise. &lt;br&gt;
If your organization currently lacks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A culture of TDD (Test-Driven Development),&lt;/li&gt;
&lt;li&gt;Modular architecture boundaries,&lt;/li&gt;
&lt;li&gt;Strict Code Review processes...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...then introducing GenAI won't make you "agile." It will just make you produce bad software 40% faster. You are automating your dysfunction.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Cognitive Debt" Trap
&lt;/h3&gt;

&lt;p&gt;The biggest risk Farley highlights isn't the code itself—it's "Cognitive Debt."&lt;br&gt;
When junior developers rely on AI to write logic they don't fully understand, they lose the ability to reason about the system when it inevitably breaks. &lt;/p&gt;

&lt;p&gt;In my work modernizing legacy systems (Banking/Insurance), "fast" is often a trap. The dominant cost of software is maintenance (50-80% of TCO). Saving 2 hours on typing today is irrelevant if it costs 2 weeks of debugging next year.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Strategy: Safe Modernization
&lt;/h3&gt;

&lt;p&gt;To use AI safely in an enterprise environment, we must invert the hype:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Architecture First:&lt;/strong&gt; Define the module boundaries and contracts &lt;em&gt;before&lt;/em&gt; opening the chat window.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Constraint-Based Coding:&lt;/strong&gt; Use AI to fill in the implementation details of a strictly defined interface, not to "invent" the solution.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Infrastructure as Code:&lt;/strong&gt; If the AI suggests a console click, reject it. If it’s not in Terraform/OpenTofu, it doesn’t exist.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;AI is a powerful amplifier. &lt;br&gt;
Before you roll it out to your entire team, ask yourself: &lt;strong&gt;"Do we have an engineering culture worth amplifying?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the foundation is weak, speed is the last thing you need.&lt;/p&gt;

</description>
      <category>genai</category>
      <category>safemodernization</category>
      <category>technicaldebt</category>
      <category>ai</category>
    </item>
    <item>
      <title>The 'Sprint' Illusion: 3 Bosses, 0 Tech Leads, and the 'AI-Generated' Debt</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Mon, 02 Feb 2026 16:31:50 +0000</pubDate>
      <link>https://dev.to/jmontagne/the-sprint-illusion-3-bosses-0-tech-leads-and-the-ai-generated-debt-3dfg</link>
      <guid>https://dev.to/jmontagne/the-sprint-illusion-3-bosses-0-tech-leads-and-the-ai-generated-debt-3dfg</guid>
      <description>&lt;h2&gt;
  
  
  The 'Sprint' Illusion: 3 Bosses, 0 Tech Leads, and the 'AI-Generated' Debt
&lt;/h2&gt;

&lt;p&gt;There is a pathology spreading through engineering organizations. It manifests as missed deadlines, unexplained production incidents, and a revolving door of developers who "just couldn't keep up." Leadership diagnoses it as a talent problem. It is not.&lt;/p&gt;

&lt;p&gt;It is a structural failure. And it is killing your codebase from the inside.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Diagnosis: The Inverted Pyramid
&lt;/h2&gt;

&lt;p&gt;Consider the reporting structure of a typical mid-level developer in 2024:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Engineering Manager:&lt;/strong&gt; Handles performance reviews, headcount, and "career growth."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Shadow Manager:&lt;/strong&gt; A senior manager or director who "checks in" on critical projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Project Manager:&lt;/strong&gt; Owns the Jira board, the sprint commitments, and the stakeholder updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now count the technical mentors in this structure.&lt;/p&gt;

&lt;p&gt;Zero.&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;Inverted Pyramid&lt;/strong&gt; anti-pattern. The developer has three people asking &lt;em&gt;when&lt;/em&gt; the work will be done. They have no one helping them determine &lt;em&gt;how&lt;/em&gt; it should be done.&lt;/p&gt;

&lt;p&gt;The Tech Lead role—once the shield between business pressure and engineering reality—has been eliminated, redistributed, or reduced to a title without authority. Architecture decisions are made by committee. Code reviews are optional or perfunctory. Technical debt is invisible until it becomes a production incident.&lt;/p&gt;

&lt;p&gt;The pyramid has inverted. Administrative overhead at the top. Engineering support at the bottom.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Symptom: The 45-Minute Daily
&lt;/h2&gt;

&lt;p&gt;You can observe this dysfunction in any sufficiently compromised standup.&lt;/p&gt;

&lt;p&gt;What should be a 15-minute synchronization ritual has metastasized into a 45-minute interrogation. The format is predictable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developer mentions a blocker.&lt;/li&gt;
&lt;li&gt;Manager asks for "more context."&lt;/li&gt;
&lt;li&gt;Developer attempts to translate "race condition in the message consumer" into language that will not trigger a risk escalation.&lt;/li&gt;
&lt;li&gt;Project Manager asks for a "revised ETA."&lt;/li&gt;
&lt;li&gt;Developer provides a number. Any number.&lt;/li&gt;
&lt;li&gt;The number becomes a commitment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not Scrum. This is performance theater.&lt;/p&gt;

&lt;p&gt;The cognitive load is immense. Developers are not problem-solving during these sessions. They are practicing organizational self-defense. Every technical statement must be sanitized, simplified, and stripped of nuance to avoid triggering management anxiety.&lt;/p&gt;

&lt;p&gt;The irony: the meeting intended to &lt;em&gt;remove&lt;/em&gt; blockers has become the blocker.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Mechanism of Failure: Silent Compromises
&lt;/h2&gt;

&lt;p&gt;Here is how deadlines actually work in the Inverted Pyramid:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; "This feature requires 10 days. We need to implement retry logic with exponential backoff, add circuit breaker patterns, and write integration tests against the payment gateway's sandbox."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Manager:&lt;/strong&gt; "Stakeholders need it in 5 days. What can we cut?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; "We could skip the circuit breaker and use a simple retry loop. It's not ideal, but—"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Manager:&lt;/strong&gt; "Great. Let's do that."&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;Silent Compromise&lt;/strong&gt;. It is silent because it is never documented. The Jira ticket will show "Feature Complete." The pull request will be approved by another developer who is also under deadline pressure. The architectural shortcut will never be reviewed by someone with the authority to reject it.&lt;/p&gt;

&lt;p&gt;In a healthy organization, the Tech Lead intercepts this conversation. They translate the technical risk into business terms: "If we skip the circuit breaker, a payment gateway outage will cascade into thread pool exhaustion. The entire checkout service will become unresponsive. Downtime cost will exceed whatever we save by shipping early."&lt;/p&gt;

&lt;p&gt;Without that voice, the compromise passes in silence.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Case Study: Anatomy of a Production Incident
&lt;/h2&gt;

&lt;p&gt;Six months later, production goes down.&lt;/p&gt;

&lt;p&gt;Here is the code that caused it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentRetryService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;MAX_RETRIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PaymentGatewayClient&lt;/span&gt; &lt;span class="n"&gt;paymentGateway&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PaymentRetryService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentGatewayClient&lt;/span&gt; &lt;span class="n"&gt;paymentGateway&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentGateway&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentGateway&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;PaymentResult&lt;/span&gt; &lt;span class="nf"&gt;processWithRetry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;MAX_RETRIES&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;paymentGateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;process&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentGatewayException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="no"&gt;MAX_RETRIES&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PaymentFailedException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Max retries exceeded"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="c1"&gt;// "Temporary" solution - TODO: implement proper backoff&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InterruptedException&lt;/span&gt; &lt;span class="n"&gt;ie&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentThread&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;interrupt&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PaymentFailedException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Retry interrupted"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ie&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PaymentFailedException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unexpected retry loop exit"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code worked perfectly in QA. It passed the demo. Stakeholders were satisfied.&lt;/p&gt;

&lt;p&gt;Then the payment gateway experienced a 30-second latency spike.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Each payment request spawned a thread that blocked for up to 5 seconds (5 retries × 1 second sleep).&lt;/li&gt;
&lt;li&gt;Incoming requests accumulated. The thread pool saturated.&lt;/li&gt;
&lt;li&gt;New requests queued. Timeouts cascaded.&lt;/li&gt;
&lt;li&gt;The health check endpoint became unresponsive.&lt;/li&gt;
&lt;li&gt;The load balancer marked the instance as unhealthy.&lt;/li&gt;
&lt;li&gt;Traffic rerouted to remaining instances, which also saturated.&lt;/li&gt;
&lt;li&gt;Total service outage: 23 minutes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What should have existed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A circuit breaker (Resilience4j, Hystrix) to fail fast when the gateway is degraded.&lt;/li&gt;
&lt;li&gt;Exponential backoff with jitter to prevent thundering herd.&lt;/li&gt;
&lt;li&gt;Async retry with a bounded queue to avoid blocking the request thread.&lt;/li&gt;
&lt;li&gt;Metrics and alerting on retry rates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this existed because "we didn't have time."&lt;/p&gt;

&lt;p&gt;The 5 days saved in development cost 23 minutes of downtime, three incident postmortems, and an emergency patch deployed at 2 AM.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The AI Factor: Generating Debt at Scale
&lt;/h2&gt;

&lt;p&gt;This situation has worsened since the advent of generative AI coding assistants.&lt;/p&gt;

&lt;p&gt;The code snippet above? A junior developer can generate it in 30 seconds with a prompt like: &lt;em&gt;"Write Java code to retry a payment request up to 5 times with a 1 second delay."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The AI will produce syntactically correct, functional code. It will compile. It will pass basic tests. It will &lt;em&gt;look&lt;/em&gt; professional.&lt;/p&gt;

&lt;p&gt;It will also contain every anti-pattern the prompt implied.&lt;/p&gt;

&lt;p&gt;This is not the AI's failure. It is an amplifier. It amplifies whatever engineering culture already exists.&lt;/p&gt;

&lt;p&gt;In an organization with strong code review practices, the AI-generated code gets caught. A senior engineer asks: "Why are we blocking threads here? Let's use a proper resilience library."&lt;/p&gt;

&lt;p&gt;In the Inverted Pyramid organization, there is no such checkpoint. The code goes from AI to IDE to pull request to production. The review is a rubber stamp. The Tech Lead who would have caught it does not exist.&lt;/p&gt;

&lt;p&gt;Generative AI has not changed the nature of technical debt. It has changed the velocity at which we can accumulate it.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Verdict: Engineering Authority Is Not Optional
&lt;/h2&gt;

&lt;p&gt;The industry has convinced itself that engineering leadership is overhead. That "flat organizations" and "self-organizing teams" can replace the need for technical authority. That project managers and process frameworks can substitute for engineering judgment.&lt;/p&gt;

&lt;p&gt;This is false.&lt;/p&gt;

&lt;p&gt;You cannot replace architectural oversight with Jira workflows. You cannot replace mentorship with Confluence documentation. You cannot replace the word "no"—spoken by someone with the technical credibility to defend it—with another sprint planning meeting.&lt;/p&gt;

&lt;p&gt;The Inverted Pyramid produces a predictable outcome: developers who cannot grow, systems that cannot scale, and incidents that cannot be prevented.&lt;/p&gt;

&lt;p&gt;The fix is not another process. It is not another tool. It is not another AI assistant.&lt;/p&gt;

&lt;p&gt;The fix is restoring engineering authority to engineering decisions. Put Tech Leads back in the room. Give them the power to reject bad estimates, block dangerous shortcuts, and mentor the developers who report to them.&lt;/p&gt;

&lt;p&gt;Or keep running sprints. And keep wondering why you never finish.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If this resonates, you are not alone. The comment section is open.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>agile</category>
      <category>techdebt</category>
      <category>management</category>
    </item>
    <item>
      <title>Technical Debt is Not a Metaphor. It's Why Your Migration Failed.</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Wed, 14 Jan 2026 09:30:36 +0000</pubDate>
      <link>https://dev.to/jmontagne/technical-debt-is-not-a-metaphor-its-why-your-migration-failed-21l7</link>
      <guid>https://dev.to/jmontagne/technical-debt-is-not-a-metaphor-its-why-your-migration-failed-21l7</guid>
      <description>&lt;p&gt;I recently went through Dave Farley's guide on &lt;em&gt;Managing Technical Debt&lt;/em&gt;. It’s a mandatory read, mostly because it treats debt strictly as a business risk, not just a developer complaint.&lt;/p&gt;

&lt;p&gt;I have spent the last two decades fixing systems that "moved fast and broke things." &lt;br&gt;
Spoiler alert: they usually stayed broken.&lt;/p&gt;

&lt;p&gt;Here is my take on Farley’s concepts, filtered through years of battling legacy Java monoliths and migrating them to AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The "Bit Rot" Reality Check
&lt;/h2&gt;

&lt;p&gt;Farley talks about "Bit Rot"—the idea that software degrades over time. We know code doesn't physically rust. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Farley defines Bit Rot as a symptom of neglect.&lt;/strong&gt; It happens when teams fail to refactor and "tidy up" as they go. It’s the kitchen analogy: if you cook a five-course meal but never wash a pan or wipe the counter, eventually you can’t cook anymore. You are paralyzed by the mess.&lt;/p&gt;

&lt;p&gt;I see this constantly in Java modernization's and Cloud migrations. A team lifts-and-shifts a Java application to AWS. They don't refactor. They don't modularize. Is updating just jdk a modernization?&lt;/p&gt;

&lt;p&gt;The result? You have a 15-year-old monolith running on expensive EC2 instances. Every time you try to patch a security vulnerability, something breaks in a completely unrelated module.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My rule:&lt;/strong&gt; If you aren't leaving the code better than you found it, it is already rotting.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Configuration Debt: The New Spaghetti
&lt;/h2&gt;

&lt;p&gt;This is the part of the guide that hit home the most. &lt;/p&gt;

&lt;p&gt;In the Java world, we spent years learning how to avoid spaghetti code. But now, I see "Spaghetti Infrastructure."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security Groups defined manually by clicking in the UI.&lt;/li&gt;
&lt;li&gt;Lambda triggers set up in the console, undocumented.&lt;/li&gt;
&lt;li&gt;Terraform states that are out of sync with reality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;Configuration Debt&lt;/strong&gt;. It is arguably worse than code debt because it can bring down your entire environment, not just one feature.&lt;/p&gt;

&lt;p&gt;If I catch a developer changing infrastructure settings manually in the AWS Console, we have a problem. Not because I'm a purist, but because that manual change is a ticking time bomb for the next person who runs the deployment pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The GenAI Trap: High-Speed Legacy
&lt;/h2&gt;

&lt;p&gt;This wasn't in Farley's original text, but it belongs there now.&lt;/p&gt;

&lt;p&gt;Tools like Copilot or ChatGPT are incredible. I use them daily. But for a disciplined team, they are power tools. For an undisciplined team, they are &lt;strong&gt;High-Speed Debt Generators&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I am seeing Pull Requests filled with AI-generated boilerplate that the author clearly didn't read closely. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It works? Maybe. &lt;/li&gt;
&lt;li&gt;Is it efficient? Rarely. &lt;/li&gt;
&lt;li&gt;Does it handle edge cases? Never.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember: &lt;strong&gt;"Bit Rot" comes from neglect.&lt;/strong&gt; If you generate AI code without ruthlessly refactoring and testing it, you are neglecting your codebase at 10x speed. You aren't "coding faster"; you are just automating the creation of Legacy Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My rule for AI code:&lt;/strong&gt; Treat it like code written by a drunk intern. Review it twice as hard.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Test Debt: The High-Interest Loan
&lt;/h2&gt;

&lt;p&gt;"We will write tests later."&lt;/p&gt;

&lt;p&gt;No, you won't. I have never seen a team go back and "backfill" unit tests once the feature is in production.&lt;/p&gt;

&lt;p&gt;Test Debt is dangerous because it kills velocity. Without a reliable test suite (and I mean fast, automated tests, not manual QA), you become afraid to change the code. &lt;/p&gt;

&lt;p&gt;When you are afraid to change the code, the Bit Rot accelerates because you stop refactoring. It is a vicious cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Technical Debt is inevitable, but it must be a conscious choice (like a mortgage), not the result of incompetence (like gambling).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Refactor constantly.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codify everything (especially infra).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don't let AI write code you don't understand.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are paid to solve problems, not to create new ones for the future.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>java</category>
      <category>aws</category>
    </item>
    <item>
      <title>The Junior Developer Role is Dead. Long Live the "Apprentice".</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Wed, 31 Dec 2025 08:12:48 +0000</pubDate>
      <link>https://dev.to/jmontagne/the-junior-developer-role-is-dead-long-live-the-apprentice-1a94</link>
      <guid>https://dev.to/jmontagne/the-junior-developer-role-is-dead-long-live-the-apprentice-1a94</guid>
      <description>&lt;p&gt;The industry is panic-scrolling. &lt;em&gt;"Will AI replace Junior Developers?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is the wrong question. The correct question is:&lt;br&gt;
&lt;strong&gt;"Does the Junior Developer role, as defined by Agile in 2010, still make economic sense?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;No&lt;/strong&gt;.&lt;br&gt;
But the solution isn't to stop hiring. The solution is to go back to 1400 AD.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Death of the "Ticket Mover"
&lt;/h2&gt;

&lt;p&gt;For the last 15 years, we trained Juniors using the &lt;strong&gt;"Factory Model"&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Isolate a small, non-critical task (change button color, fix a typo, write a getter).&lt;/li&gt;
&lt;li&gt; Create a Jira Ticket.&lt;/li&gt;
&lt;li&gt; Let the Junior struggle for 2 days.&lt;/li&gt;
&lt;li&gt; Review the PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This model is dead. Why? &lt;strong&gt;Because an AI Agent can close that ticket in 4 seconds for $0.01.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are hiring Juniors to "write simple code", you are burning money. If you are a Junior hoping to build a career by "closing tickets", you are in trouble.&lt;/p&gt;
&lt;h2&gt;
  
  
  The "Verification Gap"
&lt;/h2&gt;

&lt;p&gt;In a Senior-led "Commando Unit" (or Tiger Team), the bottleneck is no longer &lt;em&gt;generating&lt;/em&gt; code. It is &lt;em&gt;verifying&lt;/em&gt; that the generated code is secure, business-compliant, and fits the architecture.&lt;/p&gt;

&lt;p&gt;Seniors are overwhelmed by verification. We need help.&lt;br&gt;
We don't need "Coders". We need &lt;strong&gt;"Auditors"&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Return of the Guild: The Apprentice Model
&lt;/h2&gt;

&lt;p&gt;We need to retire the title "Junior Developer" and bring back &lt;strong&gt;"The Apprentice"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the Medieval Guilds, the Apprentice did not "build their own small cathedral". They carried the Master's tools, mixed the mortar, and &lt;em&gt;watched&lt;/em&gt; how the Master solved problems.&lt;/p&gt;

&lt;p&gt;Here is how I integrate Apprentices into an AI-augmented workflow:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Shadow, not the Silo
&lt;/h3&gt;

&lt;p&gt;My Apprentices don't get their own tickets. They sit in the &lt;strong&gt;Mob Session&lt;/strong&gt; with me.&lt;br&gt;
They don't write code in isolation. They watch the "Prompt Engineering" in real-time. They see how I reject 5 wrong solutions from the AI before accepting the 6th.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They learn discernment, not syntax.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. The AI Auditor
&lt;/h3&gt;

&lt;p&gt;I task my Apprentices with "Hostile Verification":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The AI wrote this migration script. I want you to spend the next 4 hours trying to break it. Find the edge case the model missed."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This turns them from "Code Writers" into "Code Critics". This is a far more valuable skill for their future.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The "Why" Documentation
&lt;/h3&gt;

&lt;p&gt;AI generates the &lt;em&gt;What&lt;/em&gt; (Code). The Senior knows the &lt;em&gt;Why&lt;/em&gt; (Architecture).&lt;br&gt;
The Apprentice's job is to capture the &lt;em&gt;Why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They document the decision log of the Mob Session. They map the "Mental Model" of the Senior. By explaining the Senior's decision, they internalize it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The ROI of Apprenticeship
&lt;/h2&gt;

&lt;p&gt;Critics say: &lt;em&gt;"This sounds expensive. You are paying 2 people to do 1 job."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Wrong. The math is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Old Way:&lt;/strong&gt; Junior spends 3 days on a ticket -&amp;gt; Senior spends 2 hours fixing the PR -&amp;gt; Production bug -&amp;gt; Rollback. &lt;strong&gt;Total Cost: High.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Apprentice Way:&lt;/strong&gt; Junior catches the AI hallucination &lt;em&gt;before&lt;/em&gt; commit -&amp;gt; Senior focuses on Architecture -&amp;gt; Documentation is actually written. &lt;strong&gt;Total Cost: Low (Risk Reduction).&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Summary for Engineering Leaders
&lt;/h2&gt;

&lt;p&gt;Stop hiring Juniors to improve your velocity. They won't.&lt;br&gt;
Hire Apprentices to improve your &lt;strong&gt;Safety&lt;/strong&gt; and &lt;strong&gt;Longevity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The "Code Factory" is closed. The "School of Architecture" is open.&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="c"&gt;# The New Career Path&lt;/span&gt;
1. Apprentice &lt;span class="o"&gt;(&lt;/span&gt;The Verifier &amp;amp; Student&lt;span class="o"&gt;)&lt;/span&gt;
2. Journeyman &lt;span class="o"&gt;(&lt;/span&gt;The AI-Augmented Builder&lt;span class="o"&gt;)&lt;/span&gt;
3. Master &lt;span class="o"&gt;(&lt;/span&gt;The Architect &amp;amp; Guild Leader&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>career</category>
      <category>ai</category>
      <category>productivity</category>
      <category>agile</category>
    </item>
    <item>
      <title>Stop Writing User Stories for AI. Start Writing Specs.</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Mon, 29 Dec 2025 07:41:05 +0000</pubDate>
      <link>https://dev.to/jmontagne/stop-writing-user-stories-for-ai-start-writing-specs-ea5</link>
      <guid>https://dev.to/jmontagne/stop-writing-user-stories-for-ai-start-writing-specs-ea5</guid>
      <description>&lt;p&gt;The "2-Pizza Team" is dead. McKinsey just confirmed that Agentic Workflows can increase productivity by "500%".&lt;br&gt;
But there is a catch.&lt;/p&gt;

&lt;p&gt;If you feed a Senior AI Agent (Claude 4.5 Sonnet / GPT-5.2) with a standard Agile User Story, you will get garbage.&lt;/p&gt;

&lt;p&gt;Why? &lt;strong&gt;Because User Stories are "Conversation Starters".&lt;/strong&gt; They rely on human context, tribal knowledge, and the "Definition of Ready" discussed in a meeting room.&lt;br&gt;
AI was not in that meeting room.&lt;/p&gt;

&lt;p&gt;If you want the "Commando Unit" efficiency I talk about on LinkedIn, you need to switch from &lt;strong&gt;Story-Driven Development&lt;/strong&gt; to &lt;strong&gt;Spec-Driven Development (SDD)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is the protocol I use to migrate Legacy Java apps to AWS Serverless without breaking production.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Entropy of Human Language
&lt;/h2&gt;

&lt;p&gt;This is a typical Jira ticket:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;User Story:&lt;/strong&gt; As a customer, I want to filter my transaction history so I can see my spending.&lt;br&gt;
&lt;strong&gt;Acceptance Criteria:&lt;/strong&gt; Filter by date and amount.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you give this to a Junior Dev, they will ask questions.&lt;br&gt;
If you give this to Cursor/Copilot, it will &lt;em&gt;hallucinate&lt;/em&gt; assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I'll use client-side filtering!" (Performance killer)&lt;/li&gt;
&lt;li&gt;"I'll assume the date format is MM/DD/YYYY!" (Breaks in Europe)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are not managing risk; you are amplifying it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Protocol: Markdown Specifications
&lt;/h2&gt;

&lt;p&gt;In my workflow, the "Senior Architect" does not write production code. &lt;strong&gt;The Architect writes the Spec.&lt;/strong&gt; The AI writes the implementation.&lt;/p&gt;

&lt;p&gt;As Werner Vogels said: &lt;em&gt;"The work is yours, not the tool's."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I treat English as a programming language. The Spec must be deterministic.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Structure
&lt;/h3&gt;

&lt;p&gt;I create a &lt;code&gt;.specs/&lt;/code&gt; folder in my repository. Each feature gets a markdown file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# SPEC-001: Transaction History Filter (API Level)&lt;/span&gt;

&lt;span class="gu"&gt;## 1. Context&lt;/span&gt;
Migrating &lt;span class="sb"&gt;`LegacyTransactionService.java`&lt;/span&gt; to AWS Lambda (Node.js/TypeScript).
Target Database: DynamoDB (Single Table Design).

&lt;span class="gu"&gt;## 2. Interface Contract (Strict)&lt;/span&gt;
&lt;span class="gs"&gt;**Input:**&lt;/span&gt; &lt;span class="sb"&gt;`GET /transactions`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`startDate`&lt;/span&gt; (ISO8601, Optional)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`minAmount`&lt;/span&gt; (Integer, cents, Optional)

&lt;span class="gs"&gt;**Output:**&lt;/span&gt; JSON Array &lt;span class="sb"&gt;`Transaction[]`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Max page size: 50 items.
&lt;span class="p"&gt;-&lt;/span&gt; Pagination: LastEvaluatedKey.

&lt;span class="gu"&gt;## 3. Logic &amp;amp; Constraints (The "Meat")&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Validation:**&lt;/span&gt; If &lt;span class="sb"&gt;`startDate`&lt;/span&gt; is in the future, throw &lt;span class="sb"&gt;`400 Bad Request`&lt;/span&gt;.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Query Pattern:**&lt;/span&gt; MUST use DynamoDB &lt;span class="sb"&gt;`Query`&lt;/span&gt; (GSI_Date), NOT &lt;span class="sb"&gt;`Scan`&lt;/span&gt;.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Legacy Parity:**&lt;/span&gt; Must replicate the "rounding error" logic from the old COBOL core (see reference: &lt;span class="sb"&gt;`calc_utils.legacy.js`&lt;/span&gt;).

&lt;span class="gu"&gt;## 4. Edge Cases&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; User has 0 transactions -&amp;gt; Return &lt;span class="sb"&gt;`[]`&lt;/span&gt; (HTTP 200), not 404.
&lt;span class="p"&gt;-&lt;/span&gt; DynamoDB Throttling -&amp;gt; Implement exponential backoff (Use AWS SDK v3 standard retry).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. The "Vibe Coding" Trap: Why Code Comprehension is King
&lt;/h2&gt;

&lt;p&gt;There is a lot of buzz around "Vibe Coding"—letting the AI handle the syntax while you focus on the flow.&lt;br&gt;
But as Gene Kim and Steve highlight in their work on &lt;em&gt;Vibe Coding&lt;/em&gt;, this only works if you have extreme &lt;strong&gt;Code Comprehension&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AI suffers from the "Illusion of Competence". It generates code that &lt;em&gt;looks&lt;/em&gt; correct, compiles perfectly, but contains subtle logical bugs or security holes.&lt;/p&gt;

&lt;p&gt;In this model, you are no longer just a "Writer". &lt;strong&gt;You are a Code Auditor.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding:&lt;/strong&gt; Rapidly iterating with AI to build the structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Comprehension:&lt;/strong&gt; Reading every generated line to ensure it matches the &lt;strong&gt;Spec&lt;/strong&gt; and doesn't introduce hidden technical debt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You cannot "vibe" your way through a banking migration. You must comprehend the output. If you treat the AI as a "Black Box", you are not engineering—you are gambling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow (ROI Analysis)
&lt;/h2&gt;

&lt;p&gt;This looks like "Waterfall", doesn't it?&lt;br&gt;
&lt;strong&gt;Good.&lt;/strong&gt;&lt;br&gt;
Agile was created to manage the cost of change when &lt;em&gt;coding&lt;/em&gt; was slow.&lt;br&gt;
Now, coding is instant. The cost has shifted to &lt;em&gt;debugging bad requirements&lt;/em&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Old Model (Agile + Human)&lt;/th&gt;
&lt;th&gt;New Model (Spec-Driven + AI)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1h (Jira/Refinement)&lt;/td&gt;
&lt;td&gt;2h (Deep Work / Writing Spec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8h (Dev + Tests)&lt;/td&gt;
&lt;td&gt;5 min (AI Generation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auditing / Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1h (PR Review)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2h (Deep Line-by-Line Audit)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10h&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~4h&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion: The "Thinking" Gap
&lt;/h2&gt;

&lt;p&gt;The McKinsey report scares people because it implies we need fewer developers.&lt;br&gt;
It's true. We need fewer &lt;em&gt;coders&lt;/em&gt;.&lt;br&gt;
But we need more &lt;em&gt;Engineers&lt;/em&gt; who can articulate complex system behaviors in unambiguous text and &lt;strong&gt;validate&lt;/strong&gt; the result.&lt;/p&gt;

&lt;p&gt;AI is a multiplier.&lt;br&gt;
Zero times a Million is still Zero.&lt;br&gt;
If your input (User Story) is fluff, your output (Code) will be technical debt.&lt;/p&gt;

&lt;p&gt;Stop writing stories. Start writing Specs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on **Legacy Modernization&lt;/em&gt;* and &lt;strong&gt;Risk Management&lt;/strong&gt; in the cloud.*&lt;/p&gt;

</description>
      <category>genai</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>aws</category>
    </item>
    <item>
      <title>McKinsey Just Killed Agile: Why 'Commando Units' &amp; Spec-Driven AI Are The Future of Legacy Migration</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Fri, 26 Dec 2025 16:46:28 +0000</pubDate>
      <link>https://dev.to/jmontagne/mckinsey-just-killed-agile-why-commando-units-are-the-only-way-to-survive-legacy-migration-40lk</link>
      <guid>https://dev.to/jmontagne/mckinsey-just-killed-agile-why-commando-units-are-the-only-way-to-survive-legacy-migration-40lk</guid>
      <description>&lt;p&gt;&lt;strong&gt;Listen.&lt;/strong&gt; I’m going to be brutally honest because I’m too old to play corporate politeness games.&lt;/p&gt;

&lt;p&gt;For the last three articles, I’ve been advocating for a controversial operational model I call &lt;strong&gt;"Tiger Teams"&lt;/strong&gt; or &lt;strong&gt;"Commando Units"&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The premise was simple: &lt;strong&gt;Stop the relay race.&lt;/strong&gt; Stop treating software engineering like an assembly line where 8 people pass a ticket around for two weeks. Put 3 senior engineers in a room, give them absolute silence, and watch them migrate a monolithic payment gateway to AWS in 4 days.&lt;/p&gt;

&lt;p&gt;My inbox was full of Project Managers telling me this is "unsustainable."&lt;/p&gt;

&lt;p&gt;Well, last week, &lt;strong&gt;McKinsey &amp;amp; Company&lt;/strong&gt; validated everything the "Old Foxes" have been saying for years.&lt;/p&gt;

&lt;p&gt;Let’s break down the data, the math, and the &lt;strong&gt;new toolchain (Kiro)&lt;/strong&gt; that makes this possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data: 10% vs. 700%
&lt;/h2&gt;

&lt;p&gt;In the video below, Martin Harrysson drops a bomb on the industry.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/SZStlIhyTCY"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Most companies are currently trying to sprinkle GenAI on top of their existing Agile processes. They keep the 10-person teams, the daily standups, and just give everyone an autocomplete tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result? A pathetic 10-15% productivity gain.&lt;/strong&gt; (According to McKinsey).&lt;/p&gt;

&lt;p&gt;Why? Because the bottleneck isn't typing speed. It's &lt;strong&gt;communication overhead&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, companies that change the &lt;strong&gt;Operating Model&lt;/strong&gt; to what I call "Commando Units" (Small Pods) are seeing results that are &lt;strong&gt;transformational&lt;/strong&gt;. Based on my own deployments of this model in Cloud Migrations, we are seeing a &lt;strong&gt;5x to 7x efficiency jump&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "2-Pizza Team" is Too Big
&lt;/h3&gt;

&lt;p&gt;In 2026, a single Senior Architect with the right Agentic IDE has the output capacity of 5 juniors from 2020. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The New Rule: The "1-Pizza Pod"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size:&lt;/strong&gt; 3-4 People Max.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition:&lt;/strong&gt; 1 Lead Architect, 1-2 Senior Devs, 1 QA/Data Specialist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methodology:&lt;/strong&gt; Continuous Flow, not Sprints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Pivot: From "User Stories" to "Hard Specs"
&lt;/h2&gt;

&lt;p&gt;This is where most Agile coaches will start sweating.&lt;br&gt;
We have spent the last decade training developers to write fuzzy "User Stories."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"As a user, I want to upload a file..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is &lt;strong&gt;useless&lt;/strong&gt; for an AI-driven workflow. AI models hallucinate when you give them ambiguity. They thrive when you give them constraints.&lt;/p&gt;

&lt;p&gt;If you are modernizing a 15-year-old Java Monolith to AWS Lambda, you don't need a User Story. You need a &lt;strong&gt;Specification&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Weapon of Choice: Kiro (The Spec-Driven IDE)
&lt;/h2&gt;

&lt;p&gt;I have stopped using standard chat-based assistants for complex migrations. They are too "chatty" and lose context.&lt;/p&gt;

&lt;p&gt;Recently, I switched to &lt;strong&gt;&lt;a href="https://kiro.dev" rel="noopener noreferrer"&gt;Kiro.dev&lt;/a&gt;&lt;/strong&gt; because it enforces a &lt;strong&gt;Spec-Driven Workflow&lt;/strong&gt;. It doesn't guess; it follows the "Steering" files.&lt;/p&gt;

&lt;p&gt;Here is my exact workflow for migrating a legacy module to AWS:&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Define the "Steering" (The Rules of Engagement)
&lt;/h3&gt;

&lt;p&gt;In Kiro, I don't repeat myself. I define project-wide rules in the &lt;code&gt;.kiro/steering/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.kiro/steering/tech.md&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# AWS Migration Standards&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Compute:**&lt;/span&gt; Target AWS Lambda (Java 21 SnapStart) or Fargate.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Persistence:**&lt;/span&gt; DynamoDB (Single Table Design) preferred over RDS.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Observability:**&lt;/span&gt; implementation must include CloudWatch Structured Logging.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Validation:**&lt;/span&gt; Use Pydantic (if Python) or Jakarta Validation (if Java).
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**Forbidden:**&lt;/span&gt; Do not use &lt;span class="sb"&gt;`System.out.println`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Write the Spec (Not the Code)
&lt;/h3&gt;

&lt;p&gt;Instead of writing a prompt, I write a &lt;code&gt;.md&lt;/code&gt; spec file. Kiro reads this and plans the implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;specs/01_order_service_migration.md&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Specification: OrderService Migration&lt;/span&gt;
&lt;span class="gs"&gt;**Goal:**&lt;/span&gt; Refactor &lt;span class="sb"&gt;`EJBOrderService.java`&lt;/span&gt; to &lt;span class="sb"&gt;`OrderLambdaHandler.java`&lt;/span&gt;.

&lt;span class="gu"&gt;## Interface Contract&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Trigger:**&lt;/span&gt; SQS Event (JSON payload).
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Output:**&lt;/span&gt; Write to DynamoDB table &lt;span class="sb"&gt;`Orders`&lt;/span&gt;.

&lt;span class="gu"&gt;## Business Rules (Strict)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Verify &lt;span class="sb"&gt;`totalAmount &amp;gt; 0`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; If &lt;span class="sb"&gt;`customerType`&lt;/span&gt; is "VIP", apply 5% discount (logic copied from legacy).
&lt;span class="p"&gt;-&lt;/span&gt; Idempotency: Use &lt;span class="sb"&gt;`orderId`&lt;/span&gt; as the DynamoDB Partition Key.

&lt;span class="gu"&gt;## Error Handling&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; If DynamoDB throws &lt;span class="sb"&gt;`ProvisionedThroughputExceeded`&lt;/span&gt;, implement exponential backoff.
&lt;span class="p"&gt;-&lt;/span&gt; Any other error -&amp;gt; Send to SQS Dead Letter Queue.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: The "Legacy Factory" Execution
&lt;/h3&gt;

&lt;p&gt;Once the spec is ready, I trigger Kiro's Agent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; "Implement &lt;code&gt;specs/01_order_service_migration.md&lt;/code&gt; following the rules in &lt;code&gt;.kiro/steering/tech.md&lt;/code&gt;. Generate the Infrastructure-as-Code (CDK) as well."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because Kiro understands the &lt;strong&gt;entire project context&lt;/strong&gt; and strict &lt;strong&gt;Specs&lt;/strong&gt;, the code comes out production-ready, typically passing 90% of unit tests on the first run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ROI Calculation (Show this to your Boss)
&lt;/h2&gt;

&lt;p&gt;Let's talk money.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Standard Agile Team&lt;/th&gt;
&lt;th&gt;Commando Pod + Kiro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Headcount&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8 Developers + 1 SM + 1 PO&lt;/td&gt;
&lt;td&gt;3 Senior Engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meetings/Week&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~12 hours/person&lt;/td&gt;
&lt;td&gt;~2 hours/person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workflow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Jira Tickets &amp;amp; Chat"&lt;/td&gt;
&lt;td&gt;"Spec-Driven Agents"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Velocity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linear (1x)&lt;/td&gt;
&lt;td&gt;Exponential (5x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;High&lt;/strong&gt; (10 salaries)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Medium&lt;/strong&gt; (3 high salaries)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Final Thoughts: The Silence of the Lambs
&lt;/h2&gt;

&lt;p&gt;My "Grand Strategy" for 2026 is simple: &lt;strong&gt;Deep Work and Silence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have blocked my calendar from 09:00 to 11:00. No meetings. No Slack. Just me, the AWS Console, and the Kiro Agents.&lt;/p&gt;

&lt;p&gt;The McKinsey video proves that this isn't just "introvert preference." It is the &lt;strong&gt;optimal economic strategy&lt;/strong&gt; for software development.&lt;/p&gt;

&lt;p&gt;If you are a developer: &lt;strong&gt;Stop coding. Start architecting.&lt;/strong&gt;&lt;br&gt;
If you are a Manager: &lt;strong&gt;Stop scaling up. Start scaling down.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I am Jacques Montagne. I specialize in migrating Legacy Monoliths to AWS. I am currently building the "Legacy Commando" methodology using Kiro.dev. Follow me for more field reports.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>agile</category>
      <category>kiro</category>
      <category>legacy</category>
    </item>
    <item>
      <title>Asynchronous Warfare: How to Deliver When The Org Won't Cooperate (Part 4)</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Fri, 26 Dec 2025 11:32:46 +0000</pubDate>
      <link>https://dev.to/jmontagne/remote-mobbing-that-doesnt-suck-the-2025-operational-guide-part-3-3n43</link>
      <guid>https://dev.to/jmontagne/remote-mobbing-that-doesnt-suck-the-2025-operational-guide-part-3-3n43</guid>
      <description>&lt;p&gt;&lt;strong&gt;Strategies for Mocking, Decoupling, and InnerSourcing.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Ferrari in Traffic" Problem
&lt;/h2&gt;

&lt;p&gt;If you followed Parts 1, 2, and 3, you now have a high-performance &lt;strong&gt;Tiger Team&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You use &lt;strong&gt;Tracer Bullets&lt;/strong&gt; to validate paths instantly.&lt;/li&gt;
&lt;li&gt;You use &lt;strong&gt;CoScreen/RustDesk&lt;/strong&gt; to mob remotely with zero latency.&lt;/li&gt;
&lt;li&gt;You deploy in &lt;strong&gt;15-minute increments&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But then, reality hits.&lt;br&gt;
You need an API change from the "Core Banking Team." You open a Jira ticket.&lt;br&gt;
They reply: &lt;em&gt;"Added to backlog. ETA: 3 weeks."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your velocity drops from 100mph to zero.&lt;br&gt;
This is the &lt;strong&gt;Asynchronous Warfare&lt;/strong&gt; phase. Your internal speed is irrelevant if your external dependencies are blocked.&lt;/p&gt;

&lt;p&gt;You cannot "agile" your way out of a dependency on a slow team. You must &lt;strong&gt;Decouple&lt;/strong&gt;.&lt;br&gt;
Here are the four tactical maneuvers to survive in a hostile, slow environment.&lt;/p&gt;


&lt;h2&gt;
  
  
  Tactic 1: Mock First, Ask Later (Consumer-Driven Contracts)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Trap:&lt;/strong&gt;&lt;br&gt;
You wait for the dependency to build the API so you can consume it. This is "Integration Hell" in slow motion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Maneuver:&lt;/strong&gt;&lt;br&gt;
Do not wait. Define the contract yourself.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Write the &lt;strong&gt;OpenAPI (Swagger)&lt;/strong&gt; spec that &lt;em&gt;you&lt;/em&gt; wish existed.&lt;/li&gt;
&lt;li&gt; Spin up a &lt;strong&gt;Mock Server&lt;/strong&gt; (using WireMock or Microcks) that returns that exact response.&lt;/li&gt;
&lt;li&gt; Build your entire feature against the Mock. Deploy it to UAT behind a Feature Flag.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Power Move:&lt;/strong&gt;&lt;br&gt;
When the Core Team finally wakes up, you don't ask them &lt;em&gt;"Can you design an API?"&lt;/em&gt;&lt;br&gt;
You hand them the spec and the tests: &lt;em&gt;"Here is the contract we are already using. Your job is just to make the backend satisfy this test."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wiremock" rel="noopener noreferrer"&gt;
        wiremock
      &lt;/a&gt; / &lt;a href="https://github.com/wiremock/wiremock" rel="noopener noreferrer"&gt;
        wiremock
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A tool for mocking HTTP services
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;WireMock - flexible, open source API mocking&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
    &lt;a href="https://wiremock.org" rel="nofollow noopener noreferrer"&gt;
        &lt;img width="512px" src="https://camo.githubusercontent.com/16b902223f10d80cc649ac22925be4ab4253b3a65d3d56d444c06b12dac0ae83/68747470733a2f2f776972656d6f636b2e6f72672f696d616765732f6c6f676f732f776972656d6f636b2f6c6f676f5f776964652e737667" alt="WireMock Logo"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/tomakehurst/wiremock/actions/workflows/build-and-test.yml" rel="noopener noreferrer"&gt;
        &lt;img src="https://github.com/tomakehurst/wiremock/actions/workflows/build-and-test.yml/badge.svg" alt="Build Status"&gt;
    &lt;/a&gt;
    &lt;a href="https://wiremock.org/docs/" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/a2c03915d32af9daa8ae661f5752a31ddd4d468d232acfb7b924a604d35620a5/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d446f63756d656e746174696f6e266d6573736167653d7075626c696326636f6c6f723d677265656e" alt="Docs"&gt;
    &lt;/a&gt;
    &lt;a href="https://slack.wiremock.org/" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/f1c225df58f6f980bf9baed3296db3a81ea7ed9b5f95d9424b9297762b85571b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f736c61636b2d4a6f696e25323075732d627269676874677265656e3f7374796c653d666c6174266c6f676f3d736c61636b" alt="Join us on Slack"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/wiremock/wiremock/./CONTRIBUTING.md" rel="noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/34615e91c4fb143f6be55aef67b0d0c44144e8933dea9ea94070c8c80a7de668/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d436f6e747269627574696e67266d6573736167653d677569646526636f6c6f723d6f72616e6765" alt="Contributing Guide"&gt;
    &lt;/a&gt;
    &lt;a href="https://search.maven.org/artifact/org.wiremock/wiremock" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/47c635219f0919ad098a780a334d92dfdd3f5962e6d82d6f167c8c3a2ff5dd7f/68747470733a2f2f696d672e736869656c64732e696f2f6d6176656e2d63656e7472616c2f762f6f72672e776972656d6f636b2f776972656d6f636b2e737667" alt="Maven Central"&gt;
    &lt;/a&gt;
&lt;/p&gt;



&lt;br&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d5af5c16354fe04c86cccdb0cc4bbd62477dc7b5b5771cd2aee5888ce0fa756c/68747470733a2f2f776972656d6f636b2e6f72672f696d616765732f776972656d6f636b2d636c6f75642f776972656d6f636b5f636c6f75645f6c6f676f2e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/d5af5c16354fe04c86cccdb0cc4bbd62477dc7b5b5771cd2aee5888ce0fa756c/68747470733a2f2f776972656d6f636b2e6f72672f696d616765732f776972656d6f636b2d636c6f75642f776972656d6f636b5f636c6f75645f6c6f676f2e706e67" alt="WireMock Cloud Logo" height="20"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;WireMock open source is supported by &lt;a href="https://www.wiremock.io/cloud-overview?utm_source=github.com&amp;amp;utm_campaign=wiremock-README.md-banner" rel="nofollow noopener noreferrer"&gt;WireMock Cloud&lt;/a&gt;. Please consider trying it out if your team needs advanced capabilities such as OpenAPI, dynamic state, data sources and more.&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;WireMock is the popular open source tool for API mocking, with over 6 million downloads per month
and powers &lt;a href="https://www.wiremock.io/comparison?utm_source=github.com&amp;amp;utm_campaign=wiremock-README.md" rel="nofollow noopener noreferrer"&gt;WireMock Cloud&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It can help you to create stable test and development environments
isolate yourself from flaky 3rd parties and simulate APIs that don’t exist yet.&lt;/p&gt;
&lt;p&gt;Started in 2011 as a Java library by &lt;a href="https://github.com/tomakehurst" rel="noopener noreferrer"&gt;Tom Akehurst&lt;/a&gt;,
now WireMock spans across multiple programming languages and technology stacks.
It can run as a library or client wrapper in many languages, or as a standalone server.
There is a big community behind the project and its ecosystem.&lt;/p&gt;
&lt;p&gt;WireMock supports several approaches for creating mock APIs -
in code, via its REST API, as JSON files and…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wiremock/wiremock" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; You shift the power dynamic. You define the standard; they just implement it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tactic 2: The Anti-Corruption Layer (ACL)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Trap:&lt;/strong&gt;&lt;br&gt;
The Legacy Team finally delivers the API, but it's garbage. Column names are in French mixed with Hungarian notation (&lt;code&gt;int_montant_ht_VAL&lt;/code&gt;), and the dates are strings.&lt;br&gt;
If you use their data structures directly, your clean code becomes "infected" by their technical debt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Maneuver:&lt;/strong&gt;&lt;br&gt;
Build a hard wall. In Domain-Driven Design (DDD), this is an &lt;strong&gt;Anti-Corruption Layer&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Their World:&lt;/strong&gt; Dirty Data, XML, SOAP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Wall (ACL):&lt;/strong&gt; A distinct Adapter/Mapper class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your World:&lt;/strong&gt; Clean DTOs, Immutable Records, English naming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Never let a legacy class name (e.g., &lt;code&gt;T_USR_DATA_V2&lt;/code&gt;) leak into your domain logic. Map it at the border, even if it feels redundant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tactic 3: InnerSource (The "Nuclear Option")
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Trap:&lt;/strong&gt;&lt;br&gt;
The dependency team agrees the change is easy (e.g., adding one column), but they have "no resources" to do it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Maneuver:&lt;/strong&gt;&lt;br&gt;
Stop asking for a &lt;em&gt;service&lt;/em&gt;. Ask for &lt;em&gt;access&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I understand you are busy. Give my team Write Access to your repository for 2 days. We will implement the change, write the tests, and you only have to do the Code Review."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scenario A:&lt;/strong&gt; They agree. You do it yourself. You are unblocked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scenario B (Most likely):&lt;/strong&gt; They are terrified of letting "outsiders" touch their code. Their pride gets hurt. Result: They suddenly "find time" to do it themselves by tomorrow just to keep you out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, you win.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tactic 4: Weaponized Economics (For The Sponsor)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Trap:&lt;/strong&gt;&lt;br&gt;
The Infrastructure Team says: &lt;em&gt;"Opening this firewall port takes 10 business days. It's the SLA."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Maneuver:&lt;/strong&gt;&lt;br&gt;
This is where your &lt;strong&gt;Executive Sponsor&lt;/strong&gt; (from Part 3) steps in.&lt;br&gt;
Engineers argue about &lt;em&gt;time&lt;/em&gt;. Managers must argue about &lt;em&gt;money&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Do not say: &lt;em&gt;"It's too slow."&lt;/em&gt;&lt;br&gt;
Say: &lt;em&gt;"The Cost of Delay for this feature is *&lt;/em&gt;€15,000 per week** in lost opportunity. If we wait 2 weeks for a firewall rule, are you signing off on a €30,000 loss?"*&lt;/p&gt;

&lt;p&gt;Suddenly, the firewall rule gets opened in 1 hour.&lt;br&gt;
&lt;strong&gt;Risk&lt;/strong&gt; is the only language bureaucracy understands.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: The Completed Guide
&lt;/h2&gt;

&lt;p&gt;You cannot fix the entire organization. If you try to modernize everything at once, you will be crushed by the inertia.&lt;/p&gt;

&lt;p&gt;Instead, build a &lt;strong&gt;Tiger Team&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Isolate it&lt;/strong&gt; financially (Part 1).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Equip it&lt;/strong&gt; with tools like &lt;code&gt;mr&lt;/code&gt; and &lt;code&gt;RustDesk&lt;/code&gt; (Part 2 &amp;amp; 3).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Defend it&lt;/strong&gt; with mocks and ACLs (Part 4).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stop asking for permission to be efficient.&lt;br&gt;
&lt;strong&gt;Decouple, Mock, Deliver.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This concludes "The Legacy Survival Guide". Good luck out there.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>management</category>
      <category>softskills</category>
      <category>legacycode</category>
    </item>
    <item>
      <title>Remote Mobbing That Doesn't Suck: The 2026 Operational Guide (Part 3)</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Wed, 24 Dec 2025 17:45:00 +0000</pubDate>
      <link>https://dev.to/jmontagne/remote-tiger-teams-the-dont-kill-each-other-operational-guide-2025-edition-1m4e</link>
      <guid>https://dev.to/jmontagne/remote-tiger-teams-the-dont-kill-each-other-operational-guide-2025-edition-1m4e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Low-Latency Cockpits, RustDesk, and the Git Handover Protocol.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  "Okay, you convinced me."
&lt;/h2&gt;

&lt;p&gt;In my previous posts, I argued that &lt;strong&gt;Tiger Teams&lt;/strong&gt; (cross-functional Commando Units) are the only way to modernize Legacy Systems effectively. But there is one objection I keep getting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Jacques, we are 100% remote. Sitting on a Zoom call for 6 hours a day sounds like hell. How do we do this without killing each other?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Valid point. If you try to run a Mob Session using Microsoft Teams or Zoom, you &lt;strong&gt;will&lt;/strong&gt; fail. The Deep Research is clear: these tools optimize for &lt;em&gt;video smoothing&lt;/em&gt;, creating a latency of &lt;strong&gt;100-150ms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For code, we need the &lt;strong&gt;"Gold Standard": &amp;lt;50ms&lt;/strong&gt;.&lt;br&gt;
If there is a delay between me typing and you seeing it, our brains disconnect. We stop "collaborating" and start "instructing."&lt;/p&gt;

&lt;p&gt;To survive, you need to build a &lt;strong&gt;"Digital Cockpit"&lt;/strong&gt;. Here is the operational guide based on the 2025 market landscape.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. The "Pixel Streaming" Layer (Desktop Sharing)
&lt;/h2&gt;

&lt;p&gt;This is the heavy artillery. You need to see the &lt;em&gt;whole&lt;/em&gt; context: The IDE, the Terminal, the AWS Console, and the Database Client.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: The Mac-First Choice (&lt;strong&gt;Tuple&lt;/strong&gt;)
&lt;/h3&gt;

&lt;p&gt;If your team is 100% macOS, stop reading and buy Tuple.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Tech:&lt;/strong&gt; It uses a custom WebRTC engine stripped of browser bloat, defaulting to Peer-to-Peer (P2P).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt; &lt;strong&gt;5K Resolution at 60fps.&lt;/strong&gt; It renders text sharply enough that you forget you are streaming. It feels local.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Option B: The Multi-Window Choice (&lt;strong&gt;CoScreen&lt;/strong&gt;)
&lt;/h3&gt;

&lt;p&gt;If you need to debug complex distributed systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Tech:&lt;/strong&gt; It allows you to share &lt;em&gt;individual windows&lt;/em&gt; simultaneously. I can type in your Terminal window while you type in my IDE window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt; &lt;strong&gt;True Mobbing.&lt;/strong&gt; It eliminates the "Driver/Navigator" locking. Everyone has a mouse. It turns a "presentation" into a "war room."&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Option C: The "Sovereign" Choice (&lt;strong&gt;RustDesk&lt;/strong&gt;)
&lt;/h3&gt;

&lt;p&gt;For those in Banking, Defense, or heavy Linux shops. Tuple has a "Linux Gap," and TeamViewer is expensive corporate bloat.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rustdesk" rel="noopener noreferrer"&gt;
        rustdesk
      &lt;/a&gt; / &lt;a href="https://github.com/rustdesk/rustdesk" rel="noopener noreferrer"&gt;
        rustdesk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/rustdesk/rustdesk/res/logo-header.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Frustdesk%2Frustdesk%2Fres%2Flogo-header.svg" alt="RustDesk - Your remote desktop"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://github.com/rustdesk/rustdesk#raw-steps-to-build" rel="noopener noreferrer"&gt;Build&lt;/a&gt; •
  &lt;a href="https://github.com/rustdesk/rustdesk#how-to-build-with-docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; •
  &lt;a href="https://github.com/rustdesk/rustdesk#file-structure" rel="noopener noreferrer"&gt;Structure&lt;/a&gt; •
  &lt;a href="https://github.com/rustdesk/rustdesk#snapshot" rel="noopener noreferrer"&gt;Snapshot&lt;/a&gt;&lt;br&gt;
  [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-UA.md" rel="noopener noreferrer"&gt;Українська&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-CS.md" rel="noopener noreferrer"&gt;česky&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-ZH.md" rel="noopener noreferrer"&gt;中文&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-HU.md" rel="noopener noreferrer"&gt;Magyar&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-ES.md" rel="noopener noreferrer"&gt;Español&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-FA.md" rel="noopener noreferrer"&gt;فارسی&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-FR.md" rel="noopener noreferrer"&gt;Français&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-DE.md" rel="noopener noreferrer"&gt;Deutsch&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-PL.md" rel="noopener noreferrer"&gt;Polski&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-ID.md" rel="noopener noreferrer"&gt;Indonesian&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-FI.md" rel="noopener noreferrer"&gt;Suomi&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-ML.md" rel="noopener noreferrer"&gt;മലയാളം&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-JP.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-NL.md" rel="noopener noreferrer"&gt;Nederlands&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-IT.md" rel="noopener noreferrer"&gt;Italiano&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-RU.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-PTBR.md" rel="noopener noreferrer"&gt;Português (Brasil)&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-EO.md" rel="noopener noreferrer"&gt;Esperanto&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-KR.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-AR.md" rel="noopener noreferrer"&gt;العربي&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-VN.md" rel="noopener noreferrer"&gt;Tiếng Việt&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-DA.md" rel="noopener noreferrer"&gt;Dansk&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-GR.md" rel="noopener noreferrer"&gt;Ελληνικά&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-TR.md" rel="noopener noreferrer"&gt;Türkçe&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-NO.md" rel="noopener noreferrer"&gt;Norsk&lt;/a&gt;] | [&lt;a href="https://github.com/rustdesk/rustdesk/docs/README-RO.md" rel="noopener noreferrer"&gt;Română&lt;/a&gt;]&lt;br&gt;
  &lt;b&gt;We need your help to translate this README, &lt;a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang" rel="noopener noreferrer"&gt;RustDesk UI&lt;/a&gt; and &lt;a href="https://github.com/rustdesk/doc.rustdesk.com" rel="noopener noreferrer"&gt;RustDesk Doc&lt;/a&gt; to your native language&lt;/b&gt;
&lt;/p&gt;

&lt;div class="markdown-alert markdown-alert-caution"&gt;
&lt;p class="markdown-alert-title"&gt;Caution&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Misuse Disclaimer:&lt;/strong&gt; &lt;br&gt;
The developers of RustDesk do not condone or support any unethical or illegal use of this software. Misuse…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rustdesk/rustdesk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Tech:&lt;/strong&gt; Open-source, written in Rust. Crucially, it allows &lt;strong&gt;Self-Hosting&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt; &lt;strong&gt;Data Sovereignty.&lt;/strong&gt; You can deploy the Relay Server inside your own VPC. No pixels ever leave your corporate network. It is the "TeamViewer Killer" for security-conscious commandos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. The "State Sync" Layer (IDE Native)
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't need pixels. You need raw speed on a low-bandwidth connection. These tools stream the &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt;, not video.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Standard: JetBrains Code With Me / VS Code Live Share
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt; &lt;strong&gt;Bandwidth Efficiency.&lt;/strong&gt; You can pair on a 4G hotspot. Plus, I can navigate to &lt;code&gt;User.java&lt;/code&gt; to check a reference while you are writing code in &lt;code&gt;UserService.java&lt;/code&gt;. We are unblocked.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Disruptor: Cursor (The "Synthetic Pair")
&lt;/h3&gt;

&lt;p&gt;The market has shifted in 2025. "Pairing" no longer just means two humans.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Tech:&lt;/strong&gt; A fork of VS Code with native LLM integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt; &lt;strong&gt;The AI Driver.&lt;/strong&gt; With features like "Composer," you can prompt the AI to refactor 5 files simultaneously while the Mob reviews the diffs. The "Mob" becomes: 3 Humans + 1 AI Agent.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. The "Hacker" Layer (Terminal Sharing)
&lt;/h2&gt;

&lt;p&gt;For DevOps and Platform Engineers, the GUI is a distraction. The truth lives in the shell. Do not share your screen for this; share the session.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tool: Zellij (The Modern &lt;code&gt;tmux&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;If you still use &lt;code&gt;tmux&lt;/code&gt; or &lt;code&gt;screen&lt;/code&gt;, it's time to upgrade. &lt;strong&gt;Zellij&lt;/strong&gt; is a terminal multiplexer written in Rust.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/zellij-org" rel="noopener noreferrer"&gt;
        zellij-org
      &lt;/a&gt; / &lt;a href="https://github.com/zellij-org/zellij" rel="noopener noreferrer"&gt;
        zellij
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A terminal workspace with batteries included
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  &lt;br&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/zellij-org/zellij/main/assets/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fzellij-org%2Fzellij%2Fmain%2Fassets%2Flogo.png" alt="logo" width="200"&gt;&lt;/a&gt;
  &lt;br&gt;
  Zellij
  &lt;br&gt;
  &lt;br&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/zellij-org/zellij/main/assets/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fzellij-org%2Fzellij%2Fmain%2Fassets%2Fdemo.gif" alt="demo"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;
  [&lt;a href="https://zellij.dev/documentation/installation" rel="nofollow noopener noreferrer"&gt;Installation&lt;/a&gt;]
  [&lt;a href="https://zellij.dev/screencasts/" rel="nofollow noopener noreferrer"&gt;Screencasts &amp;amp; Tutorials&lt;/a&gt;]
  [&lt;a href="https://zellij.dev/documentation/configuration" rel="nofollow noopener noreferrer"&gt;Configuration&lt;/a&gt;]
  [&lt;a href="https://zellij.dev/documentation/layouts" rel="nofollow noopener noreferrer"&gt;Layouts&lt;/a&gt;]
  [&lt;a href="https://zellij.dev/documentation/faq" rel="nofollow noopener noreferrer"&gt;FAQ&lt;/a&gt;]
&lt;/h4&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://discord.gg/CrUAFH3" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Discord Chat" src="https://camo.githubusercontent.com/6807ef49c757e5f11a43ea2a3c6e024fee6cc7eee4c87e04a5da246ebc28a31c/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3737313336373133333731353632383037333f636f6c6f723d353836354632266c6162656c3d646973636f7264267374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a href="https://matrix.to/#/#zellij_general:matrix.org" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Matrix Chat" src="https://camo.githubusercontent.com/9f7de35f22e9eb8874565fc4eaa6516fd4c377991ee1db6aabea3ac5c180abc7/68747470733a2f2f696d672e736869656c64732e696f2f6d61747269782f7a656c6c696a5f67656e6572616c3a6d61747269782e6f72673f636f6c6f723d316437653634266c6162656c3d6d617472697825323063686174267374796c653d666c61742d737175617265266c6f676f3d6d6174726978"&gt;&lt;/a&gt;
  &lt;a href="https://zellij.dev/documentation/" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Zellij documentation" src="https://camo.githubusercontent.com/25f683e2de40ab16faf986e3de03bc4a8cb250d1995ad959ea71513aabb64d4c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7a656c6c696a2d646f63756d656e746174696f6e2d6663303036303f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
      &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F55156624-a71a-46b5-939e-f562e3b2dd7f" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F55156624-a71a-46b5-939e-f562e3b2dd7f" alt="Sponsored by "&gt;&lt;/a&gt;&lt;br&gt;
    &lt;br&gt;
     &lt;br&gt;
     &lt;br&gt;
    &lt;a href="https://www.gresearch.com/" rel="nofollow noopener noreferrer"&gt;&lt;br&gt;
        &lt;br&gt;
          &lt;br&gt;
          &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F742ae902-fe9d-41c6-baf2-4bc143061da3" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F742ae902-fe9d-41c6-baf2-4bc143061da3" alt="gresearch logo"&gt;&lt;/a&gt;&lt;br&gt;
        &lt;br&gt;
    &lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;What is this?&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/zellij-org/zellij#origin-of-the-name" rel="noopener noreferrer"&gt;Zellij&lt;/a&gt; is a workspace aimed at developers, ops-oriented people and anyone who loves the terminal. Similar programs are sometimes called "Terminal Multiplexers".&lt;/p&gt;

&lt;p&gt;Zellij is designed around the philosophy that one must not sacrifice simplicity for power, taking pride in its great experience out of the box as well as the advanced features it places at its users' fingertips.&lt;/p&gt;

&lt;p&gt;Zellij is geared toward beginner and power users alike - allowing deep customizability, personal automation through &lt;a href="https://zellij.dev/documentation/layouts.html" rel="nofollow noopener noreferrer"&gt;layouts&lt;/a&gt;, true multiplayer collaboration, unique UX features such as floating and stacked panes, and a &lt;a href="https://zellij.dev/documentation/plugins.html" rel="nofollow noopener noreferrer"&gt;plugin system&lt;/a&gt; allowing one to create plugins in any language that compiles to WebAssembly.&lt;/p&gt;

&lt;p&gt;Zellij includes a built-in &lt;a href="https://zellij.dev/tutorials/web-client/" rel="nofollow noopener noreferrer"&gt;web-client&lt;/a&gt;, making a terminal optional.&lt;/p&gt;

&lt;p&gt;You can get started by &lt;a href="https://zellij.dev/documentation/installation.html" rel="nofollow noopener noreferrer"&gt;installing&lt;/a&gt; Zellij and checking out the &lt;a href="https://zellij.dev/screencasts/" rel="nofollow noopener noreferrer"&gt;Screencasts &amp;amp; Tutorials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/zellij-org/zellij" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Feature:&lt;/strong&gt; &lt;code&gt;zellij --session pairing&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt; &lt;strong&gt;Instant Multi-Cursor in CLI.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;You don't need to install a client.&lt;/li&gt;
&lt;li&gt;You SSH into the bastion, attach to the session, and fix the server together.&lt;/li&gt;
&lt;li&gt;It works where GUIs fear to tread.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The Protocol: The "Git Handover"
&lt;/h2&gt;

&lt;p&gt;Tools reduce friction, but Process prevents burnout. In a remote setting, the "Alpha Geek" tends to dominate the keyboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 15-Minute Timer Rule:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Set a timer.&lt;/li&gt;
&lt;li&gt; When it rings, the Driver stops immediately.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"wip: handoff to [Name]"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next Driver: &lt;code&gt;git pull&lt;/code&gt; and shares screen.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💰 The Concrete Gain:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forced Engagement:&lt;/strong&gt; You cannot tune out (check Instagram) because you are driving in 12 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic History:&lt;/strong&gt; You generate a granular commit history. If you go down a rabbit hole, you revert 15 minutes, not 4 hours.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Appendix: The 2025 Tooling Tier List
&lt;/h2&gt;

&lt;p&gt;I have analyzed the market so you don't have to. Here is what you should fight for.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;The Concrete Gain (ROI)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RustDesk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Screen Sharing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Total Sovereignty.&lt;/strong&gt; Self-hostable, zero spying risk.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Banks / DevOps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tuple&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Screen Sharing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.5/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Input Latency.&lt;/strong&gt; The crispest remote control (&amp;lt;40ms).&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;macOS Teams&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CoScreen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-Window&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.5/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Context Mixing.&lt;/strong&gt; I share IDE, you share Terminal.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zellij&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Ops Velocity.&lt;/strong&gt; Collaborative SSH without lag.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SRE / Platform&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI Editor&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Velocity Multiplier.&lt;/strong&gt; The AI becomes the "Driver".&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Greenfield&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Teams/Zoom&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Corporate&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Nothing.&lt;/strong&gt; High latency, blurry text. Avoid.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Presentations&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;The Bottom Line:&lt;/strong&gt;&lt;br&gt;
If you are a backend team on Linux, build a &lt;strong&gt;RustDesk + Zellij&lt;/strong&gt; stack.&lt;br&gt;
If you are a frontend team on Mac, buy &lt;strong&gt;Tuple + Cursor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Stop trying to code on Zoom.&lt;/p&gt;

</description>
      <category>remotework</category>
      <category>productivity</category>
      <category>tools</category>
      <category>management</category>
    </item>
    <item>
      <title>Stop The Relay Race: A Tech Lead’s Guide to "Tiger Teams" (Part 2)</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Sun, 21 Dec 2025 16:33:29 +0000</pubDate>
      <link>https://dev.to/jmontagne/stop-the-relay-race-a-field-guide-to-tiger-teams-in-legacy-systems-3jk0</link>
      <guid>https://dev.to/jmontagne/stop-the-relay-race-a-field-guide-to-tiger-teams-in-legacy-systems-3jk0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Virtual Monorepos, Tracer Bullets, and Escaping Integration Hell.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Paradox of Modern Tools
&lt;/h2&gt;

&lt;p&gt;We have Kubernetes, CI/CD pipelines, and AI assistants. Yet, shipping a single feature across a legacy ecosystem (Java Backend + SQL DB + JS Frontend) feels like pulling teeth.&lt;/p&gt;

&lt;p&gt;Why? Because we rely on &lt;strong&gt;Component Ownership (Silos)&lt;/strong&gt;, which generates &lt;strong&gt;Integration Hell&lt;/strong&gt;. The cost of coordinating changes across service boundaries often exceeds the cost of the code itself.&lt;/p&gt;

&lt;p&gt;The solution isn't a new framework—it's an &lt;strong&gt;organizational shift&lt;/strong&gt; to &lt;em&gt;Tiger Teams&lt;/em&gt;: interdisciplinary units using &lt;strong&gt;Mob Programming&lt;/strong&gt; to dismantle these costs. Below is a technical field guide on implementing this approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: The Tooling (Virtual Monorepo)
&lt;/h2&gt;

&lt;p&gt;In a legacy landscape, you rarely have a clean monorepo. You have an &lt;em&gt;archipelago&lt;/em&gt; of repositories—some Git, some SVN, loosely coupled by APIs.&lt;br&gt;
To move as a Tiger Team, you need a &lt;strong&gt;meta-layer of control&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: The "Old Fox" Choice — &lt;em&gt;myrepos (mr)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;For polyglot environments (Java + JS + Python), &lt;em&gt;myrepos&lt;/em&gt; (by Joey Hess) is the pragmatic standard. It abstracts underlying VCS differences, allowing unified control across repos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup (.mrconfig):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[.]&lt;/span&gt;
&lt;span class="py"&gt;chain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[backend-service-legacy]&lt;/span&gt;
&lt;span class="py"&gt;checkout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;git clone git@github.com:company/backend.git&lt;/span&gt;

&lt;span class="nn"&gt;[frontend-react]&lt;/span&gt;
&lt;span class="py"&gt;checkout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;git clone git@github.com:company/frontend.git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instead of cd-ing into multiple directories, run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mr update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;to pull changes for all services simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power Move:&lt;/strong&gt; Define custom workflows in &lt;code&gt;.mrconfig&lt;/code&gt; to reduce friction:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;git_nuke&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;git clean -fdx &amp;amp;&amp;amp; git reset --hard HEAD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This turns &lt;code&gt;mr&lt;/code&gt; into a &lt;strong&gt;force multiplier&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option B: The Node.js Choice — &lt;em&gt;meta&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;If your stack leans JS/TS, use &lt;strong&gt;meta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mateodelnorte" rel="noopener noreferrer"&gt;
        mateodelnorte
      &lt;/a&gt; / &lt;a href="https://github.com/mateodelnorte/meta" rel="noopener noreferrer"&gt;
        meta
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tool for turning many repos into a meta repo. why choose many repos or a monolithic repo, when you can have both with a meta repo?
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://travis-ci.com/mateodelnorte/meta" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/58dd6d806f9bd3ffc4daa337afeb5cef9f52452bfef15de514f22a3324eebdb3/68747470733a2f2f7472617669732d63692e636f6d2f6d6174656f64656c6e6f7274652f6d6574612e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://badge.fury.io/js/meta" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/541810d906ccac99acb7f29346d856b1297eff7ae1eb08199f48c41aefb763eb/68747470733a2f2f62616467652e667572792e696f2f6a732f6d6574612e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0786d1bdf3f3093f6a9df8827dbc9896f18776c7fb21b0bdb710a644702270a4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d646174652f6d6174656f64656c6e6f7274652f6d6574612e737667"&gt;&lt;img src="https://camo.githubusercontent.com/0786d1bdf3f3093f6a9df8827dbc9896f18776c7fb21b0bdb710a644702270a4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d646174652f6d6174656f64656c6e6f7274652f6d6574612e737667" alt="Latest Release Date"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="https://www.npmjs.com/package/meta" title="View the status of this project's dependencies on NPM" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d2ae2908c33c12fd45ec0cfdbd3ccafcab6303d2b02eae37f36a30a929a111a5/68747470733a2f2f696d672e736869656c64732e696f2f64617669642f6d6174656f64656c6e6f7274652f6d6574612e737667" alt="Dependency Status"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;&lt;a href="https://www.npmjs.com/package/meta" title="View the status of this project's development dependencies on DavidDM" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f26a4ae2d8b77eb54b7a65ec9f11f9cfab4d8e130caa0d35c6cefe1a05d6bfef/68747470733a2f2f696d672e736869656c64732e696f2f64617669642f6465762f6d6174656f64656c6e6f7274652f6d6574612e737667" alt="Dev Dependency Status"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="https://npmjs.org/package/meta" title="View this project on NPM" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/56caedd5084888f69961e54982245583ac410728fd204ed2e0b16a95775122dd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f6d6574612e737667" alt="NPM downloads"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/08fb2bdce2d13b71fff6f020acc74bbfcc61d4117aa64a88b6fae758f1e203ea/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6d6174656f64656c6e6f7274652f6d6574612e737667"&gt;&lt;img src="https://camo.githubusercontent.com/08fb2bdce2d13b71fff6f020acc74bbfcc61d4117aa64a88b6fae758f1e203ea/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6d6174656f64656c6e6f7274652f6d6574612e737667" alt="Contributors"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span&gt;&lt;a href="https://gitter.im/meta-repos-ftw/Lobby" title="Discuss meta on Gitter" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8269c2ff577134565d006f8af560bc458cd31b722565830a3d6c5d9862716ff7/68747470733a2f2f696d672e736869656c64732e696f2f6769747465722f726f6f6d2f6d6174656f64656c6e6f7274652f6d6574612e737667" alt="Gitter"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;meta&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;meta is a tool for managing multi-project systems and libraries. It answers the conundrum of choosing between a mono repo or many repos by saying "both", with a meta repo!&lt;/p&gt;

&lt;p&gt;meta is powered by plugins that wrap common commands, letting you execute them against some or all of the repos in your solution at once. meta is built on &lt;a href="https://github.com/mateodelnorte/loop" rel="noopener noreferrer"&gt;loop&lt;/a&gt;, and as such inherits loops ability to easily target a particular set of directories for executing a common command (eg &lt;code&gt;meta git status --include-only dir1,dir2&lt;/code&gt;. See &lt;a href="https://github.com/mateodelnorte/loop" rel="noopener noreferrer"&gt;loop&lt;/a&gt; for more available options).&lt;/p&gt;

&lt;p&gt;meta is packaged with a few of these core plugins by default: &lt;a href="https://github.com/mateodelnorte/meta/blob/master/package.json#L63-L66" rel="noopener noreferrer"&gt;https://github.com/mateodelnorte/meta/blob/master/package.json#L63-L66&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why meta?&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;clone a many-project architecture in one line&lt;/li&gt;
&lt;li&gt;give every engineer on your team the same project setup, regardless of where it's cloned&lt;/li&gt;
&lt;li&gt;npm / yarn install against all your projects at once&lt;/li&gt;
&lt;li&gt;execute arbitrary commands against many repos to manage your…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mateodelnorte/meta" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;Key Feature:&lt;/strong&gt; &lt;code&gt;meta npm link&lt;/code&gt; — it creates symlinks between child repositories, letting you edit shared libraries and see live updates without repetitive &lt;code&gt;npm install&lt;/code&gt; cycles.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: The Methodology (Tracer Bullets)
&lt;/h2&gt;

&lt;p&gt;Once your repositories are synchronized, don't start by designing the "perfect" architecture. Start with a &lt;strong&gt;Tracer Bullet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tracer Bullet ≠ Prototype.&lt;/strong&gt;&lt;br&gt;
A prototype is disposable. A Tracer Bullet is &lt;strong&gt;production-quality code&lt;/strong&gt; that establishes a working path through the entire stack, verifying integration points early.&lt;/p&gt;
&lt;h3&gt;
  
  
  The 4-Service Path Example:
&lt;/h3&gt;

&lt;p&gt;Goal: Add a "Priority" flag to a Batch System.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;DB:&lt;/strong&gt; Add &lt;code&gt;is_priority&lt;/code&gt; column. Verify app starts.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;API:&lt;/strong&gt; Pass the payload field, skip validation for now.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Batch:&lt;/strong&gt; Read and handle the flag.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;UI:&lt;/strong&gt; Add minimal checkbox input.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This reveals integration failures &lt;em&gt;immediately&lt;/em&gt;—e.g., a legacy DB driver that can't parse new columns—before full development begins.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: The Anatomy of a Tiger Team (Roles)
&lt;/h2&gt;

&lt;p&gt;Tools are useless if the chain of command is broken. A Tiger Team is not a democracy; it is a tactical unit. To function without "Relay Race" handoffs, you need four distinct roles inside the team.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Sponsor (The General)
&lt;/h3&gt;

&lt;p&gt;Usually a VP or Director.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job:&lt;/strong&gt; Provides the budget, sets the high-level objective ("Migrate Payments by Q3"), and acts as a "Heat Shield" against organizational politics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anti-Pattern:&lt;/strong&gt; The General trying to radio into the battlefield to tell soldiers how to aim their rifles (Micromanagement).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The Tech Lead (The Captain)
&lt;/h3&gt;

&lt;p&gt;The technical commander on the ground. This is not just a "Senior Dev."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Field Commander:&lt;/strong&gt; Translates the General's objective into technical tactics (Tracer Bullets, ACLs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operator:&lt;/strong&gt; Configures the "Digital Cockpit" (RustDesk, CI/CD tunnels).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tie-Breaker:&lt;/strong&gt; Ends endless technical debates during Mob sessions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;The Rule:&lt;/strong&gt; The Captain writes code. If they stop coding to "manage," they lose the respect of the unit.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Product Owner (The Scout)
&lt;/h3&gt;

&lt;p&gt;In Legacy Modernization, the biggest risk is "Scope Creep"—migrating features nobody uses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope Assassin:&lt;/strong&gt; Ruthlessly cuts features. Their favorite word is "No."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Mapper:&lt;/strong&gt; Decides &lt;em&gt;what&lt;/em&gt; gets built next. While the Captain decides &lt;em&gt;how&lt;/em&gt;, the Scout decides &lt;em&gt;what&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. The Commandos (The Execution)
&lt;/h3&gt;

&lt;p&gt;Full-stack engineers who own the feature from Database to UI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job:&lt;/strong&gt; Execution via Mob Programming. In a Tiger Team, no one owns a "component" (e.g., "I only do Frontend"). Everyone owns the mission.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4: The Protocol (One Keyboard, Many Minds)
&lt;/h2&gt;

&lt;p&gt;A Tiger Team acts as a single organism. To achieve this remotely, you need strict discipline.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Handover Protocol
&lt;/h3&gt;

&lt;p&gt;Rotate the &lt;strong&gt;Driver&lt;/strong&gt; role every 10–15 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Driver A: git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"wip"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push
Driver B: git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Takes &amp;lt;30 seconds; serves as a micro-break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strong-Style Pairing:&lt;/strong&gt;&lt;br&gt;
When switching stacks (e.g., from React to Java), the &lt;strong&gt;expert navigates&lt;/strong&gt;, the &lt;strong&gt;novice drives&lt;/strong&gt;.&lt;br&gt;
Rule: &lt;em&gt;"For an idea to go from your head to the computer, it must pass through someone else's hands."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This turns skill gaps into training loops through &lt;strong&gt;haptic learning&lt;/strong&gt;—knowledge transfer in motion.&lt;/p&gt;




&lt;h3&gt;
  
  
  Stop Passing the Baton — Carry the Ball Together
&lt;/h3&gt;

&lt;p&gt;Legacy integration work is not a solo marathon. It's a &lt;strong&gt;relay no more&lt;/strong&gt;—a unified sprint, same keyboard, shared context, collective ownership.&lt;/p&gt;




&lt;h3&gt;
  
  
  Next Step: go remote without going crazy.
&lt;/h3&gt;

&lt;p&gt;You have the Methodology and the Team Structure. Now, let's build the &lt;strong&gt;Digital Cockpit&lt;/strong&gt; to execute this remotely.&lt;br&gt;
👉 &lt;strong&gt;Read Part 3: &lt;a href="https://dev.to/jmontagne/remote-tiger-teams-the-dont-kill-each-other-operational-guide-2025-edition-1m4e"&gt;Remote Mobbing Operations&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>mobprogramming</category>
      <category>legacycode</category>
      <category>tigerteam</category>
      <category>integration</category>
    </item>
    <item>
      <title>Solo Devs Don't Survive Legacy: Why 'Commando Units' Beat 'Full Utilization' (Part 1)</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Sat, 20 Dec 2025 18:57:16 +0000</pubDate>
      <link>https://dev.to/jmontagne/solo-devs-dont-survive-legacy-why-commando-units-beat-full-utilization-5en</link>
      <guid>https://dev.to/jmontagne/solo-devs-dont-survive-legacy-why-commando-units-beat-full-utilization-5en</guid>
      <description>&lt;p&gt;So, you’ve inherited a legacy beast. It’s written in a framework that lost support when Obama was president.&lt;br&gt;&lt;br&gt;
There is no documentation. The original architect retired to a farm in Provence.&lt;/p&gt;

&lt;p&gt;And management just hired 5 new contractors and assigned each of you a separate &lt;em&gt;component&lt;/em&gt; to modernize.&lt;/p&gt;

&lt;p&gt;I have seen this movie before. It ends with a blown budget, a cancelled project, and you updating your CV because you spent 6 months accomplishing absolutely nothing.&lt;/p&gt;

&lt;p&gt;Here is the brutal truth: &lt;strong&gt;In a high-discovery environment (undocumented legacy), solo work is simulation.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The Cognitive Load Trap
&lt;/h3&gt;

&lt;p&gt;When you work alone on a legacy component, you aren't &lt;em&gt;coding.&lt;/em&gt; You are doing &lt;strong&gt;reverse engineering.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You are trying to hold the entire database schema, the business logic, and the weird side-effects of a stored procedure in your RAM (working memory).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cognitive Load Theory&lt;/strong&gt; tells us that once your working memory overflows, your IQ drops.&lt;br&gt;&lt;br&gt;
You stare at the screen. You switch context. You check Slack. You rewrite the same line of code three times.&lt;br&gt;&lt;br&gt;
You are &lt;em&gt;busy&lt;/em&gt;, but you aren't producing value.&lt;/p&gt;




&lt;h3&gt;
  
  
  Enter the "Commando" Unit (The Tiger Team)
&lt;/h3&gt;

&lt;p&gt;Your colleague proposed a “Commando” approach: small teams (2–3 people), one feature at a time.&lt;br&gt;&lt;br&gt;
Management hates it because it looks like &lt;em&gt;paying 3 people to do 1 person’s job.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Management is wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the physics of a Commando Unit applied to legacy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Distributed RAM:&lt;/strong&gt; When 3 people look at the same code (Swarming/Mobbing), you pool your working memory.
One person navigates the database, one tracks the business logic, one drives the keyboard. You don’t get stuck — you bulldoze through the confusion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Code Review:&lt;/strong&gt; In the status quo, you wait days for a review — often shallow because the reviewer doesn’t understand your component.
In a Commando Unit, the review happens &lt;em&gt;while you type.&lt;/em&gt; The error rate drops to near zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Bus Factor:&lt;/strong&gt; If you work alone and get sick, your component dies.
In a Commando Unit, knowledge spreads instantly. The Bus Factor goes from &lt;strong&gt;1 to 3.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The "Friday-to-Thursday" Cycle (Shape Up Style)
&lt;/h3&gt;

&lt;p&gt;Your colleague suggested a specific rhythm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Friday:&lt;/strong&gt; Planning &amp;amp; research (in office). Map out the terrain.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mon–Wed:&lt;/strong&gt; Remote execution. Deep work. No corporate fluff meetings.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thursday:&lt;/strong&gt; Demo &amp;amp; deploy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t “Agile” with sticky notes and empty process ceremonies.&lt;br&gt;&lt;br&gt;
This is &lt;strong&gt;Shape Up&lt;/strong&gt; — betting on a specific scope and delivering it.&lt;br&gt;&lt;br&gt;
It kills the “Zombie Tickets” that sit in &lt;em&gt;In Progress&lt;/em&gt; for weeks.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion: Don’t Be a Hero
&lt;/h3&gt;

&lt;p&gt;Modernizing legacy code isn’t about how fast you type.&lt;br&gt;&lt;br&gt;
It’s about how fast you &lt;strong&gt;learn.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Solo developers learn slowly and fail quietly.&lt;br&gt;&lt;br&gt;
Commando Units learn fast and deliver loudly.&lt;/p&gt;

&lt;p&gt;Stop simulating work.&lt;br&gt;&lt;br&gt;
Form a squad.&lt;br&gt;&lt;br&gt;
Kill the legacy monster together.&lt;/p&gt;

</description>
      <category>legacycode</category>
      <category>teamdynamics</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How to Write in Markdown but Deliver in Word. A Senior Architect's Workflow.</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Fri, 19 Dec 2025 23:38:10 +0000</pubDate>
      <link>https://dev.to/jmontagne/how-to-write-in-markdown-but-deliver-in-word-a-senior-architects-workflow-59ep</link>
      <guid>https://dev.to/jmontagne/how-to-write-in-markdown-but-deliver-in-word-a-senior-architects-workflow-59ep</guid>
      <description>&lt;h2&gt;
  
  
  The Conflict: Engineering vs. Management
&lt;/h2&gt;

&lt;p&gt;There is a fundamental conflict in corporate IT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engineers&lt;/strong&gt; want to write documentation like code (Markdown, in IDE, versioned in Git).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management/Clients&lt;/strong&gt; want "professional" documents (Word, neatly formatted, with logos).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a Senior Architect, I refuse to spend my "Deep Work" hours fighting with Microsoft Word margins or table alignments. But I also know that sending a raw &lt;code&gt;.md&lt;/code&gt; file to a stakeholder is unprofessional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution is not to surrender to Word. The solution is to compile to Word.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tool: Pandoc with Reference Docs
&lt;/h2&gt;

&lt;p&gt;Pandoc is a command-line tool that converts text formats. But its "killer feature" for corporate environments is the &lt;code&gt;--reference-doc&lt;/code&gt; flag.&lt;/p&gt;

&lt;p&gt;This feature allows you to map your plain Markdown text onto a strictly formatted corporate Word template.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgi8o0et13daovx5d7ky.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgi8o0et13daovx5d7ky.jpg" alt="Diagram" width="733" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorial: Setup Your Factory
&lt;/h2&gt;

&lt;p&gt;Here is how I set up a "Documentation Factory" in 5 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Pandoc
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; &lt;code&gt;brew install pandoc&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;choco install pandoc&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Create the "Reference Dog" (The Template)
&lt;/h3&gt;

&lt;p&gt;This is the most important step. You don't create styles in Pandoc. You "steal" them from a Word doc.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Take an existing, well-formatted document from your company (one with the correct headers, fonts, and footer logo).&lt;/li&gt;
&lt;li&gt; Delete all the content, leaving just one dummy header and one paragraph.&lt;/li&gt;
&lt;li&gt; Save it as &lt;code&gt;reference.docx&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step 3: Write in Markdown
&lt;/h3&gt;

&lt;p&gt;Open your IDE (VS Code / IntelliJ). Write your specs using standard Markdown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Architectural Decision Record 001&lt;/span&gt;

&lt;span class="gu"&gt;## Context&lt;/span&gt;
We need to migrate the Monolith to AWS.

&lt;span class="gu"&gt;## Decision&lt;/span&gt;
We will use AWS Lambda and Spring Boot SnapStart.

&lt;span class="gu"&gt;## Consequences&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; Cost reduction by 40%
&lt;span class="p"&gt;*&lt;/span&gt; Cold starts handled by SnapStart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: The Build Command
&lt;/h3&gt;

&lt;p&gt;Run this simple command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc input.md &lt;span class="nt"&gt;-o&lt;/span&gt; Final_Report.docx &lt;span class="nt"&gt;--reference-doc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;reference.docx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What just happened?&lt;/strong&gt;&lt;br&gt;
Pandoc took your text from &lt;code&gt;input.md&lt;/code&gt; and "poured" it into the styles defined in &lt;code&gt;reference.docx&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your &lt;code&gt;# Header 1&lt;/code&gt; became the company's official blue, size 16 font.&lt;/li&gt;
&lt;li&gt;Your lists are perfectly indented.&lt;/li&gt;
&lt;li&gt;The company logo is already in the header/footer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This is a Career Hack
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Speed:&lt;/strong&gt; You write 3x faster in Markdown than in Word.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Version Control:&lt;/strong&gt; You can track changes in Git. Try doing a "Code Review" on a binary &lt;code&gt;.docx&lt;/code&gt; file—it's impossible. With this method, you review the Markdown, merge it, and generate the Word doc as a build artifact.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Professionalism:&lt;/strong&gt; You deliver documents that look &lt;em&gt;exactly&lt;/em&gt; like the business expects, without ever opening Office 365.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Work smart, not hard. Let the CLI handle the formatting.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devops</category>
      <category>documentation</category>
      <category>career</category>
    </item>
    <item>
      <title>AWS Q Developer Agent vs. OpenRewrite: An Architect’s Guide to Realistic Migration Strategies</title>
      <dc:creator>Jacques Montagne</dc:creator>
      <pubDate>Thu, 18 Dec 2025 07:17:27 +0000</pubDate>
      <link>https://dev.to/jmontagne/aws-q-developer-agent-vs-openrewrite-an-architects-guide-to-realistic-migration-strategies-25f5</link>
      <guid>https://dev.to/jmontagne/aws-q-developer-agent-vs-openrewrite-an-architects-guide-to-realistic-migration-strategies-25f5</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: This analysis is based on technical documentation, re:Invent sessions, and deep-dive comparisons of the underlying architecture. It aims to cut through the hype to find the optimal workflow for enterprise migrations.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Promise vs. The Reality
&lt;/h2&gt;

&lt;p&gt;If you attended recent AWS workshops or watched the demos at re:Invent, you likely left with the impression that &lt;strong&gt;AWS Q Developer Agent for Code Transformation&lt;/strong&gt; (formerly AWS Transform) is a magic wand. You upload a Java 8 JAR, wait a few hours, and download a pristine Java 17/21 Spring Boot application.&lt;/p&gt;

&lt;p&gt;For a "Hello World" or a standardized microservice? &lt;strong&gt;Yes, it works beautifully.&lt;/strong&gt;&lt;br&gt;
For a 15-year-old Enterprise Monolith with cyclic dependencies and custom SOAP wrappers? &lt;strong&gt;It requires a strategic approach.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a Senior Architect, I dissected the tool to understand what is happening under the hood and how to use it effectively without getting stuck in feedback loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Under the Hood: Orchestration vs. Generation
&lt;/h2&gt;

&lt;p&gt;It is crucial to understand that the Agent isn't just "Hallucinating code upgrades." The architecture typically follows a robust 80/20 split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;80% Deterministic Rules (OpenRewrite):&lt;/strong&gt; A significant portion of the work—bumping JDK versions, modifying &lt;code&gt;pom.xml&lt;/code&gt;, upgrading Spring Boot namespaces—is powered by engines like &lt;a href="https://docs.openrewrite.org/" rel="noopener noreferrer"&gt;OpenRewrite&lt;/a&gt;. This is a mature, rule-based engine. It doesn't "think"; it executes precise recipes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;20% GenAI (The Resolution Layer):&lt;/strong&gt; The LLM (Bedrock) acts as an intelligent exception handler. It steps in when the deterministic build fails, attempting to logically deduce fixes for compilation errors that static analysis cannot resolve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Architect's Take:&lt;/strong&gt; You aren't just paying for AI; you are paying for a managed orchestration layer that combines static analysis with generative fallback.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Feedback Loop Challenge
&lt;/h2&gt;

&lt;p&gt;The main friction point in a pure-cloud approach is latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Local Way (OpenRewrite CLI)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Run Recipe (&lt;code&gt;mvn rewrite:run&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Instant feedback.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; Fix compilation error in IDE.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Total cycle time: ~15 minutes.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Cloud Sandbox Way
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Zip code and upload to S3.&lt;/li&gt;
&lt;li&gt; Wait for the Agent sandbox to boot.&lt;/li&gt;
&lt;li&gt; Agent runs transformation.&lt;/li&gt;
&lt;li&gt; Build fails -&amp;gt; Agent asks LLM for a fix -&amp;gt; Agent retries.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Total cycle time: 2 to 4+ hours.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By moving the "fix" phase entirely to the cloud, you lose the interactivity of the IDE. For complex legacy apps, this "blind debugging" can be costly.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The "Success Probability" Matrix
&lt;/h2&gt;

&lt;p&gt;Not all apps are created equal. When planning your migration roadmap, consider this topology:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Application Type&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;AWS Q Agent Success Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard Demo / Pet Clinic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;High (95%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard Microservice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Good (75%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy Monolith&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Moderate (45%)&lt;/strong&gt; - Requires manual intervention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Frankenstein" Legacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Extreme&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Low (&amp;lt; 15%)&lt;/strong&gt; - Requires heavy refactoring first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: If your application relies on internal Nexus libraries or proprietary frameworks not visible to the public training data, the Agent will struggle to hallucinate a fix for dependencies it cannot see.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Strategy: A Hybrid Migration Pattern
&lt;/h2&gt;

&lt;p&gt;Instead of choosing between "Manual" and "AI-Only," I recommend a &lt;strong&gt;Hybrid Pipeline&lt;/strong&gt; to satisfy both Developers (who need speed) and Security (who worry about IP):&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Local Deterministic Pass (Velocity)
&lt;/h3&gt;

&lt;p&gt;Don't upload dirty code. Run &lt;strong&gt;OpenRewrite locally&lt;/strong&gt; first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update &lt;code&gt;pom.xml&lt;/code&gt; parents.&lt;/li&gt;
&lt;li&gt;Apply standard recipes (e.g., &lt;code&gt;javax&lt;/code&gt; to &lt;code&gt;jakarta&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why?&lt;/strong&gt; It's free, instant, and catches the low-hanging fruit without the cloud latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: The Cloud "Closer" (Complexity)
&lt;/h3&gt;

&lt;p&gt;Once the noise is cleared, upload the cleaner artifact to &lt;strong&gt;AWS Q Developer Agent&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let the AI handle the obscure compilation errors and logical shifts that OpenRewrite missed.&lt;/li&gt;
&lt;li&gt;The Agent now has a much higher chance of success because the "noise" of basic version mismatches is gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: AI for Assurance
&lt;/h3&gt;

&lt;p&gt;Instead of asking AI to just "migrate," use tools like Q or Copilot to &lt;strong&gt;generate unit tests&lt;/strong&gt; for the legacy code &lt;em&gt;before&lt;/em&gt; you start. High test coverage is the only safety net that makes the migration verifiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Verdict
&lt;/h2&gt;

&lt;p&gt;AWS Q Developer Agent is a powerful tool, but it shouldn't be treated as a "black box" solution for every scenario. By understanding its reliance on deterministic rules and combining it with local workflows, you can reduce migration time from months to weeks.&lt;/p&gt;

</description>
      <category>java</category>
      <category>aws</category>
      <category>architecture</category>
      <category>migration</category>
    </item>
  </channel>
</rss>
