Google's Rust Style Guide

(google.github.io)

86 points | by kaycebasques 1 hour ago

11 comments

  • monocasa 1 hour ago
    Can anyone expand on the chromium specifc guidelines on super tiny crates, particularly no nesting of modules/source files?

    That feels like the ~2010 era of people saying that functions should be as small as possible. That lead me to reviewing a lot of code where every function was one or two lines and you couldn't actually see what was going on anymore through the layers of unneeded abstraction.

    I want to give chrome the benefit of the doubt, but that seems really goofy.

    • evmar 39 minutes ago
      In Cargo-built Rust, a crate is costly in terms of abstraction because it needs its own directory, Cargo.toml, src/ subdir, etc. In the Google build systems I've worked with in the past (and it looks like Chromium follows) they instead put source files in the same directory mixing languages and with finer-grained libraries as they see fit.

      Given that a crate is the unit of build parallelization in Rust, there's a benefit to more crates especially when they don't cost much cognitive overhead. You could imagine using crates in the way you'd typically use separate mods in a normal Rust project.

      I dug around in their code search to find some examples but didn't see much Rust in there, seems still early. I think https://source.chromium.org/chromium/chromium/src/+/main:tes... has ~4 Rust files that end up separate crates though. (One of them defines a proc macro so even in a Cargo built Rust project it would need to be in its own separate crate, I think!)

    • loeg 59 minutes ago
      Maybe one or two line functions are a totally different scale than "all source code files in a crate"? So like, one is problematic in a way the other is not. And the guidance is "prefer small," not "always super tiny." See: "Larger crates are allowed" later on. And also see: "Rationale: Fine-grained library targets are recommended in Chromium due to the massive size of our codebase, non-local effects of adding dependencies in the build graph, and to improve performance of parallel compilation and build caching."
    • skohan 52 minutes ago
      It might have to do with optimizing compile times. A crate is the unit of compilation, so small crates increase the likelihood that you won't end up recompiling a lot of unrelated code.

      I guess smaller crates and avoiding nested modules could also help optimize for making the code greppable by coding agents without blowing up context windows.

    • i2talics 24 minutes ago
      The granularity of crates shouldn't really impact what kinds of abstractions you build. You can still have as many modules and types as you need, and as big of functions as you need, but its saying you should organize the modules into separate crates instead of one large crate. They even call out the trait coherence rules, saying that you can just make your library bigger instead of forcing a more awkward design in the pursuit of a smaller crate.

      I think one benefit of small crates is that it gives you more granularity in linking and dependency graphs, which is especially relevant for rebuilds. At a previous job we had a monolithic "utilities" crate, and this caused problems when you tried to depend on it for the IP address utilities but this brought in the radio frequency utilities. When one of these submodules got an update the versioning would excessively propagate downstream to every consumer. If this was organized as small "net-utils" and "rf-utils" crates then maybe it would not have been as much of an issue.

    • dnautics 53 minutes ago
      Compilation speed?
  • incrediblers 30 minutes ago
    Getters and setters is the one I'm most at disagreement with.

       // Mine
       let label = Label.text("Hello Wold");
       let label_text = label.get_text();
    
       // Theirs
       let label = Label.set_text("Hello Wold");
       let label_text = label.text();
    
    A method is a way to accomplish a specific task. Emphasis on specific not generic. The getter task is to always return. The setter task is specific. So the method should be the setter - `text`, `color`, `fill`. In Rust the getter can't have same name, so prefix it. Not the other way around.
    • i2talics 21 minutes ago
      Their style is pervasive in Rust, such as in the standard library, so I would personally apply a when-in-rome philosophy. FWIW something like `.text("hello")` I would expect to see in a builder-pattern but not in a setter for an object that's already built.

      That being said I don't particularly understand your conception of a method. They are both methods. The getter ought to have a shorter name since it is probably called more frequently and because it inherently has less of an impact -- this goes along with the principle that names that demand attention should be larger and easier to notice.

    • trimbo 9 minutes ago
      This style is aligned with protocol buffers, which is aligned with the style of protos in C++.

      https://protobuf.dev/reference/rust/rust-generated/

  • JoeDohn 59 minutes ago
    This is nice, I have been lurking on google and meta rust projects, mimicking and picking style by prompting LLMs to distill it, taking a look at fmt & clippy configs helps too.

    But it wasn't as coherent and reliable from project to project like this guide. Kudos to google on this one !

  • i2talics 34 minutes ago
    Much of this is very standard across the Rust ecosystem but it's very helpful to have it all in one place.
  • tcallred 24 minutes ago
    I really appreciate that they distinguish between library code and application code. Rust gets too much of a bad rap for its complicated generic code, but in most application scenarios you are not writing code nearly that complex or generic.
  • petcat 1 hour ago
    At this point, is anybody writing new C or C++? It seems like they are sunset languages even at the big corps.
    • fasterik 59 minutes ago
      I'm pretty sure most big software projects (Windows, Linux, Chrome, gcc, LLVM, AAA game engines, ...) are still writing a lot of new C and C++. Pretty much everyone in the embedded world as well.

      As a solo programmer, I still prefer C and C++. In fact, as I've incorporated LLMs in to my workflow, I've been increasingly drawn toward C and its simplicity. A lot of the QoL features of C++ simply aren't needed when you're writing less code manually.

    • xedrac 4 minutes ago
      Unfortunately for me, yes. Some companies are very risk adverse and would rather stick with the devil they know. They have no idea what they are sacrificing.
    • npalli 38 minutes ago
      Far from it. Until Rust can read C++ code seamlessly, there will be more code written in C++ than Rust for the foreseeable future. HPC, Finance, AI, Games, Databases, Hardware all continue to be written in C++.
    • pjmlp 10 minutes ago
      Games, anything that depends on LLVM, GCC, CUDA, SYSCL,....

      Ah and Rust's compiler backend dependency on LLVM and in the future GCC as well.

    • j1elo 25 minutes ago
      Today I went over a TODO comment from 2007 in a C++ codebase that is still evolving very vividly, year after year. Trust me, for well established projects C++ is there to stay.
    • loeg 1 hour ago
      Plenty of new C++ going on at my BigCorp employer.
    • skohan 51 minutes ago
      C/C++ is still relevant for HPC, where you want to carefully optimize memory management.
      • vlovich123 5 minutes ago
        Hate to break it to you but Rust is equally capable of doing all the same memory management optimizations.
    • neutronicus 1 hour ago
      C++ seems alive and well in the defense space. The big contractors near me have tons of C++ job postings and I don't think I've seen a single one looking for Rust.
      • thomashabets2 56 minutes ago
        Do you know if the code bases are of the kind where dynamic memory (among many other features) is disallowed?
        • neutronicus 52 minutes ago
          Some of them, probably.

          From the job postings, many of them seem to be physics simulations of various kinds where (in my experience) memory is allocated on the heap without a second thought. Well, there are second thoughts, but those second thoughts are about performance.

    • tkz1312 1 hour ago
      I've been extracting a lot of verified C from theorem provers recently.
    • IshKebab 44 minutes ago
      Yes mine is, because they have a huge amount of C++ already and none of it is publicly accessible so security isn't a concern. (Obviously there are many other reasons to prefer Rust, but that is a big one.)
    • icase 1 hour ago
      grownups with important jobs write C
      • thomashabets2 1 hour ago
        Are you just being snarky, or do you have something more specific to say about something that's choosing C?

        Considering that it's been 54 years, and we've yet to find any human being, any at all[1], who can write C without UB, I'd say that writing C in 2026 when there's any other option is basically misconduct and a good case could be made that if the code touches money in any way, then it could be a SOX violation too.

        Writing C today is like still writing Cobol. Yes, if you are adding a new type of savings account to your bank, and the rest is in Cobol, then sure write it in Cobol.

        Some microcontroller projects may have an ecosystem in C that makes other options harder in practice, but it's still a worthy investment to not use C. There's a reason phone baseband firmwares are moving away from C.

        [1] No, not even djb, who people like to bring up.

        • clifflocked 35 minutes ago
          > Considering that it's been 54 years, and we've yet to find any human being, any at all[1], who can write C without UB

          Undefined behavior does not mean that a language is useless. C is quite nice to write as an abstraction over assembly, and I highly recommend writing C code and thinking about (and checking) what assembly it compiles into.

          Also, it is possible to verify that the types of UB that you are referring to do not occur: see the seL4 project, which provides machine-checked proofs for an OS kernel that no execution can reach a state that is undefined by the language specification.

          • thomashabets2 18 minutes ago
            > Undefined behavior does not mean that a language is useless.

            Never said it was useless. But it's pretty damning that literally nobody can write correct code in the language. And my point is that it's been enough time that it can't be seen as a skill issue.

            > C is quite nice to write as an abstraction over assembly, and I highly recommend writing C code and thinking about (and checking) what assembly it compiles into.

            Absolutely. I think in order to understand programming you need to be able to write C, and be able to read assembly.

            C isn't "high level assembly", with the whole discussion about the spec talking about the abstract machine, but one does not need to be a C language lawyer to be a good programmer.

            But to your point about checking the output: That goes for Rust too, and godbolt.org supports Rust too, for this workflow.

            So I'm not saying C is useless. But I am saying that if someone were to decide to write their greenfield project in C, then if it plans to have actual users (as opposed to a fun project), then it's basically misconduct.

            Cf. Steve Gibson writes his software in assembly, still. Because he enjoys it, and his enjoyment is the primary user. I respect that. But I would NEVER hire someone to write whole applications like that in assembly. Or C.

        • anonymous908213 45 minutes ago
          > Are you just being snarky,

          They aren't being snarky, they're stating a fact. Rust, rounding to the nearest percent, does not exist. It's a trendy language among the Silicon Valley types that HN draws, but 99.9% of the world runs on C/++, OSes written in C/++, and language VMs implemented in C/++. Maybe some day it will change, but hanging around here too much will give you a very skewed idea of how widely adopted it is.

          • thomashabets2 31 minutes ago
            Well, "grownups with important jobs write C" can be taken in two ways. Non-snarky, sure. There are MANY people who write C professionally.

            Not as many as there are Python, Java, JS, or C++ programmers. Depending on the survey, C seems to be neck and neck with PHP.

            I read the comment the other way, though. The way that says that those other more popular languages are not serious, and NOT for grownups with important jobs.

            Edit: actually, Jetbrains 2025 survey has C neck and neck with Rust: https://www.jetbrains.com/lp/devecosystem-data-playground/ . Both "below the fold" and less than 10% of Java.

            • anonymous908213 27 minutes ago
              Python, Java, and JS are all implemented in C/++. C++ is an extension of C. Taken strictly, sure, not everyone is literally writing C. But C powers everything. It is still the systems language of the world, that is the foundation of all of our systems, including both embedded and phone/PC OSes. Then there's a bit of COBOL and Fortran for mainframes, Ada for military hardware, and a whole notta Rust anywhere.

              Think about what Rust software people actually use. Codex CLI, uv, ripgrep, and what else? That's three pieces of software, all development tools for development nerds. Normal people aren't engaging with any of this stuff. Your metaphorical grandma has never used software written with Rust in her life.

              • thomashabets2 10 minutes ago
                Cobol powers the world's money and international travel. Not sure how that matters.

                > Think about what Rust software people actually use

                More and more Chrome, Google, Android, Cloudflare, Prime Video, and phone basebands, parts of Linux kernel, and many other things.

                Normal users literally use those all day every day.

                Are they 100% Rust? Of course not (well, I don't actually know if some phone basebands are, by now. Naturally very closed source). But they're not 100% another-language either.

                If C disappeared from the world, the world would stop, yes. Same with Cobol. Same with Java. Same with C++. Same with assembly.

                If I were to guess (completely without basis for my guess) about the number of lines of code that normal users exercise in a normal day (counting each line just once), my bet would be on Java or JS.

                Would the Java be able to run without the C code? No. But normal users would not be able to do anything if only C was left. And all banks would be gone.

                And in any case C would not be able to do anything without transistors.

              • dwattttt 10 minutes ago
                Rust is in use in more places than you may expect. Does the hypothetical grandma use Windows' kernel? Android? Firefox? Chrome?
                • anonymous908213 7 minutes ago
                  1% of code in some obscure module that's barely used being written in Rust does not give one claim to those things being written in Rust. Even Firefox is only 10% Rust despite the language being designed by Mozilla, and they abandoned their project to write a new browser engine in Rust.
        • dnautics 51 minutes ago
          > who can write C without UB

          Sel4?

  • oddCopper65 1 hour ago
    The enum-over-bool rule is the one I'd keep even solo, saved me a reversed flag in a cert validator once.
    • sebastianconcpt 1 hour ago
      This is a sub-case of the general one that is narrowing the interpretation of things. A big infinite amount of things can be true or false, only one can be a Rust variant.
  • slaymaker1907 30 minutes ago
    I have a huge disagreement here. You should absolutely be using Arc and Rc for any references *that live outside of the call stack.*

    Don't do weird crap with lifetimes to try and convince the compiler that what you're doing is ok, just throw Rc/Arc on it and be done with it.

    The Rc/Arc advice also applies to C++ IMO, though you use different constructs, std::shared obviously, but there is a strong argument to be made for a std::shared_st or something which is single threaded.

    It would not surprise me if this advice comes from experience with C++ where there is no Rc so reference counting is very expensive. Even so, you can greatly reduce the expense by passing things by ref where lifetimes are simple which is the vast majority of the time.

    • i2talics 17 minutes ago
      I think using refcounting can allow you to get lazy with your object graphs, throwing referencing to objects around everywhere and then losing the ability to conceptualize who owns what and who is responsible for who (so to speak). Sticking to a stricter ownership graph forces you to be more deliberate with how your types are designed and this can lead to better architecture in the long run.
  • younglunaman 27 minutes ago
    ctrl+c > ctrl+v > into my AGENTS.md for my next rust project /s
  • icase 1 hour ago
    no amount of stylistic heterogeneity can make this awful language pleasant
    • sebastianconcpt 1 hour ago
      The good emotions come with the confidence in the engineering quality that it gives you as output (once you overcome the friction, which AI can help you big time to achieve).
  • Thanemate 1 hour ago
    Not trying to rain on someone's parade but, the only reason why would care about style guides nowadays is to feed them to our model of choice and let it do what it's supposed to be doing.

    So it's not like I am willing to read through this and think to myself "I cannot wait to pick up some new ways of doing things". I'm the general to my agentic army now.

    I guess you would code manually every now and then for your own enjoyment but at that point do you care about style guides written for scale?

    • nimih 1 hour ago
      I'm not sure I really agree with your main point (I think it's probably still important for LLM-generated code to be generally human-understandable, at least if you care about long-term maintainability), but setting that aside to answer this question:

      > I guess you would code manually every now and then for your own enjoyment but at that point do you care about style guides written for scale?

      I think they're still quite valuable in that case, for a couple reasons:

      - When learning a new language (which happens much more frequently when writing code "for pleasure," as it were), "written for scale" guidelines still translate pretty well to "written for oneself" IME. At the very least, they tell you what to expect in code you read, and give you a reasonable starting point as you develop your own taste and stylistic preferences.

      - I've noticed some open source projects beginning to institute anti-AI contribution guidelines, and such projects still benefit from codified style guides. Google obviously doesn't fall under this category themselves, but in other language ecosystems, their style guides tend to find use in OSS projects.

    • anonymous908213 1 hour ago
      > I'm the general to my agentic army now.

      What have you produced with your agentic army? Would you like to share with the class?

      • bigfishrunning 59 minutes ago
        my guess is a lot of heat, some water vapor....
      • solyin 31 minutes ago
        Why would they when the class is full of dropouts who, generously, have a 0 percent chance of going "hey, y'know what, that's actually kinda cool! I'm going to change my mind about LLMs being useless" and a 100% chance of going "ur project is total shit and you should feel bad".
        • nvme0n1p1 25 minutes ago
          The people you call "dropouts" have written 100% of the software that people actually use and actually keeps the real world running, so maybe you shouldn't write them off.
    • smoe 1 hour ago
      First paragraph: “includes guidance on API and implementation design”

      It seems to me that if the intent is not just to produce code but also to operate it, having the different pieces behave in a similar, predictable way is kind of nice. Whether the software is written by AI or humans.

    • yodsanklai 1 hour ago
      This is what we do in my company, give the guidelines to the model. Unfortunately, the model isn't always following them and it's impossible to enforce them manually. There's too much code to review, the code is generally low quality, and is more often than not auto-approved by AI.

      Unless you're working on your own project on which you have full control, or you have a strong authority figure in your company who cares about that, it's a lost battle.

      It's sad for anyone who love their craft, but tbh I'm not even sure it matters anymore for most projects.

    • monocasa 1 hour ago
      The point of style guides is to optimize for readability despite a cognitively diverse workforce coding in the same repos.

      I would think they're probably even more meaningful in an agentic world.

      Shitty generals can't review meaningfully review the work of their troops.

      On top of that all, I just enjoy programming itself. It's less and less of the meat of a software job over time, but I was coding before I got paid for it, and I'll probably keep coding well after I can get paid for it.

      • mkagenius 52 minutes ago
        > Shitty generals can't review meaningfully review the work of their troops.

        Except that reviewing has become just asking your agent what that piece of code does in english. Reading code has a bit of cognitive load, that we will probably drop it in coming years

    • petersellers 1 hour ago
      Are you saying that you don't ever look at the code once it's been generated?
      • bigstrat2003 10 minutes ago
        AI bros think you can never look at code and make good software. They're wrong, of course, but they refuse to listen and will probably never listen until the shoddy quality of their work becomes too great to paper over.
    • u1hcw9nx 1 hour ago
      Not trying to rain on someone's parade, but the only reason I would care about HN comments nowadays is to feed them to my model of choice and let it generate the contrarian hot takes it's supposed to be generating. So it's not like I am willing to read through this thread and think to myself "I cannot wait to pick up some new ways of complaining about documentation." I'm the Editor-in-Chief to my synthetic pundit army now.

      I guess you would type out a comment manually every now and then for your own enjoyment, but at that point do you really care about comments at scale?

      ---

      EDIT (above is a joke) It's very important that every time you find something that is of no use to you, you write a comment explaining that this link is of no interest to you, discouraging people from things you have no interest in. Monoculture for all!

    • gatlin 1 hour ago
      Seems very much like your goal was to rain on a parade.