NewsLab
Oct 27 20:46 UTC

The Goose Programming Language (aardappel.github.io)

594 points|by bobbydigitales||365 comments|Read full story on aardappel.github.io
https://twitter.com/ID_AA_Carmack/status/2113704269274636568

Comments (365)

120 shown|More comments
  1. 1. bobbydigitales||context
    "That looks really neat! The automatic analysis and use of multiple data stacks and resizable fields takes it from "lots of work can be done this way" to "basically everything can be".

    The relative references and built in binary structure validation also enable direct memory mapping of data structures and immediate use of network data. "Parsing" file and network data is often 100x slower than it needs to be." - John Carmack

  2. 2. mi_lk||context
    Obviously the guy is replying to something that you can't see without logging in twitter. And without context this means little
  3. 3. andsoitis||context
    > Obviously the guy is replying to something that you can't see without logging in twitter.

    I could follow the link and read the thread and I don't have an X account.

    You can also check out the language's website by googling "goose programming language", which should lead you to: https://aardappel.github.io/goose/index.html

  4. 4. mi_lk||context
    the rest of the thread yes but not the thread before
  5. 5. cosmotic||context
    The link to the github works. Everything else opens google play store page for twitter for me.
  6. 6. celsoazevedo||context
    The Twitter/X link doesn't show the full thread without a login. It also doesn't tell you that something is missing, so I guess it's normal for people to think they're seeing everything.

    What X shows me: https://celsoazevedo.com/files/2026/x.webp

    With a login/nitter: https://celsoazevedo.com/files/2026/nitter.webp

  7. 7. mcdonje||context
    He should've posted the website instead of twitter
  8. 8. stefanos82||context
  9. 9. frangonf||context
  10. 10. randyrand||context
    Twitter is gone, in more ways than one. RIP.
  11. 11. DoesntMatter22||context
    Better than ever tbh
  12. 12. AnEro||context
    Such a cool idea! I've been toying around making a few libraries to force languages to do that direct io zero-read mapping to data structures. Ofcourse this looks way better and infinity less hacky, but it is a fun and trippy experience to find someone working in the same direction as you independently.
  13. 13. Aardappel||context
    Btw I made the language, AMA. repo: https://github.com/aardappel/goose
  14. 14. vanderZwan||context
    If you had no other obligations and todos getting in the way, what's the first thing you'd rewrite in Goose yourself?

    (And why isn't it Amiga E?)

  15. 15. Aardappel||context
    Most of my current Goose projects are games, not surprisingly, but I have some language/tooling ideas as well.

    As for Amiga E, I am very proud of having made it way back when obviously, but it doesn't stack up against my more modern languages (Goose and Lobster), so I think I'll leave it be :)

  16. 16. fancyfredbot||context
    What happens if the memory is freed in a different order to allocation? Does the language disallow that? Or does it get allowed but mean the stack can't shrink?

    How are you deciding how many stacks to use?

  17. 17. Aardappel||context
    The compiler automatically optimally allocates all arrays currently in scope that are able to grow to "stacks" (address spaced reserved areas).

    The programmer choose what to store where, so you typically store things in arrays by lifetime. Goose gives you many more tools to do that, it can store entire variable sized trees of an enum type in a single array.

    You try to avoid having to deallocate in mixed/random order, but if you absolutely must, you can turn arrays into pools, basically.

  18. 18. fancyfredbot||context
    Thanks!

    I'm a bit confused about how you could decide the number of stacks at compile time. I can see you could see how many arrays are lexically in scope. However if the code puts one dynamic array inside another dynamic array I can get to an unbounded number of total stacks without ever needing more than two in lexical scope at once. Do you also add stacks at runtime? Like a stack of stacks?

  19. 19. Aardappel||context
    The top level arrays all are owned by a local variable. An array of arrays is just allocated to a single stack.
  20. 20. fancyfredbot||context
    I'm sorry if I'm being dense here but I can't see how that would work?

    The spec on your GitHub says: "Two simultaneously-live resizable values never share a stack."

    So I surely can't have a dynamic array of dynamic arrays share a single stack? That's an unbounded number of resizeable values sharing a stack?

    You could make it work on a single stack but that would involve having non-contiguous memory for each inner array since you can add to any array in any order.

    The spec implies that we need one stack per element of the outer dynamic array which would let you have contiguous memory for each inner array, but you wouldn't know how many stacks you needed at compile time.

  21. 21. Aardappel||context
    The language has different levels of solutions for the inner arrays being dynamic, for example a) only dynamic upon construction, b) fixed size, c) fixed size with cap, or d) allocated in a pool in a different array.

    Depending on your needs you use one of these solutions.

  22. 22. fancyfredbot||context
    Makes sense now. Thank you!
  23. 23. AnEro||context
    You noted AI creating a large amount of this code base with yourself directing it. Do you have a process that keeps you sane while doing this over such a large codebase?(especially for a brand new concept and implementation) [Obviously congrats and can't wait to read through to have deeper questions!]
  24. 24. Aardappel||context
    A big part of this making it base the code of this new compiler on my previous compiler for the Lobster Programming Language. I had it go thru that codebase, distill an elaborate code style guide from it, and used that to make it write the new code pass by pass in that style. That made me feel "at home" as if it is my code, easier to review etc, and easier to know we're going in the right direction by seeing similar structure to my past compiler work.

    Once the initial compiler was there it became easier, as Fable is rather good of working within the context of what is already there.

  25. 25. AnEro||context
    Thanks much appreciated!! Feeling silly for not noticing my best experience with AI in larger/complex cases has been languages/frameworks that are opinionated in usage/design(zig/go/elixir/rust)
  26. 26. ksec||context
    First, Congrats on the release!

    Do you know if Goose is the first time something like this has been done?

  27. 27. Aardappel||context
    In this particular combination, most certainly.

    There is lots of prior art on the individual parts of the design, e.g. "regions" and various stack languages etc, see: https://github.com/aardappel/goose/blob/master/docs/design/p...

    Part of this is that 64-bit address spaces make this design practical, and almost all languages in use today were designed with the limitations of 32-bit in mind. Once you can assign arrays huge amounts of address space, you don't have to realloc, which gets you stable pointers, and a lot of the other Goose features.

  28. 28. amelius||context
    Is this like forcing the escape analysis of the compiler to be perfect, by making it explicit in the programming language?

    I'm wondering what kind of architectural corners this forces the programmer into ... have you found any so far?

  29. 29. Aardappel||context
    Yes, the compiler guarantees references to data structures can't escape. I believe it does that "perfectly" :)

    It certainly requires the programmer to rethink how they structure their data, as you have to think of where it is going to be stored, and how to store it in a way such that it will have similar lifetimes to what it is stored with, to get the most out of the language.

  30. 30. koolba||context
    What does this mean (from your link):

    > Nested data stays inline. A string, an array of strings, a record with variable-size fields and an array of those records are each one contiguous block with no pointer in it. A record that is 160 bytes and an allocation in C++ is 29 bytes and none in Goose.

    I’m having trouble parsing that last sentence.

  31. 31. lynndotpy||context
    I parsed it as "A record that is ((160 bytes and an allocation) in C++) is ((29 bytes and none) in Goose)."

    So, I read it as, "C++ uses 160 bytes and an allocation, when Goose requires 29 bytes and no allocation".

  32. 32. Aardappel||context
    It means that to do variable sized things like vectors and strings, C++ often ends up having to allocate their contents dynamically. Which results in data structures with lots of 64-bit pointers over multiple allocations.

    Even Rust's "enum" feature, which can store different sized things all in the same space, does that at the cost of the smallest variant being just as big as the biggest.

    Goose can do all of that not only inline (no pointers), but with variable size, meaning small items take less space. It's like a serialized data representation, but iterable. It makes for big space savings vs these languages.

  33. 33. koolba||context
    These AI generated docs would make more sense if you instruct it to not include numbers unless they form a complete example.
  34. 34. eslaught||context
    As far as I can tell, you're essentially creating a new stack for every dynamically-sized variable (because otherwise nothing would be able to grow by bump allocation without moving). But this means you're creating a separate virtual memory allocation for each of these objects, which (I presume?) then rounds the size up to the OS's minimum page size (4KiB or similar).

    Doesn't that waste a lot of space? Or is there something I'm missing?

    Also it would seem to force every allocation to go through the OS kernel to allocate unless there's some trick to avoid that.

  35. 35. Aardappel||context
    Only top level growable arrays get their own "stack", if you create an array of arrays it only uses one stack.

    How you deal with the inner stack growing depends, ideally they don't grow (construction only), or you can make them fixed size, or with a capacity, or in the worst case, as a pool. The language has facilities for all of these.

  36. 36. amluto||context
    What’s the “pool” case? A function allocates a growable arena in normal heap or virtual memory?
  37. 37. Aardappel||context
  38. 38. vanderZwan||context
    I think what you might be missing is that you can also do a sort of livenes analysis to determine how many dynamically-sized variables are "awake" at the same time at most. Then you only need to create as many stacks as that number, because you can reuse the stacks of "sleeping" variables (since the "awake" variables are guaranteed to be freed once their block goes out of scope, and threads don't share any memory so no data race worries regarding those stacks).

    For example, suppose we have a function with a growable array that calls another function (without passing said array) that also uses a growable array as some temporary scratch space. Then the first function's array isn't being used when the second is sleeping, so the inner function's array could safely share the stack because it will all be freed with a single pointer restore once the second function exits.

    Now, I actually don't know how the compiler works but as I understand it does things similar to my example to optimize the number of stacks needed (but let's wait for WvO to confirm or deny whether my understanding matches reality).

  39. 39. Xirdus||context
    The obvious question is how does it work for linked lists, trees, and other non-stack-shaped data structures?
  40. 40. cardboardguru||context
    At the end of the day trees are still stored linearly in memory. Think of it as an array, with each node an element of the array, and indexes used rather than pointers.

    Plenty of trees only ever grow. And that's the normal type of array in Goose. However you can also have arrays that can grow and shrink, if you have a tree that is constantly in flux.

    Either way it'll be one stack for an entire tree.

  41. 41. dirkt||context
    There are examples in the tutorial, including a circular linked list.

    You can just store all them items of the list/tree/whatever on the stack, growing it as needed, or you can add an addition "freelist" for a particular stack, so you can re-use items.

  42. 42. cardboardguru||context
    All it's doing is allocating address space. And 64 bits means you have an astronomical amount of that. It only needs to become actual memory when you use it. A page at a time.
  43. 43. adwn||context
    > All it's doing is allocating address space. And 64 bits means you have an astronomical amount of that.

    No, you can typically only assume 48 bits of virtual address space; the kernel takes half of it, so really only 47 bits. Newer CPUs provide 57 bits (e.g., Zen 4) or 52 bits (certain ARM64 models). And that's provided that the kernel plays ball; apparently some Android configurations only support 39 bits of user virtual address space.

  44. 44. randfur||context
    I wish it was more clear about the memory layout of nested variable sized data structures. As far as I can work out the max capacity is decided at construction time which makes the whole thing a lot less intriguing.
  45. 45. mgaunard||context
    You can also just do that in C++. I do that as part of my messaging usually, so that the objects are trivially relocatable and reinterpret-castable. It only works so long as you combine a set of canonical types, but that can be verified or converted using C++26 reflection.

    I have both what I call inline sequences, and out-of-line ones (store an offset to the object itself rather than pointers).

    I made all my sizes and offset 32-bit, but I suppose they could have been 16-bit.

  46. 46. groundzeros2015||context
    This is also the default C behavior.
  47. 47. lemming||context
    Do you consider Goose to be a replacement for Lobster, or do they fill different niches?
  48. 48. Aardappel||context
    I think they have slightly different places on the "speed vs ease of use" pareto frontier.

    With Goose, the core design favors speed over everything else. Though not only was I able to make that safe, it is fairly pleasant to use. But it remains a low level systems language that requires you to think hard about data organization.

    Lobster is a waaay more high level language made to be pleasant to use first, fast second. Surprisingly though, it can get pretty close in speed to C++/Rust nowadays too, but still a lot slower than Goose.

  49. 49. lemming||context
    Do you have plans to continue using AI to improve Lobster too, e.g. working on implementation speed, or perhaps self-hosting?

    How have you found AI at writing Goose or Lobster code, if you give them a skill or something, are they relatively competent at actually writing code in the language?

    Both are really interesting projects, BTW - thank you! I've been meaning to try Lobster out but haven't found time, I think this might be the push I needed.

  50. 50. Aardappel||context
    I've already been improving Lobster's speed a lot in recent times: https://github.com/aardappel/lobster/blob/master/tests/compa...

    Self-hosting would be cool too, but for both Lobster and Goose I've tried to keep it simple for people to build the language in any environment, which is why its still all in C++.

    I don't use any "skills". From what I can see, the #1 way an AI produces "good code" is to simply work in the context of existing good code. I don't need to hold it by a style guide, it seems to infer that from context just fine. At least Fable does, other models less so.

  51. 51. vanderZwan||context
    > From what I can see, the #1 way an AI produces "good code" is to simply work in the context of existing good code.

    "Just Git Gud First" - Wouter van Oortmerssen

  52. 52. perrygeo||context
    That's unnecessarily dismissive. I find the statement quite enlightening and I wish other engineers would realize the wisdom here.

    LLMs are pattern matching machines. Your code is the base template that will determine all patterns moving forward. No amount of context engineering or prompting can save your code from itself.

    Pragmatically, it suggests we need a much greater investment in code quality, and much less hand-wringing over AI tooling.

  53. 53. vanderZwan||context
    Apologies, I wasn't trying to be dismissive, it was meant to be a joke that the sentence read like an (earned) humblebrag.

    For context: I'm very active on the Goose discord (and have been following WvO's languages since Lobster was announced on Google Groups eons ago). I goof around there too, and forgot for a moment that outside of that chat it wouldn't be obvious that I'm being tongue-in-cheek.

  54. 54. andyferris||context
    I suppose something like a skill would help those starting with the language. If nothing else, a well written skill can be read by a human - or you could load the skill and generate a program you are familiar with.
  55. 55. __mharrison__||context
    How do you ensure that bootstrapping a new project has good code?
  56. 56. Aardappel||context
    As I mention at the end of https://github.com/aardappel/goose/blob/master/README.md I essentially had it use a previous compiler of mine (Lobster) as a template.

    Even if you don't have such an example, pick a project that you think has "good code" (even if it is not your own), point the LLM at it, tell it to have a deep read of the code, and come up with a very in-depth coding guideline in a .md file with code patterns etc. Then put that .md in your new project and tell it to follow it.

  57. 57. nextaccountic||context
    > Threads that share nothing. A worker is compiled as a separate program with its own memory, and flat values cross typed queues as a memcpy. Data races, locks, atomics and memory orderings do not exist in the language.

    how to perform this copy without atomics?

    do the workers run as threads or processes?

    also you claim it's faster than rust and c++. but for certain kinds of software it's certainly (and substantially) slower, right?

  58. 58. Aardappel||context
    The copy is made by the runtime, which obviously does use atomics underneath, but you don't ever use these yourself.

    The workers are threads. The separate memory is the concurrency model, but it's still single process, multiple threads.

    The "faster than" is on average, and both in my own benchmarks and independent benchmarks you can find examples of algorithms where it is slower, but they tend to be the exception. "substantially" slower I haven't found yet.

    https://kostya.github.io/LangArena/#/top_tab

  59. 59. Jtarii||context
    That site is just benchmarking how well an AI can implement things, it has nothing to do with how "fast" the language is.
  60. 60. jibalt||context
    > It evaluates 27 programming languages across 50 real-world-inspired tasks using 5 metrics: runtime, runtime score, memory usage, compile time, and expressiveness.
  61. 61. Jtarii||context
    I'm not sure how that is relevant to every test being vibe-coded?
  62. 62. nextaccountic||context
    > The "faster than" is on average, and both in my own benchmarks and independent benchmarks you can find examples of algorithms where it is slower, but they tend to be the exception. "substantially" slower I haven't found yet.

    Well message passing with literal memcpys (rather than, say, just a shared buffer, like is common in Rust) is very expensive when the messages are huge. Of course as the message size increases, the Rust program will become faster than the Goose one (and if it doesn't, you should look into your benchmarks)

    Being more specific, it means that for each message, we are writing on memory twice - one to build our own buffer with the message, and another to make a copy to another worker. Message passing violates, in spirit, the Goose rule that things are built on their end destination: we can't write into a buffer owned by another task, so we need to first write on our own buffer, and then do a copy, which is a lot like first writing the value to the stack, then copying the heap. Writing twice has an overhead, specially when messages don't fit in the cache - you just need benchmarks with sufficiently large messages to demonstrate it.

    Beyond that, there are some algorithms that can be made much faster when written with atomics rather than message passing. (Also there are algorithms that will get faster if you use locks! Locks aren't always slower). It's just a matter of finding such examples, and writing a Rust code that will use atomics, compared to a Goose program that uses messages between workers because Goose doesn't expose atomics to the user.

    So if you didn't find such examples, it's because you didn't specifically write benchmarks with those scenarios in mind (or, I mean, didn't told your LLM to write this).

    That is: if the Rust program and the Goose program do the same thing in the same way, then it's reasonable that Goose is faster on average. But Goose is limited because it doesn't let you do some things, but Rust does, so to compare the languages you need to find those cases where the Goose limitations end up making the software slower

  63. 63. Aardappel||context
    Sure, those cases could bite. I think all my benchmarks (and external benchmarks) are mostly single threaded.

    Note that all this supposed copying overhead also has an upside: once the synchronisation has happened, every thread can now run at maximum speed doing single threaded memory allocation with no locking of any kind.

    In C++, malloc/new in multithreaded programs needs to essentially go thru a mutex and can make allocation even more expensive than it already is. I am not sure if Rust does the same.

    Since in Goose "allocation" is just a pointer bump, we cannot make that multi-threaded, hence the threading model followed from that.

    And like a lot in Goose, you have to write your program to fit the language a bit. If you expect to do concurrency on top of a huge graph of constantly changing data that all threads must have immediate access to, it is probably not the language for you. But there are plenty of concurrency models that fit and are blazingly fast.

  64. 64. cardboardguru||context
    Sounds like they are processes, as the docs say that all the global data is duplicated for the workers to have a private copy.
  65. 65. groundzeros2015||context
    Why are you pretending that John is endorsing your project?
  66. 66. jdw64||context
    Why was it named Goose?
  67. 67. Aardappel||context
    I've named many of my past languages with animal names, e.g. Lobster. Goose just popped into my head as cool sounding at the time. It has no special meaning.
  68. 68. spacemarine1||context
    I feel the need, the need for speed. Talk to me, Goose.
  69. 69. jdw64||context
    Thank you.
  70. 70. adastra22||context
    I would throw the entire docs out and write it from scratch in your own words. I get that we live in an era where the machine writes most/all of the code, and I can accept that. What I need, to even consider using and extending this project, is some understanding of what part of the design is yours and what part is accident by Claude. I can't get that from reading Claudese.
  71. 71. felixgallo||context
    We as a society have to cut this low effort commenting out. The documentation is perfectly comprehensible. What action would you take differently if a given feature were implemented by Claude, or a human?
  72. 72. adastra22||context
    As I said in my message, it would determine whether I use the project or not. I need to match it to my use cases, and if I find a match I need to know: is it matching because my use case falls in the domain of what the human collaborator wants from this project, or is my use case a hallucination that will go unsupported?

    You cannot tell either from the AI written docs. I'd rather OP gave a rambling post about some problem he has in gamedev that led him to think a new language was needed, why the constraints are different, and how this will improve X, Y, or Z in his own words. Then I can infer what this project is and where it is going. Right now, I have no clue.

  73. 73. knowsuchagency||context
    The docs are perfectly legible and to the point. I don't see the need to waste the author's time with aesthetics
  74. 74. adastra22||context
    Legibility is not the concern. The issue is whether the point the docs are making are the actual point the author is concerned with.
  75. 75. partyficial||context
    literally the first point under Why Goose -

    "Faster than C++ and than safe Rust, ..."

    perfectly legible ?

  76. 76. felixgallo||context
    With respect, what on earth are you talking about? The documentation is clear about what the language does. You can download it and test it out if you like, and verify if yourself if the documentation matches the feature descriptions. What the human collaborator wants is immaterial. You get the code.

    The author has written that post about why the language came about. He doesn't owe you that, but he did it anyway. He doesn't owe you anything more. You can use it or not. Advising him to throw away all the documentation and rewrite it again by hand from scratch so that adastra22 can deign to examine it further is ridiculous.

    If you have a question about whether or not this further iterations will fit your specific (and so far undescribed) particular use case, the correct avenue for that is to ask the author politely. Or Fable; Fable could probably tell you without having to bother the author. But holy cow, the entitlement.

  77. 77. adastra22||context
    Are we now in a situation where all code is disposable, throwaway things with no long-lived projects?

    We're talking about a programming language. Languages, and their compilers, evolve over time. Where is this one headed?

  78. 78. felixgallo||context
    If you think you'll be able to divine that if and only if the documentation is entirely written by a human, then I'm afraid I'll have to disappoint you: no language has ever evolved strictly according to the initial plan of their authors. Nor has any author's strongly held belief about the future ever panned out the way they thought. Nor has the documentation ever held the immutable future of the language, even when fully human generated (which essentially zero languages have, even before AI).

    The way to find out if a language is suitable for your needs is not to demand, in an entitled way, that the author perform an act for you. It is to (a) ask the author politely; or, failing that, (b) to examine it yourself (or ask Fable to evaluate it, using tokens you paid for).

    This particular language, further, is Apache 2.0 licensed. If it's not working for you, fix it. Jesus.

  79. 79. jibalt||context
    Your correspondent keeps moving the goalposts and never presents a coherent argument. I would just leave them be.
  80. 80. adastra22||context
    How have I been inconsistent?
  81. 81. vikramkr||context
    pretty much that's the default assumption yeah. Anything new is probably a throwaway. If there's anything cool in it - rebuild it to your own taste. There will be exceptions that do become long lived projects of course. probably even the same amount there were before. But there's going to be a few orders of magnitude more throwaways so on average any new piece of code is going to be a throwaway
  82. 82. adastra22||context
    Do you not see the problems that arise here? Are we losing our accumulated engineering best practice knowledge? Standardized, common, highly reviewed subsystems provide working engineering know-how and accumulated lessons learned. Not even the best AI systems can keep that many considerations in mind when re-spinning code.

    If this is your default assumption, I hope I never have to rely on code you generate.

  83. 83. vikramkr||context
    Who said it's my assumption for code I generate? We're talking about how I evaluate code other people generated. If that wasn't my default assumption - then you should never trust anything I create because I would be naively trusting other people to maintain throwaway projects.

    Are we losing our accumulated engineering best practice knowledge? Yes. Have you seen the quality of new hires recently? The ones who've cheated their way through school and don't know what a for loop is? People that have those skills aren't letting them atrophy but the chain of transmission is in crisis. Breaking news, sometimes things suck

  84. 84. baq||context
    with programming languages which just rehash ideas (not saying it's a bad thing mind you! a good mix is better than a sum of its parts) you can nowadays get literally years of work in a week. truly novel stuff like bend2 takes longer (ask Victor), but I expect the next generation of models to compress those timelines, too (if the next generation is allowed to be released, since the security brouhaha going on now is seriously concerning)
  85. 85. hexasquid||context
    Seems like an AI could be tasked with verifying the docs. Then a human can double check it's work if it finds anything.
  86. 86. adastra22||context
    Verify against what? What I want verification against lives in the human's head, not the repo.
  87. 87. hexasquid||context
    Oh, I was thinking verify what the doc claims to what the code actually does, I misunderstood you.
  88. 88. vikramkr||context
    What's left to determine? Obviously AI written docs are a deal breaker for you. Seems very straightforward. If docs are ai written, move on. That's an immediate and obvious fundamental incompatibility you have with the project. Why are you still complaining about the docs being ai written getting in the way of making your decision when you've clearly already made it?
  89. 89. condwanaland||context
    Why are low effort comments not worthwhile but low effort docs are fine?
  90. 90. spuz||context
    If you've ever been tasked with coming up to speed on a system mostly documented with AI writing, you'll quickly realise how hard it is to trust anything you are reading. Even if the Claude documentation is 100% accurate, you'll never shake the worry that some crucial fact you founded your understanding on was wrong. It's a fast recipe for psychosis.

    That's without even mentioning that AI writing can often state the what but not the why. That human perspective is usually the most valuable knowledge to get across in writing.

  91. 91. JojoFatsani||context
    There’s no reason to trust a human any more than an LLM for this. Humans are not 100% accurate and very capable of making crucial factual errors in documentation. Ask me how I know.
  92. 92. foltik||context
    There’s a _very_ good reason. Humans have a much richer mental mental model of the codebase, design decisions, external factors, etc.

    Of course Humans can make errors when translating that to English. But if you’ve read any amount of Claudish it should be obvious that interpolating the code to documentation with an LLM typically produces a significantly worse result in almost every way. Except for superficially “sounding” correct.

  93. 93. brabel||context
    That’s just not true especially when the author designed the language with the LLM like he says in the end (the AI is very good at forcing you to be specific and make decisions on ambiguous terms): all decisions can be included in the repository in a way the computer can follow and understand, which is a pattern called specification graphs. You can just document things in the docs as well if you want a more basic method. If you are claiming this language is worse in every way than others that were made by humans alone, could you be specific?? What are the bad things you’ve found? What part of the docs are incorrect? Or are you just commenting without having looked at any of that?
  94. 94. vikramkr||context
    That is not necessarily true if the codebase is written by AI unless the human chose to be involved. That was also not necessarily true before AI either. Human skill level is wildly variable
  95. 95. jug||context
    Above all, I think I like human docs because then I not only know someone has a deep understanding of it, but also that someone can actually be queried about it. With Claude, there is always the accountability problem. If something seems off, do I even have someone other than Claude that understand it all and who is accountable ?
  96. 96. ashkankiani||context
    I don't want to read software written by misanthropes. If you've given up on working with other people, then what is the point exactly?
  97. 97. conartist6||context
    Amen. Not to mention these people usually want others to laud them for creating a world they can't bring themselves to actually live in.

    If you believe you are making something worth other people's time, you should ALSO believe you are making something worthy of your own time.

  98. 98. partyficial||context
    we need an equivalent of the medieval "stand under the bridge you built" trust system.

    would you fly in an airplane if the software was written mostly by Claude?

    If an engineer who mostly used Claude left the company, can his replacement understand his mental model, given that he himself doesn't ?

  99. 99. creata||context
    It's probably possible to prompt an LLM into writing well, but most LLM writing that I've seen is poorly structured (e.g., the paragraphs in this post feel like strings of punchy marketing phrases), and the LLMs are too good at sounding like they're saying a lot while saying very little.

    Plus, if a human puts the effort into writing something, that signals to me that it's worth something, because human time is much more scarce than LLM time.

  100. 100. lilbigdoot||context
    I recently saw a language posted that caught my interest. I went into the docs and read the page "How X compares to Y", and Y is my favorite language

    Within the first couple of paragraphs and bullets it made a completely false claim that is the opposite of how the language operates, something any person that knows the essentials of it would know. Language Y was listed in the front page as an inspiration (and I don't doubt them) but clearly they either did not read the docs the LLM wrote or did not use the language for long enough to know it has zero structural typing

  101. 101. vikramkr||context
    at that point i just ask an ai questions about how the system works and hope the reasons for particular decisions can be reverse engineered from git history/pr comments etc.
  102. 102. fuzzythinker||context
    I find your comment much much lower effort than GP you took a snip at. It's true that more ppl may align in your thinking, but dissing the other side's concern as low effort does not belong in hn.
  103. 103. nozzlegear||context
    > What action would you take differently if a given feature were implemented by Claude, or a human?

    This one is easy: I'd read the docs if it were written by a human, but I won't read them if they're written by Claude.

  104. 104. hackrmn||context
    Comprehensibility does not equal correctness or fitness. As if that wasn't enough, or perhaps in most related manner, an LLM/AI cannot be held responsible for what it produces, by nature, especially considering the fact that a _human_ claims all of it as their own work, or at least take responsibility. Meaning that when a parable of documentation is discovered to be bogus, you can't pin it on AI, you go to the human and ask them why the documentation is wrong, and it's not a good look.
  105. 105. elxr||context
    > The documentation is perfectly comprehensible

    For a programming language? It's subpar and you know it.

    See this for a language docs site by a small-ish team, but a significant effort was put into making it nice to read: https://tour.gleam.run/everything/

  106. 106. otabdeveloper4||context
    > The documentation is perfectly comprehensible

    That's, like, a stunningly low bar for documentation. "The vehicle is perfectly capable of performing motion, why are you complaining?"

  107. 107. WillAdams||context
    The version of the documentation which I would very much like to see would be a Literate Programming version where all the code is explained from the ground up.

    Apparently, this can actually assist the LLM:

    https://silly.business/blog/we-should-revisit-literate-progr...

    as discussed here previously:

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

  108. 108. elxr||context
    That's a great idea. I wonder if any major library (or language) has attempted a version their site in that style.

    I'd love to experiment with this myself.

  109. 109. WillAdams||context
    I've been trying to collect Literate Programs collected as books at:

    https://www.goodreads.com/review/list/21394355-william-adams...

    Note that ICC, a C compiler, is one:

    https://www.goodreads.com/book/show/522102.Retargetable_C_Co...

    Note that one can look through projects tagged as Literate Programming by using the topics view:

    https://github.com/topics/literate-programming

    might be there's something useful there.

  110. 110. cmontella||context
    > might be there's something useful there.

    There is! As of now, if you sort by recently updated, my literate programming project is the first result :P (link in profile if anyone reads this later)

  111. 111. WillAdams||context
    In the interest of full disclosure, my own project is in there as well (but nowhere near the top and it's a kind of obscure topic, so not likely to ever get there).
  112. 112. johnisgood||context
    I would probably go down the Lojban route though!
  113. 113. polski-g||context
    Once a week, I tell Antigravity (3.8-flash) to rewrite every code comment and documentation that was changed in the past week. Neither GPT nor Claude can write like a human.
  114. 114. adastra22||context
    Neither can Gemini.
  115. 115. rocho||context
    Gemini models have consistently been the best, by far, at writing and explaining.
  116. 116. adastra22||context
    Best against other AI output, still not even close to what a human would write.
  117. 117. pphysch||context
    Okay, describe one quirk of Gemini-ese that makes it stand out?
  118. 118. Archer6621||context
    If you use it often enough, it becomes quite easy to tell. For one, when using it through the chat interface, it always congratulates me on my amazing insight in the first paragraph or at least has a very forthcoming tone. It also has a fetish for numbered lists whenever attempting to make a point, which usually contain 3 items, sometimes 2. It's also quite good at making relatively unhelpful ASCII diagrams on a semi-frequent basis.

    That said, I do genuinely enjoy brainstorming with it, and these quirks are not really a hindrance. If anything, the sentiment in the first paragraph is quite useful to quickly get an insight about where I stand with my thoughts, relative to the available knowledge that Gemini has access to.

  119. 119. assimpleaspossi||context
    >>I get that we live in an era where the machine writes most/all of the code

    Only on the Internet is this true, not in real life. I cannot and do not trust any of these things to do a proper job because they have not in any situation succeeded in any job I've given them. And no company I deal with claims otherwise

  120. 120. hexasquid||context
    That's like me with violins!