Rust Survey 2019 Results
blog.rust-lang.org
blog.rust-lang.org
The problem I had was basically the IDE integration in VSCode. RLS was okay but unreliable. And if it only works most of the time, it may as well not work at all. Especially when it only sometimes gave me code completion and type checking (A lot of "unknown" would fill my code).
Then Steve pointed out Rust Analyzer in a previous thread and I was off to the races. Rust Analyzer has gotten _so good_. Having a VSCode setup that gives me immediate feedback for my mistakes and code discovery makes a huge difference (to me at least). Maybe a bit of feedback is that I wish Rust Analyzer hadn't been so hard to discover. Though maybe that's just because it was new.
That, combined with my nightly march through The Rust Book has me well beyond, "I wish I could learn a systems language but !@#$ C and C++ are just so complicated and unforgiving" and into "wow, it's no-longer a matter of _if_ but a matter of how much I want to hone my understanding." Rust is a beautiful language that way. It guides me away from rookie mistakes that would leave me disenchanted after hours of debugging something dumb. (It's hard to be unrelentingly dedicated to learning something new now that I have young kids. When I was a teen it was easy)
I don't want to come off as a Rust fanboy. I have yet to implement much of anything (though hopefully by next year I'll have a Game Boy emulator to show you all). But I want to give thanks and proselytize a little because it has been such an empowering experience.
I wish I had something this slick for Scheme, C, C++ and even C#. Omnisharp is good, but not this good.
C# Roslyn analysers or StyleCop, also on VS.
CheckStyle or PMD for Java, alongside Netbeans, Eclipse or InteliJ.
XCode analysers.
CLion Inspections.
It helps that rust has incredible documentation.
Never in my life has Emacs segfaulted or indefinitely suspended. It was nary a day that VS would not do so.
It as a good workaround for me during the late 90's up to mid-2000 until UNIX finally got proper IDEs.
And yes, I managed to bork it multiple times.
C++ complicated compared to Rust? They offer roughly the same features and both are complex languages if you want to understand what is really going on.
Rust is a very good language that competes with C++. The main feature it brings to the table isn't simplicity (Rust, like C++, isn't simple at all), but the borrow checker.
Please avoid making comparisons between languages if you don't know them (as you claim).
That's a bit misleading though. Yes, C is very small - but that doesn't mean it's magically easy to understand. It's size has a huge consequence; the language doesn't do much for you, so it's up to you to fill in the gaps, e.g. correctly manage memory
If you learn C, you'll find that most used languages are compatible with C way of thinking. You can pick up C#, Java, Javascript, Python, PHP with ease as you kind of think in the same way.
While Rust, the language might not be terribly complicated, you have a totally different paradigm, the restriction on variables and the borrowing system makes it totally different than the languages people are used to, to the point that for beginners is totally unintuitive.
You can't just declare a variable, initialize it, pass it to a function and get a result back.
You can't have self references in a structure.
No, siree, as a beginner learning Rust you have to do a lot of complicated dancing around the borrow checker.
Comming from C like languages I find even functional languages like F# easier to pick up. Because they feel more intuitive. Unlike Rust you kind of feel what kind of code you need to write to get a workable result.
Right now I feel that the only advantage of Rust over other safe by default languages is speed. You can use low level constructs and unsafe features like raw pointers in C#, but the garbage collector for the safe code slows it down.
I don't think garbage collected languages can ever be as fast as Rust.
Reference counting like in Swift is another way to provide simplicity, but I see Swift is even slower than garbage collected languages.
So if your use case needs both performance and safety, Rust is your best bet.
It seems that from simplicity, performance, safety you can only pick two at once.
Microsoft Research is working on a language inspired by Rust. I'm curious if they can come up with something as safe but easier to use. I wouldn't bet on it. They aren't convinced of the outcome since they recommended to write or rewrite parts of their software in Rust instead of waiting for the new magical language.
A good thing from Microsoft evaluating Rust to use in their huge code base is they learned about a few weak points and are making recommendation to Rust team.
One side effect of Microsoft embracing Rust might be that other corporations like Google and Oracle might avoid it to distance themselves from Microsoft.
https://fuchsia.googlesource.com/fuchsia/+/refs/heads/master...
Its simplicity is at the same time its own worst enemy, in that it pushes down all the difficulties, complexities and verbosity for you to manage yourself. Perhaps an extreme comparison but just to show that simpler language doesn't always yield a simpler program.
Programming web apps and lob software in C might be tough. As would trying to program systems software in Python or Java.
I was going to compare how many pages the rust standard has, and compare it to the C standard (plus 20% for the "correctly manage memory" that you pointed out as something extremely complicated). http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
Anyway.. C is a rather simple language. No matter what the opinion of rust programmers is.
Please don't respond to this post. At least not with the bog standard "undefined" "unsafe/memory" and other shallow conceptions.
Sorry. "correctly manage memory" in C is not 20% more problematic, it's like dividing by 0, infinity% more problematic.
Nobody has gotten it right. Ever. Nobody.
The Mozilla team switched from C to C++ trying to get memory right. Failed. Then they tried GC. Failed. Then they tried to go back to manual. Sill failed.
So they wrote their own language to solve the problem--Rust.
Jury is still out, but the situation is a lot better than when Mozilla started.
Still Mozilla software, including Firefox, run at more than 80% in C++ and are fully usable right now.
It is also the case of probably almost all the software you see on your own desktop right now... Most of them are C++.
Meaning, all considered, your notion of "failed" is pretty relative and opiniated.
The work on ANSI C started in 1983, 11 years after C came out. And it took 6 years! to complete.
If Rust is as sucesful as C was during its 11 first years, Rust will most likely get a formal spec eventually. But don't hold your breath because it's going to take a loooong time to get there.
With Rust none of these things are issues and we get to actually spend time solving problems in the language instead of just understanding the language. Yes, C is as simpler language, but it's got no safety rails, and when you're a beginner at systems programming it's nice to have a friendly compiler who can help you pinpoint errors rather than to be shown "SEGMENTATION FAULT" and feel like you're on your own.
For example, adding dependencies. And this one thing makes a lot of practical tasks simpler too, because there is a whole swathe of code you simply don't need to implement at all.
What's simpler: Implementing a HashMap in C, or `use std::collections::HashMap`? If you really need to understand what's going on under the hood then yes C might be simpler. But when was the last time you needed to inspect the details of your HashMap?
There are also things like C's declaration syntax, which is anything but simple. And header files (even for your own code).
However we aren't comparing languages here but standard libraries.
If we introduce modules in C instead of header files and add some simple data structures and algorithms to stdlib, I can see C being simpler.
C++ has data structures in its standard library and will have modules starting with C++20.
Rust:
let mut map = HashMap::new();
map.insert("foo", "bar");
println!("Value: {}", map.get("baz").unwrap_or("<none>"));
C# Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("foo", "bar");
try {
Console.WriteLine("Value: {0}", dict["baz"]);
} catch (KeyNotFoundException) {
Console.WriteLine("Value: <none>.");
}
[0]: https://doc.rust-lang.org/rust-by-example/std/hash.html[1]: https://docs.microsoft.com/en-us/dotnet/api/system.collectio...
var dict = new Dictionary<string, string> { ["foo"] = "bar" };
Console.WriteLine($"Value: {dict.GetValueOrDefault("baz", " <none>.")}");
Better look for another example.System Programming is the custom tailoring of data conditioning to a particular set of circumstances and then taking responsibility for the benefits and consequences of that those choices that differentiates systems programming from the other broad categories of program construction.
Rust is a fine language if it fits your use case, and you feel as though the purported benefits of the ‘borrow checker’ assist you in writing quality code, but if you just want a programming language that provides a large library of pre-written solutions, then the difference between language is dependent only on use case and usage requirements. Saying Rust is simpler than C because you can use a pre-written HashMap implementation is ridiculous, because you can do the same thing in C (I mean use someone else’s HashMap). But if ‘systems programming’ is the area of interest, being able to inspect/implement the actual HashMap is a key concern, and just dismissing that aspect is not an acceptable proposition.
Don't gatekeep. Rolling your own containers has no bearing on whether or not the language is a systems programming language.
I'm using it to do real time audio and graphics, but I don't have the time to hand roll my own data structures because I have a demanding day job and other responsibilities. I still get to have the benefit of using a fast, modern, bare metal language.
> Saying Rust is simpler than C because you can use a pre-written HashMap implementation is ridiculous
No it's not. HashMap is literally there in std::collections to import and use. You don't need to find a library, know about the linker, etc.
Rust makes working in this domain so much easier than C and C++. You can go from zero to productive in a reasonable amount of time.
C++ has a hash map in its standard Library since 10 years.
> You can go from zero to productive in a reasonable amount of time.
That's definitively a very WRONG assumption. Anyone starting to use Rust, even with 10 years of C++ experience, will spend from HOURS to DAYS fighting the borrow checker.
It is not "zero to productive", Rust is not easy to learn, nor productive for beginner.
Is it however worth the effort ? I believe it is. Especially if you are looking for a language providing you safety first.
OP was talking about C, not C++/STL.
> Anyone starting to use Rust, even with 10 years of C++ experience, will spend from HOURS to DAYS fighting the borrow checker.
You might have learned Rust pre-1.0 or non lexical lifetimes. They've made a tremendous amount of work to improve the language and make it beginner friendly.
A few weeks ago I watched one of my coworkers implement a simple toy state machine app after having just read a tutorial. The compiler literally hand holds you now.
The meme that Rust is hard needs to die.
I still use Rust almost every week for personal projects, I enjoy it and I still would not qualify it as quick "zero to productive". It still fall behind C++ in term of productivity for me.
Many things that few lines of C++ allow you to do in few lines requires mental gymnastic to wrap around the borrow checker, strict typing and Rust error report system in 10-20 lines.
Comparatively speaking, I program in C++ since 15 years and in Rust since 3 years. Still, everything I do in rust takes between 1.5X to 3X more times to do than in C++, even if the tooling is better.
I know I am going to make enemies saying that with the number of Rust fanboys on YC, but... this is my experience.
And it is not a surprising experience.... Anyone that programmed in OCaml or strict typing language like ATS already experienced that... The strict typing gives you runtime safety and make your program "just" run (less bug-prone) compared to Weaker typed language....
But... it has a cost... like everything... And the cost is much more mental gymnastic... meaning time... meaning less productivity.
Stuff like build systems, setting up dependencies, understanding memory allocation etc...
Rust has its own steep learning curve but C is only really simple in terms of a language, not the experience of using the language.
Also in my experiences the rust compiler errors are extremely helpful, especially compared to the c++ template stuff.
There's nothing wrong with that. People need to see that everyone around them is catching the Rust bug.
I want people to feel like they're missing out so that they too will take the plunge. The sooner everyone knows Rust, the sooner employers will start using it internally.
Rust seems to be popular only in the web sphere, where Javascript and Python programmers are tweeting that they now know a "systems language".
I see that is the best thing Rust brings to the table, as the scope of learning and using Rust is pretty much “scoped “. Once you are comfortable with the compiler, you can use Rust reliably and deloy code to production. Whereas C/C++ is very “open” to learn, you can learn the syntax and basic in a couple of weeks, but to use it correctly and reliably (to a certain degree) WITHOUT SUPERVISION from another advanced programmers takes years of experience under your belt.
This is great because now we are starting to get faster, more performant libraries and code. People switching from Node to Rust see huge speedups. Perhaps we'll also switch from JS to rust with WASM. Rust is nice because it's high level enough to write code with algebraic data types, like in TypeScript, so that maintenance is easier. Personally I'd love to see as many people as possible move from JS and Python to Rust.
Thank you for the suggestion :-)
I use vi. Works every time.
My old server needed nested callbacks, wrapping everything in refcounting, loops via recursion, and Either for control flow. Still easier than C, but not pretty.
Now it's just `do_this().await.do_that().await` and I'm done! Huge congratulations on shipping that.
For instance, I wanted to return a function (async) from a function. A seemingly simple task, but I couldn't figure it out and I had to ask on Stack Overflow. https://stackoverflow.com/questions/61167939/return-an-async...
The answer is obvious only if you know a fair deal of Rust. Thanks to the Rust team's amazing momentum I am sure the compiler will improve over time, but for now I found passing functions and closures around a bit harder than I expected. Totally loving the language though.
Even if we account 90% of that time to the lack of experience in Rust, it still feels like a massive productivity hit.
So unless you absolutely need to squeeze the most performance you can from the hardware it might not be the best choice.
https://www.rust-lang.org/static/pdfs/Rust-npm-Whitepaper.pd...
Go was designed to be extremely simple (simplicistic, if you want to be ugly with terms) while rust was designed with very different goals in mind.
Moreover the mental model of JavaScript is much closer to the one of go than the one of Rust.
If you are learning rust and you are not from C/C++ or similar low level languages you are basically re-learning how computers works. Usually on go you don't really care of the difference between the stack and the heap, in rust you have to.
Said so, it is really true that rust has a steep learning curve, however once you get over it the productivity is at least as high as go especially in the long term.
For one off script of ~100 lines I would pick go as well.
Their reasons appear to have been that Rust code has fewer bugs (who cares if you get your JS code done in an hour if you spend a week fixing trivial runtime bugs?), had better performance, and they didn't like Go's dependency system.
I definitely have noticed when writing Rust code I spend way more time getting it to compile, but I also have that "wait it worked first time? Impossible, I must have done something wrong" feeling waaaay more in Rust than I ever did with C++ or Typescript. I'm even starting to get used to it and think "sure it worked first time, it compiled after all!".
I wonder how their opinions on Go would change though, given that it now has arguably the best designed dependency system of any language.
> The rewrite of the service in Rust did take longer than both the JavaScript version and the Go version: about a week to get up to speed in the language and implement the program.
So that was an hour for a programmer who knew JS, and then a week for a developer who didn't know Rust.
Secondly, to me those times are acceptable, because they don't tell the whole story. JS is very easy to quickly prototype things in, but that doesn't mean it's great to maintain. Just yesterday in our JS code we have found in some places we are writing timestamps as an epoch number, and some places we are writing them as a DateTime string. It's not as fast as native code, nor as easy to parallalise, etc.
They are better than most docs, but sometimes they have gaps in their sample apps.
The WASM book, for example, goes from "hello world" straight to "game of life".
It's certainly an interesting algorithim and probably hits a sweetspot because its computation heavy(?), but at least for me it was too much noise around actually learning Rust and WASM.
Eventually I found a simple CLI idea I wanted to implement and decided to learn enough rust to do so. Glad I stuck with it.
Still haven’t gotten around to doing anything with Rust and WASM yet tho.
BTW the (3d!) pie charts are far less clear or informative than the nice simple bar charts, which could be used for everything here.
I didn't write this post, but I'll pass it along.
At the end of it you might even develop Stockholm syndrome and be one of those posting “if you just restrict yourself to these parts of the standard and run this 6 static analysers on your code then c++ is perfectly safe if you’re not an idiot”.
If you don’t want to learn c++ for its own sake, that’s time you could better spend learning a language that’s not actively trying to harm you.
Source: coded c++ for 20 years, now writing rust as much as possible.
With enough time, you will realize that any language try to harm you and has quirks. Just different quirks in different scope. Rust included.
> Source: coded c++ for 20 years, now writing rust as much as possible.
I coded for C++ for a smilar time. Now I write Rust on my free time and I still enjoy C++.
This "nightmarish many-tentacled footgun monster" is still a pleasure to use for many use cases and far more powerful than Rust for some scenarios ( constexpr/consteval, template with const litteral, overloading, low level control on memory allocator and a gigantic ecosystem of high quality libraries)
For the work I do GC is also a non-starter. I know it’s got some level of no-gc now but the last time I looked it wasn’t well-supported.
In short it seemed interesting but on-boarding felt hard. And with that the value proposition wasn’t there or well-advertised: It’s supposedly “better” in some ways such as faster compile times and better meta-programming and frankly that didn’t seem worth the effort.
Rust by contrast does an excellent job of onboarding and making it easy to learn the language (at least at an introductory level). It also comes with a very straightforward value proposition: just as fast as c++ but whole classes of bugs simply aren’t possible. Add in a little bit of ergonomics and functional flavour and I was hooked.
What I liked on it over Java and .NET languages, is no longer relevant after GraalVM, and the low level features in C# 7/8 adopted from Midori, came to be.
Also C++20 now makes much D less relevant.
Unfortunately the recent @safe and @live discussions don't inspire confidence in which direction they want to drive the language design.
1. The learning materials are much better. The official Rust book is excellent. And it doesn't take long to do a first run through it.
2. You'll learn much quicker with Rust. With C++ it could take you years of experience to gain a full appreciation of the pitfalls because they're often not apparent when you first write the code, only when you actually run into the bug further down the line. With Rust, you'll get a compile error and enlightenment is quick google and a reading of a blog post away.
3. Some parts of Rust only seems to be difficult for C/C++ programmers who have learnt the C(++) way of doing things and expect that to translate into Rust. They get frustrated when Rust doesn't let you use certain patterns. However as C++ is generally less strict, if you learn the Rust way first, then you'll generally be able to translate that fairly directly into C++.
I also think 2 and 3 are ... overstated.
I’m not sure which is correct.
If I weren't a C++ programmer first, I don't know that I would really grok the value proposition of Rust (not dealing with Move Constructors) or the trade-offs (library code has to provide differently-named functions that trash resources as an optimization, rather than just providing an overload that eats temporaries).
That seems like a very odd way to characterize the results (55% Linux, 24% Windows, 23% mocOS). Why draw the line between the two platforms that are 1% apart instead of between the two that are 31% apart?
For those who didn't try: this plugin works even in the Community Edition of IntelliJ IDEA.
Once you get to higher level protocols like HTTP, you also have questions like "should HTTP header be strings or encoded as types. There very much isn't just one way to implement it.
That's pretty fundamental and completely changes your API.
And, before you reply, you might want to know that while the majority of things do it with callbacks, both the lowest embedded AND highest custom networking systems implement networking with polling (for different reasons).
If anything, i would say that over the last year or so, too much effort has been put into making Rust a competitor for web development, what with async, and lots of attention paid to web frameworks. Meanwhile, C++ people i know mostly look at it and say "meh, no const generics, no placement new".
Second, we’ve been working a ton on const generics. It takes a long, long time. But it’s been a constant effort. We’ll get there.
(Placement new has had less attention.)
If (if!) Rust's mission was to replace C++, that would be a mistake.
That's pretty obvious, right? You decide to replace C++. You make a language which isn't a great C++ replacement. You attract users who aren't C++ programmers. They aren't interested in the things C++ programmers are interested in. You build features which don't appeal to C++ programmers. Lather, rinse, repeat.
I think at this point, in practice, Rust's goal isn't to replace C++. It's to become a better Rust.
From the very first introduction of Rust to the world: “a complied, concurrent, safe systems language.”
Then it was “memory safety without garbage collection”.
Now it’s “A language empowering everyone to build reliable and efficient software.”
Sure there is domain and design overlap, but the goal was never explicitly attracting C or C++ programmers. At least not exclusively.
That is still Mozilla's main angle on Rust, but Rust has grown much beyond Mozilla, so this is just history now as you describe.
This assumption only holds if people didn't want to do systems programming before. Many people who wanted to do it crashed into C++ and then said "yeah okay, not for me", which calls this into question.
GUI tooling like Qt or XAML, even OWL, MFC, wxWidgets, VCL, if I go pick 90's examples.
async/await runtime as part of std. C++20 async/await isn't relying to competing external libraries.
Mixed language IDE based development experience, including debugging across languages on the same session, e.g. Java/C++, .NET/C++, Objective-C, Swift/C++.
Standard library is a liability. It's only a matter of time before any non-trivial stuff will turn out to be worse than a 3rd party solution, and won't be able to catch up due to std's constraints (C++ regex being extreme example).
Rust has already learned that lesson with channels. So instead of having to say "don't use std's, use the other faster nicer thing", Rust skips over the tech debt part, and recommends the other faster nicer thing immediately.
And a clean separation of await from its runtime is actually pretty cool. I'm writing a GTK+ app right now, and I can await button clicks on its event loop.
Rust will be most popular with those who are 18 years old now and wanting to try native programming. When you compare the two, tabula rasa, it's just a no-brainer.
https://www.independent.co.uk/life-style/learn-language-scie...
It's nothing personal against anybody.
When is that? Knuth is 82.
Also, I haven't been following the Go ecosystem lately, so I could be wrong, but they seem to have done a good job at creating standard libraries for common stuff like http serving, and those libraries seem to have aged just fine.
I'll bite. Why?
Rust is a system-level programming language.
Not that this means that every demand needs to be acquiesced to, there’s balance to be found.
I used to code a lot in C++, but I've come to the conclusion that manual memory management is a cost that has to be considered seriously. e.g. one burden is that when you're declaring a field on a struct in Rust, you have to consider whether it needs to be a reference, value, automatic reference counted, boxed, if its a reference, what the lifetime is, etc. The only thing I miss about manual memory management is the RAII pattern.
Rust moves down a level of abstraction that IMO is not useful for most applications.
Thing is, with ongoing efforts on managed languages to integrated similar capabilities into their type systems, we can get most of it, even if we don't get access to the full package.
So I guess you're right, nothing I can think of quite fills the niche that Rust does, if compiling to a native binary is a hard requirement. Also I'm not aware of any widely-adopted language with borrow checking, if that's a feature that's valuable for your use case.
Rust belongs with the above but it has...checks notes...actix-web which was run by one guy who ragequit and apparently no one else is capable of taking the reins.
Also you forgot netty which is best Java networking library nowadays.
Java is a good example why batteries-included standard library is a bad idea. The fact that Java keeps reinventing things (Old I/O -> New I/O, Newer I/O; java.util.Date -> java.time.*; File -> Path are just a few examples) also proves that point.
Standard library must contain fundamental interfaces which are required by most libraries to interoperate with user code and with other libraries. String type is used everywhere, so standard library must contain String type, otherwise people will invent QString, CString, Glib::ustring and billion other string which do not interoperate with each other, so instead of writing useful code you'll convert one string to another. Array, Set, Map are used everywhere as well, so standard library should provide those interfaces. Filesystem paths, streams are useful. And similar things. But not big libraries like HTTP library. They should be implemented as independent projects, so the best one wins.
You're arguing against a strawman. These things are not in the standard library, but the ecosystem builds around them, and there are published JSRs that define the interfaces for foundational libraries (including both servlets and DI - of which Spring is just one of many compatible implementations).
No-one's arguing that Rust should have a web framework in the language standard library (I hope). But there should be one or more established options that the rest of the ecosystem knows about and interoperates with.
You can't compare a general use networking server such as hyper with actix-web. Hyper is used for a much broader range of scenarios than just web development.
I truly hope that programmers continue to broaden the ecosystem, but progress has been slow.
Then: "The majority of Rust projects (43%) are 1,000-10,000 lines of code."
Am I reading this wrong somehow? I've been rereading it a couple of times, and feel like you can't draw that conclusion.
On the other hand C++ has some huge array of books. All of the them being top notch.
- a CPU emulator
- a fully functional NTP client
- a skeleton grep implementation
- how decimal numbers are represented in Rust
- developing your own format for representing numbers
- a memory scanner so you can learn how game cheaters cheat
- handling UNIX signals
- inspecting binary files for hidden patterns
- an OS kernel + bootloader
- an L-Systems implementationAnd once the data processing code was in Rust, it made sense to have the endpoint that collected the data in Rust too. It would probably have been possible to optimise the node/python versions. But it was easier to write it in Rust that is designed for these high-performance scenarios.
An unexpected bonus was just how reliable our Rust code turned out to be. I'd definitely consider Rust for non-performance critical code on that basis.
(but then again who cares when you can just piggyback off Electron)
Rust doesn't do so well in the mobile app space.
Still, a very large portion of mobile apps are connecting to some back end service. I think I have exactly one app that stores it's data locally without a server connection (not counting games).
Additionally really don't see a need for having to deal with the borrow checker in distributed computing applications, instead of tracing GC + value types.
Rust's ideal place is like where Oracle, Apple, Google and Microsoft are placing C++, OS low level libraries, audio codecs, graphics drivers.
While it is true that some developer builds yet another e-commerce cart on JavaScript or PHP, some of is work in critical systems.
Systems that in one way or another allow our world to keep working.
What if DNS stop working? What if the service that get unemployment claims stop to work? What if the system that manages patients in a big hospital stop working? What if an avionics system in a big Boeing is done wrong? What if a database that keep track of citizenship corrupt data?
Those are problem just as serious as bridges falling down.
Some structural engineers build houses some other huge bridges. Some software engineers build carts for e-commerce, other fundamental systems of our world.
Programming is more like being a lawyer than engineering. But let's stop making analogies to other professions and just call it what it is: programming.
I've had better luck splitting architecture up between three or five leads (not four).
There is no "developer" in the list, but "system architect" is what match the definition.
its syntax is too irregular and permissive. (too much ruby?) people tend to disagree, but syntax is very important. that is, in fact, why python has won the scientific community. we don't wanna be spending brain cycles deciphering syntax.
as a side note, we blamed java for being verbose for years. in retrospective, java was right. i have never seen a piece of java that i couldn't understand. i may not know why the code is doing what it's doing, but i always know what the code is doing.
java has stellar readability!
with rust, only time will tell. my gut feeling is that the readability will not help the language when programs get old.
Java is pretty much the opposite, very large focus on architecture with DI-magic and extremely verbose. The lasagna building has gone out of style and never reasoned well with scientists which is why they never used it in the first place.
Compare [x for x, y in v] to v.iter().map(|&(x,y)| x).collect::<Vec<_>>(). There is a good reason for every bit of ugliness, but that does not change the fact that it is ugly.
``` let vec: Vec<_> = v.iter().map(|pair| pair.0).collect(); ```
I don't think that's really _that_ ugly. Yes, the pithy Python example you gave is simpler, but by the same token, the assembly you would write to achieve this makes the Rust look really simple. If you're going to try to write efficient code in a systems language like Rust, you're going to need to express things more precisely than you would in a scripting language like Python.
Also, I would write the second example different:
let r: Vec<_> = v.iter().map(|(x,_)| x).collect();
In my opinion that's superior in readability to both of your examples, but probably also only because I'm used to it.Then ' for lifetimes. Personally I like short keywords. Maybe "life"?
Then there are the <> generics which some don't like.
And most modern languages don't have references anymore plus & was always ugly and non intuitive as a symbol. Again, maybe a short keyword? "ref"?
The SGX and no_std support might be of particular interest to some of you.