È qualcosa che ha a che fare con il funzionamento del cervello umano. Siamo cablati per essere "abbastanza bravi" per attività che di solito non richiedono precisione ingegneristica. C'è una ragione per cui i casi con cui abbiamo più problemi si chiamano casi "edge".
Probabilmente il modo migliore per evitare errori off-by-one è l'incapsulamento. Ad esempio, invece di usare un ciclo for che itera una collezione per indice (da 0 a count - 1), usa un ciclo di stile for-each con tutta la logica di dove fermarsi incorporato nell'enumeratore. In questo modo devi solo ottenere i limiti una volta sola, quando scrivi l'enumeratore, invece di ricorrere ogni volta alla raccolta.