Is there a coding style and set of best-practices that avoid (not bypass) "fighting the borrow checker"?

60 points DoxxThis1

In reading about Rust one of the few recurring criticisms I keep encountering is that you will have "to fight the borrow checker."

I have several questions about this.

Is "fighting the borrow checker" something that really happens when you're writing idiomatic Rust, or is it a result of C++ / Java / Python developers trying to force their long-held coding styles onto Rust?

i.e. is this something akin to a C++ developer "fighting the lack of pointer arithmetic" in Java? OR a PHP Developer "fighting the stupid indentation rules" in Python?

Is there a particular style of Rust or set of patterns that tends to let the borrow checker do its job without becoming a nuisance?

Before you respond PLEASE NOTE I'm not talking about "bypassing" the borrow checker via stupid tricks like stuffing all your memory into a byte array.