I take it you're not using a compiler to generate machine code, then?
Scratch that, I guess you're not using a modern microprocessor to generate microcode from a higher-level instruction set either?
Wait, real programm^Wartists use a magnetised needle and a steady hand.
Programming has always been about finding the next black box that is both powerful and flexible. You might be happy with the level of abstraction you have settled on, but it's just as arbitrary as any other level.
Even the Apollo spacecraft programmers at MIT had a black box: they offloaded the weaving of core rope memory to other people. Programming is not necessarily about manually doing the repetitive stuff. In some sense, I'd argue that's antithetical to programming -- even if it makes you feel artistic!
Plus, all the parts are deterministic in this stack. Their behavior is fixed for a given input, and all the parts are interpretable, readable, verifiable and observable.
LLMs are none of that. They are stochastic probability machines, which are nondeterministic. We can't guarantee their output's correctness, and we can't fix them to guarantee correct output. They are built on tons of (unethically sourced) data, which has no correctness and quality guarantees.
Some people will love LLMs, and/or see programming as a task/burden they have to complete. Some of us love programming for the sake of it, and earn money by doing it that way, too.
So putting LLMs to the same bucket with a deterministic, task specific programming tool is both wrong, and disservice to both.
I'm also strongly against LLMs, not because of the tech, but because of how they are trained and how their shortcomings are hid and they're put forward as the "oh the savior of the woeful masses, and the silver bullet of all thy problems", and it's neither of them.
LLMs are just glorified tech demos which shows what stochastic parrots can pose as accomplishing when you feed the whole world to them.
We can (for programming, at least): run the output thru theorem prover, ensure that proof is constructive, the Curry-Howard correspondence guarantees that you can turn the output into a correct program. It doesn't guarantee that formal properties of the program correspond to the informal problem statement. But even people occasionally make such errors (a provably correct program doesn't do what we wanted it to do).
> and we can't fix them to guarantee correct output
Same thing with other systems capable of programming. That is people.
You just can't make a system that guarantees correct transformation from an informal problem statement into a formally correct implementation. "Informal" implies that there's wiggle room for interpretation.
No, it doesn't mean that current LLMs are ready to replace programmers, it also doesn't mean that ML models of 2030s will not be able to.
Who said that? Everyone I've talked to warns about their shortcomings (including their creators) and even the platform where I use them has a warning plastered right under the input box saying "ChatGPT can make mistakes. Check important info."
This why you should write good tests, review the code, and don’t approve anything you don’t understand.
It’s not a reason to reject pretty good autocomplete, though.
The dismissive glibness of your comment makes me wonder if it's worth it trying to point out the obvious error in the analogy you're making. Compilers translate, LLMs generate. They are two completely different things.
When you write a program in a high-level language and pass it to a compiler, the compiler translates your program to machine code, yes. But when you prompt an LLM to generate code, what are you translating? You can pretend that you are "translating natural language to code" but LLMs are not translators, they're generators, and what you're really doing is providing a prefix for the generated string. You can generate strings form an LLM with an empty prefix; but try asking a compiler to compile an empty program.
>> Even the Apollo spacecraft programmers at MIT had a black box: they offloaded the weaving of core rope memory to other people.
You're referring to core rope memory:
https://en.wikipedia.org/wiki/Core_rope_memory
There is no "black box" here. Programmers created the program and handed it over to others to code it up. That's like hiring someone to type your code for you at a keyboard, following your instructions to do so. You have to stretch things very far to see this as anything like compilation.
Also, really, compilers are not black boxes. Just because most people treat them as a scary unknowable thing doesn't mean that's what they are. LLms are "black boxes" because no matter how much we peer at their weights, arrays of numerical values, there's nothing we can ... er ... glean from them. They're incomprehensible to humans. Not so the code of a compiler. Even raw binary is comprehensible, with some experience.
Is that "compiling" or "translating"? Lots of people use language to C "compilers".
I don't think this is true for LLMs. Their output is not deterministic (up for discussion). Their weights and the sources thereof are mostly unknown to us. We cannot really be confident that an LLM will produce correct output based on correct input.
It's not that LLMs aren't deterministic, because neither are many compilers.
It's also not that LLMs produce incorrect output, because compilers do that to, sometimes.
But when a compiler produces the wrong output, it's because either (1) there's a logic error in my code, or (2) there's a logic error in the compiler†, and I can drill down and figure out what's going on (or enlist someone to help me) to fix the problem.
Let's say I tell an LLM to write a algorithm, and it produces broken code. Why didn't my prompt work? How do I fix it? Can anyone ever actually know? And what did I learn from the experience?
---
† Or I guess there could be a hardware bug. Whatever. I'm going to blame the compiler because it needs to produce bytes that work on my silicon regardless of whether the silicon makes sense.
When I’m calling ‘getFirstChar’ from a library, me and the author have a good understanding of what the function does based on a shared context of common solutions in the domain we’re working in.
When you ask ChatGPT to write a function that does the same, your social contract is between you and untold billions of documents that you hope the algorithm weights correctly according to your prompt (we should probably avoid programming by hope).
You could probably get around this by training on your codebase as the corpus, but until we answer all the questions about what that entails it remains, well, questionable.
Recently got email about gcc 14.2, they fixed some bugs in it. Can we trust it now, these could be the last bugs. But before that it was probably a bad idea to trust. No, even compiler's output requires extensive testing. Usually it's done at once, just final result of coding and compilation.
> Their output is not deterministic
yes.
> Their weights and the sources thereof are mostly unknown to us
Some of them are known. Does it make you feel better. There are too many weights, so you are not able to track its 'thinking' anyway. There are some tools which sort of show something. Still doesn't help much.
> We cannot really be confident that an LLM will produce correct output based on correct input
No, we can't. But it's so useful when it works. I'm using it regularly for small utilities and fun pictures. Even though it can give outright wrong answers for relatively simple math questions. With explanations and full confidence.
There are 2 things at play here, one is LLM with human in the loop, in which it's just a tool for programmers to do the same thing they have been doing, and the other is LLM as black box automaton. For the former, it's not a problem that the tool is undeterministic, we are double checking the results and add our manual labour anyway. The fact that a tool can fail sometimes is an unsurprising fact of engineering.
I think the criticism in this chain of comment applies more to the latter, but even it always has values to non-tech people, just like how no-code approaches are, however shitty it looks to us software enfineers.
So other path forward could very well be LLMs as they can save lot of time with writing boilerplate code
https://ai.meta.com/research/publications/meta-large-languag...
The biggest difference to me is that we have humans that claim they can explain why compilers work the way they do. But I might as well trust someone who says the same about LLMs, because honestly I have no way to verify if they speak the truth. So I am already offloading a lot of burden of proof about the systems I work on to others. And why does this ”other” need to be a human.
1. Anything that is in the world when you’re born is normal and ordinary and is just a natural part of the way the world works.
2. Anything that's invented between when you’re fifteen and thirty-five is new and exciting and revolutionary and you can probably get a career in it.
3. Anything invented after you're thirty-five is against the natural order of things.”
― Douglas Adams, The Salmon of Doubt: Hitchhiking the Galaxy One Last Time
To give an analogy, a carpenter might be happy with hand tools, happy with machine tools, happy with plywood, and happy with MDF. For routine jobs they may be happy to buy pre-fabbed cabinets.
But for them to employ an apprentice (AI in this example) and outsource work to them - suddenly they are no longer really acting as a carpenter, but a kind of project manager.
edit: I agree that LLMs in their current state don't really fundamentally change the game - the point I am trying to make is that it's completely understandable that everyone has their own "stop" point. Otherwise, we'd all live in IKEA mansions.
They help me with the keyboard work, not any of the actual programming.
Whether you think LLMs are spectacularly worthwhile or odious and destructive, it's crucial not to classify them as being a person instead of a software tool.
disclaimer: I know next to nothing about llms. and I'm not that interested to learn about them. just asking casually.
>> Scratch that, I guess you're not using a modern microprocessor to generate microcode from a higher-level instruction set either?
Hell, I design gate level logic -> map it to instructions -> use them in C for the very LLMs and can fully understand[0] every aspect of it (if it doesn't behave as expected, that is a bug) but I cannot fathom or predict how the LLMs behave when i use them even though I know their architecture and implementation.
[0] Admittedly I treat the tools I use during the process, like cad tools, compiler, as black boxes, however I know that if I want to or the need arises, I can debug/understand them.
In practice, compilers frequently have bugs and programmers even more frequently make use of "what the compiler actually does" rather than adhering to the language specification -- to the point where the de facto spec for many languages is "what the canonical implementation does".
And the specifications change over time.
I imagine that machine learning powered coding will evolve to an even blacker box, than it is today: It will transform requirements to CPU instructions (or GPU instructions, netlists, ...). Why bother to follow those indirections, that are just convenience layers for those weak carbon units (urgh)?
Simultaneously, automation will likely lead to fewer skilled programmers in the future, because there will be fewer incentives to become one.
Together those effects could lead to a situation where we are condemned to just watch.
> I take it you're not using a compiler to generate machine code, then?
An LLM is much, much closer to a "black box" than a compiler ...
In fact, an LLM is pretty much a black box even to the people who created it.
Actually the opacity of the abstraction layer is the core of the issue. First we note that opacity is a measure in both the inner-workings of the 'box' and orthogonally (in context of LLMs) a measure of deterministic outcome.
Programming, it is asserted by some of us, is exactly the act of instructing a deterministic 'black' box.
Peer-coding with an LLM is the act of cajoling a mechanism to hopefully consistently produce the input to a sensible "blackbox". It is not programming, it is getting help. Now if the help was 100% reliable, we could discuss programming the helper.
The other day I had a vision of the future AI whisperer in the corporate setting. They wear capes of varied colors and possibly sport a wand. "It's an art you see".
I think OP has a point, and is about guiding the design, then overall structure and dynamic of the code. Nobody expects to write in Assembler or not using libraries, but making a concious decision on the design.
I have met few programmers, but many coders. For them coding is a job, and generally they don’t care about overall architecture, algorithm efficiency, and code elegance is limited to syntax-coloring-themes in their editor. I respect their existence, but generally they are building on top off somobody else’s effort.
LLMs provide statistically probable answers with no guarantee of correctness. It takes more time to review LLM code than it takes to write it correctly from scratch.
Beckett: What?
HN commenter: Well it's just like when you decided to work in French instead of English. Your art was no less because of it. Now you can use an LLM instead of French. It will be so much quicker.
Maybe you can't examine what the LLM is doing, but as things get more advanced we can generate code to do things, and also have it generate executable formal proofs that the code works as advertised.
However, I don't understand your claim that an LLM acting as a programming assistant "...can’t be reasoned about or meaningfully examined/debugged."
I type something, and Copilot or whatever generates code which I can then examine directly, and choose to accept or reject. That seems much easier to reason about than what's happening inside a compiler, for example.
Compilers are complex programs fraught with bugs. Modern microprocessors are hideously complex devices fraught with bugs. But at least we understand them in principle and practice.
LLMs are nonsense generators, you need a second device that can recognize correct programs to use them effectively. Only humans can do that all-important second part.
> Programming has always been about finding the next black box that is both powerful and flexible.
That's the opposite of programming. Programming is the art and science of developing reliable algorithms. You can treat programs as black boxes only after you're sure that they work correctly. Otherwise you're just engaged in a kind of cargo cult.
That the scary thing about the LLM fad: so many people seem so willing to abdicate their responsibility to actually think.
Using a bought brush to paint and generating a painting via a prompt are basically identical.
/s
There are a handful of cases where LLMs are useful, mainly because Google is horrifically bad at bringing up useful search results, it can help in that regard... or when you can't find the right words to describe a problem.
What I would like to see out of an AI tool, is something that gobbles up the documentation to another programming tool or language, and spits it back out when it is relevant, or some context aware question and answers like "where in the code base does XYZ originate" or w/e. the difference is having a tool that assists me VS having a tool spit out a bunch of garbage code. Its the difference between using a tool, and being used by a tool
I have similar feelings to you, but I want to be careful about making assumptions. That being said, I see so many people making hyperbolic claims about the productivity gains of llms and a huge amount (though not all) of the time, they are doing low value work that betrays their inexperience and/or lack of ability.
I have yet to see a good example of where an llm invented a novel solution to an important problem in programming. Until that happens -- and I'm not saying it won't -- I remain extremely skeptical about the grandiose claims. This is particularly true of the companies selling llm products who make vague claims about productivity benefits. Who is more productive, the person who solves the most leet code problems in a month or the person who implements a new compiler in the same time frame? The former will almost surely have the most lines of code, but they have done nothing of direct value. I point this out because of how often productivity is measured in lines of code and/or time to complete a problem with a known solution.
So for me, when people brag about how much more productive they are with llms, I wonder, ok, well what are you building? I feel like llms are as likely going to make people build fragile bridges to nowhere at scale as anything truly revolutionary.
Some examples:
Deciphering spaghetti code: LLMs generally are pretty good at picking apart code blocks and generally explaining the functional parts. A while ago I was dealing with code that had lots of methods on single lines with tons of conditions. I put in in chatGPT, asked it to go over it and it gave me a point by point explanation of all the logic in there. Again, I don't expect it to be perfect here, it doesn't need to be. The way my mind works once I have the explanation I can much easier go to the single line mess and follow it along. If chatGPT messed up I will see that, but I will also be much further along already with deciphering as I would have been doing it manually.
Getting a quick start on technology, specifically if it is something I know I will only need to know once it helps me avoid tedious google searches. Instead I get a pretty decent rundown of whatever it is I need to know as well as some basics.
In short, I don't they are miraculous technologies transforming my work. But, they are pretty good at removing some of the more tedious tasks letting me focus on other things. So they do make me more productive in that aspect.
If you are a one man shop, where you have to work with: Javascript, Typescript, Haxe, PHP, bash, WordPress, BuddyPress, npm, Selenium, Playwright, Jest, Kha, Three.js, HTML, CSS, Bootstrap, Tailwind, Nextjs, SQL, ... . And that is all next to marketing, devops, managing freelancers, ... . Well, then an LLM is a super fast and super cheap junior of everything that can quickly create something you need in seconds.
Edit: Let me make it more concrete with an example of the previous days. I registered a new domain and wanted to already have a quick landing page on there that sends people to a certain url. It would already use Nextjs & tailwind so that I can test out the setup on the server.
So I wanted to generate this quick landing page. I have a few options:
1. Do it myself, which will take some time digging into the css to style things.
2. Hire a freelancer, which is more expensive, and would take up more time.
3. Let ChatGPT generate the initial version in 3 seconds, I can suggest some changes and get a full reply in 3 second.
Same for a lot of other things that I do. Will ChatGPT help me out in a big, complex application that I'm writing? Probably not. But it sure has its uses for a lot of small things.
This will likely not happen and is a horrible benchmark for productivity. The advantage of using LLMs as a partner for coding is that I myself will have more time to generate “novel solutions” since a lot of the low level stuff that I still need to write can be done in less than half the time.
I never trust it to write code I can’t write for myself and things I can’t make tests or verify.
It’s not about generating more lines of code but having more time to think of the more mentally demanding stuff. It’s like having a junior developer that can work really fast but I will still need to check what it does.
As a very personal benchmark, at work I know how much time it takes me to build repeating things from scratch that can’t be automated. By my estimate, having the LLM saves me around an hour or two of coding a day. That doesn’t replace my time but those 20-40 hours a month of time saved is worth the 20 bucks on average I pay for it.
Tldr; it won’t make anything novel but it gives me more time to make things that are
I don't like BASH scripting. I wanted to automate a certain task and dump it in a justfile for convenient reference.
Learning BASH scripting would be a poor use of my time - I didn't value the knowledge I would gain.
Using Google to piece together everything I needed would have been very painful. Painful enough that I simply didn't bother in the past.
Asking an LLM solved the problem for me. It took about 6 iterations, because I had somewhat underspecified and the scripts it returned, while correct, had side effects I didn't like.
But even though it took several iterations it was infinitely more satisfying than the other options. Every time it failed I would explain to it what went wrong and it would amend the script.
It's like having an employee do the work for me, but much much cheaper.
That's the power of LLMs. They enable me to do things that just weren't worth the time in the past.
Would I use it for my main programming work? No. But does it increase my productivity? Definitely.
But they way you talk about makes me feel weird. It honestly sounds a little insane.
I'm a former/old-school professional programmer (now a retired CIO) and I still love automating my life with an assortment of tech (e.g. python, bash, c#, c++, jscript, etc). My knowledge of these tools isn't indepth... so being able to use AI to assist with generating the base code is a godsend.
My experience using chatgpt has been quite positive overall... sometimes it comes up with elegant solutions, sometimes its dog shit - but generally it's a useful starting point.
"HELP! ChatGPT destroyed my system" most commonly people want a command that will move pictures or something and the LLM spits out something feasible, they turn it into a shortcut on their mac and click it, and it is literally just 'find -type f -exec mv {} ..' with relative paths and it moves all of their critical files into random places. It is quite literally something I've seen happen at least 5 times.
There is a lot of benefit in just learning a little bit and then having the flexibility to write anything you want.
I'm starting to think that the people that moan the most about LLMs being terrible, might just be terrible at writing good queries.
Like everything else: garbage in, garbage out.
EDIT: I was not aiming this comment directly at you. But I've had a couple of devs try to convince me that tools like ChatGPT or Claude is garbage, and then use extremely short queries as proof.
"Write me a website with [list of specs]", and then when it either fails or spits out half-baked results, they go "See? It's garbage!"
On the other hand I've seen non-coders create usable tools, by breaking up the problem and inputting good queries for each of those sub-tasks.
solid points there.
it is surely some of both reasons. for the bad programmers, it will be the former. for those invested in llms, it will be the latter, that is financial incentives - to the tune of billions or millions or close to millions, depending upon whether you are an investor in or founder of a top llm company, or are working in such a company, or in a non-top company. it's the next gold rush, obviously, after crypto and many others before. picks and shovels, anyone?
and, more so for those for whom there are financial incentives, they will strenuously deny your statements, with all kinds of hand waving, expressions of outrage, ridicule, diversionary statements, etc.
that's the way the world goes. not with a bang but a whimper. ;)
sorry, t.s. eliot.
I'm not always trying to create a timeless, perfect, jewel and there is a limit to how much I want to follow every highway and byway needed to do stuff across several dozen languages, libraries, platforms and frameworks.
Some days I'm just tired.
If the LLM cannot even solve such a simple question, something a young child can do, and confidently gives you incorrect answers, then I’m not sure how someone could possibly trust it for complex tasks like programming.
I’ve used them both for programming and have had mixed results. The code is always mediocre at BEST but downright wrong and buggy at worst. You must review and understand everything it writes. Sometimes it’s worth iteratively getting it to generate stuff and you fix it or tell it what to fix, but often I’m far quicker just doing it myself.
That’s not to say that it isn’t useful. It’s great as a tool to augment learning from documentation. It’s great at making pros and cons lists. It’s great as a rubber duck. It can be helpful to set you on a path by giving some code snippets or examples. But the code it generates should NEVER be used verbatim without review and editing, at best it’s a throwaway proof of concept.
I find them useful, but the thoughts that people use them as an alternative to knowing how to program or thinking about the problem themselves, that scares me.
The 'confidently answering with a wrong solution' aspect is of course still a valuable insight, and yes, you need to double-check any answer you've received from an LLM. But if you've never tried GitHub Copliot, I can recommend doing so. I'd be surprised if it doesn't manage to surprise you. For me it was actually really useful to get those parts of code out of the way that are essentially just an 'exercise in typing', once you've written a comment explaining the idea. (It's also very useful to have a shortcut to quickly turn off its completions, because otherwise you end up spending more time reading through its suggestions than actual coding, in situations where you know it won't come up with the right answer.)
copilot annoyed the shit out of me and I barely get any useful code from LLMs. I think the most help I get from LLMs is asking things like "what is this operator mean '~uint64'" or other non-common language constructs. I primarily will just pull up open-source code that is of verifiably high quality and learn from that.
This is no different than starting with boilerplate code, e.g. from a tutorial or manual or other project (or, heaven forbid, an Internet search), and changing it for your specific needs.
As for imprecision, a developer is perfectly capable of writing imprecise, ambiguous, or just plain buggy code by themselves. If you think your code is better than that produced by an LLM (and I'm not saying it isn't), then by all means use it. But the fact is that an LLM, in some cases, can produce code better and/or faster than it would take some people to write themselves who don't want to spend several minutes or hours stumbling through finding the exact syntax or algorithm, let alone Googling for a good starting point.
As for the non-determinism that many people are decrying, this is no different from Googling and finding several examples, each of which is written for a particular use case, none of which ever seem to match yours exactly. Caveat emptor if you simply cut and paste without reading, just as with code produced by an LLM.
however, referring to the first paragraph of the comment above, the problem is that many people are not in their right minds :)
For example, I frequently have to implement Serde's traits for some serialization format or to marshal types, most recently to translate types from Rust to Qt QML's Javascript. By giving it some context (Serde traits and QT docs) I managed to do it with Claude in about an hour, which is roughly how long it would have taken me just to get up to date with the documentation if I had tried it myself.
Not helped by the choice of using a monospaced font. I get that it is often an aesthetic choice, but given that a blog post is written with the idea to be read, one I don't think is a particularly good one. Although the last time I made a remark about that on HN it became clear to me that a lot of people don't see the issue. Even if there are decades worth (at this point) of research that makes it clear that a sans serif font (or even a serif font on modern displays) works better for readability. ¯\_(ツ)_/¯
In this case though, the combination of the monospaced font, everything being in lowercase and the run-on sentences I really am scratching my head here.
Are you trying to get a message out there? Or are you mostly going for aesthetics?
That annoying trend is infecting HN too. There’s at least a half-dozen comments like that on this thread alone.
Ironically, while looking into it, I found that one of their projects seems to use generative AI to make it work.
It might be because of what you said, though the same way I asked an LLM to insert proper uppercasing I can also ask it to remove it. So it would be more for the "vibes" more than anything.
---
As LLMs get better and better at writing code, more and more people, at least on twt, have started to incorporate LLMs into their workflow. Most people seem to agree that LLMs have been a game changer for coding. They praise them for how much they have improved their productivity. They also mention how much easier it is to write code. Some claim that programmers who refuse to use them are "not using them correctly" and will eventually get left behind.
In my opinion, the effectiveness of LLMs in coding at their current state is vastly overblown. Even if LLMs were as good as what avid users of them claim, I still won't see myself using it in any meaningful capacity.
## The art of programming
Programming can be broken down into two parts. The first is solving problems algorithmically, breaking problems into steps that computers can follow within some constraints, thus forming a solution to the original problem. The second is expressing the solution in a way that the computer can understand.
Both parts provide the programmers with an infinite canvas on which they can express their creativity. There are practically limitless ways to approach and solve a problem, and a practically infinite way to express a solution to the problem. Hence, programming is a form of self-expression - it is an art form. What is produced through programming is a kind of art - an art few appreciate.
## I am a programming artist
In that sense, I see myself as an artist, one that expresses his creative self through programming. I enjoy creating programming art, because only through it do I find my true self, one who has a burning passion to create and build things.
## LLM is not for me
Using LLM to write code is like asking an artist to paint for you. If you only want the end result, by all means! If you are like me who enjoy the process of painting, then why would you bother automating the fun part away? One may say, "But I am only using LLM to write code. I am still doing the problem solving myself!". To me, programming isn't complete if I don't get to express the solution in code myself. It isn't my art if I don't create it myself.
## A sad reality
It is sad to me just how much people are trying to automate away programming and delegating it to a black box that can't even count letters in a word sometimes. They are even going as far as trying to emulate a software engineer on top of the black box. Does no one not find programming fun anymore? Does no one care enough about programming to go further beyond getting things working "well enough"? Is this just another case of availability bias?
Please don't take this as a judgmental piece to anyone that I am alluding to. It's fine to not find programming enjoyable. It's fine to just want things to work. I am just disappointed at how the ones who care appear to be an ever dying breed.
I use an LLM to generate ideas, to rubber duck, to get a lead on unknowns, and to generate boilerplate occasionally. So I do everything except replace the coding part because that's what requires the most precision, and LLMs are bad at precision. And yet, people claim massive productivity gains in specifically coding. What am I missing?
Suppose you suddenly are required to write a VBA macro for Excel for your job. It's a one off task - not something you'll do repeatedly. Do you prefer learning VBA for Excel and crafting a solution or asking the LLM and verifying its solution by looking at the docs?
Hint: If you use the macro recorder in Excel and inspect the code you are closer to the LLM end of the spectrum.
For work stuff? I couldn’t care less if the code comes from me, my colleagues or an LLM. As long as it works and it’s secure, we’ll ship it.
Folks, career != job.
We are at the cusp of creative destruction and we are only getting started. Ironically, blue collar jobs seem safe as there hasn't been a humanoid revolution and what I see in the white collar field is what blue collar workers experienced before the automation and offshoring of jobs
Adequate but not enjoyable. Lorem ipsum of visual art. Probably kills some basic graphic design jobs at the margin working on low budget projects.
Meanwhile big brands using big agencies will just incorporate it into their design process. McD Japan is a recent example. You still need a human with an eye and taste to be the editor.
But no one is reading or viewing AI art for pleasure. It’s all “that’s neat” (continues scrolling).
Besides, being good at programming makes it easier to deal with BS jobs that pay well, so it’s not that I suffer 40h/week.
I would never judge anyone who finds your non-capitalized, grammatical-error ridden essays seductive.
Maybe the author should have had the LLM write the article while they wrote software instead. Play each to their strengths.
Do we have grammar/spelling checkers for markdown editors or whatever most are using to write their blogs?
But not code
The consumer never sees the code. To him, it makes no difference if there is pure elegance underneath the app or just garbled spaghetti
The user can likely tell AI-generated images and articles. But he’d have zero clue if the website used AI generated code
Programming started sucks before when companies started to orient on fast income and preferred pure quality templated projects over well-made efficient ones.
This world changes. Many people have nothing to do and with AI amount of them will grow. It scare.
You can, in theory, still program elegant little side projects with no pretense of business value or any customer besides, maybe, yourself.
I find that my work-coding and hobby-coding are different enough that they don't even feel like the same activity
* They are great for overcoming procrastination. As soon as I don't feel like doing something or a task feels tedious I can just delegate it to an LLM. If it doesn't solve it outright it at least makes me overcome the initial feeling of dread for the task.
* They give me better solutions than I initially had in mind. LLMs have no problem adding laborious safeguards against edge-cases that I either didn't think of or that I assessed wouldn't be worth it if I did it manually. E.g. something that is unlikely and would normally go to the backlog instead. I've found that my post-LLM code is much more robust from the get go.
* They let me try out different approaches easily. They have no problem rewriting the whole solution using another paradigm, again and again. They are tireless.
* They let me focus on the creative parts that I enjoy. This surprised me since I've always thought of myself as someone who loves programming but it turns out that it is only a small subset of programming I love. The rest I'm happy to delegate away.
I am the same, and why many of my personal projects end up stranded. Once I've solved the tricky bit, the rest often isn't that motivating as it's usually variations on a common theme.
I held off LLMs for a long time, but recently been playing with them. They can certainly confidently generate junk, but in most cases it's good enough. And like you say can be used as a driver to keep going. In that regard they can be useful.
It's like having a junior dev that doesn't complain and gets the work done immediately.
AI code suggestions as I type are however a different beast. It's easy to introduce subtle bugs when the suggestion "kinda looks right" but in fact the LLM had zero understanding of the context because it can't read my mind.
I sort of understand some of the vitriol that I see on HN but it is incredibly overblown. I don't really get a lot of the criticisms. LLMs aren't deterministic? Neither are humans. LLMs write bugs they can't fix? So do humans. LLMs are only good at being junior programmer copy paste machines? So are lots of humans.
My current project is training an LLM to do superoptimization and it's working exceedingly well so far. If you asked anyone on hacker news if that's a good idea, they'd probably say no.
People that refuse to program with AI or intellisense or any other assistance are like carpenters who refuse to build furniture with power saws and power drills. Which is perfectly fine, but IMO that choice doesn't really affect the artistry of the final product
Fun analogy because if you're especially negligent you can injure yourself so badly you'll make programming forever more difficult than it needs to be or end your career altogether - like with a tablesaw cutting off fingers.
But I don't know man, I love coding with LLMs. It just opens up more things, I think on some projects I actually spend MORE time on traditional coding than I did in the past, because I used an LLM to write scripts to automate some tedious data processing required for the project. And there's also projects where the LLM gets me from 0 to 60 and then I rather quickly write the code I actually care about writing, and may or may not end up replacing all the LLM written code.
I'm sure it heavily depends on exactly what types of project interest you. The fact that LLMs and diffusion have both become fixations of mine also means I have a lot more data processing involved in lots of my projects, and LLMs are quite good at custom data processing scripts.
I suppose my suggestion to the author would be that perhaps their projects aren't amenable to LLMs in the way they want and that's fine, but don't lose hope that there are kindred spirits out there just because so many people love LLM coding; some of us are both and that may be more about what types of projects we do.
I that's a big gulf people don't appreciate. I don't enjoy programming. When I program a microcontroller for my hobby projects it's a means to an end. I would love a tool that takes in a natural language description of what I want and outputs code and LLMs are good at doing that for basic tasks.
With ai I need to review the output but not because there may be some issues I didn't noticed, but because that may be issues the tool itself didn't noticed, so it's less of an "apply this specific change" but more of an "apply some change"
Like what great ideological purpose are you serving if you delegate writing tailwind boilerplate to a LLM, or a basic axios get request?
Does your code become impure if instead of copying code from the documentation you get an LLM to do it?
But this has led me to wonder if there will be gradual pressure to build on top of LLMs, which, in turn, will really only be useful with the tried and true. Like, we’re going to be heading towards an era where innovation means “we can ask the LLM about it”. Given the high capital costs required to train, I wouldn’t be shocked to see LLMs ignoring new unique approaches and biasing to whatever the big corps want you to do. For “accuracy”.
I just sense were about to hit an era of software causing massive problems and costs, because LLMs are rapidly accelerating the pace of accidental complexity, and nobody knows really how to make money off them yet.
I don't see it as a "judgemental piece to anyone that i am alluring to" (I think you mean alluding) but I do think it's an honest assesment of those who are attempting to rely heavily on AI.
> please don’t take this as a judgemental piece to anyone that i am alluring to. it’s fine to not find programming enjoyable. it’s fine to just want things to work. i am just disappointed at how the ones who care appear to be an ever dying breed.
I'm not saying the author shouldn't write that, write whatever you want. But you should own what you write.
Answering that is easy: I won't be able to stay employed as a programmer if the other programmers use AI to become more productive, and I do not.
Programming is just a mean to an end, please stop this cringe romantic rhetoric. If you really love programming you don’t care about the medium, the fact that a program is represented as text is just a transient phase in the history due to the current tech we have available in this specific moment in time. Programming (today) is expressed as text, LLMs auto complete boring text, so that us “the artists” can write more of it faster, end of story.
I wrote a blog post about it yesterday:
https://henrikwarne.com/2024/08/25/programming-with-chatgpt/
But to the point of the post, yeah, I agree. The people using LLMs are just using it to compensate for a horrible toolkit. It doesn't help them think or break down problems that nobody has seen before. If it makes them quicker it's because they were using caveman-level tools before. I haven't typed every character in the code I produce for at least a decade at this point. Most of my time and effort is in thinking. But for braindead code monkeys, sure, anything will make you quicker.
We've already did the speedrun from people styling themselves "prompt engineers" to people openly mocking people styling themselves "prompt engineers".
And now it seems we're going to be "6 months to a year away from replacing programmers" for as long as it generates more funding.
Unlike art where you can tell if the end product is AI generated even, software is not. The end users do not care if you used AI to generate your react front-end or back-end, your employers dont care who wrote the code as long as its bug free and works like in the scope document.
Ironically, I don't see software developers writing manifestos or complaining that AI generated software isn't software or that they are stealing from them.
Likewise, software that was produced artistically may or may not be better, or more valuable, or distinguishable in any way from other software products, but if the author feels like it's art it may be art. That may be because there's no tangible reason for it to exist other than a creative endeavor, in which case maybe it's not actually software.
These high level abstractions are where I find the most joy from programming. Perhaps for some there is still some modicum of enjoyment from writing a for loop but for most people twenty years into a career there's nothing but the feeling of grinding out the minutia.
There's still a lot of room for better abstractions when it comes to interfacing with computing devices. I'd love to write my own operating system, CLI interface, terminal, and scripting language, etc from scratch and to my own personal preferences. I don't imagine I could ever have the time to handcraft such a vast undertaking. I do imagine that within a few decades I will be able to guide a computing assistant through the entire process and with great joy!
LLMs can do mindless drudgery just as well as I can, but in seconds instead of hours. There's nothing about remembering syntax, boilerplate code, forgetting a semicolon, googling the most common way of doing something, or combining some documentation to fill in the gaps that's even remotely "art" to me.
I never ask an LLM for what I'm artfully creating. I ask it for what I know it'll get instantly right, so I can move on to my next thought.
Like, ideally, it shouldn't really take that much code to implement a thing. I like to think of programming as writing a bunch of levers, starting with simple levers for simple jobs, incrementally ratcheting up to larger levers lifting the smaller levels. Before too long, it'll feel as though you've written a lever capable of lifting the world...or at least one that makes an otherwise wickedly difficult project reasonably manageable.
If you say that LLMs make you more productive because it allowed you to finish a project that would otherwise take forever to write, then I'm skeptical that an LLM is the best solution. I mean, it's a solution at least, but I can't help but wonder if there's a better solution.
If the problem is that you lack the understanding to take on such a project, then perhaps what we really need are better tools for understanding. I myself have found that LLMs are great for gaining a quick understanding of languages that otherwise have sparse information for beginners, but I have to wonder if perhaps there's a better way.
If, on the other hand, the problem is that writing that much code would take forever, then I have to wonder if the real solution is that we need a better way to turn programming languages into patterns (levers) and turn said patterns into larger patterns (larger levers)
A partial solution works, but only partially well, and occasionally has consequences one has to reckon with
We had an overdemand for devs during late ZIRP early COVID leading to bootcamps and self taught pulling a lot of untrained into the industry. Many of them have left the industry.
Add to that the whole data science bubble and it’s bursting where we had tons of degrees and job openings for sort-of-devs. Lot of those jobs are gone now too.
Don’t forget the pull of “product management” and its demise outside big tech.
Now we have hiring freezes and juniors leaning on LLMs instead of actually spending an hour trying to solve problems.
Interesting times.
In an ideal world, our abstractions would be so perfect that there would be no mundane boiler-platey parts of a program; you'd use the abstractions to construct software from a high level and leave details be. But our abstractions are very far from perfect: there's all kinds of boring code you just have to write because, well, your program has to work. And generally that code is, if you look, most of your code. This because making good abstractions is really hard and constructing fresh ones is often more work than just typing out the different cases. If you think this is mistaken, I'd gently suggest you take a fresh look at your own code.
Anyway, that's where LLMs come in. They help write the boring code. They're pretty good at it in some cases, and very bad at it in others. When they're good at it, it's because what the code should do is sort of overspecified; it's clear from context what, say, this function has to do to be correct, and the LLM is able to see and understand that context, and thus generate the right code to implement it. This code is boring because it is in some vague sense unnecessary; if it couldn't be otherwise, why do you have to write it at all? Well you do, and the LLM has taken care of it for you.
You can call this work the LLM is displacing "art", but I wouldn't. It's more the detritus of art performed in a specific way, the manual process required to physically make the art given the tools available.
You could object that the LLMs will get better in the sense that not only that they will make fewer mistakes, but they will be able to take on increased scope, pushing closer to what I'd consider the "real" decisions of a program. If this happens -- and I hope it does -- then we should reevaluate our lofty opinions of ourselves as artists, or at least artists whose artistry is genuinely valuable.
Author needs to get into Bret Victor. Has no idea how much more fun he could be having.
Programming is a step on the way to access to the state space of information. When we get to that stage, programming will seem like a maze of syntax, that has its own idiosyncrasies that force you into corners or regions in the state space, just like any DAW plugin or 3D tool, or any tool at all that exists.
I feel like you have to drop this kind of thinking to get anywhere past intermediate, not to mention you become a nightmare to anyone who has even a touch of pragmatism about them.
Sad to say, LLMs have made me lazy coder for the past two years or so. But I do deliver/finish work much faster, so my incentives to keep using LLMs as coding co-pilots are overshadowing my incentives to write code the "old way".
And for what it is worth, sometimes these posts read like modern luddite confessions - the rants just sound too personal.
As we approach this point, programming (program creation) will become a largely non-technical skill but the few who have that skill will be needed to solve the problems which LLMs create and which its operators don't have the know-how to fix.
I use LLMs as an alternative to asking a question on stackoverflow. And I'm not confident LLMs can currently save time on large projects: take a couple of hours to write the code or spend a few seconds to generate the code and then a couple of hours understanding and debugging it.
I use LLMs cause it takes care of the syntax and leaves me more time to think about the logic and how everything is connected together. LLMs still lack in the latter category.
For one-off tasks, it's truly a time saver. In the future, I see people trying to do more complex stuff with chains of LLM calls (already happening but it's still a WIP). Break a complex task into sub-tasks, then solve them sequentially to achieve something non-trivial in the end. I'm a bit skeptical though - not so much because of my skepticism of LLMs in general but more about humans not being good at maintaining code bases they didn't write (often even with code that wrote). You cannot trust LLMs to also maintain the codebase. There's too much context about the life of the code, all the dependencies, and even business logic, that is missing.
I wrote a whole Slack clone (not feature complete of course) in just 1 day. I love to code, and I do have to at times but this feels like the end of what was the joy of my youth and adulthood, my favorite pastime is gone. I will still develop applications and enjoy my creativity but with probably 1/50th the effort it took before.
For me it feels like it enables me to express myself even better. I use 1 for basically a super charged intellisense or clever auto complete. Finishing lines as I am typing them. Exactly the way I was going to write them.
It saves time on the more boiler plate glue code and allows me to maintain a better flow and momentum on more expressive areas.
I don't see it taking away anything but only enabling me to do more, faster, and better. I'm not telling it to write full apps because it can't.
It seems to me that there is a middle ground between writing programs myself and downloading code from a package manager. LLMs fill up some space within that gap.
I think refusing to use an LLM because of "reasons" is the same as refusing to use packaged libraries for "reasons". That is, reasons for both definitely exist but I consider that kind of stubborn intransigence to be a sign of mental disorder.
I recommend simply adjusting the criteria you use to decide when and when not to use packaged libraries to help determine when and when not to use LLMs.
I like to code in the middle of the night, solving very complex problems and building cool applications.
Programming was mostly a hobby in the days of 8-bit PCs. It was a profession for some decades. Maybe it will be a hobby again in 5 years. Like gardening, sailing, fishing - professions at one time, now hobbies.
On the other hand, the arrival of futuristic capabilities like computers speaking human languages is what drew me to technology in the first place. Luckily, you can choose to look forward and backward. You don't have to pick only one.
Of course I understand that the "sweet spots" of logic, design, and platform architecture shifts over time. I can work at a higher level of abstraction now than I did when I started out writing PHP in 1999. I'm also willing to believe low-code/no-code solutions or turnkey solutions will get better over time. There's a reason I don't try to find restaurant clients to build a glorified menu website for anymore.
But the hoopla around LLMs has only served to reinforce the disconnect between the people who express artistry in code and the people who see programming as nothing more than a "feature-implementation-pipeline" that's ripe for rote automation. I'd expect as much from folks in marketing, or CEOs, but to see so many CTOs make public claims they must privately know is simply bullshit…well, that's shaken my faith in this industry, I'll tell you that much.
I'm feeling optimistic though. The tides are turning against generative AI and when the hype cycle is finally over, we'll have a handful of narrowly-purposeful, ethically-engineered models which provide some specific yet useful productivity gains…and beyond that, it'll just be the slow-but-steady progress of the discipline of hand-writing code.
That said, in my experience, trying to get ChatGPT to spit out sensible code is sometimes like arguing with a conspiracy theorist. I ask a question, receive an answer, ask a follow-up question and scrutinise one of the details, and the interviewee just falls apart and grasps for other straws.
My formal education was in music composition and film scoring specifically. I never once, even then considered myself "an artist" or thought that I was pursuing art. I did consider myself a craftsman: I was learning a style of music composition where I was expected to realize someone else's vision for their purposes. One could argue that the filmmaker was an artist and the film a work of art, but as the composer my job was to produce a work product that conformed to a specification as directed by someone else. I cared about creativity, quality, and having my product fit for purpose. I do not see the craftsman as inferior to the artist, but the goals are different and in a medium such as film you must have both artists and craftsmen (and sure sometimes a single person is both, but that's not a requirement).
When I am a programmer I see myself in exactly the same way. Professionally, I'm paid to satisfy someone else's need for automation/data wrangling. The solution I deliver is a work of craftsmanship, not of art. I will be creative in exercising my craft: often I'm just given a statement of the problem that needs solving and the solution design and development are left to me. I may find unique capabilities or processes which are better than those anyone envisioned... but at the end of the day I am creating an expression of my craft, not trying to achieve a deeper artistic goal. Trying to achieve an artistic goal with programming, at least in most professional programming, would likely lead to some sort of malpractice: the craft of the product diminished in time, cost, or features to gain an unasked for message.
Another issue I take with this article is that it confuses the tools with the result. Today, artists that paint use a large variety of brushes, spatulas, and other tools and paints which have all the benefits of being formulated with the knowledge of modern chemistry for stability, texture, and durability over time. Would the artist of old be justified in suggesting that using the new tools make you not an artist since you don't have to control for the limitations of the past? As a composer, I used sample players, sequencers, notation programs, and DAWs, even when writing for a conventional orchestra. True Beethoven didn't have these tools, but does this mean a modern composer that might use the same tools as me don't produce art... even if the final result is played by a traditional orchestra? I find LLMs to be in this category. When producing art (or craft as I discussed), the final product is ultimately what is to be judged... unless you find programming as being more about performance art where the journey is more the product that the final result.
Anyway, as a programmer I absolutely use LLMs. Sometimes they help, sometimes not. Even at my most creative, I don't find developing a good regex or a shell script something I care to be creative in approaching. How I apply the LLM, my judgement of the quality of what it produces, or whether I think the kind of "lowest common denominator" approach an LLM will produce is appropriate or not in a given situation still puts me and my creativity plainly at the center of producing a craft-full, and perhaps artful, product.
BTW what's the aider vs cursor opinion?