C –> Java != Java –> LLM

(observationalhazard.com)

31 points | by WoodenChair 5 days ago

6 comments

  • cadamsdotcom 5 days ago
    The spec rarely has enough detail to deterministically create a product, so current vibecoding is a lottery.

    So we generate one or many changesets (in series or in parallel) then iterate on one. We force the “chosen one” to be the one true codification of the spec + the other stuff we didn’t write down anywhere. Call it luck driven development.

    But there’s another way.

    If we keep starting fresh from the spec, but keep adding detail after detail, regenerating from scratch each time.. and the LLM has enough room in context to handle a detailed spec AND produce output, and the result is reasonably close to deterministic because the LLM makes “reasonable choices” for everything underspecified.. that’s a paradigm shift.

    • emodendroket 1 hour ago
      Well, it’s really a return to the old-fashioned role of an analyst coming up with a data dictionary and a detailed spec. But in practice how often did that work as intended?
    • seanmcdirmid 2 hours ago
      > The spec rarely has enough detail to deterministically create a product, so current vibecoding is a lottery.

      How is that different from how it worked without LLMs? The only difference is that we can now get a failing product faster and iterate.

      > If we keep starting fresh from the spec, but keep adding detail after detail, regenerating from scratch each time..

      This sounds like the worst way to use AI. LLMs can work existing code, whether it was generated by an LLM or written by human. It can even work on code that has been edited by a human, there is no good reason to not be iterative when using an LLM to develop code, and plenty of good reasons to be iterative.

      • cowl 22 minutes ago
        >How is that different from how it worked without LLMs? The only difference is that we can now get a failing product faster and iterate.

        The difference is that there is an engineer in the middle who can judge if the important information is provided or not as input.

        1. for a LLM "the button must be blue" has the same level of importance as "the formula to calculate X is..."

        2. failing faster and iterating is good thing if the parameters of failing are clear which is not always the case with vibecoding, especially when done by people with no prior experience in developing. plenty of POCs build with vibecoding have been presented with no aparent failure in their happy path but with disastrous results in edge cases or with disastrous Security etc.

        3. where previously, familairity with the codebase and especially the "history of changes" gave you context about why some workarounds were put into place, these are things that are lost to a LLM. Vibecoding a change to an existing system risks removing those "special workarounds" that keep in mind much more than the current context of the specifications or prompt.

        • seanmcdirmid 16 minutes ago
          > 1. for a LLM "the button must be blue" has the same level of importance as "the formula to calculate X is..."

          You can divide those into two prompts though, there is no point for the LLM to work on both features at the same time. This is why iterative is so useful (oh, the button should be blue, ... and later, the formula should be X).

          > 2. failing faster and iterating is good thing if the parameters of failing are clear which is not always the case with vibecoding, especially when done by people with no prior experience in developing. plenty of POCs build with vibecoding have been presented with no aparent failure in their happy path but with disastrous results in edge cases or with disastrous Security etc.

          This isn't about vibecoding. If you are vibecoding, then you aren't developing software, you are just wishing for good code from vague descriptions that you don't plan to iterate on.

          > 3. where previously, familairity with the codebase and especially the "history of changes" gave you context about why some workarounds were put into place, these are things that are lost to a LLM. Vibecoding a change to an existing system risks removing those "special workarounds" that keep in mind much more than the current context of the specifications or prompt.

          LLMs can read and write change logs just as well as humans can (LLMs need change logs to do updates, you can't just give it a changed dependency and expect the LLM to pick up on the change, it isn't a code generator). And again, this is serious software engineering, not vibecoding. If you are vibecoding, I have no advice to give you.

      • dwringer 1 hour ago
        For me it just depends. If the response to my prompt shows the model misunderstood something, then I go back and retry the previous prompt again. Otherwise the "wrong ideas" that it comes up with persist in the context and seem to sabotage all future results. The most of this sort of coding I've done was in Google's AI studio, and I often do have a context that spans dozens of messages, but I always rewind if something goes off-track. Basically any time I'm about to make a difficult request, I clone the entire context/app to a new one so I can roll back [cleanly] whenever necessary.
        • seanmcdirmid 53 minutes ago
          If you fix something it sticks, the AI won't keep making the same mistake, it won't change the code that already exists if you ask it not to. It actually ONLY works well when you are doing iterative changes and not used as a pure code generator, actually, AI's one-shot performance is kind of crap. A mistake happens, you point it out to the LLM and ask it to update the code and the instructions used to create the code in tandem. Or you just ask it to fix the code once. You add tests, partially generated by the AI and curated by a human, the AI runs the tests and fixes the code if they fail (or fixes the tests).
          • dwringer 45 minutes ago
            All I can really say is that doesn't match my experience. If I fix something that it implemented due to a "misunderstanding" then it usually tends to break it again a few messages later. But I would be the first to say the use of these models is extremely subjective.
            • seanmcdirmid 19 minutes ago
              I think we have very different experiences then. I find multiple prompts with narrow focuses each executed to update the same file work much better than trying to one shot the file. I think you would have a better experience if you used /clear (assuming you are using Gemini CLI), the problem isn't the change in the file, the problem is probably the conversation history instead.
      • dizlexic 1 hour ago
        >How is that different from how it worked without LLMs?

        I won't lie and say "That's a great idea" when it isn't.

    • hu3 16 minutes ago
      This is interesting.

      It's like the nix philosophy.

      When changes are needed, improve the spec and you can nuke the entire thing and start over.

      something like immutable code development.

      One major problem is: how do you not break existing data on the database when code changes?

      Maybe include current database structure in the spec.

    • DelightOne 44 minutes ago
      In what environment do you run such tests? Do you have a script for it, or do you have a UI that manages the process?
    • tjr 5 days ago
      At that level of detail, how far removed are we from “programming”?
      • Vegenoid 2 hours ago
        Without understanding the level of detail required, which we do not yet know, we cannot say.

        When I think of English specifications that (generally) aim to be very precise, I think of laws. Laws do not read like plain, common language, because plain common language is bad at being specific. Interpreting and creating laws requires an education on par with that required of an engineer, often greater.

        • Muromec 2 hours ago
          Laws being unreadable is largely an Enlish-language problem zo. I have no problem reading them in my native language. Not requiring massive context size of case law makes things easier still. Big part of being a lawyer is having the same context with all the other lawyers and knowing what was already decided and what possible new interpretation is likely to be accepted by everyone else.
          • Vegenoid 1 hour ago
            > Big part of being a lawyer is having the same context with all the other lawyers and knowing what was already decided and what possible new interpretation is likely to be accepted by everyone else.

            And to create software specifications with language, the same thing will need to happen. You’ll need shared terminology and context that the LLM will correctly and consistently interpret, and that other engineers will understand. This means that very specific meanings become attached to certain words and phrases. Without this, you aren’t making precise specifications. To create and interpret these specifications will require learning the language of the specs. It may well still be easier than code - but then it would also be less precise.

            • Muromec 22 minutes ago
              >And to create software specifications with language, the same thing will need to happen. You’ll need shared terminology and context that the LLM will correctly and consistently interpret, and that other engineers will understand.

              That sounds awfully similar to... software development.

            • jimbokun 1 hour ago
              And this could end up looking more like mathematics notation than English. For the same reason mathematicians opt to use specialized notation to communicate with greater precision than natural language.
      • cadamsdotcom 5 days ago
        Far!

        But without the need to “program” you can focus on the end user and better understand their needs - which is super exciting.

    • mungoman2 1 hour ago
      Yes, I believe the paradigm shift will be to not treat the code as particularly valuable, just like binaries today. Instead the value is in the input that can generate the code.
  • chuckledog 5 days ago
    > “As an aside, I think there may be an increased reason to use dynamic interpreted languages for the intermediate product. I think it will likely become mainstream in future LLM programming systems to make live changes to a running interpreted program based on prompts.”

    Curious whether the author is envisioning changing configuration of running code on the fly (which shouldn’t require an interpreted language)? Or whether they are referring to changing behavior on the fly?

    Assuming the latter, and maybe setting the LLM aspect aside: is there any standard safe programming paradigm that would enable this? I’m aware of Erlang (message passing) and actor pattern systems, but interpreted languages like Python don’t seem to be ideal for these sorts of systems. I could be totally wrong here, just trying to imagine what the author is envisioning.

    • aardvark179 27 minutes ago
      Smalltalk, Lisp, and other image based languages allowed this. I would not recommend it beyond a very restricted idea of patching.
    • handoflixue 5 days ago
      I think at some point in the future, you'll be able to reconfigure programs just by talking to your LLM-OS: Want the System Clock to show seconds? Just ask your OS to make the change. Need a calculator app that can do derivatives? Just ask your OS to add that feature.

      "Configuration" implies a preset, limited number of choices; dynamic languages allow you to rewrite the entire application in real time.

      • 8organicbits 2 hours ago
        Maybe I'm missing it, but when my calculator app gets a new derivatives feature, how am I supposed to check that it's implemented correctly? End user one-shot of bug free code seems like a different technology than what LLMs offer.
        • seanw444 1 hour ago
          Yeah I don't see how LLMs are ever supposed to be reliable enough for this, but they did say "at some point in the future", which leaves room for another (better) technology.
      • jimbokun 1 hour ago
        I agree that as LLMs approach the capabilities of human programmers, the entire software paradigm needs to change radically. Humans at that point should just ask their computers in human language to introduce a new visualization or report or input screen and the computer just creates it near instantly.

        Of course this requires a huge architecture change from OS level and up.

    • WoodenChair 5 days ago
      I was envisioning the latter (changing behavior on the fly). Think the hot-reload that Flutter/Dart provides, but on steroids and guided by an LLM.

      Interpretation isn’t strictly required, but I think runtimes that support hot-swap / reloadable boundaries (often via interpretation or JIT) make this much easier in practice.

    • savolai 1 hour ago
      Smalltalk, mumps?
  • panny 9 minutes ago
    >The intermediate product of LLMs is still the Java or C or Rust or Python that came before them. English is not the intermediate product, as much as some may say it is. You don’t go prompt->binary. You still go prompt->source code->changes to source code from hand editing or further prompts->binary. It’s a distinction that matters.

    Funny enough, that wasn't the case for me recently. I was working with an old database with no FKs and naturally, rows that pointed to nowhere. I was letting search.brave.com tell me what delete statement I needed to clean up the data given an alter table statement to create an FK.

    It was just magically giving me the correct delete statements, but then I had a few hundred to do. So I asked it to give me a small program that could do the same thing. It could do the job for me, but it could not write the program to do the job. After about 30 minutes of futzing with prompts, it was clearly stuck trying to create the proper regex and I just went back to pasting alter tables and getting deletes back until the job was done.

    There was no intermediate product. The LLM was the product there.

  • emodendroket 1 hour ago
    The analogy to IDE templates seems more compelling.
  • cess11 1 hour ago
    "Many have compared the advancements in LLMs for software development to the improvements in abstraction that came with better programming languages."

    Where can I see examples of this?

    • layer8 46 minutes ago
      Comments comparing LLMs to just another level on the abstraction ladder are fairly commonplace:

      https://news.ycombinator.com/item?id=46439753

      https://news.ycombinator.com/item?id=46369114

      https://news.ycombinator.com/item?id=46366864

      Juts the first three I found via hn.algolia.com.

    • krupan 1 hour ago
      Tons of people throw this argument out on social media. "You keep using assembly while I go up an abstraction layer by using AI."

      I can only assume people saying that don't even know what assembly is. Actually, as I typed that out I remembered seeing one comment where someone said "hexcode" instead of assembly (lol)

      • Muromec 18 minutes ago
        You never know. Writing machine code in hex directly into memory of the running process is totally a thing and people exposed to this kind of fun long enough just know.
  • SadWebDeveloper 5 days ago
    This is another pointless article about LLM's... vibe coding is the present not the future, the only sad part of all of it is that LLM's is killing something important: code documentation.

    Every single documentation out there for new libs is AI generated and that is feed again into LLMs with MCP/Skills servers, the age of the RTFM gang is over sigh