This article by Dan Abramov about Bug-O Notation is a great one.
The Big-O describes how much an algorithm slows down as the inputs grow. The Bug-O describes how much an API slows you down as your codebase grows.
Without explicitly calling it out, he describes using simple Finite State Machine concepts that allow for explicit, identifiable state positions rather than nested calls and race conditions. It’s a great way of thinking about things - if you know where you are, you can explicitly reset the UI and rebuild it with much less effort.