<?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: Doug Niccum</title>
    <description>The latest articles on DEV Community by Doug Niccum (@dniccum).</description>
    <link>https://dev.to/dniccum</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F955301%2F6f4ac820-5ca9-45ba-93de-783065cafe13.jpeg</url>
      <title>DEV Community: Doug Niccum</title>
      <link>https://dev.to/dniccum</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dniccum"/>
    <language>en</language>
    <item>
      <title>We kept leaking .env files across environments—here’s how I solved it</title>
      <dc:creator>Doug Niccum</dc:creator>
      <pubDate>Thu, 25 Jun 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/dniccum/we-kept-leaking-env-files-across-environments-heres-how-i-solved-it-3917</link>
      <guid>https://dev.to/dniccum/we-kept-leaking-env-files-across-environments-heres-how-i-solved-it-3917</guid>
      <description>&lt;p&gt;Sharing our secrets among our teammates and across our environments was becoming a liability. So I decided to take matters into my own hands.&lt;/p&gt;




&lt;h2&gt;
  
  
  A quick story
&lt;/h2&gt;

&lt;p&gt;Last year when I onboarded a new developer on the team I was managing, I quickly ran into a couple issues with the onboarding process. First, I realized our documentation was pretty bad and scarce, but if you are in software development, chances are yours is too. The second issue was environment setup. He started asking questions about which database connection he should be using and which API key he should be using for this service. Naturally, his next question, "can you send me your environment file in Slack?" This happened three or four more times. So in a ten-minute period we had dumped a couple hundred environment variables into our team's chat without really thinking twice about it. What made the situation worse were we discovered several credentials were out of date or no longer active, forcing the entire team to drop what they were doing and help our new developer get unblocked.&lt;/p&gt;

&lt;p&gt;It was at this point I realized we needed to change. Our onboarding experience needed to get better, our documentation needed to get written, but most importantly, our security &lt;strong&gt;HAD&lt;/strong&gt; to get better.&lt;/p&gt;

&lt;p&gt;In my recent &lt;a href="https://blog.dniccumdesign.com/stop-sharing-your-variables-in-slack" rel="noopener noreferrer"&gt;other Slack and security-related post&lt;/a&gt;, I cited an interesting statistic from GitGuardian that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;38% of incidents in collaboration tools were classified as highly critical or urgent, higher than in code repositories.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Slack, Teams, Jira, Linear, and Clickup are all collaboration tools. So as it turns out, my false sense of security that I get by using Slack or Teams is just that: a false sense of security. Any sensitive information that I share with a co-worker could still be compromised no matter the protocols or safeguards that are in place by myself, the company, or those IT guys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using other solutions
&lt;/h2&gt;

&lt;p&gt;If you have been around the software development industry long enough, you are sure to know there are many methods for storing secrets for your applications. If you use a cloud/serverless platform that is worth anything, they will have their own solution for storing secrets as well. So when it comes to securing your stuff in the cloud, you have options.&lt;/p&gt;

&lt;p&gt;But the problem that I kept coming up against was when you are sharing keys and environment settings among your coworkers and peers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud-based secrets
&lt;/h3&gt;

&lt;p&gt;Most platforms like &lt;a href="https://aws.amazon.com/secrets-manager/" rel="noopener noreferrer"&gt;AWS Secrets Manager&lt;/a&gt; are &lt;strong&gt;designed to keep your keys persistent and secure in a cloud environment&lt;/strong&gt;. You are able to retrieve specific values, but that's assuming you have access to the AWS control panel and you know what you are looking for. Depending on your processes, those vaults could be unorganized and vague at best, not to mention the bloated overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Password keychains
&lt;/h3&gt;

&lt;p&gt;Credential managers like &lt;a href="https://1password.com/" rel="noopener noreferrer"&gt;1Password&lt;/a&gt; or &lt;a href="https://www.dashlane.com/" rel="noopener noreferrer"&gt;Dashlane&lt;/a&gt; are &lt;strong&gt;more focused on authentication/credentials for websites, applications and servers&lt;/strong&gt;. For a user name and password, or a one-time password, I would absolutely recommend one of those solutions. But for a Stripe API key with the accompanying OAuth callback URL and webhook settings, the user experience just doesn't align when you are trying to replicate an application configuration or environment from one machine to another.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I wanted
&lt;/h2&gt;

&lt;p&gt;Let me first say the solutions that I have referenced above are fine services. They are polished, secure, and proven platforms that tons of developers and organizations use to secure their secrets. However, I found that existing credential management solutions were not suitable for the way development teams create software.&lt;/p&gt;




&lt;p&gt;Software engineers know you need more settings than just a username and a password to authenticate yourself against an API. Software engineers know it will take a fair amount of time copying 50 environment variables out of a web-based portal into a DotEnv (.env) file. This is usually why we resorted to pasting things into Slack!!! Despite my hours doing research, I was unable to find that one service that truly resonated with how I wanted environment variable management to go. This included:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Zero-knowledge architecture that places security in the hands of the user, not the platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A simple CLI that can be used to update/sync your environment with the cloud in a common DotEnv file format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A collaboration-first approach that allows team members to quickly share and access application keys/secrets.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As I surveyed the internet for options for the criteria that I just listed, I started to realize that nothing existed. I did happen to find a couple of open source solutions, but these did not cover my entire wishlist and had been long abandoned. I soon realized that if I truly wanted a solution like this, I would have to create it myself. I spent a few days compiling some requirements, built a project plan, and then used Linear to help me break the plan up into tasks and got to work.&lt;/p&gt;

&lt;p&gt;SecretStash was born a couple months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SecretStash is different
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fey0j9urro4vda5arua00.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fey0j9urro4vda5arua00.png" alt="SecretStash OG image" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I went about building SecretStash, I wanted to take the approach of building something developers want to use because it fits into their workflow. Again, I know there are other solutions out there, but they are subject to unnecessary enterprise bloat and are built for cloud architects that manage infrastructure, not building the software.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visibility across environments
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl17ey677ymm4s2kr7qp6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl17ey677ymm4s2kr7qp6.png" alt="SecretStash's dashboard with visibility into it's environment details" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SecretStash's organization is broken down into applications and environments. When developers think of work, especially across multiple applications, the application is what groups the work and thus tasks to be done. Assuming you follow modern software practices, you probably have at least two environments: a local development environment and a live, production environment. These environments are very likely to be different in how they are configured, so that's why they are separate entities within your application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simple to reference
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5bxzbwhq5jqlmmqy2bd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5bxzbwhq5jqlmmqy2bd.png" alt="Simply click the " width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you may not need an entire environment's worth of settings or variables, but just one. SecretStash enables you to simply copy values within the application interface. This brings the convenience of 1Password's interface-first approach into a developer-specific utility. When the "Copy" button is clicked, the encrypted value will be quickly retrieved from the server and then decrypted using a cipher stored in the browser's local storage. The decrypted value will then be applied to the device's clipboard. This ensures the value is never sent over an unencrypted channel and the server maintains a zero-knowledge state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secrets are better in groups
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffzab0h1y945v9eqmo6z9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffzab0h1y945v9eqmo6z9.png" alt="The real power of SecretStash is being able to securely share secrets with teammates." width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Where SecretStash really shines is when its features are used across multiple applications, and different team members. Each organization that you create within SecretStash can invite different sets of teammates to participate in the environment variable management process. The owner of the organization can manage the membership list by adding or removing users as needed. When a user is added to a SecretStash organization, that user will be given the ability to sync their own devices with the service to ensure their environment matches their colleagues. This also includes creating new applications, environments, and even importing their own .env files.&lt;/p&gt;

&lt;h2&gt;
  
  
  I wanted to solve my own problem
&lt;/h2&gt;

&lt;p&gt;I created SecretStash because our messy onboarding and the small, thoughtless habit of pasting .env files into Slack were creating real security and productivity problems. SecretStash is built to remove that temptation and replace it with a simple, auditable, and developer-friendly workflow that keeps secrets out of chat and repos while making it effortless to get new teammates up and running.&lt;/p&gt;

&lt;p&gt;At a glance, SecretStash solves the problem by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Centralizing secrets in an encrypted store so credentials are never shared in plain text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keeping per-environment configurations (dev, staging, prod) separate and clearly labeled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enforcing access controls and least-privilege so people only see what they need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Providing ephemeral, auditable sharing and onboarding templates so new hires get the right variables without interrupting the team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrating with CI/CD, local dev tooling, and team workflows so secrets are injected securely where needed (and never manually copy/pasted).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Offering rotation, audit logs, and alerting so stale or leaked credentials are detected and remediated quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is less frantic firefighting, fewer interrupted workdays, and a safer onboarding experience. SecretStash doesn’t aim to be one more barrier — it’s the simple muscle memory replacement for “paste the .env in Slack” so teams can move fast without sacrificing safety. If you’ve ever watched an onboarding session derail because of missing or leaked secrets, SecretStash is the small infrastructure change that prevents that from happening again.&lt;/p&gt;

&lt;p&gt;If you think SecretStash would be worth a try, please do! &lt;a href="https://secretstash.cloud?utm_source=blog" rel="noopener noreferrer"&gt;Create an account&lt;/a&gt; and find out how easy it can be to keep you and your team secure.&lt;/p&gt;

</description>
      <category>security</category>
      <category>tooling</category>
      <category>laravel</category>
      <category>php</category>
    </item>
    <item>
      <title>Stop sharing your variables in Slack</title>
      <dc:creator>Doug Niccum</dc:creator>
      <pubDate>Wed, 17 Jun 2026 03:58:42 +0000</pubDate>
      <link>https://dev.to/dniccum/stop-sharing-your-variables-in-slack-g6j</link>
      <guid>https://dev.to/dniccum/stop-sharing-your-variables-in-slack-g6j</guid>
      <description>&lt;p&gt;Let's be real with ourselves for a moment: we don't like to be onboarded. Whether you are the person who is responsible for onboarding new employees, or you yourself are the one being onboarded into a new role; it's a painful process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onboarding sucks
&lt;/h2&gt;

&lt;p&gt;The delicate balance of providing enough information so an employee feels informed while not having their brain explode from too much data can feel impossible at times. When I onboarded at &lt;a href="https://henryscheinone.com" rel="noopener noreferrer"&gt;Henry Schein One&lt;/a&gt; this past January, I cannot even begin to describe the stress and anxiety that came along with my first few days. Learning everybody's name, their role, who they report to, who reports to me, it was a lot. I do not mean to slight my co-workers in any way. They did a great job and my boss Jen provided that guiding hand when it was necessary. But despite all the back and forth of this process, things can be lost in translation. What's worse: &lt;em&gt;this is just the human side of onboarding&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimum viable setup
&lt;/h2&gt;

&lt;p&gt;The part that can be even more stressful than remembering your new computer password as part of your onboarding journey is configuring your &lt;em&gt;development environment&lt;/em&gt; (queue the "dun dun duuuunnnn" sound effects). Let's assume for a second you are lucky enough to have decent documentation and tutorials that have been written by someone else in your organization to aid in your setup. You are still likely going to be missing some key pieces of information or files to complete your environment. This could be a backup of the database, API keys, OAuth token pairs, or SSL certificates. Whatever it is, handing these things off to people can be hard. So what do we usually do? Copy and paste or drag and drop these files and environment variables into the team's Slack channel. It's quick, it's easy, and at least it's more secure than sending them via email. Or is it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaboration tools are a crutch
&lt;/h2&gt;

&lt;p&gt;We are all guilty of using collaboration tools like Slack and Teams to share information with our teammates that is sensitive. Again, this could be a password, API key, or even an RSA secret. Everything in the workplace is about speed. Gotta get this done fast, send that faster, are you using AI like you should to code this feature faster? It's an endless cycle. But are we really that safe? &lt;a href="https://www.gitguardian.com/state-of-secrets-sprawl-report-2025" rel="noopener noreferrer"&gt;GitGuardian’s State of Secrets Sprawl 2025&lt;/a&gt; says &lt;em&gt;38% of incidents in collaboration tools were classified as highly critical or urgent, higher than in code repositories. Its 2026 report says ~28% of incidents now originate outside source code in tools like Slack, Jira, and Confluence, and more than half of those collaboration-tool incidents were critical.&lt;/em&gt; So despite the bullet-proof security provided to us by the folks in the IT closet and the guarantees from the guys at Salesforce (Slack is owned by Salesforce in case you didn't know 😜) and Microsoft, we are still susceptible to breaches. All because we need to share something quick!&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual suspects just didn't cut it
&lt;/h2&gt;

&lt;p&gt;So if it's &lt;em&gt;soo&lt;/em&gt; easy to compromise these pieces of information, why don't we do it more often? Other than laziness (I can say that because I'm guilty of it too), credential storing processes usually take time to set up and maintain, not to mention the DX (developer experience) is garbage. Sure, there is AWS Secrets Manager and HashiCorp has their solution. These are all viable, but again, their flexibility is also what makes them difficult for most developers. When retrieving a list of secrets, everything is returned in JSON. Most frameworks do not leverage JSON as their method of secret management. Configuration and customization: absolutely. But the source of truth is usually a DotEnv file or &lt;code&gt;.env&lt;/code&gt; located in the code base that needs to be written and formated in a special way.&lt;/p&gt;

&lt;p&gt;I didn't like the options I had in front of me. For a while I used some self-hosted open source tools, and they worked. But as soon as the maintainer abandons the project and the application goes into deprecation hell, you are screwed. Like I said above, there are enterprise solutions. However, these require some time to set up, can be insanely costly even for a small implementation, and can lack the developer experience that I also referenced. This is why I wanted to come up with my solution, something that I knew would answer this question that I knew was important.&lt;/p&gt;

&lt;p&gt;This is why I developed SecretStash.&lt;/p&gt;

&lt;h2&gt;
  
  
  My own solution
&lt;/h2&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%2F2aqypl3naaofacjolyp2.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%2F2aqypl3naaofacjolyp2.png" alt="SecretStash Logo" width="798" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://secretstash.cloud?utm_source=blog" rel="noopener noreferrer"&gt;SecretStash&lt;/a&gt; is a developer-first platform that helps developers securely manage and share environment variables across teams, applications, and environments. This can easily and quickly be done by installing one of the first-party CLI packages and begin interacting with the zero-knowledge cloud service; all within about 1-2 minutes. This ensures your credentials are securely stored away and cannot be retrieved, even in the event of a data breach. You can then invite your teammates to reference the same variables across environments to ensure you are all in sync.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://secretstash.cloud/login?utm_source=hashnode" rel="noopener noreferrer"&gt;Click here to get started for free.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It's hard, I get it
&lt;/h2&gt;

&lt;p&gt;Being a developer myself, I know how hard secret management can be. These hardships double and even triple when you begin to look at how the CI / CD process will be impacted by rotating tokens. These things should be easy, or at least that's what I thought. But after some research and failed open source projects, I came to the tough realization that I was going to have to solve this "secret sharing issue" myself. SecretStash was the result.&lt;/p&gt;

&lt;p&gt;So in the future, stop uploading your &lt;code&gt;.env&lt;/code&gt; files into Slack or Teams, just use SecretStash. Your IT team will appreciate the added security as well.&lt;/p&gt;

</description>
      <category>security</category>
      <category>variables</category>
      <category>privacy</category>
      <category>software</category>
    </item>
    <item>
      <title>Staying vigilant in the AI coding gold rush: from generation to delivery</title>
      <dc:creator>Doug Niccum</dc:creator>
      <pubDate>Fri, 12 Jun 2026 22:10:34 +0000</pubDate>
      <link>https://dev.to/dniccum/staying-vigilant-in-the-ai-coding-gold-rush-from-generation-to-delivery-3m0k</link>
      <guid>https://dev.to/dniccum/staying-vigilant-in-the-ai-coding-gold-rush-from-generation-to-delivery-3m0k</guid>
      <description>&lt;p&gt;Being developers and managers with boots on the ground, we owe it to our customers and users to be the voice of reason and stability when deploying AI-generated assets. Despite what is being asked of us from leadership.&lt;/p&gt;

&lt;p&gt;For those who haven't worked inside the corporate world, the continuous tango of "look at metrics, adjust; look at metrics, adjust" is a never-ending cycle that we, as mid-level managers and directors, must both endure and champion for our reports. These metrics can be used to analyze almost anything about our personal performance and that of our teams. As the organizations we work for grow larger and more complex, context and awareness (of the application and situation) usually diminish. This awareness is replaced by a focus on delivering features and meeting financial and velocity goals.&lt;/p&gt;

&lt;p&gt;🤔&lt;br&gt;
What's ironic is "context" is one of the pillars that quality AI prompts and commands are built on. The more it knows, the better the result.&lt;/p&gt;

&lt;p&gt;You might be asking yourself, "What metrics am I talking about?" I'm referring to productivity metrics, &lt;a href="https://dora.dev/guides/dora-metrics/" rel="noopener noreferrer"&gt;DORA metrics&lt;/a&gt;, but more specifically: lines of code generated. It would seem logical to equate lines of code written with productivity, right? The more code written, the more is delivered to the customer—making the application better, allowing more features to be sold, which means more money. Again, on the surface this makes sense and has been a point of emphasis in my experience. But the more I think about it, just because we are writing more code with AI are we actually more productive? I am not entirely convinced.&lt;/p&gt;

&lt;p&gt;Let's dive into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A quick story
&lt;/h2&gt;

&lt;p&gt;Recently I have attended a series of management meetings where the subject of AI metrics and its usage have been a topic of discussion. Further debates about which models work in which situation, and token-spend among others dominate the forum. Likely a pretty standard "corporate AI" meeting. However one point of discussion always seems to surface again and again: usage. The overwhelming common sentiment between each meeting is the ever-increasing lines of code being generated by our agents. The accompanying narrative being paired with this analysis is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our teams have never been more productive. We are writing more code than we ever have and we are shipping more features than any other point in the company's history.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds like a pretty successful and celebratory conclusion eh? Initially I thought so. Code makes our applications function, functions create features, features means more money; so more code must be good right? But the more I got to thinking, there are other elements that go into code and features. Things like code reviews, security audits, unit tests, and so on. Technically you could use AI to perform these tasks, but (other than the unit tests) you really shouldn't. These things take time, more time to do it right, and even more time when you include multiple people in the process.&lt;/p&gt;

&lt;p&gt;I recognize I am just one manager/developer, one lowly manager/developer. I also recognize that my opinion is just one small grain of sand in the desert that is the AI efficiency discussion. But I cannot help my skepticism of these &lt;strong&gt;MASSIVE&lt;/strong&gt; gains surrounding the deployment of AI in software development practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  More isn't always better
&lt;/h2&gt;

&lt;p&gt;As a small disclaimer, I am basing a bulk of my argument with the assumption your company is following standard development processes, like writing unit tests, performing code reviews and such. If you aren't doing these things and just deploying AI-generated code to production without even the slightest review, then God's speed to you. Hope you have good insurance when your data gets ransomed.&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%2F2v5vwfwg32kx5zzoq8es.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%2F2v5vwfwg32kx5zzoq8es.png" alt=" " width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's continue.&lt;/p&gt;




&lt;p&gt;When we leverage AI to rapidly generate code, it's hard to not be in awe of the speed and accuracy it is able to do so. Some outlets are reporting developers are seeing as much as a &lt;a href="https://sloanreview.mit.edu/article/the-hidden-costs-of-coding-with-generative-ai/" rel="noopener noreferrer"&gt;55% percent increase of productivity&lt;/a&gt;, with a reduction of lead time for tasks by as much as half. More often than not, the code that is generated is pretty accurate and clean; especially if your &lt;a href="https://linear.app/developers/aig" rel="noopener noreferrer"&gt;agent guidelines&lt;/a&gt; are clear and actionable. The magic of typing a prompt and getting a working output will inevitably lull you into this result-driven comatose. It certainly has for me. The ease and luxury provided to you by your coding agent of choice makes it very easy to simply bypass the processes and protocols you would normally follow for your own code: unit tests, user-acceptance testing, quality assurance, security analysis, and so on. If the code works, why would I change it and why would I test it?&lt;/p&gt;

&lt;h3&gt;
  
  
  The "mechanism of structural decay"
&lt;/h3&gt;

&lt;p&gt;If you have worked with AI long enough, you are likely to notice the trend of: write, create, write, append, write, refactor. The agent's immediate response to a prompt is to write code, regardless if you need it to or not. According to a study done by &lt;a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research" rel="noopener noreferrer"&gt;GitClear&lt;/a&gt; and &lt;a href="https://www.sonarsource.com/blog/the-inevitable-rise-of-poor-code-quality-in-ai-accelerated-codebases" rel="noopener noreferrer"&gt;Sonar&lt;/a&gt; citing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;an 8-fold increase in the frequency of code blocks containing five or more duplicated lines, confirming a significant decline in code reuse. Furthermore, 2024 was the first year where the number of copy/pasted lines exceeded the number of moved (refactored) lines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What this crazy statistic ultimately points to is ever-growing code bases that are discarding the DRY &lt;strong&gt;(D&lt;/strong&gt;o not &lt;strong&gt;R&lt;/strong&gt;epeat &lt;strong&gt;Y&lt;/strong&gt;ourself) principles that were drilled into us as junior developers. What this also means is our code is growing larger and thus reducing efficiency and long-term maintainability. This quote from Sonar's article says it beautifully, "structural debt arises because LLMs prioritize local functional correctness over global architectural coherence and long-term maintainability." So despite the numerous additions and augmentations to our code, we could be only making it worse and thus damning our application to the pits of volatility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instability at the cost of insatiable productivity
&lt;/h3&gt;

&lt;p&gt;According to a &lt;a href="https://cloud.google.com/resources/content/2025-dora-ai-assisted-software-development-report" rel="noopener noreferrer"&gt;Google 2025 DORA Report&lt;/a&gt;, the folks over at Google found a 90% increase in AI-generated code also brought about a 9% increase in reported bugs and over a 150% increase in pull/merge request size. If you take these numbers at face value, there are a few big things that should jump out at you:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Our code bases are growing at an alarming rate.&lt;/strong&gt;&lt;/em&gt; I recently reviewed a merge request in GitLab that included 388 lines of net new code (not changes or deletions). Let's assume the developer of this merge request does this four more times over the course of a week. In a month, this means a single developer will have &lt;strong&gt;introduced 13,580 net new lines&lt;/strong&gt; of code into the project, in a single month. If that amount of new code is being written and merged into the repository at that rate, I would have some genuine concerns over the amount of duplicated code, and code that is just unnecessary.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;The number of bugs will grow as well.&lt;/strong&gt;&lt;/em&gt; On the surface, a 9% increase of reported bugs does sound like a lot, but I believe it is so much worse than that. All developers know all bugs are not created equal. They require time to analyze and troubleshoot, and even more time to fix regardless if you use AI or not. As the code base grows, the introduction of bugs is inevitable no matter the amount of testing or QA is done to prevent them (unless your company's name is &lt;a href="https://linear.app/" rel="noopener noreferrer"&gt;Linear&lt;/a&gt;. Those guys know how to produce a clean product; props). But I digress.&lt;/p&gt;

&lt;p&gt;Let's go back to the example we were using above. Let's assume for every three merge requests, one bug is introduced. In addition to this, another bug is introduced for every 5,000 lines of code. This means, keeping to the cadence of this developer's AI-powered productivity, in one month, our developer would have &lt;strong&gt;introduced around eight bugs&lt;/strong&gt;. Now, as I was hinting at earlier, these issues could be very simple and depending your CI/CD process, a resolution could be deployed in a matter of minutes. No harm, no foul right? However some of these issues could be debilitating outages, causing lost progress and lost revenue for your business; all from a single developer.&lt;/p&gt;

&lt;p&gt;🤨&lt;br&gt;
Please know, the numbers that I used above are not actual numbers from me or any of my team. They are simply just examples.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;This code needs to be tested and reviewed.&lt;/strong&gt;&lt;/em&gt; If you are following prototypical development processes, we are probably aligned in the fact of code should be tested by both a human (QA) and a machine (automated unit/feature testing). All of these things takes time, even testing that has been automated. Depending on the size of the code base and testing coverage you have for your application, these tests take time to run. And if you are running these tests on dedicated resources, they also cost money. Code reviews by humans also cost money. Yes, it takes time for another developer to review, test, and smoke check the code. This has a cost. But what people don't think about is the productivity that is also lost due to that developer not coding. So in essence, every code review costs twice of what a developer costs during that same timeframe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of doing it right
&lt;/h2&gt;

&lt;p&gt;For those of us in the tech and software industry, you are likely aware of the meme: "You can have it good, fast, or cheap, but it cannot be all three." Quality, at speed, comes with a cost. This also applies to testing, but even more so when it comes to AI generated code.&lt;/p&gt;

&lt;p&gt;A 2025 study showed that senior engineers spend an average of 4.3 minutes evaluating AI-generated suggestions, versus 1.2 minutes for code written by humans. Meanwhile, teams that rely heavily on AI are delivering substantially more pull requests. Faros AI examined data from over 10,000 developers and found a 98% rise in PR volume. Consequently, PR review time increased by 91%, even though the code generation process itself became faster. A &lt;a href="https://www.qodo.ai/reports/state-of-ai-code-quality/" rel="noopener noreferrer"&gt;Qodo survey&lt;/a&gt; found that 68% of senior engineers report quality improvements from AI, but only 26% would ship AI-generated code without review (I'm surprised its that high).&lt;/p&gt;

&lt;p&gt;So lets play this out. Lets assume you have a development team that makes the following hourly rates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Junior/intermediate developers: about $50 per hour (or $0.83 per minute)&lt;/li&gt;
&lt;li&gt;Mid-level developers: about $100 per hour (or $1.67 per minute)&lt;/li&gt;
&lt;li&gt;Senior/lead developers or architects: about $180 per hour (or $3.00 per minute)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you were to have these developers review human code at their hourly rate it would cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Junior/intermediate developers: about $1 per code review&lt;/li&gt;
&lt;li&gt;Mid-level developers: about: $2 per code review&lt;/li&gt;
&lt;li&gt;Senior/lead developers or architects: $3.60 per code review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these same developers were to review AI-written code at their same hourly rate, it would cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Junior/intermediate developers: about $3.57 per code review&lt;/li&gt;
&lt;li&gt;Mid-level developers: about: $7.01 per code review&lt;/li&gt;
&lt;li&gt;Senior/lead developers or architects: $15.48 per code review&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%2F5y81t14m2wfcqdqenhll.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%2F5y81t14m2wfcqdqenhll.png" alt="Estimated Cost Per Code Review by Reviewer Level" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is worth mentioning these numbers do not account for the lost productivity of the code reviewer as well, much like I mentioned above. Another item that is worth considering is the time added to timelines and lead times for features that can increase your company's bottom line. You will also need to keep an eye on the code bloat and potential regressions, as these can obviously affect these numbers too.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you think about it...
&lt;/h2&gt;

&lt;p&gt;Keep in mind, the numbers that I have provided are very much an approximation and estimate of your team's productivity. There are a fair amount of other caveats like language, code size, complexity, current technical debt, etc. But I think you get my point when you start to think of productivity and output in dollars and cents. As I also mentioned above, I myself have seen the benefits in my own work and undoubtedly you have as well. But with the security risks, bloat, and code duplication AI usage can introduce, AND you combine that with the increased code review time and associated costs with the potential delays and regressions; is it worth it?&lt;/p&gt;

&lt;p&gt;As leaders, we have a direct responsibility to make decisions, and to put our teams into the best possible places/opportunities to succeed. This includes selecting tools and services to use. However when we are being pushed by our bosses and their bosses to use AI to optimize our work, I believe we owe it to our reports and the companies that we represent to at least take a second and really think about the outcomes of our decisions. We are very likely to not see the long-term effects for quite some time, but months and even years from now, are our AI-driven decisions going to really make our work better? Probably, but I am highly skeptical it will be this "slam dunk" we are being told it will be.&lt;/p&gt;

&lt;h2&gt;
  
  
  To put a bow on it
&lt;/h2&gt;

&lt;p&gt;The AI coding gold rush is real — but so are the risks of mistaking generation for delivery. As organizations scale, context and awareness often get compressed into simplistic metrics. Lines of code and raw output from AI tools can feel like progress, but they are a poor proxy for actual customer value, reliability, and long-term maintainability.&lt;/p&gt;

&lt;p&gt;To stay vigilant, treat AI as an amplifier, not a replacement, for disciplined software delivery. Anchor decisions in outcome-oriented metrics (customer impact, lead time, MTTR, change-failure rate), maintain strong feedback loops, and preserve human oversight across design, review, and deployment. Invest in observability, automated testing, security scanning, and provenance tracking so generated code is verifiable and safe to ship. Foster a culture that rewards quality, learning, and shared context—document assumptions, keep prompts and models auditable, and run blameless postmortems when things go wrong.&lt;/p&gt;

&lt;p&gt;Practical steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prioritize outcome metrics over LOC; use DORA metrics thoughtfully and complement them with product and user metrics.&lt;/li&gt;
&lt;li&gt;Require tests, code review, and CI/CD for all AI-generated code before it reaches production.&lt;/li&gt;
&lt;li&gt;Capture context: rich prompts, architectural notes, and intent annotations so AI output is traceable and maintainable.&lt;/li&gt;
&lt;li&gt;Automate safety checks (security, license, performance) and monitor runtime behavior post-deploy.&lt;/li&gt;
&lt;li&gt;Train teams on effective prompting, model limits, and how to validate AI outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: harness AI to accelerate engineering, but measure and manage what actually matters—delivery, quality, and customer value. Vigilance, not hype, will determine who benefits from this gold rush.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>editorial</category>
      <category>codereview</category>
      <category>opinion</category>
    </item>
  </channel>
</rss>
