FWIW, you can also write Rust without
having to "deal" with the borrow checker either. A common problem I see from experienced programmers picking up Rust is trying to write code with minimal allocations,
before learning enough of the language to properly represent them (or whether the pattern
can be represented) in safe Rust. I recall an argument I got into with a colleague who was adamant that boxing closures was the wrong call and spent an inordinate amount of time trying to represent a pattern that wouldn't work without doing so. Or the time I myself spent a lot of time trying to return borrowed values when in hindsight I should have called .to_owned() once and spared the time I spent looking for an allocation-free alternative. (Cow would have worked in that case, but I didn't have the experience to know that for sure, and today I wouldn't have chosen it because it would have made using the API more cumbersome than needed.)
A lot of the borrow checker problems go away if you're ok with allocations, storing trait objects on the heap, making your ADTs not have references, etc. But getting familiar with the language enough to know "this requires unsafe or for<'a>" takes a while.