5403 words
27 minutes
Why Rust?
2025-06-09
2025-06-15

This blog post is laden with emotions, feelings, and opinions, read Rust For Foundational Software | corrode Rust Consulting if you want a more neutral and objective take, and not the kat experience.

ASSUMED AUDIENCE

Anyone who wants to know why I like Rust so much (duh).

Developers curious about why people like Rust so much.

Anyone who’s interested about the social aspects of programming language adoption.

Why Rust#

Let’s get the obvious points out first.

People advertise Rust because (so far) it’s the only language that’s memory safe, doesn’t have a garbage collector, and has performance comparable to C (or as No Boilerplate put it, “Fast, Reliable, Productive, pick THREE”).

You don’t need to worry about memory safety, and performance is great. People are noticing the advantages, and the industry adoption for Rust is increasing.

While that’s a good hook to get people into starting Rust, those aren’t the reason people stick with Rust.

Performance isn’t the only factor that matters for industry adoption (see: all the applications written in Python, and Electron+JS).

Memory safety doesn’t matter that much either (see: Zig, a more ergonomic C with practically the same foot guns as far as I can see to C. Or god forbid Go with all the concurrency hazards, which is praised for easy to use concurrent features, AND it decided to bring back null pointers).

IMHO, what ended up making a difference is more social than pragmatic. Rust has great tooling, the community is inclusive. It takes the best parts of functional programming, and brings it to the masses.

And, for me, coming from Python, the biggest factor was predictability.

Rust also has better defaults, good practices in other languages are enforced in Rust.

Another thing is the dreaded borrow checker, which deserves its own section.

Predictability#

So, what do I mean when I say predictability?

The first thing which comes to my mind for explaining is that Rust doesn’t have exceptions or implicitly nullable objects.

Rust has Result<T, E> which signals to the human that “This function can fail in ways that you might be able to recover from”. Result isn’t anything special, it’s just a widespread convention. From what I gathered, in C, the convention is to take pointers as arguments for where to store the data, and the function itself returns a 0 to signal success, and some other integer as error code.

There are multiple ways to say “null” which signals a different kind of “null”. The most common being Option<T> that signals “This function might, or might not produce a value” where the Option::None is treated as null. Others include () (empty tuple) signalling no return value (like void return type in C), ! (never returns) signalling the function doesn’t return anything, not even void.

Rust makes you explicitly deal with Result, and Option. You can’t ignore them. You can say you don’t care about it, or you know it won’t happen by doing .unwrap(), but that’s you making a choice. In Go, and C, you can ignore the result. In JS, and Python, you don’t even know if the function can error. Zig saw the benefit and requires you to declare the function can error, but adding context for why it failed as a payload requires works.

Just knowing if the function can fail, or not return anything reduces cognitive load. I know when a function is going to fail, and I can react to it.

Borrow checker#

I’ve always wondered, the compiler has access to my code, it should know when I’m done with a variable and automatically free it. Most variables are temporary and limited to the scope anyway. Why can’t the compiler “just” see that?

When I first heard about how Rust cleans up memory automatically, I was like “fucking finally”. Then I heard about how it forces you to either have, multiple readers, or a single writer. If you think about it, it’s the same thing databases enforce internally, so it clicked almost instantaneously for me. I went, “Oh, that’s just like a database, that’s cool”. So I never got why people kept complaining about the borrow checker.

Like, you guys can make complex software that I can only dream of making, but the borrow checker is confusing??? Also, aren’t you supposed to follow the readers xor writer rule anyways??? If the compiler makes sure you follow the rule, isn’t that just a good thing?

Sure, it makes it harder to architect large software compared to when you implicitly follow certain rules, but I feel like if the borrow checker is making it difficult then I’m doing something wrong.

How does it tie back to predictability?
Borrow checker makes it so you know if a function is going to delete a value, modify a variable, or if it just needs to read it. It also removes the confusion of “does this function modify the value or does it return a new value”.

Send and Sync#

Next thing, Rust has Send, and Sync markers. Send signals that the object can safely be sent to another thread. Sync signals that the object can safely be shared with another thread. I think Send is pretty easy to understand, it’s just moving an object from one thread to another. Sync on the other hand felt confusing to me, what does it mean for an object to be shared? “Shared” here means that even if you send a pointer to the object to another thread, when the other thread dereferences the pointer, the pointer is still valid, and the data is in “sync” with what the original thread sees.

Send/Sync Diagram

In the above diagram, the envelope represents packing up the data, and sending it to another thread. Which means the ownership is being transferred from Thread-2 to Thread-1. On the other hand, while Thread-2 owns meow, Thread-1 can still read it, so, Thread-2 has the ownership of meow, but Thread-1 has read-only access to it.

Enough yapping, let’s see an example.

Producer–Consumer problem#

In this case, the data we send, well, needs to be marked Send. The queue on the other hand needs to be marked Send, and Sync. At any time, the data is owned by one thread only, but the queue needs to be accessed from both, the consumer, and the producer. The producer will send the data to the queue, and the consumer will consume the data from the queue. So, it is important that both see the same data.

Here’s one way to write the producer-consumer program

fn main() {
    let queue/*: Vec<&str> */ = Vec::new();
    let queue/*: RwLock<Vec<&str>> */ = std::sync::RwLock::new(queue);
    let queue/*: Arc<RwLock<Vec<&str>>> */ = std::sync::Arc::new(queue);

    let producer/*: JoinHandle<_> */ = {
        let queue/*: Arc<RwLock<Vec<&str>>> */  = queue.clone();
        std::thread::spawn(move || {
            loop {
                std::thread::sleep(std::time::Duration::from_millis(193));
                let Ok(()) = queue.write().map(|mut x| x.push("meow")) else {
                    println!("Poison detected in producer");
                    return;
                };
            }
        })
    };

    let consumer/*: JoinHandle<_> */ = {
        let queue/*: Arc<RwLock<Vec<&str>>> */  = queue.clone();
        std::thread::spawn(move || {
            loop {
                std::thread::sleep(std::time::Duration::from_millis(211));
                let Ok(mut queue) = queue.write() else {
                    println!("Poison detected in consumer");
                    return;
                };
                if queue.is_empty() {
                    println!("Queue empty");
                    continue;
                }
                let data = unsafe {
                    // Safety: We checked if the queue is empty above.
                    queue.pop().unwrap_unchecked()
                };

                // Do something with it
                _ = data;
            }
        })
    };

    let handles/*: [JoinHandle<_>; 2] */ = [producer, consumer];

    let Ok(mut prev/*: usize */) = queue.read().map(|x| x.len()) else {
        println!("Poison detected before loop!");
        return;
    };

    while handles.iter().any(|x| !x.is_finished()) {
        let Ok(curr/*: usize */) = queue.read().map(|x| x.len()) else {
            println!("Poison detected while in loop!");
            return;
        };
        if prev != curr {
            println!("{}{curr}", if prev > curr { '📉' } else { '📈' });
            prev = curr;
        }
    }
}

See it run on rust playground: Link to playground

Producer-Consumer Problem

As you see in the above diagram, queue is on the heap, and it has 3 owners:

  1. The queue in main thread.
  2. The queue in producer thread.
  3. The queue in consumer thread.

But, at any point, either one thread is modifying the queue, or it’s being read from multiple threads, which is being enforced by the RwLock. So, here, the queue needs to be Send + Sync.

The easiest way to make sure there’s no data race while accessing data from other threads is to make it immutable. Wrapping the data in Arc does that. But, in our case, we also need to modify the data. To do so, Rust has an escape hatch with “interior mutability”. Mutex is one example of that. However, Mutex only allows for one reader or one writer. RwLock allows you to have either a single writer, or multiple concurrent readers. In our case, the performance difference won’t be that apparent. However, it should be fine.

But how does the compiler know that the queue is Send and Sync? I didn’t explicitly mark anything as Send or Sync. The rust compiler automatically marks structs as Send if everything inside the struct is Send. Similarly, if everything inside the struct is Sync, the struct is also Sync. So, unless you’re implementing your own synchronization primitives, you won’t need to explicitly mark stuff as Send and Sync.

In this case, Vec<T> is Sync if T is Sync, and Vec<T> is Send if T is Send. Our payload is "meow", which is of type &'static str', which stored in the data section of our binary, so it is Send, and Sync. Next, RwLock<T> is Send if T is Send, and Sync if T is Send + Sync, which it is. Finally, Arc<T> is Send + Sync if T is Send + Sync, so, our queue can be safely accessed from multiple threads, and it can be manipulated safely from multiple threads as well.

But, since Vec<T> is Send + Sync, why did I still wrap it in RwLock and Arc?

It’s because Vec<T> can only have one owner, if I refer it in another thread, rustc complains that I need to move the ownership. Once it moves, I cannot access it in the main thread. If I try to use a reference instead, then rustc complains that the reference might not live long enough. One solution can be using std::thread::scope instead since rust will join the handles automatically once the scoped handles reach end of scope. But, rustc still complains about the lifetime of the reference. Thus, I need something which allows for shared ownership. In single threaded scenarios, Rc<T> is used, however, since I’m using multiple threads, I have to use Arc<T>. But, Arc makes the data immutable, so I need interior mutability, and thus, I have to wrap the data in RwLock, and the lock inside Arc.

Tooling#

If you release a new language today, you can’t just get away with releasing the language, and the docs.
You need to have a good LSP.
You need to have a good package manager.
You need to have a good build system.
You need to have a good formatter.
You need to have a good linter.
You need to have a good test framework.
You need to have a good way to view docs.

Rust tooling is so good, people are copying it and creating tooling for other ecosystems, like uv for Python.

Rustup — The mothership#

Rustup is the first thing you need to install to use Rust.

Rustup manages Rust versions, and toolchains. Rustup also helps install all the other tools.

Cargo — Build System, Package Manager, Linter#

Cargo is the default build system, package manager, linter for Rust.

It’s also the entry point to most of the tools below.

Truly a one-for-all tool.

Rustfmt — Formatter#

Rustfmt is a tool used to format Rust code according to the community’s style guidelines

Rustdoc — Documentation Generator#

Rustdoc generates documentation and produces HTML that you can read in a browser.

Rust-analyzer — LSP#

Rust-analyzer is the default LSP for Rust.

Clippy — More advanced linter#

Clippy is an add-on linter that makes your code more idiomatic, and prevents common mistakes.

The lints it has are more advanced compared to the default lints in Cargo.

Miri — Undefined Behavior Sanitizer#

Miri checks for undefined behavior in unsafe blocks. So, even unsafe isn’t as unsafe as people make it out to be.

cargo-bench — Benchmarks#

Compile and execute benchmarks.

User-created tooling#

These are some of the tools developed by the community.

cargo-semver-check — SemVer violational linter#

Lint your crate API changes for semver violations.

cargo-tarpaulin — Code Coverage#

Tarpaulin is a code coverage reporting tool for the Cargo build system

cargo-insta — Snapshot Testing#

Cargo Insta is the companion command line tool to assist with snapshot reviewing.

cargo-flamegraph — Profiler#

A Rust-powered flamegraph generator with additional support for Cargo projects! It can be used to profile anything, not just Rust projects! No perl or pipes required <3

cargo-pgo — PGO optimizations#

Cargo subcommand that makes it easier to use PGO and BOLT to optimize Rust binaries.

divan — Benchmark#

Fast and simple benchmarking for Rust projects

cargo-fuzz — Fuzzer#

A cargo subcommand for fuzzing with libFuzzer! Easy to use!

kani — Model Checking#

The Kani Rust Verifier is a bit-precise model checker for Rust.

Kani is particularly useful for verifying unsafe code blocks in Rust, where the “unsafe superpowers” are unchecked by the compiler.

creusot — Formal Verifier#

Creusot is a deductive verifier for Rust code. It verifies your code is safe from panics, overflows, and assertion failures. By adding annotations you can take it further and verify your code does the correct thing.

Choices made for Rust#

Rust doesn’t just have good tooling.

  • It also has great error messages for most common mistakes.
  • It has the best features from functional programming languages while still being performant, compiling to native code, and feeling like a C-style language.
  • It strikes a good balance between language features, and additional syntax.
    • Operators like + can be implemented for any type by implementing the appropriate trait.
    • Option, and Result are just enums and not a special language construct.

Community#

OK, fine, Rust the language is great.

But the people also need to be good, it won’t matter how good the language is if the environment is toxic.

And I’m happy to say that the community is welcoming and has DEI as one of their core values. It’s hard to spend one day in the Rust ecosystem without running into queer people.

See: https://blog.rust-lang.org/2025/02/13/2024-State-Of-Rust-Survey-results/#community

But, again, why does it matter?

There’s an interesting phenomenon called curb cut effect, it’s an accessibility feature which helps everyone so much, people don’t even notice it’s an accessibility feature.

IMO, the number of queer people in a community is a good sniff test for toxicity.

Diversity, equitability, and inclusivity are hard metrics to meet as it’s not a single individual’s responsibility. DEI needs to be met as a community wide effort. It’s one thing to have a good product, it’s another thing to have a friendly and inclusive community. Likewise, it takes a monumental amount of coordination and energy to make sure people feel safe.

It’s only political if you think different people are… well… not people.

I focus particularly on queer people as there’s a huge correlation between being queer and being neurodivergent, and neurodivergence is a disability.

You might’ve noticed I keep using the phrase “cognitive load”, why is that?
Rust strikes a good balance between showing information, being explicit, and requiring you to have implicit knowledge. That makes it attractive to people who suffer from cognitive impairment. Rust makes it so you can write it safely while having very little working memory in your brain.

For people who suffer from cognitive impairment, it enables them to write code;
for others, it enables them to be more efficient.

Repeat with me.
Accessibility.
Helps.
All.

Sensible Defaults#

Rust also has sensible (and better) defaults, which means most common and best practices have low barrier.

But why does that matter?

Usually, the easy way is the better way.

Take immutable by default for example. In other languages, immutability is an add-on state. Which signals that it’s idiomatic to have mutable variables, and that mutability is better.

You don’t need to constantly remind yourself to do the better thing, the compiler reminds you.

Rust rewired my brain, when I need to write JS/TS, I get anxious. It feels like walking in a minefield. I know something is going to blow-up, I just don’t know where. The computer has access to where the mines are, but it won’t tell me where. It’s not something I should remember, that’s not a feasible ask.

While it’s possible to learn where the mines are in the standard library, it’s not possible to learn it for every library.

We stand on the shoulders of giants,
and we should take advantage of that. Let’s use the advancements people have made in programming.

Let the computer do what it’s best at, and use the limited time and resources we have to fill in the rest.

While dealing with the borrow checker and Option/Result can be annoying, it made me realize how much better predictability is in the long run. The features that make it more complex in the short term, helps reduce the overall complexity, especially in the long term.

I think corrode put it the best, “Rust is a day-2-language”.

I’m not saying Rust is the perfect language, or Rust has everything I’ve ever wanted from a programming language; but it’s good enough.

Life is all about trade-offs, and I’m saying that Rust’s trade-offs are acceptable for me.


Proofreaders#

Divyesh Patil


Typst files#

Typst file for the Send/Sync diagram

Typst file for the producer/consumer diagram


Case Studies#

While preparing to write this blog post I collected a bunch of other articles and I want to “react” to them / recommend them.

Multiple GCP products are experiencing Service issues (2025-06-12)#

https://status.cloud.google.com/incidents/ow5i3PPK96RduMcb1SsW

“Without the appropriate error handling, the null pointer caused the binary to crash.”

lol, lmao ~ 🦂

meme of Garfield saying "You are not immune to nullptr"

on type safety

[image or embed]

— Adam Chalmers (@adamchalmers.com) June 14, 2025 at 8:12 PM

Frog put the value in a option. “There,” he said. “Now we will not deref any more null pointers.” “But we can unwrap the option,” said Toad. “That is true,” said Frog.

Yes, but, .unwrap() would’ve raised flags. Also, wrapping the pointer in Option would be a pretty big signal that “hey, you want to be more careful here”. In Golang/C++, you don’t even know if the value can be null.


Piccolo - A Stackless Lua Interpreter by kyren (Catherine West)#

https://kyju.org/blog/piccolo-a-stackless-lua-interpreter/

Piccolo is a lua interpreter in pure, mostly safe Rust.

Kyren gave up on the VM for four years because she couldn’t figure out how to make it work with the borrow checker.

But, in the end, the architecture she ended up making turned out to have more features like cancellation, and better concurrency.

So, it just made the VM better, and now there’s a reason to use it over other VMs. It’s their “killed feature”.

Borrow checker doesn’t just prevent memory safety bugs, it also forces you to design the program in a better way.


Matt Godbolt sold me on Rust (by showing me C++) by Gustavo Noronha#

https://www.collabora.com/news-and-blog/blog/2025/05/06/matt-godbolt-sold-me-on-rust-by-showing-me-c-plus-plus/

Gustavo said, and I quote “a well designed language saves you a lot of brain cycles by not forcing you to think about how to protect your code from the simplest mistakes.”

If that’s not reducing the cognitive load then IDK what is.

C++ had decades to learn, but it didn’t matter.

From my personal experience, when I was following Learn OpenGL, I kept shooting myself in the foot because C++ is supposed to have a feature, but MSVC doesn’t support it. I tried to use smart pointers, but I couldn’t use them instead of normal pointers.

Also, it doesn’t mesh with the way I learn. Initially when I have to learn something, I go with spoonfeeding. Once I’m done getting spoonfed, I jump directly into a project, and then proceed to fuck around and find out. I like to see what methods are available on a given struct, and read the docs for them.

I couldn’t do that with C++. I tried to see what other options I can use for glBegin, and all I saw was macro expansions. Enums being just integers was also extremely annoying, because I could pass GL_TRIANGLE_STRIP to… let’s say… glGenerateMipmap.

It felt like the language itself is fragmented.


Ownership Benefits Beyond Memory Safety by Ian Wagner#

https://ianwwagner.com/blog/ownership-benefits-beyond-memory-safety

Ian says that it prevents subtle bugs where you don’t know if a function will return a new value or modify the old one.

I feel this the most when I write JS/TS, some functions modify the value, some functions return new value, others modify the value and returns it again, and then some modify and return the old value.

He also mentions that traditional functional languages also have the same benefit, but in their case, everything is cloned because everything is immutable, so you just aren’t given the choice. On the other hand, Rust gives you the choice, and makes the choice explicit.

I’ll directly quote him, “the borrow checker is a powerful ally, and you can leverage it to make truly better APIs, saving hours of debugging in the future.”


Evolution of Rust compiler errors by Kobzol (Jakub Beránek)#

https://kobzol.github.io/rust/rustc/2025/05/16/evolution-of-rustc-errors.html

One of the best things about Rust is how good the error messages are.

Here, Jakub shows the evolution of error messages.

To quote the article directly “a lot of effort has to be put into the messages to make them really good.”

It’s interesting to see how the errors went from

info dump which may or may not contain information -> short description but still a lot of information -> just useful information with lots of white space -> colored output to attract your attention to the important detail -> actively telling you what to do.


Communicating in Types • Kris Jenkins • GOTO 2024 by GOTO Conferences#

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

Kris discusses how you can use the type system to encode and enforce rules.

Doing so makes communication easier, it allows your code to be the single source of truth.


Why you should use Rust by Sebastian Woehrl#

https://blog.sebastianwoehrl.name/blog/2025-05-rust/

Sebastian starts by giving context that he works in with cloud native technologies, and more specifically, Kubernetes. Now, I’d expect someone who uses Kubernetes to use Golang or Python. And he says that he used to use those, but nowadays, his favorite is Rust.

He says Python is good enough for IO-bound applications, but dynamic typing makes things hard.

Golang is good for Kubernetes due to the ecosystem, but existence of nil, checking errors being optional, silent initialization, and duck-typing for interfaces are a design issue and make “make working with a large or complex codebase unnecessarily hard”.

Then he proceeds to talk about why he thinks Rust is great, and why, even though Rust’s ecosystem for cloud-native isn’t that good compared to Golang, he still prefers it. He also goes over the trade-offs.

I do agree with him that the compile times aren’t great, but the trade-offs feel worth it. See:

started working on game #3, spent 1 hour setting up, and then the next 7 hours battling quaternions and bevy, the compilation times are so atrocious JFC

i almost considered starting over in godot

— Kathryn<‘u1f338> (@sakurakat.systems) June 1, 2025 at 10:18 PM


Constructor acquires, destructor releases by Gustavo Noronha#

https://medium.com/@gustavokov/constructor-acquires-destructor-releases-e1455b63289c

I think just the quote “I am sure there are data races here, the compiler is just not telling me where” is enough :P


Leveraging Rust Types for Program Synthesis by Jonáš Fiala (ETH Zurich, Switzerland), Shachar Itzhaky (Technion, Israel), Peter Müller (ETH Zurich, Switzerland) Nadia Polikarpova (University of California at San Diego, USA), Ilya Sergey (National University of Singapore, Singapore)#

https://dl.acm.org/doi/abs/10.1145/3591278

The paper goes over their tool which generates code from just type signatures.

If Kris Jenkin’s talk intrigued you, you should read this paper.


Codegen your problems away - device-driver toolkit - Dion Dokter by RustNL#

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

I found the “HOLD ON! You can run cargo run AND cargo doc AND cargo fmt AND rustup update And it just works?” slide hilarious, it also highlights how good the tools are for Rust, especially when it comes to embedded development. You don’t need to install anything different for embedded development, and I think that’s a huge benefit.


We deserve helpful tools - Pietro Albini by RustNL#

https://youtu.be/aHjSraYpsLw

Pietro talks about the momentous effort that goes into making sure Rust’s error messages improve over time.


It’s Embedded Rust Time - Bart Massey by RustNL#

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

Bart talks about how great the experience is Rust for embedded. It’s similar to Dior’s talk but covers it from a professor’s point of view, and as someone who was working in Rust embedded since before Rust Embedded Working Group was a thing.


Rust Could be a Good Beginner Language by SCP-iota (Hazel)#

https://scp-iota.github.io/software/2025/06/11/rust-for-beginners.html

Hazel says that one of the biggest problem with learning Rust coming from another language is that you need to, quote, “Forget Everything You Know”, so it’s easier for beginners to learn Rust, since its just like learning any other language.


Comments on Bluesky#

These are just some of the posts I found on Bluesky


ngerakines.me and natalie.sh on why they like Rust#

Rust has a lot of pros and cons, and I get that it isn't for everyone. I sure do @smokesignal.events being a single 48.7MB container for both the app and utilities though. #atprotocol #atdev

— Nick Gerakines (@ngerakines.me) May 13, 2025 at 7:52 AM

love to write small and fast programs (mostly) by default

[image or embed]

— natalie (@natalie.sh) May 13, 2025 at 9:03 AM

jamesmunns.com on the ever improving standard library#

please do not attempt to fight the collections (you will lose)

— The Museum of English Rural Life (@themerl.bsky.social) May 6, 2025 at 4:57 PM

Rust's approach of continually improving built-in stdlib data structures

[image or embed]

— James Munns (@jamesmunns.com) May 6, 2025 at 7:55 PM

joke explainer/well actually:

Practically, external crates DO beat the std collections pretty regularly, for a while. However whenever practical, the stdlib will adopt the same techniques used to beat it, meaning that picking std::collections is usually a pretty smart choice over a long timescale

— James Munns (@jamesmunns.com) May 6, 2025 at 8:11 PM

i still feel like "better defaults" should be in rust's sales pitch somewhere

— Kathryn<'u1f338> (@sakurakat.systems) May 6, 2025 at 8:33 PM

astrakernel.bsky.social showing bevy running on esp32#

B . E . V . Y

Rusting Everything…

#rustlang #esp32 #bevy

[image or embed]

— AstraKernel 💫 (@astrakernel.bsky.social) May 7, 2025 at 10:56 PM

🎮 Breakout Game for ESP32 with OLED Display - Built in Rust Using the Bevy Engine

Thanks to bevy for introducing no_std support

I am not a game dev and this is my first attempt using Bevy(so, I may not have utilised it properly)

github.com/ImplFerris/e…

#rustlang

[image or embed]

— AstraKernel 💫 (@astrakernel.bsky.social) May 8, 2025 at 9:29 PM


gotocon.com showing Kris Jenkin’s talk#

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

Modern type systems go beyond the compiler—they're a design language. Watch @krisajenkins.bsky.social explore how types improve thinking, communication, and collaboration in software.

[image or embed]

— GOTO Conferences (@gotocon.com) April 25, 2025 at 5:33 PM

fun, covers all the reasons I prefer strongly typed languages.

another benefit is reducing cognitive load, which Kris hinted at but didn’t explicitly say during the “Describing context” section.

— Kathryn<‘u1f338> (@sakurakat.systems) April 25, 2025 at 7:51 PM


nekotachi.bsky.com and sopwithpuppy.bsky.social talking about how Rust made good language design decisions#

i really appreciate rust actually doing interesting things with syntax instead of just "yeah we'll just copy C verbatim ig"

“everything is an expression” is very cool imo.

— soweli Neko (@nekotachi.bsky.social) May 13, 2025 at 11:16 PM

Rust also feels like it has struck the perfect balance between: a bunch of hyperspecific syntax for things, and defining things 'in-language'

like how the ? operator isnt out of place despite optionals being actual enums, or PhantomData being a struct and not an annotation on the generic bound.

— sopwithpuppy.bsky.social (@sopwithpuppy.bsky.social) May 13, 2025 at 11:37 PM


mrjimmyblack.com on how error messages got them through the borrow checker learning curve#

I’ve been on rust since 2017 edition. Compiler error messages were what got me through the borrow checker learning curve and they’ve come crazy far since then. kobzol.github.io/rust/rustc/2...

[image or embed]

— Jeremy Blackburn (@mrjimmyblack.com) May 17, 2025 at 6:54 AM

r.bdr.sh talking about Rust’s developer experience#

the more i learn rust, the more i want to use it for everything.

i like the errors, i like clippy, i like the language features, but most of all: I like the way it makes you think.

i think “rust is just for systems programming” is more meme than truth.

— mirrorless gamera (@r.bdr.sh) May 17, 2025 at 4:35 AM


eikopf.dev on them being neurodivergent and loving rust#

i'm massively neurodivergent and i love programming in rust! it sparks joy! i have committed untold atrocities with macros!

— oliver (@eikopf.dev) May 19, 2025 at 8:01 PM

philpax.me on Rust’s design decisions and piss.beauty being masochist with clippy#

languages and linters that make unused variables a fatal error: it's on sight

once again, the glorious Rust programming language has charted the correct path here in making it a warning that you can make fatal if you want

— philpax (@philpax.me) May 20, 2025 at 4:08 PM

you should enable it though

— 🖤stellz🖤 (@piss.beauty) May 21, 2025 at 2:46 AM

keep your sick ways away from me (unless they're on CI on main, in which case I agree)

— philpax (@philpax.me) May 21, 2025 at 2:54 AM

team "every clippy lint is a fatal error"

— 🖤stellz🖤 (@piss.beauty) May 21, 2025 at 2:55 AM

I do something similar! I have a majority of clippy lints on and find them helpful rather than overwhelming or useless.


bencates.bsky.social talking about trans women being overrepresented in Rust community and segfaultvicta.bsky.social theorizing why#

bluesky is the place where I help perpetuate stereotypes of trans women being rust programmers and argue with gay men that they have >20% responsibility for Trump, did you look at all that gold leaf, and somehow I am not canceled

maybe because those are actual jokes, though, I dunno

[image or embed]

— Ed (@ed3d.net) May 21, 2025 at 7:38 PM

Jokes aside, trans women really are wildly overrepresented relative to baseline demographics in the rust community and I'd love to know the backstory behind that.

— Ben Cates (@bencates.bsky.social) May 21, 2025 at 7:42 PM

greater-than-background-rate of disaffected trans nerd programmers primed precisely for a language LIKE Rust to exist + early Rust founder effect doing SOMETHING incredibly right to make trans ppl feel comfortable and welcomed in the community, is my sketch of what happened there

— J. C. Cantwell 🌻 (@segfaultvicta.bsky.social) May 21, 2025 at 10:40 PM

I don't know the specific history in detail but I know that must have been what happened, it probably could have been like, Elm or Elixir or something like that but

— J. C. Cantwell 🌻 (@segfaultvicta.bsky.social) May 21, 2025 at 10:40 PM

I have personally experienced how Tim Click makes sure the community is welcoming and comfortable for everyone.


laniakita.com on how useful the Rust compiler is#

i still love how friendly the rust compiler is, dropping hints on how to fix buggy code. Ferris 🦀 really is the bestest <3

— Lani (@laniakita.com) June 2, 2025 at 3:14 PM

emily.news replying to steveklabnik.com on how Rust feels more comfortable#

#rustlang Could be a Good Beginner Language

scp-iota.github.io/software/202…

[image or embed]

— Steve Klabnik (@steveklabnik.com) June 12, 2025 at 3:37 AM

okay i have been sincerely thinking this since i first started using any Rust. it feels so much more comfortable to engage with a system where the behaviors and boundaries are more explicit, where the tooling is more deeply integrated and more intelligent.

— E = mily² (@emily.news) June 12, 2025 at 4:05 AM

elias.sh quoting corrode.dev’s article#

"I believe that we should shift the focus away from memory safety (which these languages also have) and instead focus on the explicitness, expressiveness, and ecosystem of Rust that is highly competitive with these languages" corrode.dev/blog/foundat...

[image or embed]

— Elias de oliveira Granja 🦀 (@elias.sh) June 13, 2025 at 10:44 AM

This post was the reason I read the article and found out just how much better and objective their article is lmao.

Why Rust?
https://sakurakat.systems/posts/why-rust/
Published at
2025-06-09
License
CC BY 4.0