Rust in Large Organizations
gist.github.com
gist.github.com
https://users.rust-lang.org/t/rust-in-large-organizations-me...
This was a meeting between a few employees of large organizations using Rust (Facebook, Google, Microsoft, Mozilla) at RustConf two weeks ago to discuss the common needs of enterprise users and how to collaborate effectively on the language and ecosystem going forward.
There is a proposed RFC to reduce the need for build.rs scripts in many cases [1], will likely be merged within the next 2 weeks.
I think the history behind this is that Cargo was built with only Rust in mind; when your world is 100% Rust, you generally don't need much extensibility in your build process. Make, scons, and autotools all seem like they were designed to be more language agnostic from the start. It'll be interesting to see how cargo needs to evolve to be able to support interior with other ecosystems at the level that larger companies need.
It's mentioned in the writeup.
See https://github.com/crate-ci/imperative/pull/4 for an example
I hadn't even considered the benefit of reducing build.rs usage. I was focused on speeding up people's builds by reducing the number of dependencies involved and making my crate do less work when being built.
Tempted to turn this pattern into a crate to reduce the hump to overcome to adopt it.
FullStory itself is somewhat polyglot (Go on the server, TypeScript/react in the browser, Java/ObjJ/Rust on native mobile) and we've felt some of the pain around having a consistent and reliable build environment. We've also had internal discussions along these lines - ie: which deps can we trust from various package managers (npm has interesting arbitrary code execution as well!).
Building tooling to manage all these languages in a common system is a _huge_ commitment. We're actively hiring for the role of productivity engineers which is something that I see becoming more important in orgs as they scale up, the same way that devops/SRE split out in the 2000s.
ms: would like to know how to control use of unsafe in codebase
google: grep
My fumbled metaphor of "Find in page across a lot of pages" didn't really land...
I believe that’s what MS is speaking about. Google probably simply puts this on the shoulders of the developer.
I would imagine that Rust programs benefit from LTO by removing static assertions necessary for memory safety that C++ programs simply omit, and by unraveling functional style code that Rust programs often get shoehorned into. Or maybe not, but that's one non-LTO that's needed.
That may be true, but even the big boys can't converge, and they all have their own build systems.
Attempting to add/remove features from cargo/rust when even the big companies can't agree as to what is most important in a build system seems like a path to disaster.
The big boys aren't always right (see: Gradle/Groovy).
I have a use case where I have two iterators on a linked list in nested loops and the second iterators deletes some elements as it goes. Is this something I can express in unsafe rust?
C:
``` node prime= list.head;
while () { node probe = prime.next;
while()
{
if () //condition on prime.data and probe.data {
probe.next = probe.next.next; //& drop stuff
}
}
```even python has some "tricks", try "x=256; y=256; x is y" and "x=257, y=257, x is y" under python, or 'x=[], y=[], x is y; x=y=[], x is y' you will know what I mean, you actually need know some internal designs to use python properly.
At the moment I feel golang has the right trade off for programmers, be it beginners or senior developers.
Early in studies, I couldn't really wrap my head around pointers. I mean, I knew what they were and how I needed to work with them, but they just seemed like a weird abstraction. A short intro to assembly and later on, a computer architecture class, cleared that all up.
Everyone learns differently, so my experience likely isn't applicable. But, for me, no longer treating the CPU as a black box helped me get a much better mental model of lower-level languages. And I think I'm a better high-level developer for it.
You should never be to surprised when you create a bunch of new values and a language like python isn't "smart" enough to say "these are all the same value, so I'll create one of those and have x, y, etc all point to the same thing."
Rust has a much smaller surface area, but does have some unique things to understand like the borrowing and lifetimes. The good thing is that as the borrow and lifetime checkers in the compiler get smarter, the less you have to know about those things while writing plain-jane code.
You mention downthread that you have an EE/comp-arch background. I do as well, and have found that useful on occasion when working on embedded systems, but perhaps not a huge asset when dealing with language esoterica. Sure, perhaps understanding pointers and memory access is easier when you understand how memory actually works, but it'll only get you so far.
You still need to have a grasp on the difference between reference equality and value equality without getting into anything anyone would call tricks or implementation details (eg, after `x = []; y = []; x.append(1)`, how many elements does y have?).
Python should have prevented checking primitives with is though -- only let object pointers...
That would have been less surprising (since for < 256 the singleton-ness means all same valued instances have the same "address" (id), so behave in equality check as if they were plain numbers).
[0]: https://github.com/python/cpython/blob/master/Objects/longob...
too many similar demos
by the way I actually like python and use it often, just saying it can surprise you when you start, not intuitive per se until you become good at it.
Perhaps use x = x + [1] instead?
But yeah, surprises like this (unexpected return values) are actually a pretty strong case for using a language like Rust or C++ where the compiler will tell you this before you run the program.
x=[1,2],id(x), x+=[3], id(x) ; # same id, means x stay at the original location
there should be a blog page to list those surprises for beginners :)
It’s a disaster for newcomers to programming in general. I am pretty sure a seasoned developer in any other language would understand why that returns None, too.
Or don't compare numbers with "is", since you're not supposed to? Then you can remain oblivious to the underlying mechanics that break "is" comparison for larger integers...
Have you tried Clojure?