¿Por qué los errores de uno en uno son tan comunes y qué podemos hacer para evitarlos?

20

Parece que los errores off-by-one son uno de los errores de programación más comunes (si no el más) (consulte /software/109/what-are-common-mistakes-in-coding y sabiduría convencional).

¿Por qué son tan comunes? ¿Tiene algo que ver con el funcionamiento del cerebro humano?
¿Qué podemos hacer para evitar caer en la trampa por un error?

Malfist
fuente
8
Son comunes? Estoy produciendo una buena cantidad de errores, pero los errores ocasionales rara vez se encuentran entre ellos. ¿Quizás porque uso principalmente Python, es decir, uso iteradores en lugar de hacer malabares con los índices? (Y: ¿Qué nos dice eso?;))
¿Cuanto menos tienes que pensar, más productivo eres?
Malfist
@delnan: estoy de acuerdo. Los errores "off-by-one" suelen ser los primeros en detectarse cuando estoy codificando (incluso antes de pasar a una "fase de prueba" oficial).
FrustratedWithFormsDesigner
77
Casi respondí la pregunta anterior por error ...
DevSolo
> ¿Qué podemos hacer para evitar caer en la trampa por un error? Usa un iterador .
Jim G.

Respuestas:

18

Es algo relacionado con el funcionamiento del cerebro humano. Estamos diseñados para ser "lo suficientemente buenos" para tareas que generalmente no requieren precisión de ingeniería. Hay una razón por la cual los casos con los que tenemos más problemas para tratar se llaman casos "extremos".

Probablemente la mejor manera de evitar errores fuera de uno es la encapsulación. Por ejemplo, en lugar de usar un bucle for que itera una colección por índice (de 0 a count - 1), use un bucle de estilo for-each con toda la lógica de dónde parar integrado en el enumerador. De esa forma, solo tiene que obtener los límites correctos una vez, al escribir el enumerador, en lugar de cada vez que recorre la colección.

Mason Wheeler
fuente
66
+1 para encapsulación. Los peores errores ocasionales que he visto son cuando parte del programa se basa en 1 y parte se basa en 0, y cada función que se utiliza, debe recordar cuál era y si tiene que hacer la conversión o no y en qué dirección ir. Hace un par de meses tuve que rastrear un error difícil de 2 por 2 porque la mala encapsulación significaba que alguien había cometido errores de 1 por 2 en dos lugares compuestos diferentes. Hubo conversiones por todo el lugar que fueron imposibles de seguir y pude reducirlo a una conversión en un método.
Karl Bielefeldt
2
Me encantaría aprender más sobre la ciencia de esto si alguien tiene más información. También creo que esta es la razón por la cual el estilo programático, como CSS, es tan frustrante donde todo es bordes ...
Company Laser
7

Hay algo especial en cómo el cerebro maneja bordes y bordes.

Si bien es más fácil para el cerebro pensar en términos de rangos y espacios , centrarse en un borde parece requerir algo más de atención. Así es como sucede, pérdida momentánea de atención o concentración insuficiente y se perdió la frontera.

Otra pequeña adición al problema es que diferentes entornos de programación tienen diferentes sistemas de indexación que comienzan en 0 o 1, lo que puede agregar confusión a las personas expuestas activamente a ambos tipos de entornos.


fuente
4

Creo que se debe al cambio de contexto. En nuestra vida cotidiana, tendemos a usar índices basados ​​en 1. Debido a esto, nuestro cerebro no puede grabar el comportamiento correcto en la memoria a largo plazo.

ChaosPandion
fuente
2
Y luego está la diversión de cambiar entre idiomas de programación que indexan desde 1 (como PL / SQL).
FrustratedWithFormsDesigner
3
+1 por eso. La numeración indexada en 1 responde la pregunta "¿cuántos hay?", Que se asigna perfectamente a la mayoría de las tareas del mundo real. 0 indexado se trata de "¿en qué posición se encuentra cada elemento?", Que es de menor uso en el espacio de la carne.
Dan Ray