How to write documentation for a Rust crate
blog.guillaume-gomez.fr
blog.guillaume-gomez.fr
Many people think, that docs are done once they auto-generated API docs from source code. They are not. That's not something that deserves the name "documentation". Auto-generated API docs are among the last things to turn to, when there is nothing else around or when you already understood the ideas of the library and only need to look up a name of something. That's not only true for Rust, but also for other languages.
* Want to understand generally how to use a new concept, typically at the class level (or more trickily at the two-or-three-classes level), e.g. how do I create a thread?
* Already familiar with the concept but want to do something specific, typically at the method level, e.g. how to test whether a string starts with a particular prefix?
There was a good post on Hackers News a few months ago breaking down documentation visitors into four categories, so there's at least two more.
I think examples are very important in the first case, typically you want an example led-approach to explaining new concepts. But examples are a lot less important for method-level questions, and are often (not always) totally redundant if you have really clear and precise information about the method and its parameters.
Edit: But just to be clear, I agree that examples are really important and you should definitely put them in your docs (at the class level and above).
Edit 2: Here's the article [1] and HN dicussion [2]. In that terminology, I was distinguishing "explanation" and "reference". The other two types are "tutorial" and "how-to guide".
[1] https://web.archive.org/web/20200312211539/https://www.divio...
If something doesn’t make sense to me I can straight away jump into the source code and make sense of it, from a single click.
I have learned so much about programming just reading the docs for the standard library, or it’s source code. The documentation is one of my favourite things about it the language.
Meta: the experience for readers of your comment would be much better if you'd chosen to reply to that not-now-currently top commenter.
I think almost certainly it was this: https://news.ycombinator.com/item?id=22636726
But that may not be clear at all to later readers if there are many comments here.
But.. aside from that, I quite like Rust Docs. I also especially love how I can write tests in them, link to other types and modules like `[Foo]`.
My complaint list for Rust Docs is surprisingly short honestly. Especially since they fixed the slow page loading on huge impl lists.
Compare the string pages.
Rust: https://doc.rust-lang.org/std/string/struct.String.html
Java: https://docs.oracle.com/en/java/javase/11/docs/api/java.base...
C++: https://en.cppreference.com/w/cpp/string/basic_string
Yes, the cop page probably has some bespoke work on the page, but it still demonstrates ideas that are partially auto generated (and most of that page is auto generated).
* the method and functions aren't sectioned in any useful way. Just a list of functions (solved by adding section and subsection to the doc comments). Methods that create, search, mutate, test, transform, etc should be sectioned off.
* no use of alignment, just blobs of text
* poor use of color. Both java and cpp use color to break up sections and alignment to distinguish different parts of the signature. Rust is just a page of text that is very difficult to scan.
* no summary. Cpp summarizes the group of method before clicking b through to individual listings, while java summarizes each method at the top. This is useful for searching in a page. Rust is once again just a block of text.
* rust also has a unique issue in how to organize traits and other rust specific constructs. It really should have figured this out by now.
I can keep going on the uselessness of the rust docs, and I say this as someone who was involved in the language in the past, and give it a new shot about once a year. But the docs have always sucked compared to other languages.
I think largely for one reason: the sidebar! I just scroll the sidebar for the method I know I want or a method that sounds like what I'm hoping to find, and then click it.
Java & C++ both lack that, it doesn't matter so much with the latter because the page is pretty short, but Java's is huge, and to me totally unnavigable.
I am hoping that the rust-analyzer work lets us completely fix this, in the same way I was hoping the rls would before, but it's just not ready yet.
Wow. What a terrible decision. I'm quite surprised that people actually agreed to that.
I originally said it was shit but I toned it down a little. The information isn't bad, just too difficult to find if you don't already know exactly what you are looking for. You work on rust core so I don't think you are the best person to judge.
The good part is this can mostly be solved by better formatting and adding a top one-one summary section that groups similar functions and traits (creation, mutation, lookup, etc). With just that you could even convince me to ignore the terrible formatting in the lower section.
The general take away is that the docs are too difficult to scan and if you don't already know something exists and its name, the docs aren't very useful.
It's not really possible in any other way. Building API docs is a compilation process, from source code to HTML. You either use the compiler, or re-implement parts of it. The latter makes for interesting bug possibilities.
I'm thinking in terms of Doxygen's brief comments vs detailed comments here. Pages typically go (1) class brief comment, (2) list of methods with their brief comments, (3) class detailed comments (including examples), (4) method signatures and detailed comments (linked to from above). Doxygen has many serious problems but I think it gets this bit right.
But a quick glance at the linked std::string::String page suggest that the first sentence of each method's docs already works as a brief summary of its function. I don't know if this is coincidence or deliberate, but if it is deliberate then the page could be reformatted just by changing the documentation system. I'm not saying that's easy, but it's less work than having to add something to every individual function.
It is conscious! This summary also shows up when you search, for example.
> could be reformatted just by changing the documentation system.
Yes. We've never had a bug report asking for this; I don't know how hard it would be, but it shouldn't be too tough.
> no summary. Cpp summarizes the group of method before clicking b through to individual listings, while java summarizes each method at the top.
When they say "java summarizes each method at the top." I think they're talking about the fact that the Java page has one line for each method with the brief description next to it. The C++ one is a bit mixed up with the fact the methods are also grouped together (by overloaded name), but they already mentioned that in their first bullet point so I think they're just referring to the brief text descriptions here.
It looks like Rust docs webpages default to expanded view instead of collapsed view. You can press [-][+] in the upper right hand corner to get a more summarized view that looks more like the cppreference example. Example video :
It doesn't address all your bullet points but that may help give the reader a high level overview.
And I'm not going to memorize the API either. Sorry.
I had to learn Java last year and--even as an experienced programmer--the guides we're pretty miserable. The info was there and it was terse [1], but I wound up paying for a course elsewhere because the official docs weren't working for me.
Rust method here of combining the guide (Struct docs) and reference (Methods) is vastly superior, in my opinion. One niggle I always have with docs is that the two things are considered separate and I have do figure out which link is the one I'm looking for. God help me every time I need to find the String functions in the Python docs.
If you don't like looking at the guide in the Rust docs, click the "[-]" in the upper right. It'll collapse everything in the page and make it look a lot more like the C++ sample.
[1] https://docs.oracle.com/javase/tutorial/java/data/strings.ht...
It doesn't even come remotely close to the CPU docs. It isn't sectioned just a dumb list of methods where similar methods can be pages away from each other (eg all the methods to look up or index into a data structure should be grouped).
Maybe I just have a higher standard than most rust users.
Thats a bit harsh. Yes, the documentation might be (is) a bit hard to read in a sense that its hard to _find_ something from it, but otherwise I've found if quite complete (when it comes to the standard library). Most (if not all) of your points are about the readability of the rendered documentation and not the documentation (content) it self.
But those display issues make it unusable unless you know what you are already looking for.
Look at this page for `capacity`: https://en.cppreference.com/w/cpp/string/basic_string/capaci...
Immediately, I see what other methods are relevant in this same context. So many languages references are simply enumerations of items in the library, but they don't provide the context needed to actually gain proficiency in the tool and learn incrementally.
You're linking to the reference documentation. Beginners start with the Rust Book, which covers strings: https://doc.rust-lang.org/book/ch08-02-strings.html
Besides, even the reference doc starts with five screenfuls of examples, while the Java and C++ only have two and one respectively.
I write a fair amount of python and /sometimes/ the docs are confusing; but the rust docs to me are completely useless.
I see people like Jon Gjengset navigating perfectly fine though.
I tend to reach for the examples/ directory, or the tests
I wouldn't call them useless though, clicking the [-] collapses all comments and gives a somewhat useful overview of what's available. It's far from ideal, but still useful.
A thousand times this. It doesn't matter how well written and organized that page is, because it's completely irrelevant. The relevant information is all on the traits documentation and other libraries.
Rust could use something similar to hoogle.
Out of curiosity, is there anything other than the docs that prevents you from working with Rust more?
I wish the Reddit community was less of a cancer but I guess it's not the team that's responsible, and also it's reddit after all!
Even just a single example of the most common use-case does wonders for usability. Even if it's not quite what you need, it tells you about the conventions and gives you things you can maybe swap out with other things in the crate as needed.
There's actually a really great solution in the Rust ecosystem that I would love to see used more widely - Skeptic [0]. It's a tool that parses markdown, finds Rust and builds it as an auto-generated test. If the example is no longer valid, it breaks your build.
I think I prefer it living in Rustdoc because then your README is also on docs.rs and whatnot.
But, I can see some downsides with that too. Not every README should be identical to the API docs. Not sure where the balance should sit.
Something that would automatically generate the signatures and modules entry points/data types. These seem to be very neglected and generally hard to keep up-to-date in the Rust ecosystem.
Perhaps I am reading your comment wrong, but:
- Generated Rust crate docs include signatures for all of their public functions, and
- Generated Rust crate docs include public enums, public fields of public structs, etc
e.g. here the signatures haven't been written manually... https://doc.rust-lang.org/std/string/struct.String.html
If you click 'src' at the top-right you'll see the full extent of the doc comments that generated it. (You get signatures without any comments.)
* API documentation: stuff like "type signatures"
* Reference documentation: the specification of the language
* Tutorials: long-form text that explains things
I gave a talk about the Bay Area Rust Meetup about this, but it seems like maybe it's lost to history :(
Anyway, rustdoc makes this distinction in a sense because it only provides API documentation, which I believe is what you're calling "reference" documentation. mdbook provides the longer form factor.
Most libraries don't have a language spec, since they're not a language, so they have categories one and three.
I think that's better than a separate book, since in most cases that separate book would never get written.