Cet article est orphelin. Moins de trois articles lui sont liés (mai 2025).
[[Programmation compétitive]]
La programmation compétitive ou programmation sportive est un sport intellectuel dans lequel les participants essayant de programmer selon des contraintes fournies. Les concours se déroulent généralement directement sur Internet ou en physique connecté sur un réseau local. La programmation compétitive est reconnue et soutenue par plusieurs sociétés multinationales de logiciels et d'Internet, telles que Google[1],[2], Meta[3] ou encore Huawei[4] mais également par des sociétés financières comme Jane Street[4] ou encore Citadel Securities (en)[4].
Lors d'une compétition de programmation compétitive l'organisateur propose généralement un ensemble de problèmes logique ou mathématiques aux candidats (dont le nombre peut varier de dizaines, voire de centaines, à plusieurs milliers). Les candidats doivent écrire des programmes informatiques capables de résoudre ces problèmes, dans la majorité des cas les candidats soumettent leurs programmes à une banque de donnée de tests cachés. Le jugement est principalement basé sur le nombre de problèmes résolus et le temps passé à rédiger des solutions efficaces, mais peut également inclure d'autres facteurs (qualité du résultat produit, temps d'exécution, utilisation de la mémoire, taille du programme, etc.).
L'un des plus anciens concours connus est le International Collegiate Programming Contest (ICPC), né dans les années 1970[5] et qui s'est développé pour inclure 88 pays dans son édition 2011.
De 1990 à 1994, Owen Astrachan, Vivek Khera et David Kotz ont organisé The internet programming contest, l'un des premiers concours de programmation distribués sur Internet, inspiré d'ICPC[6].
L'intérêt pour la programmation compétitive a considérablement augmenté depuis 2000, atteignant des dizaines de milliers de participants et est fortement lié à la croissance d'Internet, qui facilite l'organisation de concours internationaux en ligne permettant instantanément à un grand nombre de personnes pouvant participer.
L’objectif de la programmation compétitive est d’écrire des programmes informatiques capables de résoudre des problèmes donnés. La grande majorité des problèmes apparaissant dans les concours de programmation sont de nature mathématique et/ou logique. Ces tâches typiques appartiennent souvent à l'une des catégories suivantes : combinatoire, théorie des nombres, théorie des graphes, théorie algorithmique des jeux, géométrie algorithmique, chaîne de caractères, mathématiques discrètes et structures de données[7]. Les problèmes liés à la programmation par contraintes et à l’intelligence artificielle sont également populaires dans certaines compétitions.
Quelle que soit la catégorie du problème, le processus de résolution d'un problème peut être divisé en deux grandes étapes : la construction d'un algorithme efficace et l'implémentation de l'algorithme dans un langage de programmation approprié (l'ensemble des langages de programmation autorisés varie d'un concours à l'autre). Ce sont les deux compétences les plus couramment testées dans les concours de programmation.
Dans la plupart des concours, le jugement est effectué automatiquement par des machines hôtes, communément appelées juges. Chaque solution soumise par un candidat est soumise au juge par rapport à un ensemble de cas de test (généralement secrets). Normalement, les problèmes de concours ont un système de notation tout ou rien, ce qui signifie qu'une solution est « acceptée » uniquement si elle produit les résultats attendu sur tous les cas de test exécutés par le juge et est rejetée dans le cas contraire. Cependant, certains problèmes de concours peuvent permettre une notation partielle, en fonction du nombre de cas de test réussis, de la qualité des résultats ou d'autres critères spécifiés. Certains autres concours exigent uniquement que le candidat soumette la sortie correspondant aux données d'entrée données, auquel cas le juge n'a qu'à analyser les données de sortie soumises.
Les juges en ligne sont des environnements dans lesquels les tests ont lieu. Les juges en ligne disposent de listes de classement indiquant les utilisateurs ayant le plus grand nombre de solutions acceptées et/ou le temps d'exécution le plus court pour un problème particulier mais également à titre indicatif le nombre de caractères utilisé pour répondre au problème[8].
Dans la plupart des compétitions ci-dessus, les compétitions sont généralement organisées en plusieurs tours. Ils commencent généralement par des qualifications en ligne, qui se terminent par une finale en présentiel. Les meilleurs élèves de l'IOI et de l'ICPC reçoivent des médailles d'or, d'argent et de bronze. Dans les autres concours, des prix en espèces sont attribués aux meilleurs. Les concours suscitent également l’intérêt des recruteurs de nombreuses sociétés de logiciels, qui contactent souvent les concurrents avec des offres d’emploi potentielles.
La communauté de programmation du monde entier a créé et maintenu plusieurs ressources Internet dédiées à la programmation compétitive. Ils proposent des concours pouvant pour certain être directement créer par la communauté avec ou sans prix. Les utilisateurs se verront habituellement attribuer une note en fonction de leurs performances. Ils proposent également de pouvoir lancer des archives de concours à volonté, ce qui est une méthode privilégiée par les compétiteurs pour s'entrainer. Il existe plusieurs organisations proposant régulièrement des concours de programmation.
Nous pouvons penser à:
La participation à des concours de programmation peut accroître l’enthousiasme des étudiants en informatique . Les compétences acquises lors des concours de programmation de type ICPC améliorent également les perspectives de carrière, car elles aident à réussir les « entretiens techniques », qui demandent souvent aux candidats de résoudre sur place des problèmes de programmation et d'algorithmique complexes[22],[25].
La programmation compétitive a également fait l’objet de critiques, notamment de la part des développeurs de logiciels professionnels[26]. Un point critique est que de nombreux concours de programmation rapides enseignent aux concurrents de mauvaises habitudes de programmation et un mauvais style de code (comme l'utilisation inutile de macros, le manque d'abstraction et de commentaires POO, l'utilisation de noms de variables courts, etc.)[27],[26]. De plus, en proposant uniquement de petits puzzles algorithmiques avec des solutions relativement courtes, les concours de programmation comme l'ICPC et l'IOI n'enseignent pas nécessairement de bonnes compétences et pratiques en ingénierie logicielle, car les vrais projets logiciels comportent généralement plusieurs milliers de lignes de code et sont développés par de grandes équipes sur de longues périodes[26]. Peter Norvig a déclaré que, selon les données disponibles, le fait d'être gagnant d'un concours de programmation était corrélé négativement avec la performance d'un programmeur dans son travail chez Google (même si les gagnants du concours avaient plus de chances d'être embauchés)[28].
Un autre sentiment est que plutôt que de « perdre » leur temps à se livrer à une concurrence excessive en résolvant des problèmes avec des solutions connues, les programmeurs de haut niveau devraient plutôt investir leur temps dans la résolution de problèmes appartenant au monde de la recherche[26].