<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ vibe coding - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ vibe coding - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 16:29:29 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/vibe-coding/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Deploy AI-Generated Code on a PaaS Platform ]]>
                </title>
                <description>
                    <![CDATA[ Vibe coding is about momentum. You open your editor, prompt an AI, stitch pieces together, and suddenly you have something that works. Maybe it’s messy. Maybe the architecture is not perfect. But it’s ]]>
                </description>
                <link>https://www.freecodecamp.org/news/deploy-ai-generated-code-using-paas/</link>
                <guid isPermaLink="false">69aa6fede2698e32064e7d79</guid>
                
                    <category>
                        <![CDATA[ deployment ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vibe coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AI ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Manish Shivanandhan ]]>
                </dc:creator>
                <pubDate>Fri, 06 Mar 2026 06:10:53 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5fc16e412cae9c5b190b6cdd/0b8cb97d-4c82-4e26-862f-a9def20b1612.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Vibe coding is about momentum. You open your editor, prompt an AI, stitch pieces together, and suddenly you have something that works.</p>
<p>Maybe it’s messy. Maybe the architecture is not perfect. But it’s live and working, and that’s the point.</p>
<p>Then comes deployment. This is where the vibe usually dies. Suddenly, you’re reading about containers, load balancers, CI/CD pipelines, infrastructure diagrams, and networking concepts you never asked for. You wanted to ship a thing. Instead, you’re learning accidental DevOps.</p>
<p>The truth is simple. Most vibe-coded apps don’t need complex infrastructure. They just need a clean path from code → live URL.</p>
<p>That’s where a Platform-as-a-Service fits in. It removes the infrastructure ceremony and lets deployment feel like a natural extension of building.</p>
<p>This guide is not about perfect production architecture. It’s about shipping fast without losing momentum. In this article, we will look at how to deploy a simple vibe-coded app using Sevalla. There are other options like Railway, render, and so on, with similar features, and you can <a href="https://www.freecodecamp.org/news/top-heroku-alternatives-for-deployment/">pick one from this list</a>.</p>
<h3 id="heading-what-vibe-deployment-actually-means">What “Vibe Deployment” Actually&nbsp;Means</h3>
<p>Traditional deployment advice assumes you’re building a long-term, heavily engineered system.</p>
<p>Vibe coders operate differently. The goal is speed, feedback, and iteration. A vibe-friendly deployment workflow has a few core characteristics:</p>
<ul>
<li><p><strong>Minimal configuration:</strong> You shouldn’t spend hours setting up environments before seeing your app live.</p>
</li>
<li><p><strong>Fast feedback loops:</strong> Every push should quickly show you the result.</p>
</li>
<li><p><strong>Safe defaults:</strong> You shouldn’t need deep infra knowledge to avoid obvious mistakes.</p>
</li>
</ul>
<p>In other words, deployment shouldn’t be a “phase.” It should be part of the normal development loop. You build. You push. It updates. You keep going.</p>
<h3 id="heading-the-typical-vibe-coded-app">The Typical Vibe-Coded App</h3>
<p>Most vibe-coded projects look similar under the hood. There’s usually a frontend generated or accelerated by AI using React, Next.js, Vue, or something equally modern. The backend might be a small API, sometimes written quickly without strict structure.</p>
<p>Data lives in a managed database. Authentication might be glued together from a few libraries.</p>
<p>The code evolves rapidly. Patterns change weekly. Files get renamed, rewritten, or deleted without ceremony. And that’s fine.</p>
<p>The problem is that traditional deployment workflows assume stability and planning. They expect clean separation between environments, carefully defined build pipelines, and long-term operational thinking.</p>
<p>Vibe-coded apps need the opposite: something that tolerates change and rewards experimentation.</p>
<h3 id="heading-the-paas-mental-model">The PaaS Mental&nbsp;Model</h3>
<p>The biggest shift with a PaaS is how you think about deployment. Instead of asking:</p>
<ul>
<li><p>Which server should I use?</p>
</li>
<li><p>How do I configure networking?</p>
</li>
<li><p>What container setup do I need?</p>
</li>
<li><p>How do I maintain and run my server 24/7?</p>
</li>
</ul>
<p>You think in terms of:</p>
<ul>
<li><p>Connect your repository.</p>
</li>
<li><p>Configure the app once.</p>
</li>
<li><p>Deploy automatically.</p>
</li>
</ul>
<p>A PaaS treats your project as a service that can be built and run. You don’t manage infrastructure, you define the minimum information needed to run your code.</p>
<p>There are only a few concepts you really need to understand:</p>
<ul>
<li><p><strong>Services:</strong> Each deployable unit of your app. A frontend or backend typically becomes a service.</p>
</li>
<li><p><strong>Environment variables:</strong> Secrets and configuration that differ between local and production.</p>
</li>
<li><p><strong>Auto builds:</strong> Every code push triggers a build and deployment.</p>
</li>
</ul>
<p>That’s it. The system handles the rest. The result is important: deployment stops being a separate discipline and becomes just another part of coding.</p>
<h3 id="heading-how-to-ship-your-first-app-on-sevalla">How to Ship Your First App on&nbsp;Sevalla</h3>
<p><a href="https://sevalla.com/">Sevalla</a> is a developer-friendly PaaS provider. It offers application hosting, database, object storage, and static site hosting for your projects.</p>
<p>Let’s walk through what deployment actually looks like in practice. I have already written a few tutorials on both <a href="https://www.freecodecamp.org/news/how-to-build-and-deploy-a-loganalyzer-agent-using-langchain/">Python</a> and <a href="https://www.freecodecamp.org/news/build-and-deploy-an-image-hosting-service-on-sevalla/">Node.js</a> projects, building an app from scratch and deploying it on Sevalla.</p>
<h4 id="heading-step-1-connect-your-repository">Step 1: Connect Your Repository</h4>
<p>The starting point is your Git repository. <a href="https://app.sevalla.com/login">Log in</a> to Sevalla using your GitHub account, or you can connect it after logging in with your email.</p>
<p>You connect your project to Sevalla and select the branch you want to deploy. This creates a direct link between your code and the live app.</p>
<img src="https://cdn.hashnode.com/uploads/covers/66c6d8f04fa7fe6a6e337edd/dd0c1f28-0699-45a6-8ab6-316a9a17e780.png" alt="Creating an application" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>You can also enable “Automatic deployments”. Once you create an app, deployment becomes automatic. You push code, and Sevalla takes care of building and publishing.</p>
<p>No manual uploads. No SSH sessions. No server setup.</p>
<h4 id="heading-step-2-configure-the-runtime">Step 2: Configure the&nbsp;Runtime</h4>
<p>Next, you define how your app runs. Most modern frameworks are detected automatically. If you’ve built something common, you usually won’t need to tweak much.</p>
<p>This is where you add environment variables. API keys, database URLs, authentication secrets, and anything that shouldn’t live inside your codebase.</p>
<img src="https://cdn.hashnode.com/uploads/covers/66c6d8f04fa7fe6a6e337edd/daa3f518-c9fe-412b-959b-7d46931efad1.png" alt="Adding environment variables" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>A simple rule for vibe coders: If it changes between local and production, make it an environment variable. Once set, you rarely need to touch this again.</p>
<h4 id="heading-step-3-deploy">Step 3:&nbsp;Deploy</h4>
<p>Now you deploy. Sevalla builds the application, installs dependencies, and launches it. After a short wait, you get a live URL.</p>
<p>This is the moment that matters. Your app is no longer a local experiment, it’s something real people can use. And importantly, you didn’t need to make infrastructure decisions to get there.</p>
<h4 id="heading-step-4-iterate-like-a-vibe-coder">Step 4: Iterate Like a Vibe&nbsp;Coder</h4>
<p>Now your workflow shines! You make a change locally. Commit. Push. Sevalla rebuilds and redeploys automatically. Your deployment process becomes invisible, just part of your normal coding rhythm.</p>
<p>This matters more than most people realize. When deployment is effortless, you ship more often. When you ship more often, you learn faster. And fast learning is the real advantage of vibe coding.</p>
<h3 id="heading-things-vibe-coders-usually-break-and-how-paas-helps">Things Vibe Coders Usually Break (and How PaaS&nbsp;Helps)</h3>
<p>Even simple deployment workflows can go wrong. Some patterns show up repeatedly.</p>
<ul>
<li><p><strong>Missing environment variables:</strong> The app works locally but crashes in production. A PaaS surfaces configuration clearly, making it easier to spot.</p>
</li>
<li><p><strong>Localhost assumptions.</strong> Hardcoded URLs or local file paths break once deployed. Using environment configuration fixes this early.</p>
</li>
<li><p><strong>File storage confusion.</strong> Local files disappear between deployments. Treat storage as external from day one.</p>
</li>
<li><p><strong>Ignoring logs.</strong> Many developers only look at logs after panic sets in. Sevalla’s centralized logs make debugging faster when something inevitably fails.</p>
</li>
</ul>
<img src="https://cdn.hashnode.com/uploads/covers/66c6d8f04fa7fe6a6e337edd/c1d0d65d-3962-4b18-a8b6-5801a02dd303.png" alt="Logs" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>The important point: these aren’t advanced problems. They’re beginner deployment mistakes, and the platform’s defaults help you avoid most of them.</p>
<h3 id="heading-the-minimal-production-checklist">The Minimal Production Checklist</h3>
<p>Before you call something “live,” run through a quick checklist:</p>
<ul>
<li><p>Environment variables are set correctly.</p>
</li>
<li><p>The database is external, not local.</p>
</li>
<li><p>Logs are enabled and readable.</p>
</li>
<li><p>Custom domain is connected if needed.</p>
</li>
<li><p>You know how to roll back to a previous version.</p>
</li>
</ul>
<p>That’s enough for most early-stage projects. You don’t need complex monitoring stacks or multi-region infrastructure to start learning from real users.</p>
<h3 id="heading-why-this-workflow-works-for-vibe-builders">Why This Workflow Works for Vibe&nbsp;Builders</h3>
<p>Indie builders and vibe coders succeed by maintaining velocity. The highest hidden cost in software isn’t infrastructure, it’s context switching.</p>
<p>Every time you stop building to become a part-time DevOps engineer, momentum drops.</p>
<p>A PaaS system’s biggest advantage isn’t technical sophistication. It’s psychological. You stay in the builder mindset. You focus on product decisions instead of infrastructure decisions.</p>
<p>And because deployment feels safe, you ship more frequently. Small releases reduce risk, reduce anxiety, and make experimentation normal. This is exactly the environment where small projects grow into real products.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>The best deployment system is one you barely think about. For vibe coders, deployment shouldn’t be a scary milestone or a weekend project. It should feel like pressing save, just another step in the creative loop.</p>
<p>Build something. Push it live. Learn from users. Repeat. That’s the real goal. And when deployment stops being a bottleneck, the vibe stays alive.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Use Vibe Coding Effectively as a Dev ]]>
                </title>
                <description>
                    <![CDATA[ It may seem like everyone is a vibe coder these days, and prompting seemed like it would become the new coding. But is this AI-generated code really deployable? Bragging on social media about a clever script is one thing, but pushing a vibe coded app... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-vibe-coding-effectively-as-a-dev/</link>
                <guid isPermaLink="false">6925deb0b459e862808eb04c</guid>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Programming Blogs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vibe coding ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ankur Tyagi ]]>
                </dc:creator>
                <pubDate>Tue, 25 Nov 2025 16:52:00 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764089459731/0122c0b7-08e2-434a-b5eb-518025401951.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>It may seem like everyone is a vibe coder these days, and prompting seemed like it would become the new coding. But is this AI-generated code really deployable?</p>
<p>Bragging on social media about a clever script is one thing, but pushing a vibe coded app to prod comes with many security risks.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758881769141/9bedc585-5608-4660-a304-bbb10f10b8f2.png" alt="Vibe-debug, vibe-refactor, and vibe-check" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>With so many AI dev tools out there now, <a target="_blank" href="https://www.freecodecamp.org/news/how-to-perform-code-reviews-in-tech-the-painless-way/">code reviews</a> become more critical than ever.</p>
<p>This article will explore what <strong>vibe coding</strong> means and how code reviews should adapt in the era of AI.</p>
<h2 id="heading-table-of-contents"><strong>Table of Contents:</strong></h2>
<ol>
<li><p><a class="post-section-overview" href="#heading-what-is-vibe-coding">What is Vibe Coding?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-implement-vibe-coding-in-practice">How to Implement Vibe Coding in Practice</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-why-isnt-vibe-coded-output-production-ready">Why isn’t Vibe Coded Output Production Ready?</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-context-gaps-are-the-first-crack">Context gaps are the first crack.</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-those-gaps-lead-directly-to-integration-blind-spots">Those gaps lead directly to integration blind spots.</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-most-serious-risk-is-security-by-omission">The most serious risk is security by omission.</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-testing-and-correctness-evidence-are-thin">Testing and correctness evidence are thin.</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-operability-lags-behind">Operability lags behind.</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-guidelines-for-ai-code-reviews">Guidelines for AI Code Reviews</a></p>
<ul>
<li><a class="post-section-overview" href="#heading-code-review-process-in-vibe-coding">Code Review Process in Vibe Coding</a></li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-checklist-for-reviewing-ai-generated-code">Checklist for Reviewing AI Generated Code</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-work-effectively-with-ai-tools">How to Work Effectively with AI Tools</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></p>
</li>
</ol>
<h2 id="heading-what-is-vibe-coding">What is Vibe Coding?</h2>
<p>In early 2025, AI researcher <a target="_blank" href="https://x.com/karpathy">Andrej Karpathy</a> popularized the term vibe coding to describe a new way of development in which you “fully give in to the vibes” and let AI write code while you focus on high level intent.</p>
<p>A developer expresses their desired functionality in plain language, and an AI system (like an <a target="_blank" href="https://en.wikipedia.org/wiki/Large_language_model">LLM</a>) generates the source code to implement it.</p>
<p>This code-by-prompt approach allows even beginners to produce working code without deep knowledge of programming languages. Karpathy joked that with advanced IDE agents (like <a target="_blank" href="https://www.devtoolsacademy.com/blog/cursor-vs-windsurf/">Cursor’s</a> Composer mode), “I barely even touch the keyboard... I ‘Accept All’ always, I don’t read the diffs anymore... and it mostly works”.</p>
<p>So, vibe coding is coding by vibe and trusting AI to handle the heavy lifting.</p>
<h2 id="heading-how-to-implement-vibe-coding-in-practice">How to Implement Vibe Coding in Practice</h2>
<p>In practice, vibe coding usually involves using AI assistants and adapting your workflow to a more interactive, prompt-driven style.</p>
<p>Here’s an overview of how you can “vibe code” a project:</p>
<h3 id="heading-step-1-choose-an-ai-assistant">Step 1: Choose an AI assistant</h3>
<p>Select a development env that supports AI code generation. Popular choices include <a target="_blank" href="https://cursor.com/">Cursor</a> and <a target="_blank" href="https://github.com/features/copilot">GitHub Copilot</a>.</p>
<h3 id="heading-step-2-define-your-requirements">Step 2: Define your requirements</h3>
<p>Instead of writing boilerplate code, describe what you want to build. Provide AI with a specific prompt detailing functionality. The more <a target="_blank" href="https://www.philschmid.de/context-engineering">context</a> and detail you give, the better AI can fulfill your intent.</p>
<p>For example, when I ran an SEO inspection for my website, DevTools Academy, I used this prompt in Cursor:</p>
<blockquote>
<p>“Now, act as a senior product engineer and UX strategist. Evaluate and improve <a target="_blank" href="https://www.devtoolsacademy.com">https://www.devtoolsacademy.com</a> with a practical, no-fluff lens.</p>
<p>Scope:</p>
<ul>
<li><p>UX</p>
</li>
<li><p>SEO and technical SEO</p>
</li>
<li><p>Positioning and messaging</p>
</li>
<li><p>Copywriting and information architecture</p>
</li>
<li><p>What to add to stand out in the developer tools space.”</p>
</li>
</ul>
</blockquote>
<p>This prompt works well because it gives the AI a clear role, a defined scope, and a specific intent. AI knows it’s not just fixing SEO but also reviewing how the site communicates value to devs. That combination of clarity and context produces actionable insights instead of surface-level suggestions.</p>
<p>Below is a screenshot of that audit in progress and showing how I reviewed code, metadata, and UX recommendations side by side.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761258218099/91e93726-1a7d-4d1a-9839-531355037dfc.png" alt="cursor screenshot showing CodeRabbit reviewing a pull request with comments and summary." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>You can checkout the full code on my open source <a target="_blank" href="https://github.com/tyaga001/devtoolsacademy">blog</a> here and check out closed PRs. This will help you learn how I use all these coding agents on a production ready app.</p>
<h3 id="heading-step-3-review-the-code">Step 3: Review the code</h3>
<p>AI will produce initial code based on your prompt. Think of this as a prototype – it’s not perfect. Run the code and see how it behaves.</p>
<p>Let’s look at an example: here, CodeRabbit is reviewing one of my <a target="_blank" href="https://github.com/tyaga001/devtoolsacademy/pull/145">pull requests</a> on GitHub. I had pushed a small fix to sort blog posts correctly and make sure the RSS feed reflects the latest publish date. Within seconds, CodeRabbit analyzed the diff, understood the intent behind my change, and explained exactly what the new code does.</p>
<p>It pointed out that the fix now sorts posts before mapping them, uses the sorted data for both items and the lastBuildDate, and ensures proper chronological order throughout the feed.</p>
<p>It’s like having a senior reviewer who not only checks syntax but also validates logic and confirms that your reasoning holds up.</p>
<p><a target="_blank" href="https://github.com/tyaga001/devtoolsacademy/pull/145"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758879621613/95bee1e7-3953-4416-b48b-e844332be950.png" alt="GitHub pull request showing CodeRabbit review comments on code changes with highlighted fixes." class="image--center mx-auto" width="600" height="400" loading="lazy"></a></p>
<p>This is just a reminder to expect imperfections. Vibe coding embraces a <em>“code first, refine later”</em> mindset. This means you get a working version quickly, then iteratively improve it. You might go through a few cycles of prompt -&gt; code -&gt; test -&gt; tweak.</p>
<h3 id="heading-step-4-validate-debug-polish">Step 4: Validate, debug, polish</h3>
<p>Once AI generated code meets your expectations, do a final review.</p>
<p>Throughout the process, the core idea is that you collaborate with the AI. The AI agent serves as a coding assistant, making real-time suggestions, automating tedious boilerplate, and even generating entire modules on your behalf.</p>
<h2 id="heading-why-isnt-vibe-coded-output-production-ready">Why Isn’t Vibe Coded Output Production Ready?</h2>
<p>Vibe coding moves fast: you describe intent, the AI produces something that runs, and you’re off to the next prompt. What’s missing is the slow, unglamorous work that usually turns a draft into shippable software, like shared context, architectural alignment, verification, and documentation.</p>
<p>AI generates plausible code based on patterns it has seen. But it doesn’t understand your team’s history, your system’s constraints, or the implicit rules that keep everything coherent over time.</p>
<p>That mismatch shows up the moment a “works on my machine” demo meets a real codebase.</p>
<p>Let’s explore the common pitfalls of vibe-coded code, so you’ll know what to watch for. Then, in the checklist section below, I’ll outline practical strategies to address or prevent each issue.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758271815928/5f763a0f-2dda-4318-8c19-0c9e58447abe.png" alt="AI is Limited by Context" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h3 id="heading-context-gaps-are-the-first-crack">Context gaps are the first crack.</h3>
<p>AI only sees what you show it, so it’s easy for it to make the right local choice and the wrong global one: duplicating logic that already exists, choosing defaults that conflict with prior decisions, or introducing functions that don’t respect domain boundaries.</p>
<p>The result is code that looks reasonable in isolation but collides with existing assumptions and conventions once integrated.</p>
<h3 id="heading-those-gaps-lead-directly-to-integration-blind-spots">Those gaps lead directly to integration blind spots.</h3>
<p>Drafts often ignore the lived details of your environment – shared utilities, cross-cutting concerns, configuration, deployment hooks, and operational policies. Interfaces may line up at a glance and still fail at runtime because the draft doesn’t fit how your system composes modules, handles errors, or manages state across services.</p>
<h3 id="heading-the-most-serious-risk-is-security-by-omission">The most serious risk is security by omission.</h3>
<p>AI rarely includes robust input validation, clear authentication and authorization paths, or rate limiting unless you spell it out. Secrets handling and logging tend to be superficial or missing. That leaves common exposure points like request handlers, job processors, and webhook endpoints without the checks that prevent injection, SSRF, mass assignment, or data exfiltration.</p>
<p>Even when the surface looks tidy, the absence of explicit security controls means you’re trusting defaults you didn’t choose.</p>
<h3 id="heading-testing-and-correctness-evidence-are-thin">Testing and correctness evidence are thin.</h3>
<p>Quality suffers in quieter ways, too. Beyond “it runs,” there’s little to demonstrate behavior across edge cases or to guard against regressions.</p>
<p>Performance and scalability remain unknowns: extra network calls, N+1 patterns, and quadratic loops sneak in because nobody measured them. Dependencies and environments drift as versions aren’t pinned, infrastructure isn’t declared, and configuration lives only in the author’s head, making behavior differ across machines and CI.</p>
<h3 id="heading-operability-lags-behind">Operability lags behind.</h3>
<p>A lack of metrics, missing health/readiness probes, and no runbook make failures harder to detect and slower to recover from. Add in data quality and compliance concerns (PII handling, encoding assumptions, transitive license obligations), and you have code that demos well but isn’t ready for production’s reliability, security, and audit demands.</p>
<p>In short, vibe-coded output accelerates drafting but skips the shared understanding and evidence that make software safe to ship.</p>
<p>Until those gaps are closed, it’s a prototype, not a release.</p>
<h2 id="heading-guidelines-for-ai-code-reviews">Guidelines for AI Code Reviews</h2>
<p>Your team should keep pre-AI engineering standards as the bar, including security, tests, readability, maintainability, performance, and docs. AI should change how fast you gather the evidence for those standards, not how much evidence you require. In other words, use AI to accelerate the path to your existing bar, never to lower it.</p>
<p>Using AI, you can generate code at speed. But if reviews take the same amount of time (or more time), you lose some of the benefit. The goal isn’t to relax standards, it’s to shorten the time to prove you met them. That means layering in automation (tests, static analysis, secret scans, SCA) and AI-assisted review to catch obvious issues quickly so human reviewers can focus on intent, architecture, and risk.</p>
<p>Well-used assistants can help here. For example, tools like CodeRabbit, GitHub Copilot PR Reviewer, Claude Code, Cursor’s Bugbot, Graphite’s AI Review, and Greptile can highlight potential bugs, security gaps, style deviations, and mismatched intent, and summarize diffs for faster context. Treat these as accelerators for your existing process, not as replacements for judgment.</p>
<h3 id="heading-code-review-process-in-vibe-coding">Code Review Process in Vibe Coding</h3>
<p>The fundamentals of good code reviews haven’t changed – and in fact, they’re more critical now.</p>
<p>Below are some key principles to maintain speed without sacrificing quality.</p>
<h4 id="heading-1-trust-but-verify">1. Trust, but verify.</h4>
<p>A reviewer usually assumes the author understands the system. With vibe-coded output, the “author” may be an AI with limited context. If something looks odd or unnecessary, question it. Run the code, add/execute tests, or ask the developer/AI for clarification on intent and constraints.</p>
<h4 id="heading-2-dont-let-reviews-become-a-bottleneck">2. Don’t let reviews become a bottleneck.</h4>
<p>Vibe coding generates code quickly. If human review takes as long as hand-writing the change, you’ve erased the gain.</p>
<p>Combat this by front-loading automation: run unit/integration tests, static analysis (lint/SAST), secret scans, SCA, and basic perf checks in CI to clear the noise. Then reviewers spend their time on design trade-offs, boundary cases, and risk. The balance is: high standards, faster evidence.</p>
<h4 id="heading-3-use-ai-code-reviews-wisely">3. Use AI code reviews wisely</h4>
<p>AI can help review code just as it helps generate it. Modern “pair reviewer” tools scan a PR and surface likely bugs, security issues, missing tests, or style violations in minutes plus give natural-language summaries of the change.</p>
<p>Tools you can consider include CodeRabbit, GitHub Copilot PR Reviewer, Claude Code, Cursor Bugbot, Graphite, and Greptile. Many integrate with the CLI/IDE and GitHub/GitLab to leave actionable comments.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758272500586/a9cc891f-ab1a-47d8-a607-a772cbaef2e0.png" alt="coderabbit CLI" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Think of them as fast first-pass reviewers that increase coverage and consistency across PRs.</p>
<h4 id="heading-4-human-judgment-is-still-irreplaceable">4. Human judgment is still irreplaceable.</h4>
<p>Even the best AI reviewer is an assistant. Keep humans accountable for correctness, security posture, architectural fit, and user impact. A healthy pattern is AI first-pass &gt; human second-pass that inspects invariants, failure modes, and long-term maintainability.</p>
<h4 id="heading-5-maintain-a-high-bar-for-quality">5. Maintain a high bar for quality.</h4>
<p>It’s tempting to accept “it runs” when an AI wrote it. Don’t. Stakeholders still expect software to be robust, secure, and maintainable. Keep DRY, readability, and testability standards. Insist on input validation, authZ checks where relevant, and sensible logging/metrics. If you can’t provide evidence that you met the bar, you haven’t met it.</p>
<h4 id="heading-6-educate-and-document">6. Educate and document</h4>
<p>When reviewers find bugs or security flaws in AI-generated code, capture the lesson.</p>
<p>Update internal guides with patterns like “When generating handlers, validate and bound inputs, add rate limits, log request IDs, avoid N+1 queries, and sanitize user-visible output.” Over time, bake these into prompts, templates, repo scaffolds, and CI checks so the next AI draft starts closer to done.</p>
<h2 id="heading-checklist-for-reviewing-ai-generated-code">Checklist for Reviewing AI Generated Code</h2>
<p>Before approving any vibe-coded change, make the standards explicit and verifiable. Use this checklist to confirm behavior, security, performance, integration, and documentation so the draft you got from AI becomes code you can safely ship.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762510535966/85ea547a-f955-446b-9e22-965dc18f9e49.png" alt="Checklist for Reviewing AI Generated Code" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Here’s a checklist a human reviewer should go through before approving vibe-coded output:</p>
<h3 id="heading-1-define-the-codes-purpose-scope-amp-non-goals">1. Define the code’s purpose (scope &amp; non-goals).</h3>
<p>Be explicit about what this change does and does not do. Tie it to a user story/ticket and call out non-goals so “helpful” AI changes don’t creep in.</p>
<h3 id="heading-2-verify-x-and-y-behavior-and-edge-cases">2. Verify X and Y (behavior and edge cases).</h3>
<p>Be clear about what you’re verifying. For example, verify input parsing and pagination boundaries, verify that error paths return the correct status and body, and verify that database writes are idempotent. Run existing tests, add missing unit/integration tests, and reproduce edge inputs (empty, null, huge, unicode).</p>
<h3 id="heading-3-perform-code-quality-checks-readability-dry-refactor-needs">3. Perform code-quality checks (readability, DRY, refactor needs).</h3>
<p>AI often produces verbose or duplicated logic. Ensure names are meaningful, side effects are clearly stated, and duplication is removed or minimized. Run linters/formatters, collapse repetition, and extract helpers where they aid clarity.</p>
<h3 id="heading-4-analyze-organization-and-structure-make-sure-it-fits-the-architecture">4. Analyze organization and structure (make sure it fits the architecture).</h3>
<p>AI writes code in isolation. Confirm the change uses existing utilities, layers, and boundaries (domain/services/controllers/jobs). Check imports and module placement, avoid reinventing existing helpers, and align with repository conventions.</p>
<h3 id="heading-5-validate-inputs-and-assumptions-make-the-implicit-explicit">5. Validate inputs and assumptions (make the implicit explicit).</h3>
<p>List the assumptions the AI made (default locale/timezone, allowed ranges, required fields). Add schema validation (DTO/class validators/JSON Schema). Empty, null, over-max, non-ASCII, unexpected enum, malicious strings. And finally, enforce limits/timeouts.</p>
<h3 id="heading-6-perform-security-audits-minimum-pass">6. Perform security audits (minimum pass).</h3>
<ul>
<li><p><strong>AuthN/AuthZ:</strong> Confirm endpoint checks identity and authorization paths; deny-by-default.</p>
</li>
<li><p><strong>Inputs:</strong> Sanitize/validate inputs, prevent injection (SQL/NoSQL/command), and escape user-visible output.</p>
</li>
<li><p><strong>Secrets</strong>: No secrets in code/diff/logs, use env/secret manager, and rotate any test keys.</p>
</li>
<li><p><strong>Abuse controls:</strong> Add rate limits, size limits, and timeouts on network and disk operations. Run SAST/secret scan/SCA, and fix or justify findings.</p>
</li>
</ul>
<h3 id="heading-7-do-a-performance-evaluation-right-now-at-a-small-scale">7. Do a performance evaluation (right now, at a small scale).</h3>
<p>Look for N+1s, needless network calls, unbounded loops, quadratic sorts. Add a micro-benchmark or run a quick load test for hot paths. Set sensible cache/timeout/retry with jitter where applicable.</p>
<h3 id="heading-8-manage-dependencies-pin-justify-minimize">8. Manage dependencies (pin, justify, minimize).</h3>
<p>Review any new libraries. Are they necessary? Maintained? License compatible? Pin versions, add lockfiles, or remove unused transitive adds.</p>
<h3 id="heading-9-review-documentation-what-to-add-and-where">9. Review documentation (what to add and where).</h3>
<p>Ensure the docs are in line with the code. AI often changes some parts or adds code blocks at different places while resolving various issues. These changes might not make it into the docs.</p>
<h3 id="heading-10-observability-see-problems-early">10. Observability (see problems early).</h3>
<p>Use structured logs with request/trace IDs, key counters/timers (success/error/latency), health/readiness probes, and a basic dashboard or alert stub.</p>
<h3 id="heading-11-compliance-and-data-handling-when-applicable">11. Compliance and data handling (when applicable).</h3>
<p>Identify any personally identifiable information (PII), document collection/retention, ensure masking/redaction in logs, verify dependency licenses and data-residency constraints.</p>
<h2 id="heading-how-to-work-effectively-with-ai-tools">How to Work Effectively with AI Tools</h2>
<p>At this point, you can probably see why it’s very important to understand the actual skills involved in AI-assisted development.</p>
<p>There’s a pretty big difference between an experienced developer who uses AI tools to help them get more done, and a newbie who thinks AI can build the next Facebook or Google just with a simple prompt.</p>
<p>An inexperienced dev will ask AI something like "Hey, Build me Twitter and make no mistakes"</p>
<p>But an experienced developer who has a solid fundamentals might say say something like:</p>
<ul>
<li><p>"AI, we're building a Twitter replica. Use $SQL_Database, Use $Language, Avoid $Common_Pitfalls, Follow $Standard_Practices."</p>
</li>
<li><p>"The generated code is prone to X problem, implement this fix."</p>
</li>
<li><p>"Implementation of $X is flawed because of $Y, do $Z instead."</p>
</li>
</ul>
<p>So as you can see, you still need to know the how's and the why's and what depends on what. Often you’ll just need to make the changes manually, because it will be faster. And you don’t want to outsource the critical thinking part, which is the part that AI can't actually do.</p>
<p>LLMs are good at information retrieval. If you know nothing about what you’re looking for, then asking an AI isn’t going to be that helpful (or that reliable). But if you have an idea, some background knowledge/context, and the skills to verify AI’s responses, then it can be really helpful.</p>
<p>Last month, I shared in my <a target="_blank" href="https://bytesizedbets.com/">newsletter</a> how my current coding loop looks in practice.</p>
<p>I draft with Claude Code (or Copilot/Cursor), open a PR, and let an AI reviewer like CodeRabbit (or Copilot PR Reviewer / Cursor Bugbot or Greptile) do the first pass. CI runs tests and scans.</p>
<p>I repeat until everything’s green and the PR is ready to merge. It’s fast, but it’s still disciplined.</p>
<p>If you want to understand why this kind of workflow is becoming essential, read this article: <a target="_blank" href="https://bytesizedbets.com/p/era-of-ai-slop-cleanup-has-begun">Era of AI Slop Cleanup Has Begun</a>. I talk about what’s happening in AI-assisted engineering, where generating code is easy, but keeping it clean and production ready takes experience – and you must have good programming skills.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>AI-generated code can boost productivity – but production value still comes from software that is robust, secure, and maintainable.</p>
<p>Mindless code generation creates technical debt. But when you integrate AI thoughtfully, with guardrails, verification, tests, security checks, and documentation, you can go faster without lowering your standards.</p>
<p>That's it for this article. I hope you learned something new today.</p>
<p>If you have any questions about code reviews, engineering, startups, or business in general, please find me on Twitter: <a target="_blank" href="https://x.com/TheAnkurTyagi">@TheAnkurTyag</a>i. I’d be more than happy to discuss them.</p>
<h3 id="heading-want-to-read-more-interesting-articles-like-this">Want to read more interesting articles like this?</h3>
<p>You can read more about the latest dev tools like this one on my <a target="_blank" href="https://www.devtoolsacademy.com/">website</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Vibe Code With Help From n8n ]]>
                </title>
                <description>
                    <![CDATA[ Learn the power of vibe coding and how it pairs perfectly with n8n to build full-stack AI-driven apps. We just published a crash course on the freeCodeCamp.org YouTube channel that will teach you the power of VibeCoding and how to automate real-world... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-vibe-code-with-help-from-n8n/</link>
                <guid isPermaLink="false">686e78b53e3a3fb3bf0c79eb</guid>
                
                    <category>
                        <![CDATA[ vibe coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ youtube ]]>
                    </category>
                
                    <category>
                        <![CDATA[ n8n ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Beau Carnes ]]>
                </dc:creator>
                <pubDate>Wed, 09 Jul 2025 14:12:05 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751989831875/d04a4ccc-1159-4ff1-944b-d75399a55a2e.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Learn the power of vibe coding and how it pairs perfectly with n8n to build full-stack AI-driven apps.</p>
<p>We just published a crash course on the freeCodeCamp.org YouTube channel that will teach you the power of VibeCoding and how to automate real-world workflows using n8n. This course starts by demystifying what software engineers actually do and introduces you to the VibeCoding movement, which is an approach that blends human creativity with AI-driven automation. Paulo Dichone from Vinci bits created this course.</p>
<p>You’ll learn about the origins of VibeCoding, why it’s accessible to everyone, and how it can transform your approach to building software. The course walks through the entire vibe coding workflow, connecting it to core software engineering principles so you can vibe code like a pro.</p>
<p>A key part of this course is n8n, an open-source workflow automation tool that lets you connect different apps, APIs, and services without writing tons of code. Think of n8n as a visual platform where you can drag, drop, and link together building blocks to automate tasks, process data, and build complex backend systems.</p>
<p>You will learn how to set up n8n, create your first workflows and webhooks, and use AI coding agents to build powerful frontends that interact with your automated backend. Along the way, you’ll tackle real challenges like processing files, handling binary data, and troubleshooting workflow issues.</p>
<p>Here are the different sections covered in this course:</p>
<ul>
<li><p>What do Software Engineers do?</p>
</li>
<li><p>Vibe Coding - Who Started This Movement?</p>
</li>
<li><p>Fear Not Vibe Coding - Here’s Why</p>
</li>
<li><p>Vibe Coding - the Full Workflow</p>
</li>
<li><p>Bring it All Together - Vibecoding and Software Engineering Principles - Vibecoding Like an Engineer</p>
</li>
<li><p>LLM and Context - Why Does it Matter?</p>
</li>
<li><p>The Path to Follow when Vibe Coding</p>
</li>
<li><p>How To Think About Vibe Coding to Build Production Applications</p>
</li>
<li><p>Setting up N8N</p>
</li>
<li><p>Basics on N8N - Create your First Workflow and Webhooks</p>
</li>
<li><p>Leveraging AI Coding Agents to Build the Frontend - Intro to <a target="_blank" href="http://Bolt.new">Bolt.new</a> - Upload Files to our N8N Backend</p>
</li>
<li><p>Adding an N8N Switch Node to our Backend Workflow - Processing PDF, TXT, and CSV Files</p>
</li>
<li><p>Understanding Binary Files and Troubleshooting N8N Issues</p>
</li>
<li><p>An Overview of the Workflow Architecture - Bulletproofing the Workflow for Further Processing Downstream</p>
</li>
<li><p>Adding a Code Node to our N8N Workflow for Processing Data</p>
</li>
<li><p>Deconstructing the Field Extraction Node Code</p>
</li>
<li><p>Combining Extracted Data through the Code Node</p>
</li>
<li><p>Testing the Workflow - Full File Upload and File Processing Workflow</p>
</li>
<li><p>Final Thoughts and Where to Go From Here</p>
</li>
</ul>
<p>By the end of this course, you’ll have the VibeCoding mindset and a production-ready AI automation system built with n8n and AI tools. Watch the full course <a target="_blank" href="https://youtu.be/qDtVzumlb8M">on the freeCodeCamp.org YouTube channel</a> (2-hour watch).</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/qDtVzumlb8M" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why Vibe Coding Won't Destroy Software Engineering ]]>
                </title>
                <description>
                    <![CDATA[ AI is disrupting all industries at a pace not seen at any time in history. Technologies and industries that were once dominated by one or two companies or were very much “human-focused” are coming under threat. Google is losing ground to AI search, t... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-vibe-coding-wont-destroy-software-engineering/</link>
                <guid isPermaLink="false">682df55da72360814bcae9ef</guid>
                
                    <category>
                        <![CDATA[ vibe coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AI Coding Assistant ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AI ]]>
                    </category>
                
                    <category>
                        <![CDATA[ #ai-tools ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Software Engineering ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ben ]]>
                </dc:creator>
                <pubDate>Wed, 21 May 2025 15:46:37 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747835351675/3d178f26-c528-48b8-8ac2-32811a5672cf.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>AI is disrupting all industries at a pace not seen at any time in history.</p>
<p>Technologies and industries that were once dominated by one or two companies or were very much “human-focused” are coming under threat.</p>
<p><a target="_blank" href="https://www.smoothseo.co/blog/misc/what-the-numbers-say-about-ais-growing-role-in-search/">Google is losing ground to AI search</a>, <a target="_blank" href="https://www.axios.com/2022/03/28/automation-long-haul-truckers-jobs">truck drivers</a> may soon be a thing of the past, and low-skilled clerical <a target="_blank" href="https://news.sky.com/story/ai-risks-up-to-eight-million-uk-job-losses-with-low-skilled-worst-hit-report-warns-13102214">jobs are being lost every day</a>.</p>
<p>Will this disruption destroy the Software Engineering industry? I don’t think so, and I’ll tell you why.</p>
<h3 id="heading-heres-what-well-discuss">Here’s what we’ll discuss:</h3>
<ol>
<li><p><a class="post-section-overview" href="#heading-the-phenomenon-of-vibe-coding">The Phenomenon of "Vibe Coding"</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-ai-has-changed-software-development">How AI Has Changed Software Development</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-productivity-paradox">The Productivity Paradox</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-why-human-engineers-are-still-critical">Why Human Engineers Are Still Critical</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-ai-as-a-capability-multiplier">AI as a “Capability Multiplier”</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-critical-skills-for-the-ai-era">Critical Skills for the AI Era</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-path-forward">The Path Forward</a></p>
</li>
</ol>
<h2 id="heading-the-phenomenon-of-vibe-coding"><strong>The Phenomenon of "Vibe Coding"</strong></h2>
<p>If you follow tech discussions on X, you've likely seen the term "vibe coding" – the practice of building software through trial and error, intuition, and AI-generated code snippets without deep technical knowledge.</p>
<p>Modern AI assistants such as GitHub Copilot and ChatGPT can generate full functions, fix bugs, and create components based on simple descriptions. “Vibe Coders” are claiming that human coders will soon become obsolete.</p>
<p>From my perspective, these AI tools function more as skill multipliers than replacements.</p>
<p>They help talented developers work faster while exposing gaps in knowledge for less skilled programmers. Those lacking technical foundations will face problems they can't solve, but engineers who blend AI assistance with solid expertise will be able to be incredibly productive.</p>
<h2 id="heading-how-ai-has-changed-software-development"><strong>How AI Has Changed Software Development</strong></h2>
<p>The software industry has seen rapid adoption of AI coding tools based on Large Language Models that analyze code repositories to predict and suggest next steps.</p>
<p>These tools have transformed daily programming work by:</p>
<ul>
<li><p>Suggesting complete functions as you type</p>
</li>
<li><p>Creating API endpoints from plain language descriptions</p>
</li>
<li><p>Eliminating hours spent on standard code patterns</p>
</li>
<li><p>Automating documentation tasks</p>
</li>
<li><p>Handling repetitive logic quickly</p>
</li>
</ul>
<p>This shift toward "vibe coding" speeds up feature delivery. Programmers can now build without mastering every technical detail – they describe what they want, get AI suggestions, and adjust until the code works.</p>
<p>The risk? Developers often push code they can't explain. They move quickly during building but struggle when systems break or need changing.</p>
<p>There's also a concerning trend of non-programmers selling AI-built applications. Recently, someone with zero coding background launched a paid service created entirely through AI prompts, only to face a data breach days later when hackers exploited basic security flaws. This is dangerous. It has wasted people's money and exposed their data. Imagine if this became common place due to the rise of “vibe coders”?</p>
<p>For anyone considering building software who isn’t a software engineer, there are a few basic levels of security that you need to consider:</p>
<ul>
<li><p>Adding authentication to your API endpoints: People can scan for open ports and endpoints across the internet. If they can then call your API endpoints without being authenticated, it can cause all sorts of problems</p>
</li>
<li><p>Do not store passwords in plain text. This is a big no no. If you do this and your database gets exposed, those passwords are there for all to see. And if we’re being real, people re-use passwords, so those passwords will be their passwords for other sites too.</p>
</li>
<li><p>SSL: Make sure your website is secure and has an up to date SSL certificate. Transmitting data in plain text is dangerous.</p>
</li>
<li><p>Lock down unused ports: If you are hosting a backend service, make sure that any ports that you don’t use are locked down and people aren’t able to connect to them.</p>
</li>
<li><p>If you have areas where people can upload files, limit the uploads to specific file types.</p>
</li>
</ul>
<p>Those are just a few considerations around security for your site or product, but there are many more.</p>
<h2 id="heading-the-productivity-paradox"><strong>The Productivity Paradox</strong></h2>
<p>AI assistance dramatically increases code output – but volume doesn't equal value in software engineering.</p>
<p>These tools excel at syntax but have no understanding about system architecture, scalability concerns, and maintenance requirements. Just as typing speed doesn't create a better novel, code generation speed doesn't produce better software systems.</p>
<p>AI works for individual functions but struggles with architectural decisions, security planning, and long-term support needs. Without proper review and understanding, AI-generated code often becomes tomorrow's tech-debt and maintenance burden.</p>
<p>Consider this scenario: A developer implements an AI-created authentication system that works in isolation but causes subtle failures in users signing up to the product. Finding and fixing these integration issues might take experienced staff several days – negating any initial time savings. This is a quick path to losing money and trust.</p>
<h2 id="heading-why-human-engineers-are-still-critical"><strong>Why Human Engineers Are Still Critical</strong></h2>
<p>While AI tools handle syntax well, they cannot:</p>
<ol>
<li><p>Plan systems that grow with user demand</p>
</li>
<li><p>Create reliable deployment and testing pipelines</p>
</li>
<li><p>Anticipate unusual but critical failure cases</p>
</li>
<li><p>Make smart tradeoffs between performance and cost</p>
</li>
<li><p>Find non-obvious security weaknesses</p>
</li>
</ol>
<p>Great engineers think beyond code. They develop patterns that help entire teams, select the right technologies, and plan both for success and failure scenarios.</p>
<p>Software creation involves complex tradeoffs: Do we prioritize speed or stability? Flexibility or simplicity? These decisions require both technical expertise and business knowledge.</p>
<p>The highest value engineers I work with spend more time thinking than typing. They consider: How will requirements evolve? What stress points might emerge? How will the system recover from failures?</p>
<p>As basic code generation becomes widely accessible, your value comes from understanding system interactions. The competitive edge will be with those who know why certain approaches succeed, where they might fail, and how to build resilient solutions.</p>
<p>Per the above, there are some things that AI without proper oversight can not do.</p>
<p>AI can, for instance, be great at passing simple prompts to create solutions to well known problems. If you use this prompt, for example:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747771377197/8aae1332-f852-435a-a724-a1770a4163bf.png" alt="Prompt: &quot;Create a Python module that will tell you if some input JSON is valid&quot;" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Here’s the code you might get:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">is_valid_json</span>(<span class="hljs-params">input_string: str</span>) -&gt; bool:</span>
    <span class="hljs-string">"""
    Checks if the input string is valid JSON.

    Args:
        input_string (str): The JSON string to validate.

    Returns:
        bool: True if valid, False otherwise.
    """</span>
    <span class="hljs-keyword">try</span>:
        json.loads(input_string)
        <span class="hljs-keyword">return</span> <span class="hljs-literal">True</span>
    <span class="hljs-keyword">except</span> json.JSONDecodeError:
        <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span>():</span>
    user_input = input(<span class="hljs-string">"Enter a JSON string to validate: "</span>)
    <span class="hljs-keyword">if</span> is_valid_json(user_input):
        print(<span class="hljs-string">"✅ The input is valid JSON."</span>)
    <span class="hljs-keyword">else</span>:
        print(<span class="hljs-string">"❌ The input is NOT valid JSON."</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()
</code></pre>
<p>Pretty basic.</p>
<p>I would not, though, ask an AI to build me a complex Forex Trading platform.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747771546630/d212d814-7785-4391-8e01-79e80c05da44.png" alt="d212d814-7785-4391-8e01-79e80c05da44" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>I’ll save you reading through all of the response, but suffice it to say that it was not able to do this for me.</p>
<p>I thought I’d break that down to a slightly smaller subset of a financial trading platform:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747771773603/b65e1a13-97aa-4276-81c7-55303e5a04c6.png" alt="Prompt: &quot;Create me an endpoint for a FIX message for an FX Financial security. Make it in Python and I want to be able to accept J messages. Security is key here, so I need this to be as secure as possible.&quot;" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Now, I will admit, this got closer. Here was the result:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> fastapi <span class="hljs-keyword">import</span> FastAPI, Request, HTTPException, Header
<span class="hljs-keyword">from</span> pydantic <span class="hljs-keyword">import</span> BaseModel, Field
<span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> Optional
<span class="hljs-keyword">import</span> hmac
<span class="hljs-keyword">import</span> hashlib
<span class="hljs-keyword">import</span> logging

app = FastAPI()

<span class="hljs-comment"># === CONFIGURATION ===</span>
SHARED_SECRET = <span class="hljs-string">b"super_secure_shared_secret"</span>  <span class="hljs-comment"># Keep this secure</span>

<span class="hljs-comment"># === LOGGING SETUP ===</span>
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(<span class="hljs-string">"ems.fix"</span>)

<span class="hljs-comment"># === Pydantic Model for Execution Report (simplified) ===</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExecutionReport</span>(<span class="hljs-params">BaseModel</span>):</span>
    msg_type: str = Field(default=<span class="hljs-string">"J"</span>, const=<span class="hljs-literal">True</span>)
    cl_ord_id: str  <span class="hljs-comment"># Tag 11</span>
    order_id: str   <span class="hljs-comment"># Tag 37</span>
    exec_id: str    <span class="hljs-comment"># Tag 17</span>
    exec_type: str  <span class="hljs-comment"># Tag 150</span>
    ord_status: str <span class="hljs-comment"># Tag 39</span>
    symbol: str     <span class="hljs-comment"># Tag 55 (e.g., EUR/USD)</span>
    side: str       <span class="hljs-comment"># Tag 54 (1=Buy, 2=Sell)</span>
    leaves_qty: float  <span class="hljs-comment"># Tag 151</span>
    cum_qty: float     <span class="hljs-comment"># Tag 14</span>
    avg_px: float      <span class="hljs-comment"># Tag 6</span>
    transact_time: str <span class="hljs-comment"># Tag 60 (ISO8601 string)</span>

<span class="hljs-comment"># === Helper: HMAC Validator ===</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">verify_signature</span>(<span class="hljs-params">payload: bytes, signature: str</span>) -&gt; bool:</span>
    computed = hmac.new(SHARED_SECRET, payload, hashlib.sha256).hexdigest()
    <span class="hljs-keyword">return</span> hmac.compare_digest(computed, signature)

<span class="hljs-comment"># === Endpoint ===</span>
<span class="hljs-meta">@app.post("/fix/execution-report")</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">receive_execution_report</span>(<span class="hljs-params">
    request: Request,
    x_signature: Optional[str] = Header(<span class="hljs-params">None</span>)
</span>):</span>
    body = <span class="hljs-keyword">await</span> request.body()

    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> x_signature <span class="hljs-keyword">or</span> <span class="hljs-keyword">not</span> verify_signature(body, x_signature):
        logger.warning(<span class="hljs-string">"Invalid or missing signature."</span>)
        <span class="hljs-keyword">raise</span> HTTPException(status_code=<span class="hljs-number">403</span>, detail=<span class="hljs-string">"Unauthorized"</span>)

    <span class="hljs-keyword">try</span>:
        report_data = ExecutionReport.parse_raw(body)
        logger.info(<span class="hljs-string">f"Execution Report received: <span class="hljs-subst">{report_data.dict()}</span>"</span>)
        <span class="hljs-comment"># ✅ Here, you'd handle order updates, booking, etc.</span>
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"status"</span>: <span class="hljs-string">"ok"</span>, <span class="hljs-string">"message"</span>: <span class="hljs-string">"Execution Report received"</span>}
    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
        logger.exception(<span class="hljs-string">"Invalid payload format."</span>)
        <span class="hljs-keyword">raise</span> HTTPException(status_code=<span class="hljs-number">400</span>, detail=<span class="hljs-string">f"Invalid FIX message format: <span class="hljs-subst">{str(e)}</span>"</span>)
</code></pre>
<p>But this does not come close to the final version. Even if you could use this code as a part of your trading system, unless you know how to build and architect and entire software system, where do you go from here? You can tell your clients that they can send you an “ExecutionReport”, but then what?</p>
<p>I’ve read and heard the arguments that you “just need to be better at prompting to build bigger systems”. But where does the benefit come from then? The complexity of financial trading systems is beyond comprehension. Prompting a system well enough, with enough information to make it fully featured, scalable, secure, and extensible (not to mention able to be debugged) would itself be a mammoth task. So where is the time being saved? Is it even possible?</p>
<p>I’m yet to see any proof anywhere that anyone has build such a complex system without the oversight of a human, and I’m not convinced we will see it at any point in the near future.</p>
<h2 id="heading-ai-as-a-capability-multiplier"><strong>AI as a “Capability Multiplier”</strong></h2>
<p>These AI tools help magnify existing capabilities rather than replacing them. Skilled developers become far more productive, while less skilled ones generate problems more quickly.</p>
<p>Effective engineers use AI to:</p>
<ul>
<li><p>Handle basic implementation tasks</p>
</li>
<li><p>Create initial project frameworks</p>
</li>
<li><p>Compare different solution approaches</p>
</li>
<li><p>Move past challenging problems</p>
</li>
</ul>
<p>Meanwhile, less capable developers use AI to mask skill gaps, implementing solutions they neither understand nor can modify. When these implementations fail, they lack the knowledge to fix them independently.</p>
<p>This widens the skill gap. Top engineers leverage AI for mechanical tasks while focusing on higher-value thinking. Those using AI as a substitute for learning face limitations when working beyond the AI's knowledge boundaries.</p>
<p>A good example of something that AI is perfect for is translation logic:</p>
<p>Let’s say I have Python Dataclass representing an" “InternalUser”. I also have a Django ORM representation of the same entity. If I wanted to convert one to the other, I can just paste both representations in to ChatGPT and get it create me a conversion function. Notice that the conversion function also takes into account that the field names aren’t exact matches:</p>
<pre><code class="lang-python"><span class="hljs-meta">@dataclass</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InternalUser</span>:</span>
    id: str
    email: str
    hashed_password: str
    full_name: str
    role: UserRole
    status: AccountStatus
    created_at: datetime
    updated_at: datetime
    address: Optional[Address] = <span class="hljs-literal">None</span>
    preferences: Preferences = field(default_factory=Preferences)
    login_activity: LoginActivity = field(default_factory=LoginActivity)
    tags: List[str] = field(default_factory=list)
    notes: Optional[str] = <span class="hljs-literal">None</span>
</code></pre>
<pre><code class="lang-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InternalUser</span>(<span class="hljs-params">models.Model</span>):</span>
    id = models.CharField(primary_key=<span class="hljs-literal">True</span>, max_length=<span class="hljs-number">100</span>)  <span class="hljs-comment"># Use UUIDField if preferred</span>
    email = models.EmailField(unique=<span class="hljs-literal">True</span>)
    hashedPassword = models.CharField(max_length=<span class="hljs-number">256</span>)
    fullName = models.CharField(max_length=<span class="hljs-number">255</span>)
    role = models.CharField(max_length=<span class="hljs-number">20</span>, choices=UserRole.choices, default=UserRole.USER)
    status = models.CharField(max_length=<span class="hljs-number">20</span>, choices=AccountStatus.choices, default=AccountStatus.PENDING)
    createdAt = models.DateTimeField(default=timezone.now)
    updatedAt = models.DateTimeField(auto_now=<span class="hljs-literal">True</span>)

    address = models.OneToOneField(Address, null=<span class="hljs-literal">True</span>, blank=<span class="hljs-literal">True</span>, on_delete=models.SET_NULL)
    preferences = models.OneToOneField(Preferences, on_delete=models.CASCADE)
    loginActivity = models.OneToOneField(LoginActivity, on_delete=models.CASCADE)

    tags = models.JSONField(default=list, blank=<span class="hljs-literal">True</span>)  <span class="hljs-comment"># List of strings</span>
    notes = models.TextField(null=<span class="hljs-literal">True</span>, blank=<span class="hljs-literal">True</span>)

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span>(<span class="hljs-params">self</span>):</span>
        <span class="hljs-keyword">return</span> <span class="hljs-string">f"<span class="hljs-subst">{self.fullName}</span> (<span class="hljs-subst">{self.email}</span>)"</span>
</code></pre>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> Optional
<span class="hljs-keyword">from</span> myapp.models <span class="hljs-keyword">import</span> InternalUser <span class="hljs-keyword">as</span> ORMInternalUser, Address <span class="hljs-keyword">as</span> ORMAddress, Preferences <span class="hljs-keyword">as</span> ORMPreferences, LoginActivity <span class="hljs-keyword">as</span> ORMLoginActivity
<span class="hljs-keyword">from</span> mydataclasses <span class="hljs-keyword">import</span> InternalUser <span class="hljs-keyword">as</span> DCInternalUser  <span class="hljs-comment"># assuming your dataclass lives here</span>


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">convert_internal_user_to_model</span>(<span class="hljs-params">dc_user: DCInternalUser</span>) -&gt; ORMInternalUser:</span>
    <span class="hljs-comment"># Create or update Address if provided</span>
    orm_address: Optional[ORMAddress] = <span class="hljs-literal">None</span>
    <span class="hljs-keyword">if</span> dc_user.address:
        orm_address = ORMAddress.objects.create(
            street=dc_user.address.street,
            city=dc_user.address.city,
            state=dc_user.address.state,
            postalCode=dc_user.address.postal_code,
            country=dc_user.address.country
        )

    <span class="hljs-comment"># Create Preferences</span>
    orm_preferences = ORMPreferences.objects.create(
        newsletterOptIn=dc_user.preferences.newsletter_opt_in,
        darkModeEnabled=dc_user.preferences.dark_mode_enabled,
        language=dc_user.preferences.language
    )

    <span class="hljs-comment"># Create LoginActivity</span>
    orm_login_activity = ORMLoginActivity.objects.create(
        lastLogin=dc_user.login_activity.last_login,
        loginAttempts=dc_user.login_activity.login_attempts,
        lastIpAddress=dc_user.login_activity.last_ip_address
    )

    <span class="hljs-comment"># Create InternalUser</span>
    orm_user = ORMInternalUser.objects.create(
        id=dc_user.id,
        email=dc_user.email,
        hashedPassword=dc_user.hashed_password,
        fullName=dc_user.full_name,
        role=dc_user.role.value,
        status=dc_user.status.value,
        createdAt=dc_user.created_at,
        updatedAt=dc_user.updated_at,
        address=orm_address,
        preferences=orm_preferences,
        loginActivity=orm_login_activity,
        tags=dc_user.tags,
        notes=dc_user.notes
    )

    <span class="hljs-keyword">return</span> orm_user
</code></pre>
<p>This is a basic example, but extrapolate this out to an entire internal data model and you’ve saved hours and hours of code.</p>
<p>You can even then ask it to create you the function stubs of the tests:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> pytest
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">from</span> yourmodule.dataclasses <span class="hljs-keyword">import</span> InternalUser, Address, Preferences, LoginActivity, UserRole, AccountStatus
<span class="hljs-keyword">from</span> yourmodule.conversion <span class="hljs-keyword">import</span> dataclass_to_django_internal_user


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_basic_fields</span>():</span>
    <span class="hljs-comment"># Test that basic fields (email, name, etc.) are correctly copied</span>
    <span class="hljs-keyword">pass</span>


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_with_address</span>():</span>
    <span class="hljs-comment"># Test that address fields are properly mapped to the ORM model</span>
    <span class="hljs-keyword">pass</span>


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_with_preferences</span>():</span>
    <span class="hljs-comment"># Test preferences like dark mode, newsletter opt-in, and language</span>
    <span class="hljs-keyword">pass</span>


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_with_login_activity</span>():</span>
    <span class="hljs-comment"># Test login attempts, last IP, and last login datetime</span>
    <span class="hljs-keyword">pass</span>


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_with_tags_and_notes</span>():</span>
    <span class="hljs-comment"># Test tags list and optional notes field</span>
    <span class="hljs-keyword">pass</span>


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_with_missing_optional_fields</span>():</span>
    <span class="hljs-comment"># Ensure None fields like address or lastLogin don’t break conversion</span>
    <span class="hljs-keyword">pass</span>


<span class="hljs-meta">@pytest.mark.django_db</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">test_internal_user_conversion_saves_correctly</span>():</span>
    <span class="hljs-comment"># Save all related models and main InternalUser model and check database</span>
    <span class="hljs-keyword">pass</span>
</code></pre>
<p>Now, I’m not suggesting that you take these as is and don’t add your own thought in to each possible test scenario, but it’s a great start.</p>
<p>These pieces of “grunt work” were never what we paid the top engineers for. These were just the things that they had to do to get the job done. People didn’t enjoy these tasks. They weren’t fulfilling.</p>
<h2 id="heading-critical-skills-for-the-ai-era"><strong>Critical Skills for the AI Era</strong></h2>
<p>As AI handles more coding tasks, successful engineers must develop strengths in areas where human judgment remains essential:</p>
<p>Systems thinking becomes the primary skill – understanding component interactions, identifying potential failures, and designing for future growth. This capability comes from experience, not prompting.</p>
<p>You should build expertise in infrastructure and deployment processes. Software that works in development but fails in production creates no value. So, learn about <a target="_blank" href="https://www.freecodecamp.org/news/learn-continuous-integration-delivery-and-deployment/">continuous integration</a>, <a target="_blank" href="https://www.freecodecamp.org/news/how-to-set-up-monitoring-for-nodejs-applications-using-elastic/">monitoring</a> systems, and <a target="_blank" href="https://www.freecodecamp.org/news/beginners-guide-to-cloud-computing-with-aws/">cloud platform capabilities</a>.</p>
<p>You should also master <a target="_blank" href="https://www.freecodecamp.org/news/rest-api-design-best-practices-build-a-rest-api/">API design</a> – the interfaces between systems. <a target="_blank" href="https://www.freecodecamp.org/news/design-an-api-application-program-interface/">Well-designed APIs</a> enable team independence. Poor interfaces create bottlenecks affecting everyone.</p>
<p>Another key skill is being able to integrate security throughout the development process. A single oversight can result in breaches, damaging both customer trust and business standing.</p>
<p>Make sure you develop communication skills for both technical and non-technical audiences. You’ll need to explain complex decisions clearly across different stakeholder groups.</p>
<p>And study how AI tools function to understand their limitations and strengths, allowing you to use them most effectively.</p>
<p>For senior developers, mentoring becomes increasingly important. New engineers need guidance on responsible AI usage – knowing when to accept suggestions and when to question them.</p>
<h2 id="heading-the-path-forward"><strong>The Path Forward</strong></h2>
<p>The software field is entering a significant transition. AI will generate more code more quickly, transforming development practices. This shift presents both opportunities and challenges.</p>
<p>The most valuable positions will go to those good at tasks machines cannot handle. These engineers will determine what to build, how to design it, and how to balance technical constraints with business objectives.</p>
<p>"Vibe coding" serves as a useful technique for specific needs – like quickly building standard components. But it fails as a comprehensive strategy for complex system development.</p>
<p>Skilled engineers will advance by delegating routine work to AI while addressing more challenging problems. Less skilled engineers will struggle as fundamental knowledge gaps become apparent.</p>
<p>With regards to learning how to use AI effectively, also use caution and judgement when following advice from people online. It’s still a fairly new field and changes constantly.</p>
<p>People online are giving away “free prompts” to generate code. These prompts may be great or may have problems. The prompts may have worked when they used them, but the AI models may have changed and maybe they’ll produce different results now. Be cautious and use your best judgement.</p>
<p>The future belongs to those who view AI as a collaborative tool rather than a replacement. Software development remains fundamentally human-driven, now supported by increasingly powerful assistance.</p>
<p><em>In his spare time, Ben writes his tech blog</em> <a target="_blank" href="https://justanothertechlead.com/"><em>Just Another Tech Lead</em></a> <em>and runs a site on SEO,</em> <a target="_blank" href="https://www.smoothseo.co"><em>SmoothSEO</em></a><em>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
