← Back to Blog

Development with AI

I first began using AI in my software development back in 2018 with Tab Nine. It was a simple code completion tool and didn't affect my workflow much. Honestly, I dismissed the naysayers who claimed it would replace developers as overreacting. It was just a helper, like autocomplete on steroids. Fast forward to 2026, and the landscape has changed dramatically. With tools like Claude Code, AI can now generate entire codebases and often write cleaner code that I would have written myself.

Over the last year, I've used LLMs to write more and more of my code. Most recently I decided to build an entire app, Fitor4Fit, using Claude Code. I wanted to work on something that had a non-trivial element to it, in this case the weekly payment processing, and I wanted to use a tech stack, Supabase, that I hadn't worked with before. These two factors represented the weaknesses that developers have often mentioned about LLMs, that it's hard to trust them when there's real consequences to bugs, the weekly money transfer, and that if you are using them for an unfamiliar tech stack, in my case Supabase, you won't be able to drive the development effectively. I wanted to see if I could overcome those weaknesses and if so, how.

Unfamiliar Tech Stacks

Having never used Supabase and being a bit rusty on my SQL and relational databases in general, I wasn't sure how well I could guide Claude in building the backend. But, ironically, I think LLMs are ideally suited for this use case: helping a senior engineer work in a tech stack they're not familiar with. If you understand best practices and have a strong understanding of system development, you can steer the LLM in the right direction and use it to fill in the gaps of your knowledge. It's like having an expert pair programmer who can write code in any language or framework, but you still have to know how to design the system and review the code.

In my case, I was able to leverage Claude's knowledge of Supabase and SQL to quickly build out a backend that I would have struggled with on my own. It especially shined in helping me optimize the backend for 1000s of users, something I would usually have deferred to after launch. But, since this project involves real money distribution, I didn't want to launch with a suboptimal backend that couldn't handle the load.

Testing and Validation

The main argument for AI programming is that it is faster than hand writing code. But, if you're reviewing every line of code or writing unit tests for every function, you might as well write the code yourself. It won't be any faster. You will probably also miss bugs if you're just doing a code review, because LLMs can make subtle mistakes that are easy to overlook.

So, how do you get the speed benefits of AI-generated code without sacrificing quality? The answer, at least in my experience, is to focus on end-to-end testing. Usually developers save end to end tests for critical paths. But, since code is cheap now, you can afford to write comprehensive end-to-end tests that cover every feature and edge case. You need to treat your actual code like a black box and then very specifically prompt the AI to write tests for every edge case or stress test you can think of. This way, you can catch the bugs that slip through code review and have confidence in the quality of your code without having to review every line or write tests for every function.

In the case of Fitor4Fit, I wrote end-to-end tests that simulated 10s of 1000s of users going through the weekly challenge processing and payment flows. This gave me confidence that the code could handle the load and that the payments would be processed correctly, which was critical for an app with users spending real money.

The Takeaway

AI is just another abstraction layer, maybe the biggest one we've ever seen in software development. But, it can only do what it's told. If you don't have a clear vision for your product, especially in the details and edge cases, then the AI will try to fill in the gaps and will likely make assumptions that don't align with your vision or get confused when you give it two competing priorities. This is why it hallucinates. If you can clearly define your start and end state, and have a good understanding of the system you're building, you can use AI to quickly generate code and tests that meet your specifications. But, if you're not clear on what you want or don't understand the system, then you'll likely end up with code that doesn't meet your needs and will require a lot of manual review and debugging.