Avatar

My Journey with AI-Assisted Programming

6 min read
I have been using AI to assist with coding since 2021 when GitHub Copilot was released. Since then I've used some sort of AI pair programmer and this blog post contains my thoughts on what I've experienced these last few years.

A bit of background, I've chopped and changed editors a few times; VS Code, Webstorm, Rider, Zed, Neovim (my most fun to use by far). Then along came Cursor, I didn't try Cursor when the initial hype came, I left it for quite a while, monitoring what was going on but I honestly couldn't be bothered trying it. I was using Neovim exclusively at the time and really didn't want to leave, until you've got proficient with Neovim and really given it a good go, you can't really explain what it's like to use but it is a real pleasure. When you start a coding session in Neovim, it's like instant flow state as soon as you start. So given how I felt about Neovim, why did I try Cursor... Hype.

I saw what people were saying about it. I needed to try it myself to see what all the hype was about. I enjoyed it at first and when I gave it a try on Serveasy to help me build some features I wasn't really that interested in, I was hooked. I saw the real power of letting the Cursor agent (Composer at the time) loose, armed with the Sonnet 3.5 model, build out some nice CRUD features. Nothing crazy but it took away a lot of the brunt work that would've just been mundane for me to write.

Given I have ADHD Cursor really played into my tendency for low effort wins and shipping fast. Prompting, waiting a minute or two and getting a feature built that I was procrastinating was addicting. I very quickly found myself living inside Cursor as my full time editor even being prescribed as our main editor at work. There was no denying that you can churn out code and features fast but what about the quality?

This is where I started encountering issues, when you let the Cursor Agent loose with models like Anthropic's Claude 3.5 Sonnet, over engineering became a big issue. If you let it take too much free reign or didn't monitor it closely, it would very quickly go wild and generate a load of slop. I am not really a fan of reviewing code so when you let agents go wild, all you are doing is just reviewing AI code without fully absorbing the context why each line was written and the AI a lot of the time is just adding code that just doesn't really make sense (you should see some of the styles classes it makes when creating a React Native component 🤢). More often than not I found myself being lazy and asking the LLM to do something trivial, then it would seem to just not get it no matter how much I tweaked the prompt and was clear in my intentions. Then 20 minutes has passed and it's still not achieved what I wanted all while generating slop, for me to then throw it all out and write it myself in 5 minutes.

After a good few months of these tools, I started to notice something that was quite clear, I was mentally getting lazy and it felt like my skills were atrophying. Not just in the coding world but when it came to planning and just general problems that may require some thinking. While this is great most of the time, to have an LLM you can bounce ideas off, sometimes it's just pure laziness which I am aware of but struggle to shake. Why would I sit and think about it for 5 minutes when I could just prompt an LLM and get a shallow answer that I don't even really absorb? 😅 This leads into my last real gripe and where it comes back to Neovim...

It became almost impossible (for me) to get into a flow state when using an AI assisted editor. The flow state that I get into when you open Neovim was something I find myself craving but it now seems harder to achieve than ever. Every time I hit some friction where I need to build a screen or just hit a bit of a wall where I have to think through a solution, I want to use Cursor to achieve it because it may be quicker and it may achieve it with minimal technical debt (but it's unlikely) and every time you open the little chat window and start prompting then you have to wait for the response, all flow is completely killed. It takes away the mental load of writing the code, even though thats the fun bit, so I can just sit there drinking my coffee and watching it add, edit and tinker with files which on the surface looks ok. Then I am disconnected from the code, I can read it all I want and I do understand whats going on but I am missing that connection to actually having written it myself and knowing exactly what each line of the code does. Now I've got whole functions and I can see where they are called and why but there's something missing now, theres some magic that is getting left out of being in a flow state and writing your own code.

Going forward I will be actively trying to stop myself being lazy and being more stringent with what I get the LLM to do and what I write. I have no doubt as the models get better, the code and technical debt will improve from what they are like now and the world of programming is changing. These are just some of the pain points I've found with it this far and I will be interested to read this back in a years time and see where things are at. There is no putting this genie back in the bottle though and the AI train is moving, so I will be keeping my finger on the pulse and walking the line between keeping the fun and maximising productivity. Whether thats using Neovim for the bits of programming that require more manual labour and then just getting Cursor to generate the boring boilerplate, I am not sure yet but I am excited to keep exploring to really find what works for me (any suggestions are welcomed). Coding should be a vibe and we should be skeptical handing over the keys to the fun part of our jobs to LLMs.

Thanks for reading this ramble, feel free to connect with me on LinkedIn, follow me on X or just reach out via email if you found it interesting and experienced the same sort of thing

📧 Stay in the loop

Get notified when I publish new posts. No spam, unsubscribe anytime.