I’ve stopped using copilot because it was being paid for by my workplace. I tried using the “Continue” plugin with ollama and the qwen-coder model produced by meta, but it’s very much inferior to something I learned about long ago in my adventures through Perl: snippets.
First, why is the local AI slop not serving me well?
- it really takes a moment, like 3+ seconds sometimes
- I have to really scrutinize what it gave me, it can be terribly wrong
- it turns my computer into a spaceheater
- wasting power is bad
- it shortens the life of the equipment
Second, why do snippets work so well?
- they’re instantaneous
- I can turn off my brain and type
- it’s wicked efficient
So basically everything wrong about local inference for vibe coding makes everything about snippets just feel right.
I’ve done a bunch of “vibe coding” when I was told to at work, and I hated it. Not only does it take the joy out of software engineering (coding is the only reliably fun part), it does a such a convincing job that it makes reviewing the work for the subtle logic bugs it almost surely planted much more cognitively demanding.
I used to tell people that copilot was peak AI, I had always wanted something like a homonculous that could tell what obvious next line I had to write was, for things like handling errors or balancing markup.
I was wrong to say that. Copilot must have been wasting a tremendoous amount of resources. The local models that really test the limits of these very powerful M-chip Apple laptops don’t even come close. It’s no wonder that copilot was the first to fall to the necessity of token-based pricing because MSFT is actually a profitable company and the CFO position wasn’t a joke on whomever took the role like it must be at OpenAI or Antropic. Instead I imagine that Amy Hood was losing her mind every day that her company was lighting cash on fire to try and dominate a landscape where copilot has become mostly hated by windows users and forgotten by devs.
Even copilot was making weird mistakes occassionally, and having just an unfamiliar grasp on how LLMs work it’s no surprise. Work has even been published offering explanations of why “hallucincation” is inevitable and “reasoning” models are gettting worse at text summary tasks as they insert accidental connections through “chain of thought”.
I was writing Data::dumper::dumper(variable_here); an awful lot when
I was working in Perl.
That’s the nice, recursive data-outputting function that you need
for troubleshooting all the time. I happened to find the vscode youtube
channel or stumbled across a short form video when they were new on YT
or something and I learned about snippets. You can set a ‘prefix’ and
define a tab-completed output that would allow you to insert arbitrary
text within the defined outputs, like this:
// in file 'Code/User/snippets/javascript.json'
{
"For Loop": {
"prefix": ["for", "for-const"],
"body": ["for (const ${2:element} of ${1:array}) {", "\t$0", "}"],
"description": "A for loop."
}
}
I defined my snippet ‘ddd’ for that string Data::dumper::dumper();
and never had to type the duplicative sequence again. It was true freedom
Having tried to use local LLMs for coding and finding it wanting, I now
have enn (acronym for error not nill) for the Go if err != nil {} check,
le (log error) for slog.Error("", "error", err) and re (returne error)
for return fmt.Errorf(":%w", err) with requisite cursor stop points to fill
in the body of the if condition or error descriptions, variables, etc.
This speeds up coding as much as any stupid AI. I’m still trying to find a use for these tools that isn’t ultimately hollow or annoying. If you find something let me know!