AI as Copilot

I initially resisted the whole AI thing. As an undergrad in the mid-nineties I was working on neural networks and genetic algorithms, so I had a basic grasp on what was happening under the covers. I certainly appreciated how far we'd come and couldn't deny the cool-factor, but why would I ever use this seriously? I'm being a little hyperbolic, but the prevailing thought was "I can do this stuff [coding, web design], why do I need this?" The thing that really got to me was the rise of "vibe coding," although at the time, I couldn't exactly say why. Over time, I came to realize that it wasn't that I was annoyed just anyone could churn out code, but it came back to the old computing adage "garbage in, garbage out." Someone who is experienced in a domain is always going to be able to use a domain-specific tool better than the untrained, simply because they know what the output should look like.

Once I'd arrived there, I embraced the technology, getting a Claude Pro subscription and using it to design and code my first app (RoamVet). But key here is the way I settled into working with it. And by the way, I'm sure this is nothing new or revelatory, but I see so many non-computer science people in the various subreddits wondering why their app is such a mess that it bears saying: before a line of code was written, I had lengthy discussions with Claude about the intent, the approach, best practices, the overall shape of the result, the infrastructure. From that we drafted documentation (both human and machine-readable) that could be adhered to throughout the development cycle. Once we got to a point where code was needed, a prompt would be drafted that was handed to Claude Code (CC), using the older Sonnet model, on low effort. Why? Because all the heavy lifting had already been done and specified in the prompt. There was little need on CC's part for creativity or problem-solving. In fact, the prompt often explicitly instructed CC not to do things or to stop if it encountered ambiguity. Throughout, a comprehensive test suite was built, maintained, and used as a gate to help determine results.

The result was a solid, testable, disciplined codebase that was well-documented and had things like security baked into it from the beginning (by the way, I also used a second LLM to conduct blind security audits of the code and infrastructure). And that wasn't solely because the AI did all that. It was because I knew these things (including careful planning) were needed.

And that's the difference between "vibe coding", and LLM-assisted software development, and I am here for the latter - it's been working wonderfully for me.

Leave a Comment

Add your comment

Email is not published. Comments are moderated.