&gt; For a start, if you&#x27;re developing a systems language in a modern way, (say C++11&#x2F;14) you&#x27;re already used to thinking in terms of move semantics, const refs and shared vs unique pointers.<p>I think this is the difference when coming from a primarily GC&#x27;d (So I suppose &quot;non systems&quot;) language. Coming from C# I never even thought about the difference between storing a concrete type in an array vs storing an abstract type or interface in an array. In C# so long as they are reference types, there is very little difference. Each entry would be a pointer to the heap regardless. Moving to a language that encourages stack allocation and structs on the stack instead of on the heap, and actually has you motivate each pointer is a huge difference.<p>The same goes for ownership: it&#x27;s very easy to forget it with a GC&#x27;d runtime (this is just sloppy, but the GC will unfortunately help you be sloppy). Way too often the code you write in a GC&#x27;d language will have convenient pointers both up, down and sideways in any data structure, just in case. Writing a doubly linked list in C# is no harder than writing a singly linked list. In Rust the singly linked list is lesson 1, and the doubly linked one is much later.