0:00:02.400,0:00:06.880 Me gustaría empezar hablando de tres líneas de código Python que espero que puedan ver en 0:00:06.880,0:00:13.040 mi pantalla ahora. Un código bastante sencillo: Tengo tres líneas, tengo una lista de enteros, 0:00:13.040,0:00:17.840 y me gustaría eliminar los duplicados de esta lista de enteros en Python. Podemos hacer esto con 0:00:17.840,0:00:23.840 el método fromkeys del diccionario y luego podemos devolver el resultado a una lista. Y luego 0:00:23.840,0:00:28.880 queremos imprimir nuestra nueva lista desduplicada. Ahora bien, si has hecho un poco de programación en Python 0:00:28.880,0:00:31.920 puede que sepas que este código no funciona realmente. 0:00:31.920,0:00:37.040 Me da un mensaje de error del compilador. Y esto es lo que muestra el mensaje de error del compilador: 0:00:37.680,0:00:44.000 me dice que el objeto list no es invocable. Ahora bien, no estoy tratando de llamar a un objeto list -tengo 0:00:44.000,0:00:49.760 una lista de enteros y quiero eliminar los duplicados de la misma- por lo que este mensaje de error yo diría que no es 0:00:49.760,0:00:54.640 súper útil. No estoy tratando de llamar a una lista, quiero desduplicar una lista, así que ¿qué es lo que está mal? 0:00:55.520,0:01:00.240 Lo que ocurre es que el mensaje de error se refiere a lo que el compilador estaba tratando de hacer 0:01:00.240,0:01:07.040 en lugar de lo que yo estaba tratando de hacer. Y antes de decirte cuál es el problema del código, 0:01:07.040,0:01:12.320 déjame decirte lo antiguo que es este problema. Y para ello tenemos que remontarnos a la época en que los trabajos de informática 0:01:12.320,0:01:18.320 se escribían a máquina. Estamos en 1976, y estamos viendo aquí un artículo con 0:01:18.320,0:01:23.280 un título maravilloso, "Cómo diseñar lenguajes para hacer la programación lo más difícil posible", 0:01:24.160,0:01:28.640 escrito por Richard Wexelblat, que por cierto fue la primera persona en el mundo en obtener 0:01:28.640,0:01:35.040 un doctorado en un departamento de ciencias de la computación. Esto fue en los años 60 y luego, en 1976, escribió este 0:01:35.600,0:01:40.480 artículo, "Cómo diseñar lenguajes para hacer la programación lo más difícil posible". Uno de los 0:01:40.480,0:01:46.080 párrafos más interesantes de este documento es: "Para maximizar la dificultad para el usuario es importante 0:01:46.080,0:01:51.360 que los mensajes de error reflejen lo que hizo el programa y no lo que hizo el usuario." Y volviendo a 0:01:51.360,0:01:57.360 mirar el mensaje de error de nuestro compilador, yo diría que no hemos avanzado mucho 0:01:57.360,0:02:02.240 desde esta afirmación: el mensaje de error sigue siendo todo sobre lo que el compilador estaba tratando de hacer. 0:02:03.680,0:02:09.440 Ahora bien, en 1976, si te encontrabas con un mensaje de error del compilador, no había muchos lugares 0:02:09.440,0:02:14.240 a los que pudieras acudir en busca de ayuda. Tal vez había un libro de texto, "A Discipline of Programming" por 0:02:14.240,0:02:20.720 edsger Dijkstra publicado en el mismo año, también 1976, posiblemente mucho antes de que apareciera Python. 0:02:21.760,0:02:26.400 Pero eso ha cambiado bastante. Hoy en día, si nos encontramos con un mensaje de error del compilador, 0:02:27.600,0:02:32.160 podemos hacer muchas cosas gracias a Internet. Podemos quejarnos en Twitter, por supuesto, 0:02:32.160,0:02:37.280 eso es muy importante, pero también podemos ir a la documentación oficial de Python que tenemos 0:02:37.280,0:02:42.560 accesible muy fácilmente. Podemos buscar código similar en GitHub que quizás 0:02:42.560,0:02:47.200 también intente eliminar los duplicados de la lista y por supuesto tenemos 0:02:47.200,0:02:53.680 el foro de respuestas a preguntas favorito de todo el mundo, Stack Overflow. Y en este caso concreto, efectivamente, hay un 0:02:53.680,0:02:59.200 hilo de Stack Overflow que nos dice perfectamente cuál es el problema de nuestro código: No utilices 0:02:59.200,0:03:04.160 tuple, list u otros nombres especiales como nombre de variable, eso es probablemente lo que está causando tu problema. 0:03:04.720,0:03:11.360 Respuesta aceptada, 939 votaciones positivas, se ve muy bien, y efectivamente ese es exactamente el problema del código. 0:03:11.360,0:03:15.680 Si cambié el nombre de la variable list por otro que no fuera list u otra 0:03:15.680,0:03:22.160 palabra clave reservada, el código funciona perfectamente. Así que, al llegar a esta situación como investigadores, 0:03:23.120,0:03:28.000 nos preguntamos bien si el - si el mensaje de error bueno está tan lejos, y tenemos que buscar en Google, 0:03:28.000,0:03:32.400 y tenemos que leer un montón de hilos de Stack Overflow para encontrarlo, ¿qué podemos hacer para hacer 0:03:32.400,0:03:37.760 esto más fácil? ¿Podemos mejorar el mensaje de error - yo diría - directamente en el IDE? 0:03:38.640,0:03:44.400 Y de eso es de lo que me gustaría hablar hoy. Lo hacemos en una serie de pasos. Lo primero 0:03:44.400,0:03:49.840 que hacemos es analizar el mensaje de error. En este ejemplo, "error de tipo el objeto list 0:03:49.840,0:03:55.840 no es llamable". Luego usamos este mensaje de error para construir la consulta que enviamos automáticamente 0:03:55.840,0:04:01.120 a Stack Overflow. Y resulta, experimentamos con esto un poco, resulta que 0:04:01.120,0:04:05.440 dependiendo del error a veces tiene sentido enviar el mensaje de error detallado, a veces 0:04:05.440,0:04:09.600 tiene sentido enviar un poco de código, y a veces tiene sentido sólo enviar el tipo. 0:04:10.320,0:04:16.880 En cualquier caso, construimos una consulta que enviamos a Stack Overflow. Seleccionamos una respuesta basándonos 0:04:16.880,0:04:22.960 en características como, si la respuesta ha sido aceptada, si hay código en ella, cómo ha sido 0:04:22.960,0:04:29.280 recibida a través de votaciones positivas y negativas. Luego personalizamos un poco la respuesta, porque muchas 0:04:29.280,0:04:34.240 respuestas se refieren a nombres de variables específicas que pueden ser muy diferentes a los nombres de variables 0:04:34.240,0:04:40.560 que vemos en nuestro IDE, así que reemplazamos, en la medida de lo posible, los nombres de variables que vemos en 0:04:40.560,0:04:46.080 la respuesta con nombres de variables que realmente han sido utilizados por el usuario. Y finalmente resumimos 0:04:46.080,0:04:50.720 todo, porque como sabes, algunas de las respuestas en Stack Overflow son bastante largas. 0:04:51.680,0:04:55.840 Y como resultado, en este caso sí que podemos producir un mensaje de error mucho mejor, 0:04:55.840,0:05:01.040 yo diría que en lugar de decir que la lista no es invocable ahora podemos decir, no uses 0:05:01.040,0:05:07.920 list u otros nombres especiales como nombre de variable. Implementamos todo esto en una herramienta llamada Pycee, 0:05:07.920,0:05:15.040 que es la abreviatura de Python compiler error enhancer, y esa es exactamente la salida de Pycee. 0:05:16.480,0:05:22.560 Así que, como somos investigadores, también queríamos evaluar si esto funciona. Funciona en el 0:05:22.560,0:05:27.600 ejemplo que acabo de ver, pero ¿funciona en un entorno más general? Para ello, 0:05:28.240,0:05:34.960 reclutamos a un total de 16 desarrolladores de software profesionales y le dimos a cada uno de ellos dos tareas. 0:05:34.960,0:05:39.920 Tomamos estas tareas de uno de esos sitios web de ejercicios de programación en Python, en este caso 0:05:39.920,0:05:46.320 PracticePython.org creo, que tiene un montón de pequeños ejercicios como Fibonacci y así sucesivamente. 0:05:48.080,0:05:53.920 Y entonces, la mitad de los participantes - no, para la mitad de las tareas, por lo que cada participante hizo dos 0:05:53.920,0:05:59.920 tareas. Para una de las tareas se utilizó nuestra versión de Stack Overflow Pycee, y para la otra se utilizó 0:05:59.920,0:06:04.800 la línea de base, porque queríamos tener algo para comparar. Y en este caso 0:06:04.800,0:06:10.800 elegimos como línea de base la documentación oficial de, de Python sobre estos mensajes de error. 0:06:11.920,0:06:17.280 En total, nuestros participantes, o cada uno de los 16 participantes, trabajaron en dos tareas. Encontraron 0:06:17.280,0:06:23.280 un total de 115 errores de compilación como parte del trabajo en estas tareas, lo que como saben es bastante normal, 0:06:23.280,0:06:27.440 normalmente cuando programamos algo, nos encontraremos con errores de compilación incluso si somos 0:06:27.440,0:06:33.840 bastante buenos en ello. Se encontraron con 115 errores del compilador, alrededor de la mitad con nuestra versión mejorada de 0:06:33.840,0:06:39.360 los errores del compilador y alrededor de la mitad con la línea de base con la que estamos tratando de comparar. 0:06:40.880,0:06:45.520 Así que en este caso, afortunadamente, los resultados de Pycee en el lado derecho, 0:06:46.080,0:06:51.200 afortunadamente, en términos de la utilidad percibida en general, estuvieron de acuerdo en que nuestros mensajes de error 0:06:51.200,0:06:56.800 eran más útiles que la línea de base y también estuvieron de acuerdo en que nuestros mensajes de error les ayudaron 0:06:56.800,0:07:01.840 a ahorrar tiempo en comparación con la línea de base la diferencia en este caso no es tan grande. 0:07:02.480,0:07:09.680 Entonces, ¿qué me gustaría que sacaran de esto? Dos cosas. La primera, que los mensajes de error 0:07:09.680,0:07:15.520 sean de uso colectivo. Creo que nuestro estudio fue un buen ejemplo que muestra que el poder de la multitud, 0:07:15.520,0:07:21.040 en este caso en Stack Overflow, puede producir mejores mensajes de error y mejores explicaciones 0:07:21.040,0:07:27.360 de los mensajes de error que la información que tenemos disponible en la documentación oficial 0:07:27.360,0:07:32.800 que fue escrita por un número mucho menor de personas, por supuesto. Si los mensajes de error son de origen colectivo, 0:07:32.800,0:07:37.680 por supuesto, no son todos correctos, pero entonces podemos desarrollar herramientas automatizadas 0:07:37.680,0:07:42.400 que ayuden a filtrar estos datos y producir los mensajes de error correctos en el momento adecuado. 0:07:43.360,0:07:47.680 Eso es todo para mí - muchas gracias por escuchar.