La programación competitiva o programación deportiva es un deporte mental en el que los participantes intentan programar según unas especificaciones dadas. Los concursos suelen celebrarse a través de Internet o de una red local . La programación competitiva está reconocida y respaldada por varias empresas multinacionales de software e Internet , como Google , [1] [2] y Meta . [3]
En una competición de programación, el anfitrión suele presentar un conjunto de problemas lógicos o matemáticos , también conocidos como acertijos o desafíos, a los concursantes (cuyo número puede variar 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 empleado en escribir soluciones exitosas, pero también puede incluir otros factores (calidad del resultado obtenido, tiempo de ejecución, uso de memoria, tamaño del programa, etc.).
Uno de los concursos más antiguos que se conocen es el Concurso Internacional de Programación Universitaria (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.
Entre 1990 y 1994, Owen Astrachan , Vivek Khera y David Kotz organizaron uno de los primeros concursos de programación distribuidos basados en Internet inspirados en el ICPC. [5]
El interés en la programación competitiva ha crecido ampliamente desde el año 2000 hasta alcanzar decenas de miles de participantes (ver Competiciones destacadas), y está fuertemente vinculado al crecimiento de Internet, que facilita la realización de concursos internacionales en línea, eliminando problemas geográficos.
El objetivo de la programación competitiva es escribir el código fuente de programas informáticos que sean capaces de resolver problemas determinados. Una gran mayoría de los problemas que aparecen en los concursos de programación son de naturaleza matemática o lógica. Las tareas típicas de este tipo pertenecen a una de las siguientes categorías: combinatoria , teoría de números , teoría de grafos , teoría de juegos algorítmicos , geometría computacional , análisis de cadenas , matemáticas discretas y estructuras de datos . [6] Los problemas relacionados con la programación con restricciones y la inteligencia artificial también son populares en ciertas 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 ponen a prueba con más frecuencia en los concursos de programación.
En la mayoría de los concursos, la evaluación se realiza automáticamente por medio de máquinas anfitrionas, comúnmente conocidas como jueces. Cada solución presentada por un concursante se ejecuta en el juez contra 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" solo si produce resultados satisfactorios en todos los casos de prueba ejecutados por el juez y se rechaza en caso contrario. Sin embargo, algunos problemas de concurso pueden permitir una calificación parcial, dependiendo de la cantidad de casos de prueba aprobados, la calidad de los resultados o algún otro criterio especificado. 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 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 los concursos mencionados, los concursos suelen organizarse en varias rondas. Normalmente comienzan con rondas en línea y concluyen con una ronda final presencial. Los mejores participantes en IOI e 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 los reclutadores de varias empresas de software e Internet, que a menudo contactan a los competidores con posibles ofertas de trabajo.
La comunidad de programación de todo el mundo ha creado y mantenido varios recursos en Internet dedicados a la programación competitiva. Ofrecen concursos independientes con o sin premios menores. Normalmente, a los usuarios se les asigna una calificación en función de 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 periódica, entre ellas:
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 a los del ICPC también mejoran las perspectivas profesionales, ya que ayudan a aprobar las "entrevistas técnicas", que a menudo exigen que los candidatos resuelvan problemas complejos de programación y algoritmos en el momento. [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 , la falta de abstracción y comentarios de OOP , el uso de nombres de variables cortos, etc.). [22] [21] Además, al ofrecer solo 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 miles de líneas de código y son desarrollados por equipos grandes 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 (aunque los ganadores del concurso tenían mayores posibilidades de ser contratados). [23] Norvig afirmó más tarde que esta correlación se observó en un conjunto de datos pequeño, pero que no se pudo confirmar después de examinar un conjunto de datos más grande. [24] [ ¿ fuente poco confiable? ]
Otro sentimiento 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]