Arreglé el fallo y salió otro
Pegas en el asistente una frase: «no funciona, arréglalo». El asistente adivina y cambia tres cosas a la vez. La prueba pasa, pero ahora falla otra que antes iba bien.
Depurar con un asistente funciona mejor cuando le das datos y compruebas cada arreglo. Aquí aprendes cómo.
Al final de esta lección
Nota
Puedo dar a un asistente lo que necesita para encontrar un fallo y comprobar su arreglo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Reproducir | hacer que el fallo ocurra siempre con los mismos datos |
| Prueba que falla | la prueba más pequeña que muestra el fallo |
| Hipótesis | una explicación posible que se puede comprobar |
| Un cambio cada vez | probar un arreglo solo, antes de añadir otro |
| Regresión | algo que iba bien y falla después de un arreglo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dale lo que necesita para encontrar el fallo
Un asistente que solo oye «no funciona» tiene que adivinar. Dale cuatro cosas: la prueba que falla, el mensaje de error exacto, lo que ya probaste y el trozo de código donde crees que está.
Pide primero una hipótesis, una explicación de por qué falla. Pídele que no cambie nada hasta que la hayas leído.
Una petición posible
Esta es una petición posible, no la única. «Esta prueba falla: la media de [30, 60, 90] da 90 y debe dar 60. Esta es la función. Ya probé a cambiar el bucle y no cambió nada. Explica por qué falla, con una hipótesis, y no cambies nada todavía.»
Después de leer la hipótesis, tú decides si tiene sentido.
Comprueba el arreglo con todos los casos
Un arreglo que hace pasar la prueba que falla puede romper otra. Eso es una regresión. Por eso, tras cada arreglo, pasa todos los casos, no solo el que fallaba.
Prueba un cambio cada vez. Si el asistente propone varios, aplica uno, mira los casos y solo entonces pasa al siguiente.
Un ejemplo escrito a mano
La función con fallo y los dos arreglos de abajo los escribimos nosotros, a mano. Ningún asistente los escribió.
Los botones escriben archivos en la carpeta demo-depurar de tu proyecto. No tocan el programa de la caja.
Crear la carpeta de la demostración
docker exec -w /home/node/project agent mkdir -p demo-depurarSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir la función y arreglos, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Precio medio de una lista de precios en céntimos. Una lista vacía da 0.' 'function original(prices) {' ' let sum = 0;' ' for (const price of prices) sum = sum + price;' ' return sum / (prices.length - 1);' '}' '// Cambio A: divide entre la longitud y trata la lista vacía aparte.' 'function candidateA(prices) {' ' if (prices.length === 0) return 0;' ' let sum = 0;' ' for (const price of prices) sum = sum + price;' ' return sum / prices.length;' '}' > demo-depurar/medias.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir la función y arreglos, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Cambio B: divide entre la longitud, sin tratar la lista vacía.' 'function candidateB(prices) {' ' let sum = 0;' ' for (const price of prices) sum = sum + price;' ' return sum / prices.length;' '}' 'module.exports = { original, candidateA, candidateB };' >> demo-depurar/medias.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribir los tres casos
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const medias = require(\"./medias\");' 'const fn = medias[process.argv[2]];' '' 'const cases = [[[30, 60, 90], 60], [[50], 50], [[], 0]];' 'for (const item of cases) {' ' const got = fn(item[0]);' ' const name = \"media de [\" + item[0].join(\", \") + \"]\";' ' console.log((got === item[1] ? \"pasa \" : \"FALLA \") + name + \" esperado \" + item[1] + \" obtenido \" + got);' '}' > demo-depurar/casos.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pasar los casos por la función con fallo
docker exec -w /home/node/project agent node demo-depurar/casos.js originalSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pasar los casos por el arreglo A
docker exec -w /home/node/project agent node demo-depurar/casos.js candidateASe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pasar los casos por el arreglo B
docker exec -w /home/node/project agent node demo-depurar/casos.js candidateBSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: un fallo y dos arreglos
| Caso | Original | Arreglo A | Arreglo B |
|---|---|---|---|
| [30, 60, 90] debe dar 60 | FALLA (90) | pasa | pasa |
| [50] debe dar 50 | FALLA (Infinity) | pasa | pasa |
| [] debe dar 0 | pasa | pasa | FALLA (NaN) |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que si el arreglo hace pasar la prueba que fallaba, el fallo está resuelto. El arreglo B arregló los dos casos que fallaban y rompió el tercero. Pasa siempre todos los casos y pide que el arreglo explique el fallo.
Para ir más lejos: tu propio fallo
En el laboratorio, no uses el defecto de la caja, que es la tarea del laboratorio. Planta un fallo tuyo en una función nueva, por ejemplo una que calcule el precio de dos manzanas con una oferta.
Escribe la prueba que falla y la petición con las cuatro cosas. Pide una hipótesis antes del arreglo y pasa todos los casos después.