La programación competitiva o programación deportiva es un deporte mental en el que los participantes intentan programar de acuerdo con las especificaciones proporcionadas. Los concursos suelen realizarse a través de Internet o de una red local . La programación competitiva es reconocida y respaldada por varias empresas multinacionales de software e Internet , como Google [1] [2] y Meta . [3]
Una competencia de programación generalmente implica que el anfitrión presente un conjunto de problemas lógicos o matemáticos , también conocidos como acertijos o desafíos, a los concursantes (que pueden variar en número desde decenas o incluso cientos hasta varios miles). Los concursantes deben escribir programas informáticos capaces de resolver estos problemas. La evaluación se basa principalmente en la cantidad de problemas resueltos y el tiempo dedicado a escribir soluciones exitosas, pero también puede incluir otros factores (calidad del resultado producido, tiempo de ejecución, uso de memoria, tamaño del programa, etc.).
Uno de los concursos más antiguos conocidos es el Concurso Universitario Internacional de Programación (ICPC), que se originó en la década de 1970 [4] y ha crecido hasta incluir 88 países en su edición de 2011.
De 1990 a 1994, Owen Astrachan , Vivek Khera y David Kotz organizaron uno de los primeros concursos de programación distribuidos en Internet inspirados en el ICPC. [5]
El interés por la programación competitiva ha crecido enormemente desde el año 2000 hasta alcanzar decenas de miles de participantes (ver Concursos destacados) y está fuertemente relacionado con el crecimiento de Internet, que facilita la celebración de concursos internacionales en línea, eliminando problemas geográficos.
El objetivo de la programación competitiva es escribir código fuente de programas informáticos que sean capaces de resolver problemas determinados. La gran mayoría de los problemas que aparecen en los concursos de programación son de naturaleza matemática o lógica. Estas tareas típicas pertenecen a una de las siguientes categorías: combinatoria , teoría de números , teoría de grafos , teoría algorítmica de juegos , geometría computacional , análisis de cuerdas , matemáticas discretas y estructuras de datos . [6] Los problemas relacionados con la programación de restricciones y la inteligencia artificial también son populares en determinadas competiciones.
Independientemente de la categoría del problema, el proceso de resolución de un problema se puede dividir en dos grandes pasos: construir un algoritmo eficiente e implementar el algoritmo en un lenguaje de programación adecuado (el conjunto de lenguajes de programación permitidos varía de un concurso a otro). Estas son las dos habilidades que se prueban con más frecuencia en las competiciones de programación.
En la mayoría de los concursos, la evaluación la realizan automáticamente máquinas anfitrionas, comúnmente conocidas como jueces. Cada solución presentada por un concursante se compara con el juez frente a un conjunto de casos de prueba (generalmente secretos). Normalmente, los problemas de concurso tienen un sistema de calificación de todo o nada, lo que significa que una solución es "Aceptada" sólo si produce resultados satisfactorios en todos los casos de prueba realizados por el juez y, en caso contrario, se rechaza. Sin embargo, algunos problemas de concurso pueden permitir una puntuación parcial, dependiendo del número de casos de prueba aprobados, la calidad de los resultados o algún otro criterio específico. Algunos otros concursos solo requieren que el concursante envíe el resultado correspondiente a los datos de entrada dados, en cuyo caso el juez solo tiene que analizar los datos de salida enviados.
Los jueces en línea son entornos en línea en los que se realizan las pruebas. Los jueces en línea tienen listas de clasificación que muestran a los usuarios con la mayor cantidad de soluciones aceptadas y/o el menor tiempo de ejecución para un problema en particular. [7]
En la mayoría de las competiciones mencionadas anteriormente, las competiciones suelen organizarse en varias rondas. Suelen comenzar con rondas online, que concluyen en la ronda final presencial. Los mejores en IOI y ICPC reciben medallas de oro, plata y bronce. En los demás concursos, se otorgan premios en efectivo a los primeros clasificados. Los concursos también atraen el interés de reclutadores de múltiples empresas de software e Internet, que a menudo llegan a los competidores con posibles ofertas de trabajo.
La comunidad de programación de todo el mundo ha creado y mantenido varios recursos de Internet dedicados a la programación competitiva. Ofrecen concursos independientes con o sin premios menores. Por lo general, a los usuarios se les asignará una calificación basada en su desempeño en dichos concursos. Los archivos de problemas pasados son recursos populares para la formación en programación competitiva. Hay varias organizaciones que organizan concursos de programación de forma regular. Éstas incluyen:
La participación en concursos de programación puede aumentar el entusiasmo de los estudiantes por los estudios de informática . Las habilidades adquiridas en concursos de programación similares al ICPC también mejoran las perspectivas profesionales, ya que ayudan a superar las "entrevistas técnicas", que a menudo requieren que los candidatos resuelvan complejos problemas algorítmicos y de programación en el acto. [19] [20]
También ha habido críticas a la programación competitiva, particularmente por parte de desarrolladores de software profesionales . [21] Un punto crítico es que muchos concursos de programación de ritmo rápido enseñan a los competidores malos hábitos de programación y estilo de código (como el uso innecesario de macros , falta de abstracción y comentarios de programación orientada a objetos , uso de nombres cortos de variables, etc.). [22] [21] Además, al ofrecer sólo pequeños acertijos algorítmicos con soluciones relativamente cortas, los concursos de programación como ICPC e IOI no necesariamente enseñan buenas habilidades y prácticas de ingeniería de software, ya que los proyectos de software reales suelen tener muchos miles de líneas de código y son desarrollado por grandes equipos durante largos períodos de tiempo. [21] Peter Norvig afirmó que, según los datos disponibles, ser un ganador de concursos de programación se correlacionaba negativamente con el desempeño de un programador en su trabajo en Google (a pesar de que los ganadores del concurso tenían mayores posibilidades de ser contratados). [23] Norvig declaró más tarde que esta correlación se observó en un pequeño conjunto de datos, pero que no pudo confirmarse después de examinar un conjunto de datos más grande. [24] [ ¿ fuente poco confiable? ]
Otro sentimiento más es que en lugar de "perder" su tiempo compitiendo excesivamente resolviendo problemas con soluciones conocidas, los programadores de alto perfil deberían invertir su tiempo en resolver problemas del mundo real. [21]