<?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: Kevin Craig</title>
    <description>The latest articles on DEV Community by Kevin Craig (@kevinc35).</description>
    <link>https://dev.to/kevinc35</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2339099%2F44021b1f-74de-4850-bba5-259ffff06f54.png</url>
      <title>DEV Community: Kevin Craig</title>
      <link>https://dev.to/kevinc35</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kevinc35"/>
    <language>en</language>
    <item>
      <title>Claude Code: Beyond the Rubber Duck - How AI Assistants Are Reshaping Development Workflows</title>
      <dc:creator>Kevin Craig</dc:creator>
      <pubDate>Tue, 17 Jun 2025 17:06:24 +0000</pubDate>
      <link>https://dev.to/kevinc35/claude-code-beyond-the-rubber-duck-how-ai-assistants-are-reshaping-development-workflows-5he6</link>
      <guid>https://dev.to/kevinc35/claude-code-beyond-the-rubber-duck-how-ai-assistants-are-reshaping-development-workflows-5he6</guid>
      <description>&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%2Ff9shwgogxl533ec1kaa1.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%2Ff9shwgogxl533ec1kaa1.png" alt="A man talking with a rubber duck" width="800" height="449"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A developer's honest take on the current state and future of AI-assisted coding&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; After weeks of hands-on experience with Claude Code, I've hit token limits 3x in one day but achieved near-autonomous development workflows. Enterprise AI adoption is slower than expected, but the productivity gains for early adopters are substantial. Here's what I've learned building a 98% AI-generated social network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code enables truly autonomous development workflows once initial permissions are configured&lt;/li&gt;
&lt;li&gt;Token consumption is the biggest limitation - expect to hit usage caps frequently during intensive sessions&lt;/li&gt;
&lt;li&gt;Enterprise adoption remains cautiously slow - opportunity for early adopters to gain competitive advantage&lt;/li&gt;
&lt;li&gt;Strategic prompt planning in Claude Web + execution in Claude Code creates powerful development pipelines&lt;/li&gt;
&lt;li&gt;AI assistants have evolved beyond rubber duck debugging into genuine problem-solving partners&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Agentic Revolution is Here
&lt;/h3&gt;

&lt;p&gt;After spending the last few weeks deep in a new project using Claude Code, I'm convinced we've crossed a significant threshold in AI-assisted development. This isn't just another coding assistant—it's the beginning of truly agentic programming where AI can take ownership of complex tasks with minimal human intervention.&lt;br&gt;
For context, I'm building a modular social network application inspired by the BBS (Bulletin Board System) era—think customizable communities before the modern internet existed. My goal? Achieve 98% AI-written code, starting with a simple "hello world" and scaling up to a full-featured platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Current State: Impressive Capabilities, Real Limitations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What's Working Remarkably Well
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Autonomous Task Execution:&lt;/strong&gt; Once you've worked through the initial permission requests (and there are many), Claude Code operates with surprising independence. I can provide a detailed prompt—often developed through conversations in Claude Web first—and watch it execute complex workflows with minimal intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strategic Planning Integration:&lt;/strong&gt; The most powerful workflow I've discovered involves using Claude Web to break down project requirements into weekly prompt sequences. This strategic planning phase, combined with Claude Code's execution capabilities, creates a development pipeline that feels genuinely collaborative rather than just assistive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beyond the Rubber Duck:&lt;/strong&gt; Every developer knows the value of explaining problems to an inanimate object. AI assistants, particularly Claude Sonnet 4, have evolved far beyond this. Instead of talking to myself, I'm engaging in genuine problem-solving dialogues that often lead to solutions I wouldn't have considered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality Check: Token Economics
&lt;/h2&gt;

&lt;p&gt;Here's the honest downside—token consumption is aggressive. As a Claude Pro user, I've hit usage limits three times in a single day. When you're in flow state and suddenly hit a wall because your AI assistant needs to recharge, it's jarring. The promise of uncapped workflows can't come soon enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enterprise Adoption: The Cautious Crawl Forward&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Having navigated two job searches in the past year, I've observed something fascinating about AI adoption patterns across organizations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Resistance Patterns:&lt;/strong&gt; Many development teams seem determined to find fault with AI tools rather than understanding their current capabilities and limitations. There's a peculiar psychological barrier where some engineers approach AI assistants as competitors rather than force multipliers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Slow Enterprise Pivot:&lt;/strong&gt; Small and large companies alike are taking a wait-and-see approach. Based on conversations across the industry, I predict the second half of 2025 will mark a significant acceleration in enterprise AI adoption. The organizations that figure this out first will have a substantial competitive advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The BBS Project: A Perfect AI Test Case
&lt;/h2&gt;

&lt;p&gt;My current project—a modular social network platform inspired by BBS systems—serves as an ideal testing ground for AI-assisted development. For younger developers who might not remember: BBSs were the internet before the internet. Single phone lines, dial-up modems, one user at a time (maybe three if you were fancy), and communities built around shared interests discovered through word of mouth.&lt;br&gt;
The modern parallel I'm building maintains that spirit of customizable, focused communities. Want a social network dedicated to underwater basket weaving? The modular architecture should make that possible. It's simultaneously an experiment in AI-generated code and a return to the focused, interest-driven communities that made early online spaces special.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Insights for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Permission Dance
&lt;/h3&gt;

&lt;p&gt;Expect significant upfront time investment in training Claude Code on your preferences and security boundaries. This initial permission phase feels tedious but pays dividends in autonomous operation later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic Prompt Development
&lt;/h3&gt;

&lt;p&gt;Don't underestimate the value of using Claude Web first for project planning. The ability to have detailed architectural discussions and then translate those into actionable prompts for Claude Code creates a powerful development pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Token Management Strategy
&lt;/h3&gt;

&lt;p&gt;For heavy users, develop workflows that batch related tasks. Running out of tokens mid-flow is productivity death. Plan your AI-intensive work around usage patterns and have fallback strategies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should Engineers Be Worried?
&lt;/h3&gt;

&lt;p&gt;Not yet, and here's why: enterprise adoption remains cautiously slow, and the technology still requires significant human oversight and strategic thinking. The engineers who should be concerned are those refusing to engage with these tools at all.&lt;br&gt;
The immediate impact isn't job displacement—it's productivity multiplication for those who learn to work effectively within current AI capabilities. The developers who master AI-assisted workflows today will be the ones defining best practices as adoption accelerates.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Path Forward
&lt;/h3&gt;

&lt;p&gt;We're in a unique moment where AI coding assistants have become genuinely useful while remaining clearly bounded in their capabilities. Claude Sonnet 4 represents a significant step forward in reasoning and code generation, but it's still very much a tool that requires skilled operation.&lt;br&gt;
The developers who thrive in this environment will be those who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand AI capabilities and limitations deeply&lt;/li&gt;
&lt;li&gt;Develop effective prompt engineering skills&lt;/li&gt;
&lt;li&gt;Learn to architect projects that leverage AI strengths&lt;/li&gt;
&lt;li&gt;Maintain critical thinking about generated code&lt;/li&gt;
&lt;li&gt;Stay adaptable as the technology evolves rapidly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Looking Ahead
&lt;/h2&gt;

&lt;p&gt;My BBS-inspired social network project will serve as a real-world stress test for current AI-assisted development capabilities. I'll be documenting the journey, tracking what percentage of code is truly AI-generated, and identifying where human intervention remains essential.&lt;br&gt;
The goal isn't to prove AI can replace developers—it's to understand how we can work together more effectively. As I progress through this experiment, I'm convinced we're witnessing the early days of a fundamental shift in how software gets built.&lt;br&gt;
The rubber duck era is ending. The age of AI pair programming has begun.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the Author
&lt;/h3&gt;

&lt;p&gt;I'm currently a Senior Software Engineer at Kelly Services, bringing over 25 years of experience that spans both infrastructure and development disciplines. The last 8+ years have been spent in the startup ecosystem, where I've witnessed firsthand how technology adoption patterns vary dramatically between nimble startups and established enterprises.&lt;br&gt;
This unique perspective—combining deep technical experience with recent exposure to both emerging companies and traditional corporate environments—has given me valuable insights into how AI tools like Claude Code are being received across different organizational contexts. My career has taught me that the most impactful technologies often face initial resistance before becoming indispensable, and I believe we're seeing that pattern play out with AI-assisted development tools today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engagement Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For the community:
&lt;/h3&gt;

&lt;p&gt;What AI coding tools are you currently using, and how do they compare to your experience with traditional IDEs?&lt;br&gt;
How is your organization approaching AI tool adoption? Are you seeing resistance or enthusiasm?&lt;br&gt;
What percentage of your current projects could realistically be AI-assisted?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me&lt;/strong&gt; if you're experimenting with AI-assisted development or want to discuss enterprise adoption strategies. I'm particularly interested in hearing from other developers who are pushing the boundaries of what's possible with current AI tools.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#AI #SoftwareDevelopment #ClaudeCode #DeveloperProductivity #TechTrends #Coding #ArtificialIntelligence #SoftwareEngineering #DevTools #Innovation&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>claudecode</category>
      <category>techtrends</category>
    </item>
    <item>
      <title>AI &amp; The Future of Software Engineering: Rebuilding Legacy ERPs with AI Assistance</title>
      <dc:creator>Kevin Craig</dc:creator>
      <pubDate>Wed, 09 Apr 2025 19:17:27 +0000</pubDate>
      <link>https://dev.to/kevinc35/ai-the-future-of-software-engineering-rebuilding-legacy-erps-with-ai-assistance-2nh0</link>
      <guid>https://dev.to/kevinc35/ai-the-future-of-software-engineering-rebuilding-legacy-erps-with-ai-assistance-2nh0</guid>
      <description>&lt;h3&gt;
  
  
  Part 3 of "Navigating the New AI Landscape in Software Development"
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Throughout this series, I've explored how AI is transforming software development—first through my productivity experiment demonstrating 10x efficiency gains, then by sharing the advanced prompting techniques that made those gains possible. Now, let's turn to one of software engineering's most challenging domains: working with legacy applications.&lt;/p&gt;

&lt;p&gt;As many of us know all too well, legacy systems present unique challenges. They're often poorly documented, built on outdated technologies, and maintained by teams that have long since moved on. Yet these systems frequently form the backbone of critical business operations. In my 30 years in the industry, I've found few tasks more daunting than modernizing these digital artifacts from another era.&lt;/p&gt;

&lt;p&gt;But here's the exciting part: AI tools are proving to be remarkably effective allies in this challenging domain. Let me share what I've discovered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Legacy Challenge
&lt;/h2&gt;

&lt;p&gt;Legacy small business ERPs typically come with several obstacles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monolithic architectures built on outdated frameworks&lt;/li&gt;
&lt;li&gt;Tightly coupled UI and business logic&lt;/li&gt;
&lt;li&gt;Complex database schemas with undocumented relationships&lt;/li&gt;
&lt;li&gt;Business processes embedded in code rather than configuration&lt;/li&gt;
&lt;li&gt;Limited extensibility for modern integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before AI, modernizing these systems often meant months of archaeological code exploration, risky rewrites, and painstaking testing. Today, the landscape is rapidly changing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Changes the Legacy Modernization Equation
&lt;/h2&gt;

&lt;p&gt;Consider a hypothetical scenario: modernizing a 12-year-old small business ERP originally built with jQuery and PHP. AI tools could dramatically accelerate several aspects of this process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code comprehension&lt;/strong&gt;: AI can analyze and explain complex legacy code segments in minutes rather than hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation generation&lt;/strong&gt;: Creating missing documentation becomes semi-automated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modernization planning&lt;/strong&gt;: AI can help identify modernization pathways and potential risks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code transformation&lt;/strong&gt;: Converting from PHP/jQuery to React/TypeScript with significantly less manual coding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let me walk you through how the PREP method (introduced in Part 2) could be applied to this specific challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PREP Method Applied to Legacy Systems
&lt;/h2&gt;

&lt;p&gt;As a reminder, the PREP method consists of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P&lt;/strong&gt;roblem definition: Clearly articulate what you're solving&lt;br&gt;&lt;br&gt;
&lt;strong&gt;R&lt;/strong&gt;equirements specification: List constraints and expectations&lt;br&gt;&lt;br&gt;
&lt;strong&gt;E&lt;/strong&gt;xample integration: Show how this fits into your larger system&lt;br&gt;&lt;br&gt;
&lt;strong&gt;P&lt;/strong&gt;attern suggestion: Guide the AI toward preferred approaches&lt;/p&gt;

&lt;p&gt;Here's how this framework could be adapted specifically for legacy ERP work:&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem Definition for Legacy ERPs
&lt;/h3&gt;

&lt;p&gt;When working with legacy ERPs, providing precise context is crucial. For example, rather than asking "How do I modernize this code?", you'd get much better results with:&lt;/p&gt;

&lt;p&gt;"I need to modernize this PHP/jQuery ERP application that uses server-rendered pages and AJAX calls for data updates. The inventory management module uses a complex set of database tables with triggers and stored procedures. I need to convert this to a React/TypeScript frontend with a RESTful API backend."&lt;/p&gt;

&lt;p&gt;The specificity helps the AI understand exactly what technologies are involved and what you're trying to accomplish.&lt;/p&gt;
&lt;h3&gt;
  
  
  Requirements Specification for Legacy ERPs
&lt;/h3&gt;

&lt;p&gt;With legacy ERPs, constraints become particularly important. You should typically include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which business processes must remain unchanged&lt;/li&gt;
&lt;li&gt;Performance expectations, especially for data-heavy operations&lt;/li&gt;
&lt;li&gt;Authentication and authorization requirements&lt;/li&gt;
&lt;li&gt;Data migration approach&lt;/li&gt;
&lt;li&gt;Training considerations for users&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Example Integration for Legacy ERPs
&lt;/h3&gt;

&lt;p&gt;For legacy ERP work, providing code snippets from multiple parts of the system helps the AI understand interdependencies. You would typically share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI components and their corresponding backend code&lt;/li&gt;
&lt;li&gt;Database schemas and queries&lt;/li&gt;
&lt;li&gt;Business logic implementations&lt;/li&gt;
&lt;li&gt;Integration points with other modules&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Pattern Suggestion for Legacy ERPs
&lt;/h3&gt;

&lt;p&gt;This is where you guide the AI toward your preferred modernization approach. You would typically specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React component structure and state management approach&lt;/li&gt;
&lt;li&gt;TypeScript typing strategy for business entities&lt;/li&gt;
&lt;li&gt;API design patterns&lt;/li&gt;
&lt;li&gt;Testing methodology&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Hypothetical Example: Modernizing an Inventory Management Module
&lt;/h2&gt;

&lt;p&gt;Let's imagine modernizing an inventory management module from a PHP/jQuery ERP built in 2011. The original code used server-rendered tables with jQuery for interactivity and a mix of raw SQL and stored procedures.&lt;/p&gt;

&lt;p&gt;Here's how you might structure your prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I need to modernize this PHP/jQuery inventory management module to use React, TypeScript, and a RESTful API.

The module handles product inventory with these requirements:
- Must maintain all existing inventory adjustment types (purchase, sale, return, etc.)
- Must support batch operations for efficiency
- Must improve search and filtering capabilities
- Must maintain audit trail for all inventory changes
- Should allow offline capability for inventory counts

Here's the core inventory management code:
[code snippet of the original PHP implementation]

Here's the database schema:
[SQL schema for inventory tables]

It integrates with these other modules:
[code snippets showing integration with sales and purchasing]

I'd like to use React with TypeScript, following these patterns:
- React Query for data fetching and caching
- Zod for runtime type validation
- Context API for state management
- Headless UI components for accessibility
- RESTful API endpoints with consistent error handling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach could yield remarkable results. The AI might:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyze the existing business logic and data flow&lt;/li&gt;
&lt;li&gt;Propose a component hierarchy for the React frontend&lt;/li&gt;
&lt;li&gt;Design TypeScript interfaces for all inventory entities&lt;/li&gt;
&lt;li&gt;Generate API endpoint specifications&lt;/li&gt;
&lt;li&gt;Create example React components for key functionality&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What would typically take weeks of refactoring could be completed in a couple of days. You'd still need to review, test, and refine the generated code, but the productivity gain would be substantial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategies for Different Legacy Challenges
&lt;/h2&gt;

&lt;p&gt;Here are some specialized approaches for common ERP challenges:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Deciphering Complex Business Rules
&lt;/h3&gt;

&lt;p&gt;When facing complicated business logic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask the AI to analyze the code and identify the business rules being implemented&lt;/li&gt;
&lt;li&gt;Request a separation of presentation logic from business logic&lt;/li&gt;
&lt;li&gt;Have the AI generate test cases that would verify these behaviors&lt;/li&gt;
&lt;li&gt;Use this understanding to guide the React component design&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Handling Data-Intensive Operations
&lt;/h3&gt;

&lt;p&gt;For modules with complex data processing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have the AI analyze the existing queries and data flow&lt;/li&gt;
&lt;li&gt;Request optimized API endpoints that minimize data transfer&lt;/li&gt;
&lt;li&gt;Design React components that efficiently render and update large datasets&lt;/li&gt;
&lt;li&gt;Implement proper loading states and error handling&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Migrating from Monolith to Microservices
&lt;/h3&gt;

&lt;p&gt;When breaking up a monolithic ERP:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the AI to identify module boundaries and dependencies&lt;/li&gt;
&lt;li&gt;Design API contracts between services&lt;/li&gt;
&lt;li&gt;Create React components that can consume multiple APIs&lt;/li&gt;
&lt;li&gt;Implement proper state management for cross-module data&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Measuring Success
&lt;/h2&gt;

&lt;p&gt;Modernization projects can easily go off track without clear metrics. Success could be measured through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User experience improvement&lt;/strong&gt;: Has the modernization made the system more intuitive and efficient?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance gains&lt;/strong&gt;: Are operations faster in the new system?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Is the new code more accessible to the current development team?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: How easily can we add new features or integrations?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time saved&lt;/strong&gt;: How much faster was the AI-assisted approach compared to traditional methods?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In our hypothetical project, we might achieve an 80% reduction in modernization time while significantly improving performance and user experience. Business users would likely report that the new inventory system was much more responsive and easier to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Human Element Remains Critical
&lt;/h2&gt;

&lt;p&gt;Despite these advances, the human element remains irreplaceable. AI excels at code transformation but struggles with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding the unwritten business processes behind the code&lt;/li&gt;
&lt;li&gt;Identifying user pain points that should be addressed during modernization&lt;/li&gt;
&lt;li&gt;Balancing technical improvements with user training needs&lt;/li&gt;
&lt;li&gt;Making architectural decisions that align with company growth plans&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most effective approach combines AI's ability to rapidly process and transform code with human judgment about what should be preserved, enhanced, or redesigned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;As AI tools continue to evolve, they'll become increasingly valuable for legacy ERP modernization. Future capabilities might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic generation of data migration scripts&lt;/li&gt;
&lt;li&gt;User interface patterns based on usage analytics&lt;/li&gt;
&lt;li&gt;End-to-end testing against existing system behavior&lt;/li&gt;
&lt;li&gt;Guided refactoring that preserves complex business rules while improving architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For experienced engineers like myself, these tools don't threaten our relevance—they amplify our impact. They allow us to focus on the strategic and creative aspects of software engineering while accelerating the mechanical parts of modernization.&lt;/p&gt;

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

&lt;p&gt;Legacy ERP modernization has traditionally been one of software engineering's most challenging domains. With AI assistance, we're seeing a fundamental shift in how these projects can be approached—making them faster, less risky, and more likely to succeed.&lt;/p&gt;

&lt;p&gt;By applying structured methods like PREP to legacy challenges, engineers can leverage AI to transform outdated systems into modern, maintainable React/TypeScript applications without losing the critical business logic embedded within them.&lt;/p&gt;

&lt;p&gt;In the final article of this series, I'll explore how to design new systems specifically for AI-human collaboration, creating architectures that will remain adaptable as both business needs and AI capabilities evolve.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the third article in my series "Navigating the New AI Landscape in Software Development." If you missed the previous installments about my productivity experiment with AI tools or advanced prompting techniques, you can find them [here].&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's been your experience modernizing legacy applications? Have you tried using AI tools for this purpose? Share your thoughts in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;About the author: I'm a software engineer with 10 years of dedicated engineering experience and nearly 30 years in the IT industry overall. My career has spanned organizations of all sizes—from large corporations like Nortel (a major Cisco competitor in its day) to most recently a startup with just 6 employees. Currently seeking my next opportunity, I'm deeply invested in understanding how AI is reshaping our industry and what it means for experienced engineers like myself.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  AITools #SoftwareDevelopment #LegacyModernization #ReactTypescript #SmallBusinessERP
&lt;/h1&gt;

</description>
      <category>aitools</category>
      <category>softwaredevelopment</category>
      <category>legacymodernization</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI &amp; The Future of Software Engineering: Advanced Prompting Techniques for 10x Efficiency</title>
      <dc:creator>Kevin Craig</dc:creator>
      <pubDate>Fri, 28 Mar 2025 18:00:41 +0000</pubDate>
      <link>https://dev.to/kevinc35/ai-the-future-of-software-engineering-advanced-prompting-techniques-for-10x-efficiency-2g2h</link>
      <guid>https://dev.to/kevinc35/ai-the-future-of-software-engineering-advanced-prompting-techniques-for-10x-efficiency-2g2h</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/kevinc35/ai-the-future-of-software-engineering-my-10x-productivity-experiment-part-1-1i0n"&gt;my previous article&lt;/a&gt;, I shared my experiment demonstrating how AI tools allowed me to build an application with an unfamiliar cloud service in just a week and a half—a task that would have typically taken me 10-15 times longer using traditional development methods. The response was overwhelming: many of you reported similar productivity gains, with some achieving even faster development cycles and improved code quality through strategic AI prompting techniques. Others shared struggles with inconsistent results and the challenge of getting AI to produce production-ready code.&lt;/p&gt;

&lt;p&gt;Today, I'm focusing on the &lt;em&gt;how&lt;/em&gt;—the specific prompting techniques and strategies that can help you consistently achieve these dramatic efficiency gains. As AI becomes integral to our development workflow, prompt engineering is emerging as a critical meta-skill that separates highly productive developers from the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evolution of Developer-AI Collaboration
&lt;/h2&gt;

&lt;p&gt;We've quickly moved beyond basic code completion. Today's AI tools can generate entire components, troubleshoot complex issues, and even suggest architectural approaches. Yet many developers still experience frustration when their prompts yield generic, often incorrect results.&lt;/p&gt;

&lt;p&gt;The difference between mediocre and exceptional AI output almost always comes down to how you frame your requests. Just as clear requirements lead to better human-written code, well-crafted prompts lead to better AI-generated solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Principles of Effective AI Prompting for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Contextual Anchoring &amp;amp; Rules-Based Frameworks
&lt;/h3&gt;

&lt;p&gt;Before requesting any code, provide precise project context. Let's look at a concrete example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Weak prompt:
Write a user authentication system using Firebase.

// Strong prompt:
I'm building a React Native mobile app (Expo SDK 48) with Firebase backend. We need a user authentication system that supports:
- Email/password login
- Google OAuth
- Phone verification

The app uses Redux for state management and follows Material Design guidelines. We handle form validation with Formik and Yup. The authentication state should persist between app launches.

Here's how we've structured our Redux store so far:
{
  user: {
    isAuthenticated: boolean,
    profile: UserProfile | null,
    authError: string | null,
    isLoading: boolean
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is dramatic. The second prompt gives the AI a clear understanding of your tech stack, design patterns, and specific requirements, resulting in code that integrates seamlessly with your existing project.&lt;/p&gt;

&lt;p&gt;Modern IDEs like Cursor are taking this concept even further by implementing rules-based frameworks that let you predefine project context and coding standards. Similarly, platforms like Claude Projects (which is not an IDE, but rather a workspace for organizing conversations and artifacts) allow users to collect and reuse prompt templates and contextual information. Cursor's implementation uses the Model Context Protocol (MCP), which provides a standardized way for AI models to access external context and tools.&lt;/p&gt;

&lt;p&gt;For example, you can create a .cursor/rules file for a React Native project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# React Native Development Standards&lt;/span&gt;

You are an expert in React Native development with the following standards:
&lt;span class="p"&gt;
-&lt;/span&gt; Use functional components with hooks, never class components
&lt;span class="p"&gt;-&lt;/span&gt; Follow atomic design principles for UI components
&lt;span class="p"&gt;-&lt;/span&gt; Use TypeScript for type safety with proper interfaces for all props
&lt;span class="p"&gt;-&lt;/span&gt; Implement responsive layouts using React Native's flexbox
&lt;span class="p"&gt;-&lt;/span&gt; Follow the project's established folder structure:
&lt;span class="p"&gt;  -&lt;/span&gt; /src/components - UI components
&lt;span class="p"&gt;  -&lt;/span&gt; /src/screens - Screen components
&lt;span class="p"&gt;  -&lt;/span&gt; /src/navigation - Navigation configuration
&lt;span class="p"&gt;  -&lt;/span&gt; /src/hooks - Custom hooks
&lt;span class="p"&gt;  -&lt;/span&gt; /src/utils - Helper functions
&lt;span class="p"&gt;  -&lt;/span&gt; /src/services - API clients and services
&lt;span class="p"&gt;  -&lt;/span&gt; /src/store - Redux store setup and slices

Reference our standard imports:
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`import { colors, spacing } from '../theme';`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`import { useAppDispatch, useAppSelector } from '../hooks';`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These rules are automatically applied whenever the AI generates code for matching files, ensuring consistency across your codebase. Resources like &lt;a href="https://cursor.directory/" rel="noopener noreferrer"&gt;cursordirectory.com&lt;/a&gt; offer collections of pre-built rules for various frameworks and languages.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Constraint Definition
&lt;/h3&gt;

&lt;p&gt;Explicitly state your boundaries and requirements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Additional constraints to add to your prompt:
The solution must:
- Be optimized for mobile performance (minimize bundle size)
- Include appropriate error handling for network issues
- Follow security best practices (e.g., token refresh, secure storage)
- Use functional components and hooks (no class components)
- Include TypeScript type definitions
- Follow our project's eslint configuration (we use Airbnb style guide)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The more specific your constraints, the more tailored the output will be to your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Progressive Iteration
&lt;/h3&gt;

&lt;p&gt;Start with architecture before diving into implementation. Here's an effective sequence I use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First prompt: Request a high-level design/architecture&lt;/li&gt;
&lt;li&gt;Second prompt: Ask for implementation of a specific component based on the architecture&lt;/li&gt;
&lt;li&gt;Third prompt: Refine the implementation based on specific requirements&lt;/li&gt;
&lt;li&gt;Fourth prompt: Ask for tests or edge case handling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Breaking complex systems into manageable chunks like this creates a more manageable workflow and produces better results.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Error Resolution Patterns
&lt;/h3&gt;

&lt;p&gt;When AI-generated code doesn't work as expected (and this will happen), these troubleshooting approaches can dramatically improve resolution time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Instead of this:
This code doesn't work. Fix it.

// Try this:
When implementing the Google OAuth flow, I'm getting the following error:
[EXACT ERROR MESSAGE]

Here's the relevant code:
[CODE SNIPPET WITH LINE NUMBERS]

I think the issue might be related to how we're handling the auth credentials. Can you:
1. Explain what's causing this error
2. Provide a fixed implementation
3. Explain why your solution fixes the issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Learning to effectively diagnose issues, escape repetitive error loops, and knowing when to switch tools or approaches is crucial for productive AI collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Techniques I've Tested
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Schema-First Development
&lt;/h3&gt;

&lt;p&gt;This approach has been particularly effective for me. Before asking for implementation, I provide the complete data model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Example schema-first prompt:
Here's our PostgreSQL schema for a blogging platform:

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  email TEXT UNIQUE NOT NULL,
  name TEXT NOT NULL,
  bio TEXT,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE posts (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  published BOOLEAN DEFAULT false,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE comments (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  body TEXT NOT NULL,
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  post_id UUID REFERENCES posts(id) ON DELETE CASCADE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

Using Supabase as our backend and Next.js API routes, implement the following:
1. A complete CRUD API for posts
2. Proper error handling
3. Authentication middleware to ensure users can only modify their own posts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach gives the AI a precise understanding of your data relationships, making the generated code much more accurate.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Test-Driven Prompting
&lt;/h3&gt;

&lt;p&gt;Writing test cases before requesting implementation provides implicit requirements that AI can understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Test-first prompt example:
I need to implement a utility function called `calculateDiscountedPrice` with the following test cases:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;applies percentage discount correctly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;percentage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;applies fixed amount discount correctly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fixed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;never returns less than zero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fixed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;handles tiered discounts correctly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tieredDiscount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tiered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;tiers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;percentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;percentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;percentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tieredDiscount&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tieredDiscount&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;71.25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tieredDiscount&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please implement the &lt;code&gt;calculateDiscountedPrice&lt;/code&gt; function that satisfies all these test cases.&lt;/p&gt;

&lt;p&gt;This approach is particularly effective because it precisely defines the expected behavior through concrete examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Comparative Prompting
&lt;/h3&gt;

&lt;p&gt;Asking for multiple solution approaches to the same problem helps you understand tradeoffs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Comparative prompt example:
I need to implement a caching layer for API responses in our React application. Please provide three different approaches:

1. A solution using React Query
2. A custom hook implementation with localStorage
3. A Redux middleware approach

For each approach, please include:
- Complete implementation code
- Pros and cons
- Performance considerations
- When this approach would be most appropriate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This technique is excellent for learning and making informed architectural decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Multi-Tool Orchestration
&lt;/h3&gt;

&lt;p&gt;I've evolved my workflow over time, and my current approach leverages different tools for their specific strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;: My primary tool for in-IDE completions, project-specific code generation, and day-to-day development. Its context-aware completions and integration with the development environment make it my go-to coding companion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claude&lt;/strong&gt;: I use Claude (Desktop or Web) to create projects that centralize all my conversations and contextual documents before implementation. This becomes my planning and architectural thinking space before I move to Cursor for implementation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: I rarely use this directly anymore, except occasionally through Cursor's interface when specific capabilities are needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This workflow combines the strengths of each tool: Claude's strong reasoning and context management for initial planning, and Cursor's integrated development experience for implementation. The key insight is that different phases of development benefit from different AI interaction patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Framework: The PREP Method
&lt;/h2&gt;

&lt;p&gt;After months of refining my approach, I've developed what I call the PREP method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;roblem definition: Clearly articulate what you're solving
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt;equirements specification: List constraints and expectations
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E&lt;/strong&gt;xample integration: Show how this fits into your larger system
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;attern suggestion: Guide the AI toward preferred approaches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a template I use for complex tasks:&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Definition
&lt;/h2&gt;

&lt;p&gt;I need to implement [specific functionality] for [specific purpose].&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Functional requirements: [list]&lt;/li&gt;
&lt;li&gt;Non-functional requirements: [performance, security, etc.]&lt;/li&gt;
&lt;li&gt;Must use: [required libraries/frameworks]&lt;/li&gt;
&lt;li&gt;Must not use: [prohibited approaches]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  System Context
&lt;/h2&gt;

&lt;p&gt;This component will integrate with our system as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upstream dependencies: [what provides input to this component]&lt;/li&gt;
&lt;li&gt;Downstream consumers: [what consumes output from this component]&lt;/li&gt;
&lt;li&gt;Related systems: [other systems this interacts with]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current Implementation / Examples
&lt;/h2&gt;

&lt;p&gt;Here's how we've implemented similar functionality elsewhere:&lt;br&gt;
[code snippet or description]&lt;/p&gt;
&lt;h2&gt;
  
  
  Preferred Patterns
&lt;/h2&gt;

&lt;p&gt;We prefer to use [specific design patterns] in our codebase.&lt;/p&gt;

&lt;p&gt;This framework has consistently yielded higher-quality code with fewer iterations across various projects and AI tools.&lt;/p&gt;
&lt;h2&gt;
  
  
  Real-World Example: Building a Complex Component with Supabase
&lt;/h2&gt;

&lt;p&gt;Here's a recent example of how I approached building a real-time collaboration feature using Supabase:&lt;/p&gt;
&lt;h2&gt;
  
  
  Problem Definition
&lt;/h2&gt;

&lt;p&gt;I need to implement a real-time collaborative document editing feature using Supabase's Realtime functionality.&lt;/p&gt;
&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Users should see others' cursor positions and selections&lt;/li&gt;
&lt;li&gt;Changes should propagate to all connected users within 500ms&lt;/li&gt;
&lt;li&gt;The solution should handle conflict resolution&lt;/li&gt;
&lt;li&gt;Must work with our existing React/TypeScript frontend&lt;/li&gt;
&lt;li&gt;Must use Supabase Realtime (not WebSockets directly)&lt;/li&gt;
&lt;li&gt;Should maintain a change history for undo/redo functionality&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  System Context
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We use Supabase for authentication and data storage&lt;/li&gt;
&lt;li&gt;Our document editor is built on Slate.js&lt;/li&gt;
&lt;li&gt;Document structure is stored in a PostgreSQL table with jsonb&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Current Implementation
&lt;/h2&gt;

&lt;p&gt;Here's our current document schema:&lt;br&gt;
[schema details]&lt;/p&gt;

&lt;p&gt;Here's how we currently load documents (without real-time):&lt;br&gt;
[code snippet]&lt;/p&gt;
&lt;h2&gt;
  
  
  Preferred Patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We use React Query for data fetching&lt;/li&gt;
&lt;li&gt;We prefer custom hooks for encapsulating functionality&lt;/li&gt;
&lt;li&gt;We use Zustand for local state management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This detailed prompt resulted in a high-quality implementation that required minimal adjustments to integrate with our system.&lt;/p&gt;
&lt;h2&gt;
  
  
  Measuring Success: Quality Metrics
&lt;/h2&gt;

&lt;p&gt;Beyond simply "getting the job done," I track the following metrics to evaluate my AI collaboration effectiveness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Iteration Count&lt;/strong&gt;: How many prompt-response cycles were needed to get to a working solution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-to-Working-Solution&lt;/strong&gt;: Total time from initial prompt to working implementation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Review Feedback&lt;/strong&gt;: Qualitative feedback from teammates on AI-generated code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability Score&lt;/strong&gt;: How well does the generated code conform to our project's style and patterns&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using these metrics, I've been able to refine my prompting techniques and achieve increasingly better results over time.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Skill Development Curve
&lt;/h2&gt;

&lt;p&gt;Effective prompting improves with deliberate practice. Start with smaller, well-defined tasks and gradually increase complexity as you learn what works. I recommend keeping a "prompt journal" documenting particularly effective or ineffective approaches.&lt;/p&gt;

&lt;p&gt;Common pitfalls to avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Being too vague or general&lt;/li&gt;
&lt;li&gt;Providing insufficient context&lt;/li&gt;
&lt;li&gt;Not specifying constraints clearly&lt;/li&gt;
&lt;li&gt;Expecting the AI to infer your specific preferences&lt;/li&gt;
&lt;li&gt;Asking for too much in a single prompt&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  "Vibe Coding" vs. Knowledge-Based Approaches
&lt;/h2&gt;

&lt;p&gt;The term "Vibe Coding" has recently gained popularity in the developer community. Coined by AI researcher Andrej Karpathy in early 2025, it refers to an AI-dependent programming technique where developers describe a problem in plain language and let the AI generate code without fully understanding the implementation details. As defined by Wikipedia, vibe coding "shifts the programmer's role from manual coding to guiding, testing, and refining the AI-generated source code."&lt;/p&gt;

&lt;p&gt;While this approach can be incredibly efficient for prototyping and simple applications, I advocate for what I call "Knowledge-Based Vibe Coding." This hybrid approach embraces AI's speed while maintaining a developer's critical understanding of architecture, security implications, and best practices.&lt;/p&gt;

&lt;p&gt;Simon Willison, a respected developer, cautions that "vibe coding your way to a production codebase is clearly risky" since most software engineering involves evolving existing systems where code quality and understandability are crucial.&lt;/p&gt;

&lt;p&gt;The knowledge-based approach becomes especially important in several scenarios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// When things break
Instead of: "Fix this error: [paste error message]"
Try: "I'm getting this error: [error message]. I think it's related to how we're handling authentication state. The Redux store might not be properly updated after token refresh. Can you explain what might be happening and suggest a solution?"

// When considering security
Instead of: "Add user registration to my app"
Try: "Add user registration with proper password hashing, email verification, and protection against common vulnerabilities like SQL injection and XSS attacks. Follow OWASP security best practices."

// When thinking about scalability
Instead of: "Create a database for my app"
Try: "Design a database schema that will scale to millions of users with efficient indexing strategies. Consider read/write patterns and potential bottlenecks."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach ensures you're leveraging AI's capabilities while maintaining the critical thinking and domain expertise that separates professional developers from those just "vibing" with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Tools: MCP and RAG Integration
&lt;/h2&gt;

&lt;p&gt;Modern AI-enhanced IDEs are implementing sophisticated frameworks for context management and retrieval:&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Context Protocol (MCP)
&lt;/h3&gt;

&lt;p&gt;MCP is an open standard designed to facilitate interaction between large language models and external data sources. It establishes a client-server architecture that allows AI coding assistants to access and use additional context beyond what's provided in the prompt.&lt;/p&gt;

&lt;p&gt;For example, in Cursor IDE, MCP servers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieve API documentation dynamically&lt;/li&gt;
&lt;li&gt;Access your project's custom libraries and frameworks&lt;/li&gt;
&lt;li&gt;Provide real-time linting feedback&lt;/li&gt;
&lt;li&gt;Execute and test code in safe environments&lt;/li&gt;
&lt;li&gt;Connect to databases or other systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setting up MCP is relatively straightforward. In Cursor, you can configure it in settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings &amp;gt; Cursor Settings &amp;gt; MCP Servers &amp;gt; Enable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add specific MCP servers based on your needs. Popular options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub repository access&lt;/li&gt;
&lt;li&gt;Documentation retrieval&lt;/li&gt;
&lt;li&gt;Web scraping capabilities&lt;/li&gt;
&lt;li&gt;Advanced code testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Retrieval Augmented Generation (RAG)
&lt;/h3&gt;

&lt;p&gt;RAG is another powerful technique that enhances AI by retrieving relevant information from external sources before generating responses. In the context of software development, this means the AI can access your codebase, documentation, and external resources to produce more accurate and contextually appropriate code.&lt;/p&gt;

&lt;p&gt;Both MCP and RAG represent the next evolution in AI-assisted development, moving beyond simple prompting to create systems that actively extend the AI's capabilities with external tools and knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward: The Future of Developer-AI Collaboration
&lt;/h2&gt;

&lt;p&gt;As AI capabilities continue to evolve, the relationship between developers and their AI tools will transform. The most valuable skills will increasingly center on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architectural thinking and system design&lt;/li&gt;
&lt;li&gt;Effective communication with both humans and AI&lt;/li&gt;
&lt;li&gt;The ability to orchestrate complex systems rather than writing every line of code&lt;/li&gt;
&lt;li&gt;Judgment about when to use AI and when to code manually&lt;/li&gt;
&lt;li&gt;Creating and managing effective rules and context systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Forward-thinking developers are already building shared knowledge bases of effective prompts, rules, and strategies. Resources like &lt;a href="https://cursor.directory/" rel="noopener noreferrer"&gt;cursordirectory.com&lt;/a&gt; showcase how the community is optimizing AI-developer collaboration across different frameworks and languages.&lt;/p&gt;

&lt;p&gt;In the next article of this series, I'll explore how to leverage AI assistance in rebuilding legacy applications—perhaps one of the most promising applications of these technologies.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the second article in my series "Navigating the New AI Landscape in Software Development." If you missed the first installment about my productivity experiment with AI tools, you can find it [here].&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What prompting techniques have you found effective in your own development work? Share your experiences in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;About the author: I'm a software engineer with 10 years of dedicated engineering experience and nearly 30 years in the IT industry overall. My career has spanned organizations of all sizes—from large corporations like Nortel (a major Cisco competitor in its day) to most recently a startup with just 6 employees. Currently seeking my next opportunity, I'm deeply invested in understanding how AI is reshaping our industry and what it means for experienced engineers like myself.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>cursor</category>
      <category>development</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI &amp; The Future of Software Engineering: My 10x Productivity Experiment (Part 1)</title>
      <dc:creator>Kevin Craig</dc:creator>
      <pubDate>Wed, 19 Mar 2025 18:23:26 +0000</pubDate>
      <link>https://dev.to/kevinc35/ai-the-future-of-software-engineering-my-10x-productivity-experiment-part-1-1i0n</link>
      <guid>https://dev.to/kevinc35/ai-the-future-of-software-engineering-my-10x-productivity-experiment-part-1-1i0n</guid>
      <description>&lt;p&gt;Like many developers, I've been watching the rapid evolution of AI coding tools with a mixture of fascination and concern. When GitHub Copilot launched, it was interesting but limited. Now, with tools like Cursor, Claude, and ChatGPT, we're seeing capabilities that genuinely impact how we work.&lt;/p&gt;

&lt;p&gt;So I decided to run an experiment: build an application using a cloud service I'd never worked with before, relying heavily on AI assistance. The results were sobering, exciting, and thought-provoking all at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experiment Setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Build a fully functional React/TypeScript application using Supabase (a Firebase alternative) as my backend&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Cursor IDE with AI integration, Claude for high-level architecture&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prior knowledge&lt;/strong&gt;: Zero experience with Supabase&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Approach&lt;/strong&gt;: Rely on AI for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initial architecture recommendations&lt;/li&gt;
&lt;li&gt;Database schema design in Supabase&lt;/li&gt;
&lt;li&gt;Authentication integration with Supabase Auth&lt;/li&gt;
&lt;li&gt;Realtime subscriptions setup&lt;/li&gt;
&lt;li&gt;Security rule configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Results: 10-15x Productivity Increase
&lt;/h2&gt;

&lt;p&gt;What would have normally taken me 2-3 weeks of intensive work was completed in just over a week. The AI tools helped me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate a complete React/TypeScript project structure with Vite configuration&lt;/li&gt;
&lt;li&gt;Set up and configure Supabase tables with proper relationships&lt;/li&gt;
&lt;li&gt;Implement row-level security policies in Supabase&lt;/li&gt;
&lt;li&gt;Create React hooks for Supabase realtime subscriptions&lt;/li&gt;
&lt;li&gt;Configure authentication with multiple providers&lt;/li&gt;
&lt;li&gt;Create optimistic UI updates with proper error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The productivity gain wasn't just marginal—it was transformative. A task that would have required hours of reading Supabase documentation and browsing GitHub examples was often solved with a well-crafted prompt.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Technical Challenges: When AI Falls Short
&lt;/h2&gt;

&lt;p&gt;Despite the impressive results, AI isn't a magic solution. I encountered several limitations:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The "hallucination" problem
&lt;/h3&gt;

&lt;p&gt;AI would occasionally generate convincing but incorrect solutions. For example, suggesting a non-existent API method for Supabase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AI suggested this, but the method doesn't exist in the Supabase API&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/supabase-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SUPABASE_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// This method doesn't exist!&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profiles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;createIndex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profiles_username_idx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// The actual correct implementation needed:&lt;/span&gt;
&lt;span class="c1"&gt;// You would need to create indexes using Supabase's SQL editor or migrations:&lt;/span&gt;
&lt;span class="c1"&gt;// CREATE UNIQUE INDEX profiles_username_idx ON profiles(username);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These hallucinations required vigilant verification against Supabase's official documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context limitations and "ruts"
&lt;/h3&gt;

&lt;p&gt;AI tools have finite context windows and sometimes get stuck in repetitive patterns. I learned to recognize when the AI was in a "rut" and developed tactics to break out of these situations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// When stuck in a loop like this with Supabase:
AI: "Try adding the RLS policy with this SQL..."
[Adds incorrect policy]
ME: "I'm getting an error: 'relation \"todos\" has no column \"owner\""
AI: "I apologize for the confusion. Let's try a different approach..."
[Suggests nearly identical policy with same error]

// Breaking out with specific tactics:
ME: "Let's step back completely. Here's the exact schema from Supabase Studio:
Table: todos
Columns: 
- id: uuid (primary key)
- user_id: uuid (foreign key to auth.users)
- title: text
- completed: boolean

Given this exact schema, write a complete RLS policy for this table 
that ensures users can only see and modify their own todos."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This often required switching between different AI tools (Claude vs. GitHub Copilot vs. ChatGPT) to get unstuck.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Understanding depth trade-off
&lt;/h3&gt;

&lt;p&gt;While I completed the project faster, I didn't develop the same depth of understanding I would have through traditional coding. I found myself implementing patterns without fully grasping their underlying principles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AI suggested this Supabase Auth implementation in React&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Session&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/supabase-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabaseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_SUPABASE_URL&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabaseKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_SUPABASE_ANON_KEY&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;supabaseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;supabaseKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AuthContextType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AuthContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AuthContextType&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AuthProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSession&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Get initial session&lt;/span&gt;
    &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSession&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Listen for auth changes&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;subscription&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onAuthStateChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unsubscribe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signInWithPassword&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AuthContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; 
      &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="nx"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="nx"&gt;loading&lt;/span&gt; 
    &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AuthContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useAuth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;useAuth must be used within an AuthProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I could implement and modify this Supabase authentication context, but without the usual research process, I missed nuances about Supabase's auth lifecycle, security edge cases like device management, and how to properly handle multi-tab auth state that I would normally investigate thoroughly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Employment Implications
&lt;/h2&gt;

&lt;p&gt;As someone currently between roles with 10 years of software engineering experience (and nearly 30 years in IT overall), the implications are clear to me: these tools will reduce team sizes. One engineer with effective AI tools can now do the work that previously required multiple developers.&lt;/p&gt;

&lt;p&gt;My career has spanned organizations of all sizes—from Nortel (a Cisco competitor back in its day) to a 6-person startup most recently. Across all contexts, I can see how these productivity gains translate directly to smaller engineering teams.&lt;/p&gt;

&lt;p&gt;But I don't believe AI will replace engineers entirely. Instead, it's shifting the role toward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;System architecture&lt;/strong&gt;: Designing the overall structure of applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI collaboration&lt;/strong&gt;: Effectively guiding AI tools with well-crafted prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification and integration&lt;/strong&gt;: Ensuring AI-generated solutions actually work together&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business context understanding&lt;/strong&gt;: Translating requirements into technical solutions&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Practical Strategies for Working With AI Coding Tools
&lt;/h2&gt;

&lt;p&gt;Through my experiment, I developed several tactics for effective AI collaboration:&lt;/p&gt;

&lt;h3&gt;
  
  
  Effective prompting techniques
&lt;/h3&gt;

&lt;p&gt;The quality of AI output directly correlates with prompt quality. The difference between these prompts is enormous:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Poor prompt:
"Write code to handle Supabase authentication in React"

// Effective prompt:
"I need to implement a React authentication system with Supabase and TypeScript that:
1. Uses Supabase Auth with email/password and social login
2. Has a context provider for global auth state
3. Includes protected routes with redirect to login
4. Properly handles session refresh and persistence
5. Includes typing for Supabase user profiles with this schema:

type Profile = {
  id: string;
  user_id: string;
  display_name: string;
  avatar_url: string;
  subscription_tier: 'free' | 'premium' | 'enterprise';
  created_at: string;
};

Please provide the AuthContext, AuthProvider with Supabase integration, useAuth hook, 
and an example of a protected route component using React Router v6.
Make sure to include proper TypeScript types throughout."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handling AI limitations
&lt;/h3&gt;

&lt;p&gt;I developed a troubleshooting workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the AI generates non-working code, provide the exact error message&lt;/li&gt;
&lt;li&gt;If the AI gets stuck in a loop, reframe the problem from first principles&lt;/li&gt;
&lt;li&gt;If the AI doesn't understand a concept, break it down into smaller components&lt;/li&gt;
&lt;li&gt;When switching contexts, provide a summary of what's been established so far&lt;/li&gt;
&lt;li&gt;For complex architectures, ask the AI to create diagrams before implementation&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Balancing speed vs. depth
&lt;/h3&gt;

&lt;p&gt;To ensure I still developed proper understanding:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After implementing an AI-suggested solution, I'd ask it to explain how the code works&lt;/li&gt;
&lt;li&gt;For critical sections, I'd deliberately rewrite portions without AI assistance&lt;/li&gt;
&lt;li&gt;I'd use AI to generate test cases to verify my understanding&lt;/li&gt;
&lt;li&gt;For new concepts, I'd ask the AI to recommend learning resources&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Looking Forward: The Evolving Developer
&lt;/h2&gt;

&lt;p&gt;The migration from hands-on coding to architectural thinking is already happening. The future belongs to developers who can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Craft clear requirements and architectural vision&lt;/li&gt;
&lt;li&gt;Effectively communicate with both humans and AI&lt;/li&gt;
&lt;li&gt;Verify and integrate AI-generated solutions&lt;/li&gt;
&lt;li&gt;Understand business contexts and user needs&lt;/li&gt;
&lt;li&gt;Continue learning and adapting to rapidly changing technology&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;AI won't replace software engineers—but it will transform what software engineering means. The most successful developers will be those who view AI as a powerful collaborator rather than a threat.&lt;/p&gt;

&lt;p&gt;My own experience confirms this: I accomplished in days what would have taken weeks, but the process required a new set of skills—knowing how to guide AI tools, when to switch between them, and how to recognize their limitations.&lt;/p&gt;

&lt;p&gt;Yes, team sizes will likely shrink, but as with previous technology shifts, new opportunities will emerge for those willing to adapt. As an industry, we're not being replaced—we're being elevated.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes I left the mistakes that the Image Generator made on purpose&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;About the author: I'm a software engineer with 10 years of dedicated engineering experience and nearly 30 years in the IT industry overall. My career has spanned organizations of all sizes—from large corporations like Nortel (a major Cisco competitor in its day) to most recently a startup with just 6 employees. Currently seeking my next opportunity, I'm deeply invested in understanding how AI is reshaping our industry and what it means for experienced engineers like myself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;*This is part 1 of my series "Navigating the New AI Landscape in Software Engineering." Follow me for upcoming articles including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 2: Advanced AI Prompting Techniques for 10x Developer Efficiency&lt;/li&gt;
&lt;li&gt;Part 3: Rebuilding Legacy Applications with AI Assistance: A Case Study&lt;/li&gt;
&lt;li&gt;Part 4: The New Software Architecture: Designing Systems for AI-Human Collaboration*&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Have you experimented with AI coding tools? What productivity gains or challenges have you encountered? Share your experiences in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
