¿Cómo puedo entrenarme para no cometer errores lógicos?

¿Qué hace un buen probador? La diferencia entre un estudiante y un ingeniero de control de calidad realmente bueno es simple: el estudiante quiere terminar. Un buen ingeniero de pruebas quiere que el programa esté equivocado .

Y eso es básicamente por qué este último encuentra errores mientras que el primero no. Si desea escribir un código bueno y mayormente libre de errores, también debe desear que su programa sea incorrecto. Si desea romperlo, probablemente encontrará formas de romperlo. Encontrará contraejemplos para analizar entradas, encontrará condiciones de desbordamiento que rompen sus bucles, y así sucesivamente.

Yo diría que probablemente te lleve alrededor del 70%. El otro 30% es práctica y técnica . Para ser realmente bueno escribiendo código libre de errores, usted (en primer lugar) debe haber alcanzado una especie de masa crítica, donde ha visto la mayoría de las variaciones de los errores “comunes” que ocurren en el tipo de código que escribe. Esto viene de la experiencia. Más allá de eso, hay otras cosas que hacen la vida más fácil. Algunos consejos que creo son útiles:

  • Eleve la mayor cantidad de su programa a funciones puras, funciones que no tienen efectos secundarios. Es más fácil razonar sobre las funciones si sabe que simplemente proporciona argumentos y obtiene resultados. Cualquier mutación en el estado del programa introduce la posibilidad de que un comportamiento sutil que altere el estado se encuentre más adelante. Por lo general, no vale la pena, solo garantice que sea una función pura y evite cambiarla si es posible.
  • En relación con el n. ° 1, use lenguajes que lo alienten a usar funciones puras . No tiene que ser un lenguaje como Haskell o Scheme, aunque eso ciertamente ayuda. También puedes usar un lenguaje como Ruby y Python.
  • Minimizar la contabilidad . Para los bucles, la iteración del puntero, algo así, es tu enemigo. Si cambia la estructura subyacente de algo, cualquier cosa que acceda a esa estructura (como un bucle for) puede fallar. Siempre que sea posible, debe abstraer todo lo que se ve en la estructura de un objeto en su propia función / método, en lugar de usar bucles desnudos.
  • En relación con ese punto, recuerde verificar siempre todo lo que toca un objeto cuando lo cambia . Es decir, si cambia alguna estructura en un objeto, asegúrese de que todo lo que toque esta subestructura también se cambie correspondientemente. Esto solo causa una increíble cantidad de errores.

Eso debería ayudarte a comenzar. Buena suerte.

Jugar juegos. Seriamente. Y por “en serio” me refiero tanto a tomarme en serio como a jugar en serio. Recomiendo Go (juego de mesa) (o ajedrez si es necesario). También muchos, si no todos, los videojuegos ayudarían.

Los juegos de estrategia te ayudan a pensar de manera lógica y metódica. Tu oponente castigará rápidamente cualquier error que cometas, y tu dolor o frustración por perder el juego te hará esforzarte mucho para nunca volver a cometer ese error.

Es relativamente fácil ver cómo se aplica esto en los juegos de mesa, pero creo que también es cierto para los juegos de disparos en primera persona como Call of Duty. Los buenos jugadores usan el terreno, la conciencia situacional y sus fortalezas y debilidades individuales para vencer a otros jugadores. No se trata solo de reflejos. Hacen todo esto rápidamente, en situaciones tensas. Cuando fluye tu adrenalina, tu memoria funciona mejor.

Entrénate para reconocer cuándo estás haciendo suposiciones.
Las suposiciones son malas, son lo que te mete en problemas.

Una forma de hacerlo es utilizar un modelo mental espacial para el espacio del problema.

Por ejemplo, para la programación, puede tener un pasillo para la entrada, una sala para el procesamiento y un pasillo para la salida. El espacio para el procesamiento podría tener todas las tablas de base de datos en la pared derecha y todo el almacenamiento local en la pared izquierda.

Cada mesa es una imagen en la pared. Las imágenes tienen marcos: identifican la base de datos en la que se encuentra la tabla. ¿No tiene ningún marco en su mente? … significa que no sabes en qué DB está esa tabla.

Del mismo modo, las variables de almacenamiento local estarían representadas por cosas colgadas en una pared.

Con este tipo de modelo, sabrá que no sabe algo que pensó que sabía (una suposición) … porque, por ejemplo, no sabe si debería obtener la variable X de (a) la colección de cuerdas colgadas en la pared, (b) la colección de contadores (números) en la pared, o (c) la colección de alfileres en blanco y negro (booleanos) en la pared.