¿Puede la programación competitiva ayudarlo a mejorar en la investigación teórica de la informática / algoritmos? Parece que después de haber resuelto miles de problemas difíciles, puede abordar los problemas en su investigación de manera más eficiente, ¿verdad?

Definitivamente si.

Antes de explicar por qué ese es el caso, tengo que ser muy claro sobre lo que no estoy diciendo.

No estoy diciendo que si haces una programación competitiva, automáticamente serás un mejor investigador. (Es probable que seas bueno, pero hacer una programación competitiva no te hará una mejor. Más sobre esto más adelante).

Solo digo que en casos específicos hacer programación competitiva puede ayudarlo.

Permítanme ilustrar eso con algunos ejemplos.

Hay muchos estudiantes universitarios que intentaron competir en ACM ICPC una o dos veces con algunos niveles moderados de éxito. Esto no les ayuda a convertirse en mejores investigadores. Pero eso debería ser bastante obvio.

Echemos un vistazo a la “corriente principal” en su lugar. Hay muchos participantes activos en concursos de programación como TopCoder y CodeForces. Muchos de ellos practican mucho, o al menos participan en muchos concursos. Aquí hay dos preguntas diferentes pero relacionadas sobre ellos:

  1. ¿Eso los hace mejores investigadores que el resto de la población de estudiantes de CS?
    No.
  2. ¿Eso significa que, en promedio, son mejores investigadores que el resto de la población?
    Sí.

Espera, ¿no es eso una contradicción?
No en realidad no.

La población de estudiantes de CS es enorme. Una de las principales cosas que marca la diferencia entre un estudiante promedio de CS y un estudiante sobresaliente de CS es el interés. (¿O tal vez la pasión sería una palabra mejor?) La mayoría de los estudiantes sobresalientes no solo asisten a conferencias, están haciendo cosas activamente y, por lo tanto, están aprendiendo mucho más por su cuenta. Algunos de estos estudiantes participan en concursos de programación. Algunos de ellos piratean hardware aleatorio. Algunos ya están lanzando su tercer inicio después de que fallaron los dos primeros. No es tanto lo que están haciendo, lo importante es que están haciendo algo que aman.

Además, por razones obvias, los estudiantes que deciden participar en concursos de programación tienden a ser los estudiantes que son buenos en algoritmos y cosas relacionadas. Por lo tanto, si toma muestras de estudiantes al azar que participan en competencias de programación, obtendrá mejores investigadores que si solo toma muestras de estudiantes de CS al azar. De ahí el “Sí” a la segunda pregunta anterior.

Sin embargo, todavía afirmo que la respuesta a la primera pregunta es No. Si bien los estudiantes tienden a ser mejores que el promedio, participar en competencias de programación no les está enseñando la mayoría de las cosas que serían útiles para un investigador de CS.

¿Porqué es eso? Bueno, mira el programador competitivo promedio. Estos son los chicos en algún lugar entre verde y azul en TopCoder. (Si no está familiarizado con TopCoder, esos son códigos de colores que corresponden a la calificación promedio). En este nivel, los concursantes están aprendiendo las técnicas algorítmicas básicas. Por ejemplo, muchos luchan con la programación dinámica. En este nivel, la mejora más significativa se puede obtener al mejorar la consistencia: aprender a implementar algoritmos rápidamente y sin errores. Por lo tanto, estos concursantes practican sus habilidades de implementación y aprenden las técnicas básicas de diseño de algoritmos.

Claro, estas son buenas habilidades para tener. Por ejemplo, en comparación con los estudiantes que solo toman un curso de algoritmos, los programadores competitivos obtendrán una comprensión mucho más profunda de todos los algoritmos que usarán y adaptarán para resolver problemas de competencia. Pero aún está lejos de la investigación de CS: los problemas que estos concursantes pueden resolver ya son increíblemente difíciles para la población general de estudiantes de CS, pero al mismo tiempo son triviales desde el punto de vista de la investigación moderna de CS.

Si está de acuerdo con el párrafo anterior, ahora debería estar cuestionando mi respuesta principal. ¿Por qué afirmo que hacer concursos de programación definitivamente puede hacerte un mejor investigador de CS?

La respuesta no está en el medio de la curva de la campana, está en su extremo derecho.

En detalles de la pregunta, el autor pregunta lo siguiente:

Pero parece natural que después de haber resuelto miles de problemas difíciles, pueda abordar los problemas que encuentra en su investigación de manera mucho más eficiente que una persona que no tiene este tipo de experiencia, ¿verdad?

En mi experiencia, eso es exactamente correcto. Pero hay una trampa. No hay tantos programadores competitivos que hayan resuelto miles de problemas difíciles. Tienes que buscar aquellos al final del espectro. Y vaya, ¡el mundo se ve diferente allí!

Los problemas difíciles en los concursos de programación aún son cada vez más difíciles. (Incluso escribí un trabajo de investigación sobre eso hace unos años 😉) Esto se debe a que los mejores concursantes están mejorando cada vez más, hay más de ellos y se están desafiando activamente para desarrollar sus habilidades. (¿Quién crees que plantea los problemas difíciles para los mejores concursantes? ¡Otros mejores concursantes!)

Y estas ya no son las habilidades de “implementación rápida” o “biblioteca de códigos”. Con suficiente tiempo, el porcentaje más alto de concursantes puede implementar cualquier cosa . Las habilidades necesarias en este nivel son habilidades de resolución de problemas de núcleo duro.

Las cosas que fueron investigaciones de vanguardia hace 20 años se utilizaron en un problema de competencia de vanguardia hace 10 años, y hace 5 años ya era de conocimiento común entre al menos los 100 mejores concursantes del mundo. Por ejemplo, cosas como la optimización del casco convexo para la programación dinámica es algo que valió la pena publicar en una buena conferencia de CS. Ahora, gracias a los concursos de programación, tienes cientos de personas que no solo entienden cómo funciona, sino que pueden aplicarlo para resolver problemas nuevos y más difíciles.

Hace cinco años todavía era casi impensable implementar su propio árbol equilibrado en un concurso. Ahora, los 100 mejores concursantes saben cómo hacerlo en 15 líneas de código simple . Y pueden usar eso como una herramienta para resolver problemas más difíciles. Y la lista podría seguir y seguir: programación dinámica con exponencialmente muchos estados, descomposición de luz intensa, la rápida transformación de Fourier, … Elija.

Al desafiarse mutuamente y empujar el sobre, los mejores concursantes en los concursos de programación están aprendiendo técnicas que están a la par con la investigación actual. Y las personas con este tipo de conocimiento son muy valiosas en la investigación de CS. Los estudiantes que solo se centran en la investigación tienden a tener un punto de vista mucho más estrecho : solo saben lo que leen en los documentos que su asesor les dio para leer. Los programadores más competitivos vienen con mucha información, ya que han visto técnicas algorítmicas que se han utilizado en muchos campos diferentes.

Es un mantra común que los concursos de programación son diferentes de la investigación porque con los problemas del concurso tienes la garantía de que existe una solución. Estoy totalmente en desacuerdo. Personalmente, nunca he percibido esa diferencia: al hacer una investigación, abordo el problema con una actitud positiva: quiero resolverlo. Esa era exactamente la misma actitud que en un concurso de programación. Y hago exactamente lo mismo que haría al resolver un problema difícil del concurso: lo analizo, miro casos pequeños, busco patrones, busco posibles reducciones … La única diferencia es que si no lo resuelvo, no lo hago ‘ No sé si es porque soy tonto o porque no hay solución, y esa diferencia nunca me importó mucho. Ciertamente no tiene impacto en los resultados de dicha investigación.

He visto a muchos programadores competitivos convertirse en los mejores investigadores. He visto problemas difíciles de competencia que condujeron a investigaciones y publicaciones reales. Y también he visto trabajos de investigación que luego se adaptaron a problemas de competencia. Claro, tuvieron que adaptarse, posiblemente simplificarse, pero la parte que ciertamente quedó fue la nueva idea algorítmica. Básicamente, estos problemas son una forma de enseñar el nuevo enfoque a una comunidad más grande. Y aprender haciendo cosas funciona mucho mejor que aprender solo leyendo un periódico.

En general, tengo fuertes razones para creer que en el nivel más alto, las competencias de programación preparan activamente a nuevas y mejores generaciones de investigadores de CS. Y ese no es el futuro, ya está sucediendo.

Desde mi limitada experiencia competitiva en programación e investigación, no.

La programación competitiva puede hacerte un mejor ingeniero , pero no un científico investigador. Los rasgos enfatizados por la programación competitiva (recuperación rápida, implementación rápida, gran biblioteca de algoritmos) pueden ayudar, pero no son imprescindibles para convertirse en un buen investigador.

Como investigador, pasarás la mayor parte de tu tiempo leyendo documentos e intentando resolver problemas difíciles. Intenta una solución que probablemente falla, la modifica o intenta atacar el problema de manera diferente.

La diferencia es que los concursos de programación enfatizan la velocidad y siempre tendrán una solución, mientras que los problemas que ataca un investigador pueden no tener solución.