I would like to hear the community's opinion on the best code assistant they've tried. Ideally, I'm looking for something that allows experienced backend developers to save time (targeting languages C# and Java) and is good at handling boilerplate and complex requests. So far, I've tried Copilot, but to say that I'm disappointed is an understatement. It's essentially just auto-complete on steroids (when it works), and I don't see any real value. What's your experience?
I use Copilot in VS Code as a typing assistant, but for the most part I find copy and paste into the chat interfaces is the most valuable way to use LLMs for coding.
Even more so with the Claude Artifacts feature, which lets me see an interactive prototype of frontend code instantly - and ChatGPT Code Interpreter, which can run, test, debug and rewrite Python snippets for me.
I found that it was pretty easy to get cursor into a place where it had decimated the file and each tab complete suggestion became more and more broken.
Claude was given the task wholesale and did a reasonable job but introduced a subtle bug by moving a tracking call outside of the Ajax promise and I could not convince it to put it right. It kept apologising and then offering up more incorrect code.
I’d say that the original result was good enough that I could pretty much take it and fix it, but only because I knew all the code and libraries well enough. It was only about 150 lines of simple code and by the time I’d finished I was joking with the team that I could have spent all the time wrestling vim macros instead and come out about the same.
What’s your experience been with correctness?
I've spent so much time with them now that 90% of the time I get back exactly what I needed, because I can predict what prompt will get me the right result.
You can just select a block of code, and tell it to (e.g.) “make this function work as a decorator with graceful exception handling” and it will modify your selected code and provide you with a nice diff to apply in one keypress.
Or you can chat with the LLM directly in VS Code, with every snippet easily applied with a click. It can even catalog your codebase in a vector DB for really easy RAG:
“Create a view that allows premium users to view their billing history”
“Okay, I’ve found a function called get_premium_status in auth/user_profile.py. I’ll use that to create api/user/billing_history.py”
(Which then shows the code it will add or change, separated by file, with the option to apply the change)
Then when I tried plain Claude the delta felt way way too small for me. The eng in me kicked in and I started hacking away on continue.dev + claude3 and the delta was very very little. Plus I could bring in more functionality with extra visibility in my own hacks the way I wanted it (macros) which I couldn't with cursor.
If I need to do something more high level or that requires multiple files I still copy and paste to Claude / ChatGPT.
https://github.com/yetone/avante.nvim
So I built a small tool to streamline this copy-paste process and manage source code context to include in the prompt: https://prompt.16x.engineer/
Would recommend using a tool to save your codebase as an upload-able file.
Parent comment (simonw) has written a tool. I use another called ai-digest. Pick any one. It solves the 'my model doesn't understand my codebase' problem.
Does Cursor support setting different models for different tasks?
[0]: https://aider.chat/HISTORY.html
There are definitely instances where Claude can’t solve a problem and I have to hand write the code and explain it.
It definitely gets confused with designing multiple modules together.
But there are times when it’s simply brilliant. I needed a specific inheritance pattern and Claude introduced the curious recurring template pattern, which had escaped my career. It’s not something I’d use in business code, but in this use case it was perfect.
Claude also helped me build a bi-directional graph to host my game world.
And Claude is phenomenal at unit testing whole projects, allowing me to find design flaws very fast.
My overall experience is that if you know what you’re building, GenAI can be extremely powerful, but if you don’t, I could see both good and bad results coming out.
The lessor experienced developer using it won’t know when it should direct the process in a certain direction and more senior developers will.
As always, the requirements planning and communication is the hardest part of coding.
Maybe 1 out of 10 chats was actually time-saving
Only uses CLI, so you have two contexts you work in. One is you manually writing code just like you are used to. The other is a specific context of files that you inform the LLM you are working on.
By creating a separate context, you get much better results when you keep the tasks small.
Specifically use it with claude 3.5 sonnet
If you’re looking for “type in some English text and get fifty lines of code written”, Cursor’s chat is the best I’ve tried. But I’m not a fan of that workflow, so take my opinion with a grain of salt on that.
We're using CoPilot at work. When we were evaluating this, the question we asked our test group: How much time does it save you per week? And most people arrived at estimations of like 1-4 hours saved a week, especially when banging out new code in a code base with patterns and architecture. This was a good enough tradeoff to buy it.
Like, I recently got a terraform provider going for one of our systems. Copilot was useful to generate the boilerplate code for resources so I just had to fill in the blanks of actual logic. Or you can just hand it sample JSON and it creates go structs for those to use in an API client, and generates the bulk of methods accessing APIs with these. Or it's decent at generating test cases for edge cases.
It doesn't enable me to do things I could not do before, but it saves me a lot of typing.
Well maybe I wouldn't test my functions with all of these edge cases because that's a lot of stuff to do, heh.
Also I can note, that some languages are just naturally fit for Copilot, one of them is Go with its constant `if err != nil` incantations.