A sufficiently detailed spec is code

(haskellforall.com)

188 points | by signa11 4 hours ago

31 comments

  • hintymad 1 hour ago
    > A sufficiently detailed spec is code

    This is exactly the argument in Brooks' No Silver Bullet. I still believe that it holds. However, my observation is that many people don't really need that level of details. When one prompts an AI to "write me a to-do list app", what they really mean is that "write me a to-do list app that is better that I have imagined so far", which does not really require detailed spec.

    • mfabbri77 57 minutes ago
      Yes. This happens because the training data contains countless SotA "to-do" apps. This argument does not scale well to other types of software.
      • baxtr 25 minutes ago
        Isn’t most standard software these days a permutation of things already done before?
        • roarcher 6 minutes ago
          I'd say that's pretty much the definition of standard, yeah. And it's why you can't make a profit selling a simple ToDo app. If you expect people to pay for what you build, you have to build something that doesn't have a thousand free clones on the app store.
        • mfabbri77 14 minutes ago
          In my experience, the further you move away from the user and toward the hardware and fundamental theoretical algorithms, the less true this becomes.

          This is very true for an email client, but very untrue for an innovative 3D rendering engine technology (just an example).

      • wongarsu 16 minutes ago
        Most software written today (or 10 years ago, or 50 years ago) is not particularly unique. And even in that software that is unusual you usually find a lot of run-of-the-mill code for the more mundane aspects
        • nostrademons 10 minutes ago
          Most of the economically valuable software written is pretty unique, or at least is one of few competitors in a new and growing niche. This is because software that is not particularly unique is by definition a commodity, with few differentiators. Commodity software gets its margins competed away, because if you try to price high, everybody just uses a competitor.

          So goes the AI paradox: it's really effective at writing lots and lots of software that is low value and probably never needed to get written anyway. But at least right now (this is changing rapidly), executives are very willing to hire lots of coders to write software that is low value and probably doesn't need to be written, and VCs are willing to fund lots of startups to automate the writing of lots of software that is low value and probably doesn't need to be written.

    • lmm 1 hour ago
      > When one prompts an AI to "write me a to-do list app", what they really mean is that "write me a to-do list app that is better that I have imagined so far", which does not really require detailed spec.

      If someone was making a serious request for a to-do list app, they presumably want it to do something different from or better than the dozens of to-do list apps that are already out there. Which would require them to somehow explain what that something was, assuming it's even possible.

      • ms_menardi 34 minutes ago
        It could be an issue of discoverability too. Maybe they just haven't found the to-do app that does what they want, and it's easier to just... make one from scratch.
    • ozim 15 minutes ago
      Everyone at least heard stories of people who just want that button 5px to the right or to the left and next meeting they want it in bottom corner - whereas it doesn’t make functionally any difference.

      But that’s most of the time is not that they want it from objective technical reasons.

      They want it because they want to see if they can push you. They do it „because they can”. They do it because later they can renegotiate or just nag and maybe pay less. Multiple reasons that are not technical.

    • ChrisMarshallNY 1 hour ago
      But if you’re selling that to-do list app, then the rules are different, and that spec is required.

      I guess it depends on whether or not we want to make money, or otherwise, compete against others.

  • rdevilla 2 hours ago
    I think it's only a matter of time before people start trying to optimize model performance and token usage by creating their own more technical dialect of English (LLMSpeak or something). It will reduce both ambiguity and token usage by using a highly compressed vocabulary, where very precise concepts are packed into single words (monads are just monoids in the category of endofunctors, what's the problem?). Grammatically, expect things like the Oxford comma to emerge that reduce ambiguity and rounds of back-and-forth clarification with the agent.

    The uninitiated can continue trying to clumsily refer to the same concepts, but with 100x the tokens, as they lack the same level of precision in their prompting. Anyone wanting to maximize their LLM productivity will start speaking in this unambiguous, highly information-dense dialect that optimizes their token usage and LLM spend...

    • noosphr 20 minutes ago
      Or they could look at the past few centuries of language theory and start crafting better tokenizers with inductive biases.

      We literally have proof that an iron age ontology of meaning as represented in Chinese characters is 40% more efficient than naive statistical analysis over a semi phonetic language and we still are acting like more compute will solve all our problems.

    • majormajor 1 hour ago
      Unless you're training your own model, wouldn't you have to send this dialect in your context all the time? Since the model is trained on all the human language text of the internet, not on your specialized one? At which point you need to use human language to define it anyway? So perhaps you could express certain things with less ambiguity once you define that, but it seems like your token usage will have to carry around that spec.
    • steve_adams_86 33 minutes ago
      The thing is, doesn't the LLM need to be trained on this dialect, and if the training material we have is mostly ambiguous, how do we disambiguate it for the purpose of training?

      In my mind this is solving different problems. We want it to parse out our intent from ambiguous semantics because that's how humans actually think and speak. The ones who think they don't are simply unaware of themselves.

      If we create this terse and unambiguous language for LLMs, it seems likely to me that they would benefit most from using it with each other, not with humans. Further, they already kind of do this with programming languages which are, more or less, terse and unambiguous expression engines for working with computers. How would we meaningfully improve on this, with enough training data to do so?

      I'm asking sincerely and not rhetorically because I'm under no illusion that I understand this or know any better.

    • nomel 2 hours ago
      Let's use a non-ambiguous language for this. May I suggest Lojban [1][2]?

      [1] https://en.wikipedia.org/wiki/Lojban

      [2] Someone speaking it: https://www.youtube.com/watch?v=lxQjwbUiM9w

      • dooglius 1 hour ago
        It looks like that's about syntactic ambiguity, whereas the parent is talking semantic ambiguity
    • manmal 1 hour ago
      Codex already has such a language. The specs it’s been writing for me are full of “dedupe”, “catch-up”, and I often need to feedback that it should use more verbose language. Some of that has been creeping into my lingo already. A colleague of mine suddenly says the word “today” all the time, and I suspect that’s because he uses Claude a lot. Today, as in, current state of the code.
    • anonzzzies 1 hour ago
      It was mentioned somewhere else on hn today, but why do I care about token usage? I prompt AI day and night for coding and other stuff via claude code max 200 and mistral; haven't had issues for many months now.
      • sda2 35 minutes ago
        it’s a measure of efficiency. one might not care about tokens until vendors jack up the price and running your own comparable model is infeasible.
    • otabdeveloper4 1 hour ago
      > optimizes their token usage and LLM spend

      Context pollution is a bigger problem.

      E.g., those SKILL.md files that are tens of kilobytes long, as if being exhaustively verbose and rambling will somehow make the LLM smarter. (It won't, it will just dilute the context with irrelevant stuff.)

    • est 1 hour ago
      > by creating their own more technical dialect of English

      Ah, the Lisp curse. Here we go again.

      coincidently, the 80s AI bubble crashed partly because Lisp dialetcts aren't inter-changable.

      • Dylan16807 1 hour ago
        Lisp doesn't get to claim all bad accidental programming languages are simply failing to be it, I don't care how cute that one quote is.
      • reverius42 1 hour ago
        I bet a modern LLM could inter-change them pretty easily.
        • est 1 hour ago
          trained on public data, yes.

          But some random in-house DSL? Doubt it.

    • dwd 1 hour ago
      [dead]
    • capt-obvious 1 hour ago
      [dead]
  • sudo_cowsay 6 minutes ago
    I don't like describing countries like this but: a bit underdeveloped countries (compared to North American and European countries) seem to have a more positive view on AI.
  • lifeisstillgood 19 minutes ago
    This is laid out in “the code is the design” - https://www.developerdotstar.com/mag/articles/reeves_design_... by jack reeves.

    Like they say “everything comes round again”

  • rahulj51 22 minutes ago
    For this to be true, we should be able to

    - Delete code and start all over with the spec. I don't think anyone's ready to do that.

    - Buy a software product / business and be content with just getting markdown files in a folder.

    • zevisert 15 minutes ago
      I've heard of people _experimenting_ with deleting their code every day.

      I haven't heard of being content paying for a product consisting of markdown files. Though I could imagine people paying for agent skill files. But yet, the skills are not the same product as say, linear.

  • kikkupico 48 minutes ago
    Natural language is fluid and ambiguous while code is rigid and deterministic. Spec-driven development appears to be the best of both worlds. But really, it is the worst of both. LLMs are language models - their breakthrough capability is handling natural language. Code is meant to be unambiguous and deterministic. A spec is neither fluid nor deterministic.
  • causalityltd 42 minutes ago
    The cognitive dissonance comes from the tension between the-spec-as-management-artifact vs the-spec-as-engineering-artifact. Author is right that advocates are selling the first but second is the only one which works.

    For a manager, the spec exists in order to create a delgation ticket, something you assign to someone and done. But for a builder, it exists as a thinking tool that evolves with the code to sharpen the understanding/thinking.

    I also think, that some builders are being fooled into thinking like managers because ease, but they figure it out pretty quickly.

  • ulrikrasmussen 1 hour ago
    A corollary of this statement is that code without a spec is not code. No /s, I think that is true - code without a spec certainly does something, but it is, by the absence of a detailed spec, undefined behavior.
    • lmm 51 minutes ago
      On the contrary, code is a spec. In a decent language it should look like one.
  • Panzerschrek 1 hour ago
    I am developing my own programming language, but I have no specification written for it. When people tell me that I need a specification, I reply that I already have one - the source code of the language compiler.
    • ozozozd 39 minutes ago
      You are not wrong. But, they are not wrong either.

      I feel like if you’re designing a language, the activity of producing the spec, which involves the grammar etc., would allow you to design unencumbered by whether your design is easy to implement. Or whether it’s a good fit for the language you are implementing the compiler with.

      The OP also correctly identifies that thoughtful design takes a back seat in favor of action when we start writing the code.

    • naruhodo 22 minutes ago
      The source code does what it does, including bugs.

      So unless you want bugs to be your specification, you actually need to specify what you want.

      • lunar_mycroft 2 minutes ago
        A corollary to the linked article is that a specification can also have bugs. Having a specification means that you can (in theory) be sure you have removed all inconsistencies between that specification and the source code, but it does not mean you can know you have removed all bugs, since both the spec and the source code could have the same bug.
    • antonvs 40 minutes ago
      Maybe this is your point, but the source code of any non-toy compiler is not a usable specification for the language it compiles.

      If you want a specification from source code, you need to reverse engineer it. Although that’s a bit easier now, with LLMs.

  • adi_kurian 1 hour ago
    This won't age well, or my comment won't age well. We'll see!
    • ex-aws-dude 1 hour ago
      It will either be true or not be true

      That is the great insight I can offer

      • ozozozd 37 minutes ago
        It is indeed of type boolean.
  • ranyume 2 hours ago
    I tried myself to make a language over an agent's prompt. This programing language is interpreted in real time, and parts of it are deterministic and parts are processed by an LLM. It's possible, but I think that it's hard to code anything in such a language. This is because when we think of code we make associations that the LLM doesn't make and we handle data that the LLM might ignore entirely. Worse, the LLM understands certain words differently than us and the LLM has limited expressions because of it's limits in true reasoning (LLMs can only express a limited number of ideas, thus a limited number of correct outputs).
  • scuff3d 20 minutes ago
    I recently left this comment on another thread. At the time I was focused on planning mode, but it applies here.

    Plan mode is a trap. It makes you feel like you're actually engineering a solution. Like you're making measured choices about implementation details. You're not, your just vibe coding with extra steps. I come from an electrical engineering background originally, and I've worked in aerospace most of my career. Most software devs don't know what planning is. The mechanical, electrical, and aerospace engineering teams plan for literal years. Countless reviews and re-reviews, trade studies, down selects, requirement derivations, MBSE diagrams, and God knows what else before anything that will end up in the final product is built. It's meticulous, detailed, time consuming work, and bloody expensive.

    That's the world software engineering has been trying to leave behind for at least two decades, and now with LLMs people think they can move back to it with a weekend of "planning", answering a handful of questions, and a task list.

    Even if LLMs could actually execute on a spec to the degree people claim (they can't), it would take as long to properly define as it would to just write it with AI assistance in the first place.

  • notepad0x90 2 hours ago
    I agree to this, with the caveat that a standard is not a spec. E.g.: The C or C++ standards, they're somewhat detailed, but even if they were to be a lot more detailed, becoming 'code' would defeat the purpose (if 'code' means a deterministic turing machine?), because it won't allow for logic that is dependent on the implementer ("implementation defined behavior" and "undefined behavior" in C parlance). whereas a specification's whole point is to enforce conformance of implementations to specific parameters.
    • gizmo686 2 hours ago
      Even programs are just specifications by that standard. When you write a program in C, you are describing what an abstract C machine can do. When the C compiler turns that into a program it is free to do so in any way that is consistent with the abstract C machine.

      If you look at what implementions modern compilers actually come up with, they often look quite different from what you would expect from the source code

      • notepad0x90 2 hours ago
        I don't disagree, so in a way, compilers are the specification that implement the standard? That doesn't feel right though.
        • skydhash 2 hours ago
          Compilers are converters. There’s the abstract machine specified by the standard and there’s the real machine where the program will run (and there can be some layer in between). So compilers takes your program (which assumes the abstract machine) and builds the link between the abstract and the real.

          If your program was a DSL for steering, the abstract machine will be the idea of steering wheel, while the machine could be a car without one. So a compiler would build the steering wheel, optionally adding power steering (optimization), and then tack the apparatus to steer for the given route.

  • ozozozd 44 minutes ago
    Such amazing writing. And clear articulation of what I’ve been struggling to put into words - almost having to endure a mental mute state. I keep thinking it’s obvious, but it’s not, and this article explains it very elegantly.

    I also enjoyed the writing style so much that I felt bad for myself for not getting to read this kind of writing enough. We are drowning in slop. We all deserve better!

  • quotemstr 31 minutes ago
    No, a spec is not code. It's possible to describe simple behavior that's nevertheless difficult to implement. Consider, say,

      fn sin(x: f16) -> f16
    
    There are only 64k different f16s. Easy enough to test them all. A given sin() is either correct or it's not.

    Yet sin() here can have a large number of different implementations. The spec alone under-determines the actual code.

    • mungoman2 15 minutes ago
      Well, the spec can of course define constraints of how the function is implemented.
    • 9rx 14 minutes ago
      It says a sufficiently detailed spec is code. Your spec lacks details that could be added.
  • pkoird 1 hour ago
    Meh, it's the age old distinction between Formal vs Informal language.

    Simply put: Formal language = No ambiguities.

    Once you remove all ambiguous information from an informal spec, that, whatever remains, automatically becomes a formal description.

    • manmal 1 hour ago
      Is that true though? If I define a category or range in formal language, I’m still ambiguous on the exact value. Dealing with randomness is even worse (eg input in random order), and can’t be prevented in real world programs.
  • adampunk 1 hour ago
    Just waterfall harder
  • macinjosh 1 hour ago
    IMHO, LLMs are better at Python and SQL than Haskell because Python and SQL syntax mirrors more aspects of human language. Whereas Haskell syntax reads more like a math equation. These are Large _Language_ Models so naturally intelligence learned from non-code sources transfers better to more human like programming languages. Math equations assume the reader has context not included in the written down part for what the symbols mean.
    • WanderPanda 54 minutes ago
      They are heavily post-trained on code and math these days. I don‘t think we can infer that much about their behavior from just the pre-training dataset anymore
    • ozozozd 31 minutes ago
      They are not called Context-Sensitive Large Language Models though.

      LLMs are very good at bash, which I’d argue doesn’t read like language or math.

    • catlifeonmars 1 hour ago
      I suspect your probably right, but just for completeness, one could also make the argument that LLMs are better at writing Haskell because they are overfit to natural language and Haskell would avoid a lot of the overfit spaces and thus would generalize better. In other words, less baggage.
      • travisgriggs 48 minutes ago
        I would guess they’re better at python and SQL than Haskell because the available training data for python and SQL is orders of magnitude more than Haskell.
  • HoldOnAMinute 2 hours ago
    I have a lot of fun making requirements documents for Claude. I use an iterative process until Claude can not suggest any more improvements or clarifications.

    "Is this it?" "NOPE"

    https://www.youtube.com/watch?v=TYM4QKMg12o

  • measurablefunc 3 hours ago
    I agree with the overall structure of the argument but I like to think of specifications like polynomial equations defining some set of zeroes. Specifications are not really code but a good specification will cut out a definable subset of expected behaviors that can then be further refined with an executable implementation. For example, if a specification calls for a lock-free queue then there are any number of potential implementations w/ different trade-offs that I would not expect to be in the specification.
    • catlifeonmars 1 hour ago
      I kind of feel like the specification would call for an idealized lock free queue. Whereas the code would generate a good enough approximation of one that can be run on real hardware.

      To invert your polynomial analogy, the specification might call for a sine wave, your code will generate a Taylor series approximation that is computable.

  • ossianericson 8 minutes ago
    [dead]
  • cheevly 2 hours ago
    [dead]
  • cranberryturkey 42 minutes ago
    [dead]
  • X95_BNB35 2 hours ago
    [dead]
  • Iamkkdasari74 45 minutes ago
    [dead]
  • tomlin 2 hours ago
    [dead]
  • randyrand 1 hour ago
    True. That's why I only write assembly. Imagine a piece of software deciding register spill for you! Unhinged!
  • charcircuit 2 hours ago
    This articles ignores that AI agents have intelligence which means that they can figure out unspecified parts of the spec on their own. There is a lot of the design of software that I don't care about and I'm fine letting AI pick a reasonable approach.
    • ozozozd 25 minutes ago
      Here is an easy example:

      Say you and I both wrote the same spec that under-specifies the same parts. But we both expect different behavior, and trust that LLM will make the _reasonable_ choices. Hint: “The choice that I would have made.”

      Btw, by definition, when we under-specify we leave some decisions to the LLM unknowingly.

      And absent our looks or age as input, the LLM will make some _reasonable_ choices based on our spec. But will those choices be closer to yours or mine? Assuming it won’t be neither.

    • abcde666777 2 hours ago
      These algorithms don't have intelligence, they just regurgitate human intelligence that was in their training data. That also goes the other way - they can't produce intelligence that wasn't represented in their training input.
      • half-kh-hacker 21 minutes ago
        How does post-training via reinforcement learning factor in? Does every evaluated judgement count as 'the training data' ?
    • systemsweird 2 hours ago
      Exactly. The real speed up from AI will come when we can under specify a system and the AI uses its intelligence to make good choices on the parts we left out. If you have to spec something out with zero ambiguity you’re basically just coding in English. I suspect current ideas around formal/detailed spec driven development will be abandoned in a couple years when models are significantly better.
      • majormajor 1 hour ago
        This is humans have traditionally done with greenfield systems. No choices have been made yet, they're all cheap decisions.

        The difficulty has always arisen when the lines of code pile up AND users start requesting other things AND it is important not to break the "unintended behavior" parts of the system that arose from those initial decisions.

        It would take either a sea-change in how agents work (think absorbing the whole codebase in the context window and understanding it at the level required to anticipate any surprising edge case consequences of a change, instead of doing think-search-read-think-search-read loops) or several more orders of magnitude of speed (to exhaustively chase down the huge number of combinations of logic paths+state that systems end up playing with) to get around that problem.

        So yeah, hobby projects are a million times easier, as is bootstrapping larger projects. But for business works, deterministic behaviors and consistent specs are important.

      • bigstrat2003 59 minutes ago
        > in a couple years when models are significantly better.

        They aren't significantly better now than a couple of years ago. So it doesn't seem likely they will be significantly better in a couple of years than they are now.

      • macinjosh 1 hour ago
        For now I would be happy if it just explored the problem space and identify the choices to be made and filtered down to the non-obvious and/or more opinionated ones. Bundle these together and ask the me all at once and then it is off to the races.
    • TheRoque 2 hours ago
      Exactly, I find that type of article too dismissive. Like, we know we don't have to write the full syntax of a loop when we write the spec "find the object in the list", and we might even not write this spec because that part is obvious to any human (hence to an LLM too)
  • sjeiuhvdiidi 1 hour ago
    Absolute nonsense. A sufficiently detailed "spec" is the code. What is wrong with you people ? Pure nonsense, all they have to offer.
  • kenjackson 34 minutes ago
    Code is usually over specified. I recently used AI to build an app for some HS kids. It built what I spec’wd and it was great. Is it what I would’ve coded? Definitely not. In code I have to make a bunch of decisions that I don’t care about. And some of the decisions will seem important to some, but not to others. For example, it built a web page whereas I would’ve built a native app. I didn’t care either way and it doesn’t matter either way. But those sorts of things matter when coding and often don’t matter at all for the goal of the implementation.