What’s your take on this?
Do you specifically mean AI agents, or just AI tools in general like Copilot, Claude, etc.?
Something like Claude code etc
I boycott AI also (and smartphones, and cars, and airplanes and tech giants and …).
At the same time i’m old and unemployed. ![]()
I don’t use integrated AI tools in my IDE, but have found Claude to be very helpful for specific tasks or pieces of code. Of course you need to be able to check the output.
I use them like if they were that friend that knows everything in theory but is good at nothing. Most of the time they represent a waste of time, but they can also help you see things that you had under your nose all the time and weren’t aware of.
There’s a few use cases I’ve found them particularly useful for:
-
Debugging and error checking.
In the past I’d waste errors googling generic error codes and messages trying to piece together some clues as to why my build has failed. Now I just throw the logs at Claude and tell it to find the problem and 90% of the time it does, and in under a minute or so. -
Building proofs-of-concepts.
I recently had an idea for a new audio effect, I prompted Claude to build a Python script to process a wav file with a description of the effect and was able to verify that it did indeed sound absolutely awful without having to waste a whole afternoon implementing it myself. -
Working in unfamiliar languages/frameworks/etc.
I often know what result I’m looking for, I just don’t know what the idomatic way of doing it in the particular tech stack I’m using. Being able to prompt an AI to do it for me and reviewing the results afterwards is not only a much quicker way to build, but also a good way to learn. -
Refactoring.
Sometimes you implement something in a particular way only to realise it’s not quite right for some reason or another. Being able to simply ask an AI to rewrite it using a new approach can save hours of manual refactoring.
For example I was recently working on some visualisers using HTML<canvas>but found it quickly got very slow and was using a lot of CPU. I prompted Claude to rewrite it using SVG instead and suddenly it was silky smooth and most importantly, looked identical to the canvas approach.
I don’t vibe-code the whole thing, as I find it won’t provide creative ideas. However, for some specific tasks, I find it quite useful. I just directly chat with LLM on the website. Some successful cases:
- write a over-sampling class (quite a while ago, still needs quite some human review)
- write a test-test-and-set spin lock class (easy one)
- change InnoScript installer to MSI installer (still needs some trials, but save me from reading MSI syntax. LLM definitely saves me LOTS OF time on this)
- solve a problem where I cannot activate Google Highway AVX2 with -march=x86-64-v3 (solution: adding -maes). I just throw assembly code to LLM.
I use them as automated typers (not asking it to actual write/create any logic). This is a feature that I have wanted from an IDE for so many years. “You know, I should be able to give the IDE an example of some boilerplate code, and have it write it out for this set of variables”
Example; I recently built a stand alone app which is an editor/sample manager for a eurorack sampler which had 70+ parameters. I declared all of the components in the parent class definition, wrote the code to initialize one of each type of control (text editor, slider, combobox, etc), and told it to use my examples and write out the init for the remaining components.
Example; same with above project for the component positioning in resized (). I simply tasked it with writing all the setbounds calls for each component; positioning them in 5 columns. From there I could easily go in and customize the layout appropriately.
Example; In another project; I am using JUCE to prototype code for a eurorack module. To move quickly in getting something up and running, I simply made all the parameters public in the Processor class, and accessed those directly from the Editor class. We all know how horrible that is! So once we had things going, I tasked it with writing out all that boilerplate code to convert that to properly using APVTS.
Not, stupid. Just potentially missing out.
Forget all this vibe-coding business and this notion of one-shotting stuff. That’s for the birds.
Use AI with solid, proven software engineer PRD, Phased Planning and TDD. Use for reviewing code and finding mistakes/bugs. Use it for generating documentation. Use it for simplifying code and improving comments. Use it for writing detailed GIT commit messages and PR notes.
It’s absolutely mustard at converting/optimising to SIMD.
If you want to know how some complex code works - ask it to explain it in simple terms.
Use it as a productivity boost but bear in mind it’s an amplifier.
The old adage sticks: garbage in, garbage out.
I’m using them a lot, and the possibilities are endless. These are the kinds of things that can be possible in an order of magnitude less time.
In less than a week i created GitHub - kunitoki/tsujikiri: 辻斬り Cut through C++ bindings · GitHub which allows me to create automatic bindings for any scripting language i need in our projects (mostly pybind and luabridge3), all that with good tests, 100% coverage and CI and docs too. Would have taken me a couple months or so. While doing that i needed updates to libclang so i just took the abandoned project, modernise it and rolled out releases in pypi for the new clang releases GitHub - kunitoki/libclang-ng: (Unofficial) Release libclang (clang.cindex) on pypi. · GitHub , same week.
This one took me months of LLMs iterations, and i finally got the breakthrough some days ago. It’s clean room reverse engineered Propellerhead’s ReCycle REX2 format and their proprietary DWOP audio encoding format GitHub - kunitoki/VelociLoops: A C library for reading and writing REX2 audio loop files · GitHub . This would have taken years without the agents being able to debug crafted programs using sdks and get the feedback loop on stack frame and register analysis. This was more of a research project to build expertise, i can now say confidently that i can reverse engineer any compiled binary algorithm out there with some months and a few hundred bucks of tokens (of it hasn’t been really obfuscated to avoid any analysis). LLMs helped with the discovery process, but also analysing results, testing, fuzzing, ci…
This is old and mostly drone coded (vibed with a bit of control feedback) but it has been a nice ride so far. GitHub - ByteSmelt/etch: Define once, Etch forever. · GitHub it’s a programming language that runs interpreted for rapid iteration but also compiles to C, and it features a prover that can check for programming errors and unsafe usages (unchecked bounds access, null derefs, over and underflows) by running the program symbolically, and it has result and option types, ffi, coroutines, lambdas, references, module support. It runs in the league of lua and it’s already faster than python in all the benchmarka i’m throwing at it. This would have taken many many months and was done pretty quick instead.
So to end up this long showcase, just to tell you that it can help in all the things that you are bored to do, the boilerplate around the important parts, but also research and investigate ideas, or get out that tool in time to progress your main project.
The quality between the tools diverge a lot.
So the tool really impacts the quality of the result you get vs the model (eg. Claude Code is better than merely using their best model). Also, local models I believe will become a thing, but I believe that is a leap of 1-2 years for coding (you need RAM / big context).
To me it still feels like a roulette. where sometimes you’ll get the desired results while other times you end up with big pile of mess.
The trivial and pretty ‘safe’ usage:
- find bugs
- explain code
- code review
Those two are reasonable, because they can be most easily reviewed/proofed.
While those two are the safest scope. it is much more productive to also use generated code by models with supervision.
- fix bugs, generate pieces of code in a scope you can review.
For example, some UI or common patterns (eg. make a circular buffer single producer, multi-consumer using XYZ). if you can review it, and you hate to write it, it might be a candidate.
Making a button providing SVGs as an example, can be faster and very easy to review.
Adding basic serialization/deserialization for plug-in state is also small task where it might do it faster than you and can be easily reviewed and even be testable.
The major thing to remember, as you end up getting more code and faster than before. you still need to review it well. If you’re lazy, you can first let it do some iterations of review and fixes for itself. but you should keep the scope of work reasonable not only for the sake of those models context but also so you’ll be able to review it well enough and not just blindly push it.
Some tips I’ve got and been using which made it much more efficient:
- Plan: many tools suggests planning first. it actually makes more sense as it allows you to plan what’s being coded (even for small scope).
- If you get noise, clear the context and re-phrase.
- Letting it self review itself is always useful.
- Tests - it’s very useful to make it also write tests (you also need to review the tests of course
) - Formatting - make sure you lock it to format code (eg run git-clang-format or something) to avoid adding undesired noise.
So yeah, if you consider it as a propionate productivity tool it makes sense.
But as something you can drop blindly… that can easily backfire.
Thank you for your extremely helpful insight.
I suppose I need to dive into the topic.
I’m just thinking about how to integrate it with my current environment. I have a very large legacy code base from 25 years ago with lots of query references.
I think writing single methods and functions is an absolute no-brainer, but reshaping the codebase makes me afraid of creating new incompatibilities or bugs in existing products which run very well.
Sometimes I think it would be better to start from scratch and leave my old codebase behind, because the writing isn’t the bottleneck anymore. Then I could do whatever I want, in the way I would if I started from scratch nowadays.
How did you handle the transition?
I’m personally in the more (granted) extreme end of “no AI whatsover that I have the chance to opt out of”.
I appreciate not everyone is in the same place, but apart from personal ethical reasons, on the practical side when it comes to plugin development I’m still in my early stages and this is the time where I NEED the friction of not knowing things, looking them up, having to refactor, having to write the easy and boring boilerplate, etc., because that’s generally how a human brain learns and gets better. I’m still a long way from where removing friction will have long term, sustained benefits.
If I were still developing Python/Go code to automate data centre networks, something I started doing over 13 years ago, there’s a non-zero chance I might be more open to trying some AI tools. But right now, the fact that it can do things much faster and potentially better is precisely why I don’t want to even consider it. I don’t particularly enjoy having to refactor or write the same boilerplate over and over, but on the other hand I am aware that I still can’t do any of that automatically which means I still need to put in the hours till it becomes fully clear and a bit more “muscle memory”.
LLMs can help you understand how to refactor large codebases, but you will have to still apply more than ever engineering discipline when using them to do so, and slice the problem right and plan perfectly. You will still introduce bugs, but you will introduce bugs regardless, human refactor is error prone too, but if you are skilled and attentive to details, and carefully review each and every plan, each and every line of changed code, adding tests in the process, it will help you considerably (especially reviewing what you are doing, one pass change, one pass review on a clean context or different model).
I suggest you start with small things and ramp it up to more challenging tasks over time as you gain experience working with them. Every model has its own good and bad! and also how you interact with them will matter, i have been using them together with colleagues to solve the same complex task, while i was able to solve the problem with codex (gpt5.3) and fail with claude (opus4.5), my colleague was able to succeed with claude (opus4.5) and fail with codex (gpt5.3): prompting difference ? different way to talk and instruct can change the result.
Definitely dig into the topic. It’s a game changer in good hands. You have to change your role though and focus on code review + learn when to take the wheel and when AI will be useful to fill in the gaps. As others said it works well in certain scenarios. Let me add it normally does an excellent job to read/write data from a database or write cmakelists. And other important observation is that there are wild differences between models (results and cost!) but this may be a good topic for another thread!
This is a huge point. I was thinking the other day how lucky I am to have had the chance to learn how to code over all of those years and even get paid for it… It must be so hard now for a young dev to find a justification to do all of this hard work… (and it is absolutely necessary to be able to review AI code later!). I expect a huge pandemic of vibe coders in the years to come and a lot of painful work to fix AI messes. What terrifies me the most is that I’m not sure if I will be able to refuse it…
I dare you not to google anything ![]()
That is a good advice. Never ask llms to do something you don’t know and instead it would be better to learn first. Use them for the tedious things that you know how to do but that takes precious time from you focusing on most important detail. And keep an eye on cognitive debt.
Give this blog post a spin, lots of good advices:
Lots of great advice on this thread and in that article.
This is not related to the content, but is useful to save on tokens, so I thought I’d mention it:
