Overview



The following is a blog post where I'll cover my use of AI tools, as well as general thoughts on the technology and its place in a development workflow.

My Experience With AI


I have been fascinated with this emerging technology since the first public release of ChatGPT in 2022. For me, learning programming has coincided with the rise of LLMs. I built a foundation doing things ‘the old-fashioned way’ with Unreal Engine and my first forays into C. While it was beneficial to gain this experience, it can also be incredibly frustrating and difficult, particularly in the context of self-directed learning.

Until recently my use of AI has mostly consisted of generating boilerplate code, suggesting appropriate libraries, explaining unfamiliar concepts, etc. While this is immensely helpful, I had a strong aversion to ‘vibe-coding’ workflows, where the internal structure is AI generated and AI generated code is run unchecked. I enjoy the process of problem solving and finding my own solutions, and so leaning too heavily on AI removes a lot of the interest and enjoyment for me. From a practical perspective, AI generated code was typically not reliable for complex tasks.

In preparing this website I wanted to include a web based version of a metronome app I had made in Python, and a fractal explorer I’d made in Unreal Engine. Since I am not very familiar with JavaScript and needed it done quickly, I tried a vibe-coding type workflow. The metronome came out well with not too much effort. The fractal explorer took a long time, and finally seemed to work almost perfectly, but upon review it required extensive rewriting for performance and readability, which you can read more about below.

Even after an extensive rewrite this method was still much quicker than recreating the entire app manually. The tradeoff is that I now have two JavaScript apps, but I barely know anything about the language, and would not be confident to use it without heavy assistance. For my own personal projects I will continue to use a more manual workflow. However, I am open to exploring agentic or automated processes if required in the workplace.

To summarize, I am grateful for this incredible technology, and feel much of the recent negativity around AI is misplaced. There will never be a world without AI tools again, so it would be counter-productive to resist using them. However, we still need to be aware of their limitations. I have recently been trying out various open-weight models running locally with Ollama. I'd like to build a deeper understanding of how they work internally, and will continue to experiment with AI to keep up with the latest developments.

I Thought I Said 'Make No Mistakes'???


Adapting the code for the metronome app was a fairly easy task for AI. Even with the more advanced features, a metronome app is not overly complicated. Since I had already written a fully functioning Python version, the AI simply had to translate the logic to JavaScript.

The fractal explorer proved more of a challenge. It was made in Unreal Engine as a shader graph/blueprints based project, so could not be given to ChatGPT directly to translate. Instead I gave it an incomplete C version to use as a template, then explained which features to add and revisions to make. I did not even look at the code until it was almost finished. I was pleasantly surprised at how well it was working, but unpleasantly surprised upon closer inspection of the code.

Some of the things I found:

It was a significant task to fix the code. In total I removed ~600 lines, improved performance and readability, and fixed a few underlying issues. It serves as a reminder that AI can often produce code which works, while still being far from an ideal solution. Given my inexperience with JavaScript and WebGL, it was probably still faster than if I had done it the traditional way. However it does suggest to me that the 'vibe-coding' approach can not be trusted beyond a certain level of complexity.

It seems that the future of software development will involve finding the right balance between the productivity of AI generated code, and the need for more focused human input to keep it efficient and reliable.