Rust has many language features and they’re all largely disjoint from each other, so knowing some doesn’t help me guess the others.
I found myself more often in a state of creative flow, devising plans based on the limited capabilities of Zig and then executing them. This flow wasn’t constantly broken by stops for documentation or side-quests to investigate some feature/syntax/library.
And the way we reduce the complexity of difficult problems is through abstraction. So instead of managing the lifetime of individual memory allocations, let’s abstract that, and manage a group of memory allocations. It sounds simple, but depending on how you group allocations, you can literally reduce the number of malloc()’s and free()’s from thousands to a handful.
My approach, on the other hand, is this: instead of assuming that malloc and free were the correct low-level operations, we can change the memory allocation interface—tweaking what the user and implementation agree on—to simplify the problem and eliminate many of the problems found in the traditional malloc and free style of memory management.