I could get a little bit of benefit out of an autocomplete that only showed legal suggestions, but even with deterministic autocomplete I frequently had to look at too many suggestions and it was faster to throw a query at Google.
For a practical example, lets say I define protobuf models, I start by writing
```
service X {
rpc doSomething([cursor]
}```
It'll generally be smart enough to complete to the same pattern as every other one in the codebase
I can then put my cursor after and get it to generate the models by just tabbing a bunch:
```
service X {
rpc doSomething(DoSomethingRequest) returns (DoSomethingResponse);
}[cursor]
```
```
service X {
rpc doSomething(DoSomethingRequest) returns (DoSomethingResponse);
}message DoSomethingRequest {}
message DoSomethingResponse {}
```
Then I can go to my actual code file where this is implemented, and having had both the context of the codebase and the context of the protobuf file, it'll generate
```
class DoSomethingImpl extends some.grpc.package.DoSomethingService {
override def doSomething(request: DoSomethingRequest): Future[DoSomethingResponse] {
// Some usually bad code I just delete
}
}```
Nothing here is super complicated, I know it's right at a glance, it's super easy to write, but I hate having to do the boilerplate. Could I write a simple script that kind autogenerates this for a given API? Maybe. But a bunch of typing and piping things around becomes just a bunch of "tab" presses. And an LLM is more flexible to slight changes in the pattern.
This is multiplied times 10 if I then want to consume this from some other language, and it has both in it's context. I literally just need to create the one definition, and the LLM will complete the required code to product / consume the API on both sides as long as it's all in the same context window (and tools are getting good at doing this)
What I really want now is to just have to say "Add a proto api for `doSomething` and add boilerplate to give a response and then consume it. Put it in X existing grpc service" and just have it do all of this without a series of smaller completion.
It's mostly full stack web applications, with React frontend and APIs with databases, so it's not exactly something groundbreaking.
Every time I play with web or GUI development I get the impression that the languages and systems are misaligned with the way people express their intentions in the space. It makes me want to develop a language (or family of languages) directly for expressing GUI concepts, but I don't understand the space well enough to do a good job.
And sometimes if you do abstract it away too much, edge cases handling and everything affecting everything else might not be worth it.
I also think with Copilot in the house, it's completely acceptable to have it write utils fn even if they are not DRY, in the sense that you could import leftPad as a package, but it doesn't matter since you can just write function leftP and copilot will do it for you within few seconds, which is faster and more flexible for the future. And without unnecessary, unknown dependencies with potential vulnerabilities baked in.
I think there's going to also be some sort of enlightening in terms of overusing libraries and idea of everything having to be DRY. Because frequently this will cause more problems than it wins even though you think the code is really, really clean.