<?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: Joel Milligan</title>
    <description>The latest articles on DEV Community by Joel Milligan (@joeldevelops).</description>
    <link>https://dev.to/joeldevelops</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%2F2291915%2F0d9817a6-0d7b-49b4-83e9-72e9673961b0.png</url>
      <title>DEV Community: Joel Milligan</title>
      <link>https://dev.to/joeldevelops</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joeldevelops"/>
    <language>en</language>
    <item>
      <title>Re-thinking DevOps practices to handle accelerating dev throughput</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Mon, 23 Feb 2026 11:45:58 +0000</pubDate>
      <link>https://dev.to/joeldevelops/re-thinking-devops-practices-to-handle-accelerating-dev-throughput-4c29</link>
      <guid>https://dev.to/joeldevelops/re-thinking-devops-practices-to-handle-accelerating-dev-throughput-4c29</guid>
      <description>&lt;p&gt;In the age of AI orchestration, gitflow and other dev-centric models just can't keep up with the throughput of pull requests. "Continvoucly morging" breaks down quickly when each dev has migrations, rewrites, SOPS edits, renames, new CI pipelines, and agent file updates. I'd worked for nearly 10 years under such development flows and I already knew when I started as a Founding Engineer at Neno that we would need a new approach to stay competitive and on the cutting edge.&lt;/p&gt;

&lt;p&gt;I'm going to walk you through exactly how we did it, why the old way is killing your velocity, and what I think the future of deployment looks like. We call it &lt;strong&gt;PReFlow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Red Tape and Broken Environments
&lt;/h2&gt;

&lt;p&gt;GitFlow can honestly be a great development approach. The pitch sounds reasonable: you have a dev branch, a staging branch, and main (or prod). Code flows through each stage like a responsible assembly line. Merge to dev, deploy, test. Promote to staging, deploy, test. Promote to prod, deploy, pray.&lt;/p&gt;

&lt;p&gt;In practice? I've found it to be a traffic jam with no cops.&lt;br&gt;
Here's what actually happens. Engineer A merges a feature to dev. Engineer B merges a different feature to dev ten minutes later. Engineer A's feature depends on a migration that hasn't been tested against Engineer B's schema change. Dev breaks. Now neither of them can test. Engineer C, who was about to merge something completely unrelated, is blocked too. Everyone stops shipping and starts debugging the shared environment.&lt;/p&gt;

&lt;p&gt;Multiply this by a team of four with ambition, the kind of team where everyone has multiple PRs open at once, and you get gridlock. Not the productive kind of friction that catches bugs early, but the soul-crushing kind where engineers spend their mornings in Slack figuring out whose turn it is to deploy to dev.&lt;/p&gt;

&lt;p&gt;The merge conflicts alone are brutal. When five branches are all targeting dev, and each one touches overlapping files, you're resolving conflicts that have nothing to do with your actual work. You're doing merge archaeology, except the artifacts are three hours old and already stale.&lt;/p&gt;

&lt;p&gt;And the worst part? None of this has anything to do with building the product. It's pure organizational overhead. Red tape dressed up as engineering process.&lt;/p&gt;

&lt;p&gt;Gitflow was designed for a different world in a different time. We don't live in that world anymore thanks to git worktrees and multiple agent sessions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dev Environment Trap
&lt;/h2&gt;

&lt;p&gt;Dev, staging, and prod environments are a logical approach. Engineering teams need some buffer between "I think this works" and "customers are seeing this." However, this setup has been, in my own belief, one of convenience rather than the right setup for most teams. It is easier to "copy and paste" the setup for a cloud environment multiple times than to invest in better pipelines.   &lt;/p&gt;

&lt;p&gt;While this works, I would caution that dev environments don't scale the way you need them to.&lt;/p&gt;

&lt;p&gt;Every new developer added to the team increases the contention on that shared environment. Every open PR is another potential conflict. And database migrations? Those are the real killers. When two PRs both need to alter the same table, or even when they alter different tables but in conflicting orders, your shared dev environment requires meetings, syncs, and other work that reduces velocity just to make a feature push.&lt;/p&gt;

&lt;p&gt;You end up with coordination overhead that has nothing to do with code quality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Hey, can I deploy to dev? I need to test my migration."&lt;/li&gt;
&lt;li&gt;"Hold on, I'm in the middle of testing something."&lt;/li&gt;
&lt;li&gt;"Who ran migrate last? The schema doesn't match what I expected."&lt;/li&gt;
&lt;li&gt;"Dev is broken again. Who deployed last?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not engineering problems. These are scheduling problems. You've turned your development workflow into a shared calendar.&lt;/p&gt;

&lt;p&gt;At Neno, we had four engineers all moving fast. AI-assisted development meant we were producing PRs at a rate that would've been unthinkable two years ago. We regularly had 20 to 30 PRs in flight at the same time. Gitflow would have buried us. A shared dev environment would have been a full-time job just to keep running.&lt;/p&gt;

&lt;p&gt;I saw this coming as I had seen it before and knew there was a better way.&lt;/p&gt;




&lt;h2&gt;
  
  
  PReFlow: One Environment Per PR
&lt;/h2&gt;

&lt;p&gt;Here's what we built instead, and it's deceptively simple.&lt;/p&gt;

&lt;p&gt;When an engineer opens a pull request against main, a unique preview environment spins up automatically. That environment is theirs. It has its own database, its own services, its own URL. It's a complete, isolated copy of the application running their branch — and only their branch.&lt;/p&gt;

&lt;p&gt;No conflicts with other engineers. No waiting for someone else to finish testing. No broken shared state. You open a PR, you get an environment. Done.&lt;/p&gt;

&lt;p&gt;The full flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Branch from main&lt;/strong&gt; — always from the latest main, always targeting main. No dev branch. No staging branch. Just good, clean, trunk-based development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open a PR&lt;/strong&gt; — this triggers the creation of a dedicated preview environment. CI runs. The engineer (or their AI agent) tests against a real, running instance of the app with their changes applied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge to main&lt;/strong&gt; — when the PR is approved and merged, it doesn't go straight to customer-facing production. Instead, it first deploys to an internal sandbox — a production-like environment that our team uses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandbox succeeds&lt;/strong&gt; → deploy to prod — if the sandbox deployment is healthy, the pipeline automatically promotes the change to production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a helpful diagram:&lt;/p&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%2F6hp37kzv1y0s02pcgcwc.png" 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%2F6hp37kzv1y0s02pcgcwc.png" alt="Neno deployment diagram" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. No dev branch. No staging branch. No environment scheduling. No merge archaeology.&lt;br&gt;
Every PR is independent. Every engineer is unblocked. And the pipeline from "code written" to "code in production" is as short as it can possibly be without being reckless.&lt;/p&gt;

&lt;p&gt;We get the safety of staged deployments without the organizational overhead. The sandbox acts as our canary — if something breaks there, it never reaches customers, and only the offending merge needs to be investigated, not a tangled mess of five developers' changes landing simultaneously.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;This isn't theoretical. We've been using this system at Neno for 4 months now with a team now consisting of 6 devs.&lt;/p&gt;

&lt;p&gt;Here's what it looked like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30-35 PRs merged per week&lt;/strong&gt; across the team with an average of 3,000 LoC&lt;/li&gt;
&lt;li&gt;30-35 deployments to production &lt;strong&gt;per week&lt;/strong&gt; — each one isolated, tested, and promoted through the pipeline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0% of total production downtime&lt;/strong&gt; over the past 4 months attributable to deployment issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 broken shared environments&lt;/strong&gt; — because there are no shared environments to break&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 minute average time from PR merge to production&lt;/strong&gt; — including the sandbox validation step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is that this system removed an entire category of work from our engineers' plates. Nobody at Neno spent time debugging dev. Nobody waited for their turn to deploy. Nobody resolved merge conflicts caused by a shared integration branch. That time went back into building product.&lt;/p&gt;

&lt;p&gt;When you're a small team competing against companies with ten times your headcount, that reclaimed time is everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Our Setup
&lt;/h2&gt;

&lt;p&gt;Now for the important part, telling you how to replicate this.&lt;/p&gt;

&lt;p&gt;We have quite the simple setup, I'll hit the main points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Provider:&lt;/strong&gt; GCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code:&lt;/strong&gt; Pulumi in typescript, self-hosted on a GCP bucket&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontends:&lt;/strong&gt; Deployed from react project as static sites through Cloudflare&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git and CI Platform:&lt;/strong&gt; GitHub, though we aren't thrilled with them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We did follow the same approach as GitFlow, whereby we used pulumi to create preview (dev), sandbox (staging), and production environments.  However we don't use the default Cloud Run instance we've setup for preview. Instead we take another approach.&lt;/p&gt;

&lt;p&gt;Here's the blow-by-blow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 (~28 seconds):&lt;/strong&gt; We begin the CI pipeline by spinning up a new database within our Cloud SQL instance with the PR name: &lt;code&gt;api_pr_xxx&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 2 (~1-2 minutes):&lt;/strong&gt; Next, we calculate all the domains for the preview environments and inject them into the builds. At this point we build the API docker image from our monorepo. We also separately build the frontends in parallel. Also during this step we run any DB migrations.&lt;br&gt;
&lt;strong&gt;Step 3 (~1 minute):&lt;/strong&gt; We deploy the new API image through the &lt;code&gt;gcloud&lt;/code&gt; CLI directly in our CI. Frontends are pushed to preview deployments in Cloudflare&lt;br&gt;
&lt;strong&gt;Step 4 (~4 seconds):&lt;/strong&gt; We comment on the PR with links to all the domains to access the services.&lt;/p&gt;

&lt;p&gt;And that's IT.&lt;/p&gt;

&lt;p&gt;Working on a new feature and you want to share it with someone? Just share the preview frontend link. It's that easy.&lt;/p&gt;

&lt;p&gt;We also run a cleanup action on merge, but I'll not cover that now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Clues We're on the Right Track
&lt;/h2&gt;

&lt;p&gt;If you think this is niche: a cute optimization for a small startup — I'd ask you to look at what's happening in the industry right now.&lt;/p&gt;

&lt;p&gt;In February 2026, OpenAI's VP of Engineering Srinivas Narayanan revealed that internal teams had shipped a beta product with zero human-written code. The entire thing was generated by Codex agents. Not scaffolded by AI and polished by humans; fully AI-authored, start to finish.&lt;/p&gt;

&lt;p&gt;Around the same time, Fortune reported that engineers at both Anthropic and OpenAI said AI now writes 100% of their code. The humans are reviewing, directing, and architecting — but the actual code production is machine-speed.&lt;/p&gt;

&lt;p&gt;Think about what that means for deployment infrastructure.&lt;/p&gt;

&lt;p&gt;If your engineers (or their AI agents) can produce code at 10x the previous rate, your deployment pipeline needs to handle 10x the throughput. Gitflow couldn't handle 5 PRs a day gracefully. What happens when AI agents are opening 50?&lt;br&gt;
Shared dev environments that buckle under four engineers will collapse under the weight of AI-generated pull requests. The bottleneck won't be writing code anymore: it already isn't. The bottleneck will be getting that code tested, validated, and into production without everything falling over.&lt;/p&gt;

&lt;p&gt;That's exactly the problem &lt;strong&gt;PReFlow&lt;/strong&gt; solves. Every PR gets its own isolated world. It doesn't matter if a human wrote it or an AI agent did. It doesn't matter if there are 5 PRs open or 50. The system scales horizontally because each PR is independent.&lt;/p&gt;

&lt;p&gt;This is where software development is headed. The teams that figure out deployment at AI speed will ship circles around the teams still debating whose turn it is to deploy to dev.&lt;/p&gt;




&lt;h2&gt;
  
  
  Build for Throughput
&lt;/h2&gt;

&lt;p&gt;Your deployment pipeline is your competitive advantage. Not your framework choice. Not your cloud provider. Not whether you're using the latest AI model. The thing that determines how fast you ship — and therefore how fast you learn, iterate, and win — is how quickly a change can go from "written" to "live" without breaking anything.&lt;/p&gt;

&lt;p&gt;Gitflow was a good answer to a 2010 problem. Shared dev environments were a reasonable compromise when teams were small and PRs were infrequent. But we're in a different era now. AI is writing code at top speed. Small teams are producing enterprise-level output. And the old deployment models are buckling.&lt;/p&gt;

&lt;p&gt;If you're a founder, an engineering lead, or just someone who's tired of spending their mornings debugging a shared dev branch, consider this: kill your dev environment. Kill your staging branch. Give every PR its own world, validate through an internal sandbox, and ship to prod with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's simpler than it sounds. And it's faster than you think.
&lt;/h2&gt;

&lt;p&gt;Joel is a Founding Engineer of &lt;a href="https://neno.co" rel="noopener noreferrer"&gt;Neno&lt;/a&gt;. He writes about engineering velocity, AI-assisted development, and the systems that make small teams dangerous.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ops</category>
      <category>cicd</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Symbol Extraction - Killing Modular Monoliths</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Thu, 29 May 2025 14:53:29 +0000</pubDate>
      <link>https://dev.to/nanoapi_io/symbol-extraction-killing-modular-monoliths-3af7</link>
      <guid>https://dev.to/nanoapi_io/symbol-extraction-killing-modular-monoliths-3af7</guid>
      <description>&lt;p&gt;Let’s be honest: &lt;strong&gt;rewriting legacy systems sucks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s expensive. It’s slow. It’s risky. And it often fails.&lt;/p&gt;

&lt;p&gt;At NanoAPI, we’re building a new way forward—one that lets you evolve your system by &lt;strong&gt;extracting functionality&lt;/strong&gt; instead of rewriting everything from scratch. Our goal is to help teams innovate, scale, and adapt without the weight of technical debt dragging them down.&lt;/p&gt;

&lt;p&gt;Because legacy systems shouldn’t be anchors - they should be launchpads.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Is This a Problem?
&lt;/h2&gt;

&lt;p&gt;Most modern software systems weren’t designed—they evolved. Over time, teams change, frameworks become outdated, and business logic sprawls across thousands of lines of code.&lt;/p&gt;

&lt;p&gt;The result? Monoliths that no one fully understands. You touch one thing and something else breaks. A single function call could be trivial—or it could power your entire payments pipeline. Good luck figuring out which.&lt;/p&gt;

&lt;p&gt;This complexity kills velocity. It paralyzes decision-making. And for leadership, it’s nearly impossible to assess what parts of the system are fragile, valuable, or safe to change.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. How Do People Solve This Today?
&lt;/h2&gt;

&lt;p&gt;There are two dominant approaches on the market today, and both are painful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rewrite Everything (a.k.a. "The Big Rewrite")&lt;/strong&gt;&lt;br&gt;
Tools like &lt;a href="https://claudiajs.com/" rel="noopener noreferrer"&gt;Claudia.js&lt;/a&gt; or the Modular Monolith pattern encourage extraction though rebuilding around modern paradigms (e.g. serverless), but this typically demands a full migration and deep re-architecting. Even if it starts small, it spirals into years of work. Rewrites introduce regressions, delay product roadmaps, and often stall out before delivering value. A middle-ground approach often used here is the manually-driven &lt;a href="https://medium.com/@josesousa8/the-strangler-pattern-kill-legacy-like-a-boss-db3db41564ed" rel="noopener noreferrer"&gt;Strangler Pattern&lt;/a&gt;, which still requires years of effort.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apply AI to Understand Codebases&lt;/strong&gt;&lt;br&gt;
The promise is tempting: use LLMs to analyze your code and tell you what’s important-or even better, rewrite the whole damn thing for you. But there’s a catch—context windows are too small for real-world monoliths. AI tools may hallucinate, struggle to maintain consistency across files, and miss deeper structural relationships. You end up with surface-level insights, not surgical extractions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both options feel like hacking through a jungle with a butter knife.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. NanoAPI's Solution – Symbol Extraction
&lt;/h2&gt;

&lt;p&gt;At NanoAPI, we believe the right abstraction layer is the &lt;strong&gt;symbol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We built a platform that helps teams extract critical functionality from legacy codebases by analyzing symbols—functions, classes, and variables—mapped into an architectural graph.&lt;/p&gt;

&lt;p&gt;This process, which we call &lt;strong&gt;symbol extraction&lt;/strong&gt;, lets you isolate self-contained pieces of your system, see how they depend on each other, and surgically extract or modularize them with confidence.&lt;/p&gt;

&lt;p&gt;No rewrites. No guesswork. Just precision tooling for technical debt.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. What Are Symbols?
&lt;/h2&gt;

&lt;p&gt;In software, a &lt;strong&gt;symbol&lt;/strong&gt; is any named element in your code: a function, class, variable, or module. These are the building blocks of your system’s logic.&lt;/p&gt;

&lt;p&gt;Think of them like DNA for your application. Each symbol contains business logic, and together they form complex, interdependent behavior.&lt;/p&gt;

&lt;p&gt;By analyzing symbols and how they reference each other, we can reconstruct a &lt;strong&gt;living architecture&lt;/strong&gt; of your codebase—one that’s often more accurate than documentation or diagrams ever were.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. What Is the Benefit of This Approach Over Other Tools?
&lt;/h2&gt;

&lt;p&gt;Symbol extraction has several key advantages over conventional methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It’s deterministic.&lt;/strong&gt; We don’t guess. We analyze. Our system maps your code’s actual behavior, not just inferred patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No need to rewrite.&lt;/strong&gt; Our tool is integrated in 5 minutes: instead of migrating everything over years, you selectively extract what matters right away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture lives in code.&lt;/strong&gt; Forget stale diagrams—your architecture becomes queryable, visual, and up-to-date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe, modular extraction.&lt;/strong&gt; You can break down a monolith into clean components without introducing regressions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clarity at scale.&lt;/strong&gt; From a single function to a sprawling app, you get an interactive map of what your code is doing and why.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not just code transformation—it’s &lt;strong&gt;code as architecture&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What Are the Outcomes for Teams and Tech Leadership?
&lt;/h2&gt;

&lt;p&gt;For &lt;strong&gt;engineering teams&lt;/strong&gt;, NanoAPI means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding dependencies instantly&lt;/li&gt;
&lt;li&gt;Knowing what’s safe to extract and what’s tightly coupled&lt;/li&gt;
&lt;li&gt;Preserving core logic while shedding dead weight&lt;/li&gt;
&lt;li&gt;Making real progress on tech debt without fear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For &lt;strong&gt;tech leadership&lt;/strong&gt;, it means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accelerating innovation without rewriting from scratch&lt;/li&gt;
&lt;li&gt;Unlocking architectural visibility across teams and services&lt;/li&gt;
&lt;li&gt;Bridging the gap between today’s monoliths and tomorrow’s modular systems&lt;/li&gt;
&lt;li&gt;Making informed decisions on investment, risk, and scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As companies shift toward serverless or modular monolith architectures, NanoAPI becomes the evolution engine—not a rip-and-replace tool, but a precision scalpel.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. How You Can Help
&lt;/h2&gt;

&lt;p&gt;We’re building NanoAPI in the open—with engineers, architects, and teams like yours in mind.&lt;/p&gt;

&lt;p&gt;Here’s how you can get involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try our open-source tool&lt;/strong&gt; and give us feedback: &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;github.com/nanoapi-io/napi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join the community&lt;/strong&gt; on &lt;a href="https://discord.gg/dFWTtRvJdk" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contribute use cases or PRs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talk to us&lt;/strong&gt; about using NanoAPI in your migration or modernization efforts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, we can turn legacy systems from roadblocks into runways—and bring architecture in line with reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want More Information or Help Get Involved?
&lt;/h2&gt;

&lt;p&gt;If you’re facing architectural bottlenecks, uncertainty in legacy systems, or need help guiding technical transformation, &lt;strong&gt;NanoAPI can help&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’d love your feedback, ideas, and contributions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://nanoapi.io" rel="noopener noreferrer"&gt;nanoapi.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔍 &lt;a href="https://docs.nanoapi.io" rel="noopener noreferrer"&gt;docs.nanoapi.io&lt;/a&gt; - Our documentation&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt; — star us ⭐
&lt;/li&gt;
&lt;li&gt;📬 Reach out via &lt;a href="mailto:sales@nanoapi.io"&gt;email&lt;/a&gt; — we’re always happy to connect&lt;/li&gt;
&lt;li&gt;👾 Join our &lt;a href="https://discord.gg/dFWTtRvJdk" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; community!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>symbolextraction</category>
    </item>
    <item>
      <title>NanoAPI v1.0.9: Migration to Deno &amp; Performance Boost 🚀</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Mon, 26 May 2025 08:45:40 +0000</pubDate>
      <link>https://dev.to/nanoapi_io/nanoapi-v109-migration-to-deno-performance-boost-1dc8</link>
      <guid>https://dev.to/nanoapi_io/nanoapi-v109-migration-to-deno-performance-boost-1dc8</guid>
      <description>&lt;p&gt;We're excited to announce the newest release of &lt;strong&gt;NanoAPI v1.0.9&lt;/strong&gt;! This release represents a massive architectural overhaul with our migration from Node.js to Deno, which delivers substantial performance improvements and a streamlined development experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 What's New in v1.0.9
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Deno Migration &amp;amp; Performance Revolution
&lt;/h3&gt;

&lt;p&gt;We've rebuilt NanoAPI to leverage Deno's modern capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Deno modules to replace all Node.js dependencies, dramatically reducing bundle size&lt;/li&gt;
&lt;li&gt;Migrated from Express to Oak framework (&lt;code&gt;JSR:@oak/oak&lt;/code&gt;) for seamless Deno compatibility&lt;/li&gt;
&lt;li&gt;Eliminated some external dependencies (&lt;code&gt;uuid&lt;/code&gt;, &lt;code&gt;express&lt;/code&gt;, &lt;code&gt;http-proxy-middleware&lt;/code&gt;, &lt;code&gt;octokit&lt;/code&gt;) in favor of Deno's built-in modules&lt;/li&gt;
&lt;li&gt;Adopted JSR registry for standard libraries (&lt;code&gt;@std/path@^1.0.9&lt;/code&gt;) to leverage Deno's ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The improved performance is noticeable immediately, due to faster startup times and a reduction in the overall memory footprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why We Opted for Deno
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deno takes a more modern approach than Node.js, because it enables direct URL imports, which eliminates the need for a package manager&lt;/li&gt;
&lt;li&gt;Deno has a commitment to web platform compatibility, and allows browser APIs like Fetch and Web Workers to work natively on the server, creating a unified development experience.&lt;/li&gt;
&lt;li&gt;Security is key for Deno - it has a permission-based security model which restricts system access by default, allowing for a more granular control over what applications can do.&lt;/li&gt;
&lt;li&gt;Furthermore, it offers built-in testing, formatting, linting, and bundling tools to mean fewer dependencies and a more cohesive development workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A More Streamlined Build &amp;amp; Deployment
&lt;/h3&gt;

&lt;p&gt;We've revamped how NanoAPI is distributed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The release is now shiiped as Deno executables published on GitHub, instead of the npm registry&lt;/li&gt;
&lt;li&gt;A more convenient installation script&lt;/li&gt;
&lt;li&gt;Optimized GitHub Actions with faster build times and reduced complexity&lt;/li&gt;
&lt;li&gt;Improved our installation documentation to guide you through the upgrade&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enhanced API &amp;amp; Developer Experience
&lt;/h3&gt;

&lt;p&gt;Every aspect of the developer experience has been refined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smart version checking with native fetch API and 5-second timeout protection&lt;/li&gt;
&lt;li&gt;GitHub-first version verification (goodbye npm registry dependencies)&lt;/li&gt;
&lt;li&gt;Cross-platform browser launching using &lt;code&gt;Deno.Command&lt;/code&gt; for consistent behavior&lt;/li&gt;
&lt;li&gt;Native port detection leveraging Deno's networking APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend Modernization
&lt;/h3&gt;

&lt;p&gt;The user interface has received a complete refresh:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improved Integration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seamless API communication between frontend and backend&lt;/li&gt;
&lt;li&gt;Optimized routing that works perfectly with Oak middleware&lt;/li&gt;
&lt;li&gt;Enhanced file explorer with improved dependency graph connectivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modern Components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgraded from bare Radix UI to the comprehensive Shadcn/UI component library&lt;/li&gt;
&lt;li&gt;Streamlined UX flows for intuitive user interactions&lt;/li&gt;
&lt;li&gt;Better visual feedback and responsive design patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Getting Started with v1.0.9
&lt;/h2&gt;

&lt;p&gt;Ready to experience the new NanoAPI? Here's everything you need to know:&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick install via our convenience script&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/your-repo/nanoapi/main/install.sh | sh

&lt;span class="c"&gt;# Or download directly from GitHub releases&lt;/span&gt;
&lt;span class="c"&gt;# Visit: https://github.com/your-repo/nanoapi/releases/latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Migration from Previous Versions
&lt;/h3&gt;

&lt;p&gt;If you're upgrading from an earlier version:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Backup your current configuration&lt;/strong&gt; - While v1.0.9 maintains API compatibility, it's always good practice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update your scripts&lt;/strong&gt; - Replace any Node.js-specific calls with Deno equivalents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review permissions&lt;/strong&gt; - Deno's security model may require explicit permission flags&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;This release sets the foundation for exciting features coming in future versions. We're already working on enhanced TypeScript support, additional built-in utilities, and expanded deployment options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do You Have Any Questions or Feedback?
&lt;/h2&gt;

&lt;p&gt;Join our community discussions on GitHub or reach out on our Discord server. We'd love to hear about your experience with the new Deno-powered NanoAPI!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://nanoapi.io" rel="noopener noreferrer"&gt;nanoapi.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔍 &lt;a href="https://docs.nanoapi.io" rel="noopener noreferrer"&gt;docs.nanoapi.io&lt;/a&gt; - Our documentation&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt; — star us ⭐
&lt;/li&gt;
&lt;li&gt;📬 Reach out via &lt;a href="mailto:sales@nanoapi.io"&gt;email&lt;/a&gt; — we’re always happy to connect&lt;/li&gt;
&lt;li&gt;👾 Join our &lt;a href="https://discord.gg/dFWTtRvJdk" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’d love your feedback, ideas, and contributions!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>deno</category>
      <category>javascript</category>
      <category>release</category>
    </item>
    <item>
      <title>🚀 Introducing NanoAPI v1.0.6 — Our First Stable Release!</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Wed, 30 Apr 2025 13:54:07 +0000</pubDate>
      <link>https://dev.to/nanoapi_io/introducing-nanoapi-v106-our-first-stable-release-3066</link>
      <guid>https://dev.to/nanoapi_io/introducing-nanoapi-v106-our-first-stable-release-3066</guid>
      <description>&lt;p&gt;We’re excited to announce &lt;strong&gt;NanoAPI v1.0.6&lt;/strong&gt;, the next release of our source-available developer tool focused on building &lt;strong&gt;better software architecture in the AI age&lt;/strong&gt;. In comparison with traditional refactoring tools, NanoAPI gives developers full visibility and control over their architecture, making refactoring easier, safer, and more efficient for everyone.&lt;/p&gt;

&lt;p&gt;Whether you’re refactoring legacy code, managing rapid growth, or just aiming for architectural clarity, our open-source tool &lt;strong&gt;NanoAPI (&lt;code&gt;napi&lt;/code&gt;)&lt;/strong&gt; is aimed at helping developers, software and solution architects to understand, audit, and evolve their systems—safely and confidently. &lt;/p&gt;

&lt;p&gt;Included in this release is support for the following programming languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C-sharp&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.nanoapi.io" rel="noopener noreferrer"&gt;Our documentation is available here.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is NanoAPI (napi)?
&lt;/h2&gt;

&lt;p&gt;NanoAPI is a versatile tool designed to help to map architectural complexity and enable modular extraction of functionality from large codebases.&lt;/p&gt;

&lt;p&gt;Historically, tools like this used to live behind expensive consulting fees. NanoAPI democratizes them, enabling teams of any size to:&lt;/p&gt;

&lt;p&gt;🚨 Audit: Pinpoint areas of your code that need refactoring or cleanup.&lt;br&gt;
📝 Refactor: Extract functionality using the UI to improve architecture.&lt;br&gt;
🏗️ Build: Generate modular microservices ready for deployment.&lt;br&gt;
🔍 Architecture: Get a live view of all your software and their interactions; scoped to a specific moment in time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No more black-box tools. Just open, inspectable, source-available application architecture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ✨ What’s New in v1.0.6?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Core Engine &amp;amp; Extraction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Improved Python symbol extraction with better handling of partial imports&lt;/li&gt;
&lt;li&gt;C# metrics now available for enhanced architectural insights&lt;/li&gt;
&lt;li&gt;Enhanced visual representation of nodes for large codebases&lt;/li&gt;
&lt;li&gt;Updated highlighting mechanism for better code navigation&lt;/li&gt;
&lt;li&gt;New extraction mode with API integration + editable symbol metadata&lt;/li&gt;
&lt;li&gt;Fixed Python error AST node cleanup for more reliable extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CLI Enhancements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Better version checking with in-terminal update instructions&lt;/li&gt;
&lt;li&gt;Fixed static file serving and CLI shebang handling&lt;/li&gt;
&lt;li&gt;Streamlined build process for faster execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build &amp;amp; Packaging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Moved from external &lt;code&gt;@nanoapi.io/shared&lt;/code&gt; to bundled CLI integration&lt;/li&gt;
&lt;li&gt;Switched to &lt;code&gt;tsup&lt;/code&gt; for more reliable bundling and build performance&lt;/li&gt;
&lt;li&gt;Refined workspace configuration and dependency versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Core Features (v1.0.6)
&lt;/h2&gt;

&lt;p&gt;✅ Multi-language support (Python, C# — more on the way)&lt;br&gt;
✅ Auto-generated system &amp;amp; code-level diagrams&lt;br&gt;
✅ Audit, refactor, and modularize monoliths&lt;br&gt;
✅ Full visibility into code written by AI or past contributors&lt;br&gt;
✅ Deterministic and inspectable — no black-box logic&lt;/p&gt;

&lt;h2&gt;
  
  
  Want More Information or Help Get Involved?
&lt;/h2&gt;

&lt;p&gt;If you’re facing architectural bottlenecks, uncertainty in legacy systems, or need help guiding technical transformation, &lt;strong&gt;NanoAPI can help&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’d love your feedback, ideas, and contributions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://nanoapi.io" rel="noopener noreferrer"&gt;nanoapi.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔍 &lt;a href="https://docs.nanoapi.io" rel="noopener noreferrer"&gt;docs.nanoapi.io&lt;/a&gt; - Our documentation&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt; — star us ⭐
&lt;/li&gt;
&lt;li&gt;📬 Reach out via &lt;a href="mailto:sales@nanoapi.io"&gt;email&lt;/a&gt; — we’re always happy to connect&lt;/li&gt;
&lt;li&gt;👾 Join our &lt;a href="https://discord.gg/dFWTtRvJdk" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; community!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re source-available first because &lt;strong&gt;trust matters&lt;/strong&gt;, especially when your team’s software architecture is on the line.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>python</category>
      <category>csharp</category>
    </item>
    <item>
      <title>The Value of Using Numbers to Convince Your PO/PM to Approve Refactoring</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Thu, 24 Apr 2025 14:21:09 +0000</pubDate>
      <link>https://dev.to/joeldevelops/the-value-of-using-numbers-to-convince-your-popm-to-approve-refactoring-3bbc</link>
      <guid>https://dev.to/joeldevelops/the-value-of-using-numbers-to-convince-your-popm-to-approve-refactoring-3bbc</guid>
      <description>&lt;p&gt;Why should we refactor? Every dev has their experience with technical debt, but convincing a PO/ (PM) to prioritize refactoring is often a battle. The issue is that POs/PMs think in terms of measurable business value but without hard data, and as technical debt is an invisible cost, refactoring sounds like an unnecessary cost. By presenting measurable metrics, you can prove that refactoring saves time, reduces costs, and improves stability, then POs/PMs, could be convinced otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Refactoring Is Hard to Justify
&lt;/h2&gt;

&lt;p&gt;Why the resistance against refactoring? Because time spent improving “old” features or functionality is time taken away from developing new features. In the age of 2-week time-to-market thanks to AI, it’s now harder than ever to convince management of the need to delay new work.&lt;br&gt;
The “if it's not broken, don’t fix it” mantra within business logic, does not agree with the reality that the more code you have, the more expensive it is to maintain. The issue is that poorly maintained code leads to slower development, higher bug rates, and increased long-term costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Costs of Technical Debt
&lt;/h2&gt;

&lt;p&gt;Real costs of technical debt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical debt can have significant financial implications. A 2022 study estimated that enterprises face approximately $1.52 trillion in software technical debt. (&lt;a href="https://www.tonic.ai/guides/test-data-tech-debt-business-value" rel="noopener noreferrer"&gt;Tonic Technical Debt 2022&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Increased onboarding time for new engineers due to confusing code architecture.&lt;/li&gt;
&lt;li&gt;Scalability bottlenecks causing performance issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Make Refactoring Make Sense to POs/PMs
&lt;/h2&gt;

&lt;p&gt;Refactoring isn’t just for the developers, it’s a business decision waiting to happen. Convince your PO/PM by speaking the language that they do- show them the numbers.&lt;br&gt;
Accomplishing this requires changing the conversation by showing your PO/PM the right metrics, by using data-driven reasoning tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incident reports &amp;amp; downtime caused by legacy code.&lt;/li&gt;
&lt;li&gt;Time spent debugging vs. building new features (e.g., 40% of sprint time is spent fixing old code).&lt;/li&gt;
&lt;li&gt;Overall architectural quality of both the codebase and the entire system, which can be tracked over time as a KPI.
Having access to these metrics is not only valuable for PO/PMs to make decisions, it also allows developers to build the software in a way which makes the company acquirable in the future. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"NanoAPI clarified our codebase, cut technical debt, and sped up releases." - Mahdi Pourismaiel CTO Unideck&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Acquisition and Customer Readiness
&lt;/h2&gt;

&lt;p&gt;Large customers and potential buyers of a business will both want to assess the architectural quality of your software. If your company doesn’t pass these audits, it could lead to millions lost in client and acquisition deals. &lt;/p&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%2F4k4d65lekzlpm86nrhys.png" 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%2F4k4d65lekzlpm86nrhys.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because this has a direct impact on the technical and non-technical leadership, this is a powerful bargaining chip for teams to use to get their refactoring efforts assigned into sprints.&lt;/p&gt;

&lt;h2&gt;
  
  
  How NanoAPI Helps
&lt;/h2&gt;

&lt;p&gt;Then what we offer at NanoAPI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated Refactoring Insights – Get hard data on bottlenecks, dead code, and API inefficiencies.&lt;/li&gt;
&lt;li&gt;Architecture-level Visualizations - Spend less time during refactors by seeing exactly where the tech debt lies.&lt;/li&gt;
&lt;li&gt;Faster Onboarding - Get new developers up to speed 55% faster.&lt;/li&gt;
&lt;li&gt;Understand AI Code - Shine a light on AI-generated code within your systems to better understand how it affects your technical debt.&lt;/li&gt;
&lt;li&gt;Visual Reports &amp;amp; Metrics – Easily present refactoring benefits to management.&lt;/li&gt;
&lt;li&gt;Incremental Improvements – Refactor without disrupting active development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We believe software should be an open book, instead of a black box. Our open-source tool is aimed at helping teams to visualize, refactor, and modernize their architecture. Thereby making complex systems more transparent, maintainable, and efficient. We built NanoAPI because we’ve felt the pain of technical debt firsthand, digging through legacy systems, trying to make sense of tangled dependencies. That’s why we’re on a mission to give developers clarity and control over their codebase, without compromising security or performance.&lt;/p&gt;

&lt;p&gt;We’re creating a community by embracing open-source principles. Join &lt;a href="https://discord.gg/dFWTtRvJdk" rel="noopener noreferrer"&gt;our space&lt;/a&gt;, where developers, architects, and tech leaders can collaborate, share knowledge, and shape the future of software together. If you care about scalability, maintainability, and smarter software architecture, join us. Let’s build better systems, together.&lt;/p&gt;

&lt;p&gt;If your organization is suffering from these problems, please reach out to us via &lt;a href="mailto:sales@nanoapi.io"&gt;email&lt;/a&gt; or on &lt;a href="https://nanoapi.io" rel="noopener noreferrer"&gt;https://nanoapi.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;Please star us on GitHub!&lt;/a&gt;⭐   &lt;/p&gt;

</description>
      <category>refactoring</category>
    </item>
    <item>
      <title>Why AI Refactoring Is a Rug Pull – The Hidden Risks of Automated Code Changes</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Thu, 27 Mar 2025 15:15:55 +0000</pubDate>
      <link>https://dev.to/joeldevelops/why-ai-refactoring-is-a-rug-pull-the-hidden-risks-of-automated-code-changes-1jim</link>
      <guid>https://dev.to/joeldevelops/why-ai-refactoring-is-a-rug-pull-the-hidden-risks-of-automated-code-changes-1jim</guid>
      <description>&lt;p&gt;Nowadays, with the rise of Copilot and ChatGPT, and other AI-powered code refactoring tools, we should be more efficient, but is it, but is it saving us time and improving software quality? Even though AI refactoring gives us the promise that we now have less grunt work, it introduces risks for software developers in terms of &lt;strong&gt;quality, control, and unintended consequences&lt;/strong&gt;. Often it is necessary to clean up the mess of a Copilot refactoring, or clarify the error to ChatGPT multiple times, while being drowned in word vomit code. It generates so much code, it is hard to see the small changes.&lt;/p&gt;

&lt;p&gt;Furthermore, a contact in a large Copenhagen-based enterprise gave us the following insight into their troubles with AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The quality of code of junior developers has dropped by 54% in the years since the launch of ChatGPT”. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This contact has asked to remain anonymous, and that should key us into another portion of the issue at hand: &lt;br&gt;
&lt;strong&gt;Companies don’t want to admit when they are using AI to write code&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Well why not?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Problem with AI Training Data and Stochastic Systems
&lt;/h3&gt;

&lt;p&gt;We all know that AI models are trained on vast amounts of data and code, but even though the AI may understand how to predict code, we don’t know whether the training set of code was actually any good. &lt;/p&gt;

&lt;p&gt;There is a lack of transparency on which code it was trained on, and it is very likely that a large amount of the code is either &lt;strong&gt;legacy, not functional or just plain badly written code&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;As the age-old adage goes: &lt;strong&gt;Garbage in, garbage out&lt;/strong&gt;, if the AI just keeps recycling garbage from inconsistent or outdated codebases, it can risk introducing suboptimal patterns into refactored code. &lt;/p&gt;

&lt;p&gt;Basically, even though our code should be refactored, it still incomprehensible how useful or efficient the refactoring was. It has been shown that Copilot and other AI models sometimes produce error-prone or insecure code snippets📌 &lt;a href="https://arxiv.org/pdf/2108.09293.pdf" rel="noopener noreferrer"&gt;GitHub Copilot &amp;amp; Security Concerns&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We need a non-AI-controlled approach that keeps developers in charge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI will always lack context&lt;/strong&gt; – either through a context window that is too small, or by missing out on some bigger picture – thereby creating unintended consequences. &lt;/p&gt;

&lt;p&gt;While AI can predict isolated improvements, but it doesn’t see the entire codebase or long-term impact, and it completely fails at multi-repo tasks.  Refactoring isn’t just about “rewriting” code - &lt;u&gt;it’s about understanding its role within the entire system&lt;/u&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thought Experiment:
&lt;/h3&gt;

&lt;p&gt;I’d like you to join in a thought experiment with me. Imagine I hand you a book, and ask you to memorize its contents. So you do. You take the book and read it again and again until all the information is safely locked away in your memory, and you feel confident to answer any question asked about the contents. Later, I come back and ask: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“From what tree was the paper of that book made?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You would not and could not ever know the answer to this question by only examining the code, and that’s the &lt;strong&gt;exact issue&lt;/strong&gt; with using AI for architectural tasks: &lt;strong&gt;AI lacks context&lt;/strong&gt; about the entire system that doesn’t exist in the code in any practical or meaningful sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Refactoring Without Full Visibility May Lead To:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Breaking dependencies&lt;/li&gt;
&lt;li&gt;Removing "unused" but necessary functions&lt;/li&gt;
&lt;li&gt;Performance regressions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And this is just the &lt;strong&gt;functional&lt;/strong&gt; side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Logic in Large Systems
&lt;/h2&gt;

&lt;p&gt;AI does not understand your &lt;strong&gt;organization’s logic&lt;/strong&gt; which leads to subtle regressions of your user flows. Edge cases may not be considered and can break things in unexpected ways, hurting user trust in your products and brand. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Refactoring without context is like moving furniture around in a dark room - you might trip over something critical.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We all, as developers, rely on understanding the code structure for debugging, to be able to improve and to be able to maintain the codebase. The issue is that with AI refactoring is that we &lt;strong&gt;don’t know why&lt;/strong&gt; it made changes. &lt;/p&gt;

&lt;p&gt;This makes debugging harder, as logic and intent are not always translated well. AI refactoring is like &lt;strong&gt;“word vomit” in code&lt;/strong&gt; - how can you filter essential changes from unnecessary noise?&lt;/p&gt;

&lt;p&gt;Also, AI might change too much at once, which leads to &lt;em&gt;overcomplicated logic&lt;/em&gt;, &lt;em&gt;unexpected behavior&lt;/em&gt; and &lt;em&gt;performance regression&lt;/em&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This means that developers lose control over incremental, intentional improvements. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, AI-based refactoring may remove necessary but "unused" functions that were crucial for future updates. AI refactoring is like a junior dev on autopilot - excited to rewrite everything, but unaware of long-term consequences. The goal should be that AI should &lt;strong&gt;augment and aid developer decision-making&lt;/strong&gt;, instead of replacing it.&lt;/p&gt;

&lt;p&gt;Overall, AI refactoring introduces risks due to &lt;strong&gt;lack of quality control, context, and developer insight&lt;/strong&gt;. What is critical is that developers need full visibility and incremental changes to ensure code maintainability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alternative
&lt;/h2&gt;

&lt;p&gt;You probably expected this, but here is the part where I suggest another solution: &lt;strong&gt;NanoAPI&lt;/strong&gt;. A developer tool designed to help teams understand, refactor and modularize their codebases without the pain of major rewrites. Because of our CLI and UI, NanoAPI helps to identify dead endpoints in code, detect bottlenecks, and generate system-level interaction maps. &lt;/p&gt;

&lt;p&gt;In comparison with traditional refactoring tools, NanoAPI gives developers &lt;strong&gt;full visibility and control over their architecture&lt;/strong&gt;, making refactoring easier, safer, and more efficient for everyone.&lt;/p&gt;

&lt;p&gt;Here is a list of the core features at the time of writing:&lt;br&gt;
✅ &lt;strong&gt;Multi-language support&lt;/strong&gt; (&lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;C#&lt;/strong&gt;, with more languages on the roadmap)&lt;br&gt;
✅ &lt;strong&gt;Auto-generated diagrams&lt;/strong&gt; of system- and code-level interactions to pinpoint tech debt, bottlenecks, and the risk levels of refactors on various parts of the system.&lt;br&gt;
✅ &lt;strong&gt;Deeper insights&lt;/strong&gt; into code written by AI or former employees.&lt;br&gt;
✅ &lt;strong&gt;Git history-style exploration&lt;/strong&gt; of your architecture over time.&lt;br&gt;
✅ &lt;strong&gt;KPIs and insights&lt;/strong&gt; into how your technology transformations are progressing.&lt;/p&gt;

&lt;p&gt;And we have &lt;strong&gt;so much more on the way&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your organization is suffering from these problems, please reach out to us via &lt;a href="mailto:sales@nanoapi.io"&gt;📧email&lt;/a&gt; or on &lt;a href="https://nanoapi.io" rel="noopener noreferrer"&gt;https://nanoapi.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We’re building this tool not only to put a collar on AI-refactoring, but also to build trust with developers. That’s why we’re &lt;strong&gt;source-available first&lt;/strong&gt;. &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;Please check out the project on GitHub and star us⭐!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>ai</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Quick Time Events: How to Align a Team in One Meeting</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Tue, 26 Nov 2024 14:02:19 +0000</pubDate>
      <link>https://dev.to/joeldevelops/quick-time-events-how-to-align-a-team-in-one-meeting-2ipg</link>
      <guid>https://dev.to/joeldevelops/quick-time-events-how-to-align-a-team-in-one-meeting-2ipg</guid>
      <description>&lt;p&gt;Whether at a large corporate or a small start up there exists a problem you've likely encountered: how to get people to align and "buy-in" to a decision. For developers this can be especially tricky, as they are the ones who are building your product and need to have the most buy-in by definition. At NanoAPI, we’ve developed an unconventional yet highly effective way to strike the perfect balance between decisive leadership and team buy-in: Quick Time Events (QTEs).&lt;/p&gt;

&lt;p&gt;This post covers the first of many NanoAPI-isms: things we do to stand out and change the way companies operate by thinking critically about what our goals are.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CEO (or Leader) as a "Tolerant, Benevolent Dictator"
&lt;/h3&gt;

&lt;p&gt;In our time at &lt;a href="https://www.techstars.com/accelerators/berlin" rel="noopener noreferrer"&gt;Techstars Berlin&lt;/a&gt; we've had the opportunity to learn from some truly amazing voices in the startup space.&lt;/p&gt;

&lt;p&gt;One such person clued us in to market research which consistently shows that the best startups are often led by a CEO who acts as a "tolerant, benevolent dictator"—someone who is ultimately responsible for making tough calls but still respects the input and expertise of their team. This approach ensures that decisions align with a strong vision and strategic goals.  &lt;/p&gt;

&lt;p&gt;However, the “dictator” model runs the risk of alienating team members if they feel left out of the process. Left unchecked, this can lead to quiet quitting and other forms of team opt-out. To prevent this we've created &lt;strong&gt;Quick Time Events (QTEs).&lt;/strong&gt;  &lt;/p&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%2Fj97b295h3diw6g1s37vw.png" 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%2Fj97b295h3diw6g1s37vw.png" alt="Quick Time Event" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Are Quick Time Events?
&lt;/h3&gt;

&lt;p&gt;Borrowed from the gaming world, a Quick Time Event is a brief, interactive sequence where players must act decisively to achieve a specific outcome. In the NanoAPI context, a QTE is a structured, high-energy meeting designed to rapidly gather input and achieve consensus on key decisions. Think of it as a "decision sprint" that happens all in one meeting.&lt;/p&gt;

&lt;p&gt;Especially for startups, having alignment on efforts can save hundreds of hours of time in the long rung.&lt;/p&gt;

&lt;h3&gt;
  
  
  How NanoAPI Implements Quick Time Events
&lt;/h3&gt;

&lt;p&gt;Here’s how we run QTEs to accelerate decision-making while keeping our team engaged and aligned:  &lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Define the Problem in Advance&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Before a QTE, the leadership team clearly defines the problem or decision that needs to be made. This includes any necessary context or background, so the team comes in ready to contribute.  &lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Set a Time Limit&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The hallmark of a QTE is urgency. We allocate a strict time limit—often no more than 30–45 minutes. This forces everyone to focus on what’s truly important and avoid getting bogged down in unnecessary details.  &lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Gather Focused Input&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In the meeting, we present the problem and outline potential options. Each team member gets a brief window (e.g., 1-2 minutes) to share their perspective. This ensures every voice is heard while keeping the discussion moving quickly.  &lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Facilitate Rapid Consensus&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Once input is gathered, the CEO synthesizes the feedback and makes a decision—live, in the meeting. This step emphasizes accountability and decisiveness while showing the team that their input directly influenced the outcome.  &lt;/p&gt;

&lt;h4&gt;
  
  
  5. &lt;strong&gt;Document and Act&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Immediately after the QTE, we document the decision and any action items. Everyone leaves the meeting knowing exactly what’s happening next and who’s responsible for what. For implementation of new features, this is where a follow up meeting would be scheduled to create and refine tickets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It Works
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; By focusing discussion and enforcing time limits, QTEs ensure decisions are made quickly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clarity:&lt;/strong&gt; The process removes ambiguity, making it clear how and why a decision was reached.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy-In:&lt;/strong&gt; Team members feel valued and heard, even when the final call rests with leadership.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Momentum:&lt;/strong&gt; With decisions made on the spot, we can move forward immediately, maintaining our startup’s velocity.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Results
&lt;/h3&gt;

&lt;p&gt;Since adopting Quick Time Events, NanoAPI has seen a significant improvement in our decision-making speed and team alignment. Whether it’s choosing a product direction, deciding on a technical architecture, or setting our go-to-market strategy, QTEs help us maintain our startup’s agility without sacrificing team cohesion.   &lt;/p&gt;

&lt;h3&gt;
  
  
  Closing Thoughts
&lt;/h3&gt;

&lt;p&gt;Startups are inherently chaotic, but with the right systems in place, you can turn that chaos into a competitive advantage. At NanoAPI, Quick Time Events have become a cornerstone of our culture, allowing us to combine the decisiveness of a “benevolent dictator” with the collective wisdom of our team.  &lt;/p&gt;

&lt;p&gt;If you’re looking for a way to turbocharge decision-making at your startup, consider giving QTEs a try. Who knows—they might just become your team’s secret weapon, too.&lt;/p&gt;

&lt;p&gt;What’s your take on this approach? Drop a comment below, or reach out to share how your team tackles the decision-making challenge!&lt;/p&gt;




&lt;p&gt;This is the first of many posts on how we run our devtools company. If you're looking to see more of this, give us a follow.&lt;/p&gt;

&lt;p&gt;We're building fast and looking for help. Please consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐️ &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;Starring us on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/nanoapi-io/napi/blob/main/.github/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing to our repo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="mailto:joel@nanoapi.io?subject=NanoAPI%20Demo%20Request"&gt;Or schedule a demo with us to learn how we can help you refactor and split your monolithic codebases&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&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%2F7kvgasya7ro03m4tuusm.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%2F7kvgasya7ro03m4tuusm.jpg" alt="Team NanoAPI" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Credit to &lt;a href="https://www.reddit.com/r/PixelArt/comments/apt3iw/playstation_buttons_100x64_px/" rel="noopener noreferrer"&gt;u/magickdinopx for the cover art&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Microservices Traffic Should Be I-Shaped, Not L-Shaped</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Thu, 07 Nov 2024 15:34:09 +0000</pubDate>
      <link>https://dev.to/joeldevelops/microservices-traffic-should-be-i-shaped-not-l-shaped-2e43</link>
      <guid>https://dev.to/joeldevelops/microservices-traffic-should-be-i-shaped-not-l-shaped-2e43</guid>
      <description>&lt;p&gt;In the last decade, microservices have become the poster child for scalable software architecture. Companies like Netflix and Amazon champion the model, attributing their ability to scale to microservices. This rise in the use and reported benefits of microservices have led to greater adoption amongst many companies. But as with every shiny new toy, there’s a dark side to watch out for—particularly when it comes to how microservices communicate.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore why your microservices traffic should resemble an “I” and not an “L” (in most cases, of course). This might sound like an odd analogy, but it’s one that can save you from an architecture that spirals into chaos.  &lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with L-Shaped Traffic
&lt;/h2&gt;

&lt;p&gt;Microservices rely heavily on network communication to function. When one service depends on another, requests are sent across the network. This dependency tree grows as your system scales. In an ideal world, this traffic pattern would be predictable, resembling an “I”—a single line from the client to the relevant service, with minimal dependencies on other microservices. &lt;/p&gt;

&lt;p&gt;But in many cases, we see an “L” shape emerge: &lt;/p&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%2Fe4iovp12xlrgxci1rvez.png" 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%2Fe4iovp12xlrgxci1rvez.png" alt="Simple L-shape" width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A client request hits one service&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;That service needs to talk to another, which talks to yet another, and so on.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the above image, it's easy to spot, but in real-world examples like the one below, it's much harder to spot.&lt;/p&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%2Fazsp6qylcpgjbm172zkt.png" 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%2Fazsp6qylcpgjbm172zkt.png" alt="L-shaped interaction flow" width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, a single request fans out into multiple downstream calls. This might not sound bad in theory, but in practice, it can result in a nightmare scenario:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Latency multiplies&lt;/strong&gt;: Each additional network hop introduces latency, slowing down your system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure cascades&lt;/strong&gt;: A single service failure can ripple across the architecture, causing widespread outages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability issues&lt;/strong&gt;: Tracing what went wrong forces the inclusion of distributed tracing and logging tools like Jaeger and New Relic, increasing costs.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the dreaded &lt;em&gt;L-shaped traffic&lt;/em&gt;. It’s complex, fragile, and a performance killer.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hidden Cost of Over-Communication
&lt;/h3&gt;

&lt;p&gt;Let’s dig deeper into why L-shaped traffic is particularly harmful. Each microservice call consumes network bandwidth, requires serialization/deserialization, and introduces potential for errors. This creates a compounding effect where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance deteriorates&lt;/strong&gt;: Even a system designed for high throughput struggles under the weight of excessive inter-service communication.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costs balloon&lt;/strong&gt;: Your cloud provider charges you for every byte sent and received. With L-shaped traffic, your operational expenses can skyrocket.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer experience suffers&lt;/strong&gt;: Debugging a chain of service calls with dozens of logs, traces, and metrics can overwhelm your team.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many ways, you’re defeating the purpose of microservices and you would be better off with a monolith. You can of course tackle some of these issues by building in retry logic when making HTTP, gRPC, or other network requests, but this functionally further reduces the actual usability of the system. To prevent flooding the network you then have to implement exponential backoffs, to solve the process getting stuck from long backoffs you need to cancel the request at some point, so on and so on, ad nauseam. By the end of it, you've delivered a mess of code that adds no direct business value. It doesn't even make the system more robust, as any changes to the contract of an endpoint will break all of its consumers anyways.&lt;/p&gt;

&lt;h3&gt;
  
  
  How L-shaping Sneaks up on Your System
&lt;/h3&gt;

&lt;p&gt;As much as every engineer hates to admit it, there is only one thing allowing us to continue going into the office and working for any of the companies in tech right now: making money. This drive to make money creates sub-drives within a company that seriously harm the ability to correctly architect a system. From fast time-to-market, to product people making time promises that aren't possible, the functionality must always be improving.&lt;/p&gt;

&lt;p&gt;In reality this results in developers taking shortcuts.&lt;/p&gt;

&lt;p&gt;"Oh," they may say, "I have to deliver this functionality soon, but the service I work in doesn't have the data I need. I see in the Swagger doc for service B that there's an endpoint that exposes exactly what I need. Hot dog! I'll have it done in an hour!"&lt;/p&gt;

&lt;p&gt;There's so much wrong with this. To focus up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implementing against the API of a service owned by another team without telling them means that both teams will have to be on the 3am call to discuss the break in production whenever team B changes the contract or deprecates the API.&lt;/li&gt;
&lt;li&gt;A (possibly critical) flow now contains a sub-dependency that can be a single point of failure.&lt;/li&gt;
&lt;li&gt;No real design effort went into this solution; it was simply the quickest option.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even worse, you have entire frameworks like loopback built around this pattern (which I'm still convinced exist only to &lt;a href="https://redresscompliance.com/complexities-of-ibm-cloud-pricing/" rel="noopener noreferrer"&gt;increase pricing on IBM's load balancers&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I-Shaped Traffic is the Solution
&lt;/h2&gt;

&lt;p&gt;In contrast, I-shaped traffic emphasizes simplicity:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct, minimal communication paths&lt;/strong&gt;: Services are designed to fulfill requests without relying on multiple downstream services.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focused responsibilities&lt;/strong&gt;: Each service handles its domain independently, limiting the need for coordination.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved reliability&lt;/strong&gt;: By reducing the number of network hops, you reduce the probability of failure.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I-shaped traffic is lean and predictable. It’s the kind of architecture that keeps your system running smoothly even as you scale.  &lt;/p&gt;

&lt;p&gt;A good I-shaped architecture based on the complex L-shape example from before might look something like the following:&lt;/p&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%2F9przb9tvm9be9a136r70.png" 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%2F9przb9tvm9be9a136r70.png" alt="I-shaped interaction flow" width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above example, the conscious choice was made not to send a response to the user right away during the purchase flow. Instead, they are notified later via email.&lt;/p&gt;

&lt;p&gt;In cases like these, it can be both good for the user and the developer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Case for I-Shaped Traffic
&lt;/h2&gt;

&lt;p&gt;Beyond technical benefits, I-shaped traffic has real business implications:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better user experience&lt;/strong&gt;: Faster response times lead to happier users.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower operational costs&lt;/strong&gt;: You save on cloud bills by minimizing unnecessary data transfer and resource usage.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced risk&lt;/strong&gt;: A simpler system is easier to maintain and less prone to catastrophic failures.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Achieve I-Shaped Traffic
&lt;/h3&gt;

&lt;p&gt;At the core of the problem is a simple question that can be asked to determine how data should be shared among services: "Does the data this service is working with &lt;em&gt;need&lt;/em&gt; to be up to date? Or can it be a few minutes or hours stale?"&lt;/p&gt;

&lt;p&gt;That's it, determining the trade-off between strongly-consistent and eventually-consistent data retrieval or operation methods helps to clarify if inter-service http traffic is really needed. It's not a silver bullet, but it's a good start that I see many engineers completely ignore when designing service interactions.&lt;/p&gt;

&lt;p&gt;Below are some steps you can take while determining how up-to-date your data should be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flatten Your Dependencies&lt;/strong&gt;: Avoid deep chains of service calls. If Service A consistently requires data from Services B and C, ask whether A should own or cache that data directly. This reduces the need for repeated HTTP calls, improving performance and ensuring that A can operate independently. For strongly-consistent data, direct ownership may be necessary, whereas eventually-consistent data can rely on periodic synchronization or caching.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adopt Event-Driven Architectures&lt;/strong&gt;: Synchronous HTTP calls often impose strong consistency guarantees, which can lead to L-shaped traffic patterns. Instead, consider asynchronous communication through queues or pub/sub systems. This approach aligns well with eventually-consistent operations, allowing services to react to events without blocking or waiting for immediate responses. Strongly-consistent actions should remain synchronous but limited to where they are absolutely necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the Right Read Strategy&lt;/strong&gt;: Build specialized read models that aggregate and cache data across services. This approach minimizes the need for real-time dependency chains. If your system can tolerate eventual consistency, read models can be asynchronously updated via queues. For scenarios requiring strong consistency, ensure the read model is tightly coupled to the source of truth but designed to minimize cascading calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Evaluate Communication Patterns&lt;/strong&gt;: Not all data retrieval justifies an HTTP call. Use HTTP for operations where strong consistency is critical and the cost of failure is high (e.g., payment transactions). For less critical operations or where eventual consistency suffices (e.g., analytics, reporting), favor queues or caching mechanisms to reduce synchronous dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It may be obvious, but these improvements will likely take time and not happen overnight. That begs the question:&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Microservices Bad?
&lt;/h3&gt;

&lt;p&gt;Its a serious question to ask. Especially considering all the bad news that seems to be coming out month-by-month of all the companies moving back to monolithic architecture. &lt;/p&gt;

&lt;p&gt;The short answer is no. But like any tool, they need to be used correctly. Microservices excel when services are loosely coupled and highly cohesive. Problems arise when teams overlook the communication overhead and design sprawling dependency graphs.  &lt;/p&gt;

&lt;p&gt;If you’re struggling with an architecture that feels more like a liability than an asset, it’s time to rethink your microservices traffic. Aim for I-shaped patterns, and you’ll avoid the pitfalls that plague so many teams.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Microservices are here to stay, but their success depends on how you structure their communication. By adopting an I-shaped traffic pattern, you can ensure your architecture remains scalable, reliable, and cost-effective.&lt;/p&gt;

&lt;p&gt;Don’t let your microservices turn into a web of tangled dependencies. Focus on simplicity, and body will thank you with each full night's sleep you get.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;




&lt;p&gt;I'm Joel, CEO of NanoAPI and I've been fighting the good fight with and against microservices for almost 10 years now. If you found this post helpful, or you'd like to give back, please &lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;star our repo on GitHub ⭐&lt;/a&gt;. It really helps out.&lt;/p&gt;

&lt;p&gt;We're currently building &lt;code&gt;napi&lt;/code&gt; for companies who are looking to move their monolithic APIs into microservices. It addresses many of the pitfalls associated with the transition to microservices and helps developers and architects understand exactly what their system is doing today. With this tool, we're aiming to create "microlithic development", a new approach where a team writes a monolith, and breaks it up into microservices at deploy time. &lt;/p&gt;

&lt;p&gt;If you think this could be for you, or you'd like to become a design partner, &lt;a href="mailto:info@nanoapi.io"&gt;send me an email&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>microservices</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Rise of the "Microlith": Rethinking Microservices for Modern Developers</title>
      <dc:creator>Joel Milligan</dc:creator>
      <pubDate>Mon, 28 Oct 2024 09:00:49 +0000</pubDate>
      <link>https://dev.to/joeldevelops/open-sourcing-nanoapi-rethinking-microservices-for-modern-developers-14m2</link>
      <guid>https://dev.to/joeldevelops/open-sourcing-nanoapi-rethinking-microservices-for-modern-developers-14m2</guid>
      <description>&lt;p&gt;Hey dev.to community!&lt;/p&gt;

&lt;p&gt;We're excited to announce that after &lt;strong&gt;two years of development&lt;/strong&gt;, our project &lt;code&gt;napi&lt;/code&gt; is going &lt;strong&gt;open-source&lt;/strong&gt;! We've been building something that we believe will fundamentally change how developers approach building and deploying applications. Here's a quick dive into what we're doing, why we're doing it, and how you can be a part of it from day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🛠️ We're building to help companies reduce early technical trade-off, and late refactoring efforts, by offering a new way of writing large API codebases.&lt;/li&gt;
&lt;li&gt;🚀 Initial focus on NodeJS ecosystem, but quickly expanding outward to PHP, Java, and more.&lt;/li&gt;
&lt;li&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;Star the project on GitHub &lt;/a&gt;&lt;/strong&gt;to follow along with our progress.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A New Approach to Development: Build Monoliths, Deploy Microservices
&lt;/h3&gt;

&lt;p&gt;The traditional struggle between monolithic architectures and microservices is one every developer knows. With our project, we aim to bridge the gap by providing developers a seamless way to &lt;strong&gt;write monolithic applications that can be deployed as microservices&lt;/strong&gt;. Because of this, we have coined the term &lt;strong&gt;"Microlith"&lt;/strong&gt; This approach brings the best of both worlds — allowing you to work faster in development while benefiting from the flexibility and scalability of microservices in production. This method means no more early architectural compromises; it's all about flexibility and making what you've already built even better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting with Node.js, Expanding Quickly
&lt;/h3&gt;

&lt;p&gt;Our initial focus is the &lt;strong&gt;Node.js ecosystem&lt;/strong&gt;. You may say: "but Joel, the companies that really need to refactor are all in Java" and you would be 100% correct. JS/TS is simply the best place to start until we get community feedback on which languages are most important to you.&lt;/p&gt;

&lt;p&gt;Our roadmap is focused on expansion into &lt;strong&gt;PHP, Python, C#, Java, and more&lt;/strong&gt;. If there is a specific language you want to see first, &lt;a href="https://github.com/nanoapi-io/napi/blob/main/.github/CONTRIBUTING.md" rel="noopener noreferrer"&gt;please star us and contribute!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have some additional features planned on the roadmap as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-detect "dead" API endpoints that no longer see traffic.&lt;/li&gt;
&lt;li&gt;Automatic flagging of bottlenecks within your APIs.&lt;/li&gt;
&lt;li&gt;Codebase metrics for understanding legacy systems faster.&lt;/li&gt;
&lt;li&gt;System-level interaction mapping between multiple services.&lt;/li&gt;
&lt;li&gt;And much more!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Open Tooling for Devs, with Enterprise-level features for Architects and CTOs
&lt;/h3&gt;

&lt;p&gt;We're committed to &lt;strong&gt;supporting developers with free, powerful tools&lt;/strong&gt; while offering additional paid features tailored to solution architects and enterprise environments. By combining an open-core model with additional enterprise-ready features, we can maintain an ecosystem that's both &lt;strong&gt;accessible to individual developers&lt;/strong&gt; and &lt;strong&gt;robust for larger organizations&lt;/strong&gt; with more complex needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Going Fair-Source: Why Now?
&lt;/h3&gt;

&lt;p&gt;We've spent two years fine-tuning this project, including gathering valuable feedback and honing in on exactly what developers need most. Based on this feedback we learned that developers really don't want a black-box auto-refactoring tool that works on their code without seeing how it works. (Fair warning to you, AI-based refactoring companies!) &lt;/p&gt;

&lt;p&gt;Because of this, the time felt right to &lt;strong&gt;open up our code&lt;/strong&gt;, share our work with the community, and let developers see what we're building. By going open-source, we're creating an ecosystem where &lt;strong&gt;everyone can contribute, improve, and shape this project&lt;/strong&gt; to make it the best it can be.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Bit About Us &amp;amp; Our Journey
&lt;/h3&gt;

&lt;p&gt;Our team is driven by a vision to improve developer workflows and make large-scale application management easier for everyone. We're a fast-growing and multinational team of 3 going on 4. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇺🇸 Joel is an American abroad; he's worked as a SWE in both enterprises and startups and seen all the technical debt companies struggle with around their APIs.&lt;/li&gt;
&lt;li&gt;🏳️ Florian is our resident Frenchman. With a background in mechanical engineering, his switch to software brings unique insights into our approach.&lt;/li&gt;
&lt;li&gt;🇳🇱 Justus is our business guy. Always direct, he keeps us on track by being our "Dutch Uncle".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We plan to continue expanding as we gain traction, and plan to start looking to fill DevRel, DevExp, and other roles in the very near future. If you think this could be you, the best way to get our attention is to join the community and interact with us.&lt;/p&gt;

&lt;h3&gt;
  
  
  Join Us and Follow Along!
&lt;/h3&gt;

&lt;p&gt;⭐ &lt;strong&gt;&lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;Star the project on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Justus Goes Bald
&lt;/h3&gt;

&lt;p&gt;We really want to build a strong community of developers and an amazing project, but Justus:&lt;/p&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%2Fi93qqvleifrm2vo4oh5n.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%2Fi93qqvleifrm2vo4oh5n.jpg" alt="Our resident skeptic" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;^ This guy. Doesn't believe we can get developers on board with our project. To prove it, he made a bet with the rest of the team: if NanoAPI gets 1,000 stars on Github in the first week of the project, he will shave his hair off and donate it to charity.&lt;/p&gt;

&lt;p&gt;What do you think? Can we make him go bald? 👨🏻‍🦲&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nanoapi-io/napi" rel="noopener noreferrer"&gt;Give us a star to make it happen!&lt;/a&gt; → ⭐&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>monolith</category>
    </item>
  </channel>
</rss>
