Petr Mitrichev (à gauche) et Gennady Korotkevich (à droite), deux programmeurs compétitifs de premier plan lors de la coupe d'algorithmes Yandex 2013.
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.).
Histoire
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.
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]
Compétition par équipes pour étudiants universitaires, le concours se compose de plusieurs épreuves régionales qui se concluent par une finale mondiale organisée chaque année. Les équipes sont composées de trois étudiants de la même université et ils ne sont autorisés à utiliser qu'un seul ordinateur.[13]
Concours international pour les élèves du secondaire. Organisé chaque année depuis 1989. Chaque pays peut envoyer au maximum 4 participants pour concourir.
Concours national d'algorithmique organisé par l'association Prologin en France depuis 1996. L'un des plus vieux concours encore actif.[19]
Actif
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.
Intelligence artificielle et apprentissage automatique
Concours de programmation informatique où les participants construisent des robots dans le langage de programmation souhaité pour concourir sur un champ de bataille en deux dimensions.
Concours international annuel de programmation pour stimuler la recherche dans le domaine du développement et la programmation de systèmes multi-agents .
Un programme annuel dans lequel Google attribue des bourses à des centaines d'étudiants qui terminent avec succès un projet sur un logiciel libre/open source développer durant l'été.[20]
Mars-aout
Actif
Google Highly Open Participation Contest
Google Inc.
Un concours organisé par Google en 2007-2008 destiné aux lycéens. Le concours est conçu pour encourager les lycéens à participer à des projets open source.
Novembre-février
Inconnu
Plateformes en ligne
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.
Un concours de programmation annuel qui se déroule pendant l'Avent, avec une nouvelle paire d'énigmes publiées chaque jour, jusqu'au jour de Noël inclus. Le deuxième problème de chaque jour est bloqué jusqu'à ce que la première partie soit terminée, il en est généralement la suite logique. Il existe des classements mondiaux et privés pour chaque année, dans lesquels le classement est basé sur le premier à résoudre le problème.
Gérer par Unacademy, fournit gratuitement une plateforme d'hébergement de concours aux établissement d'enseignement mais également des cours afin de se perfectionner.
Plateforme russe, gérée par l'université ITMO, qui propose des concours fréquents (jusqu'à deux par semaine) d'une durée de 2 à 3 heures (disponibles en anglais et en russe). Les utilisateurs peuvent également participer à des concours publiés par d'autres utilisateurs dans la section « gym », soumettre des cas de test supplémentaires pour « pirater » les soumissions d'autres concurrents pendant les concours, écrire des blogs pour partager des techniques entre eux et voir le code source des solutions d'autres utilisateurs. Les concurrents qui obtiennent une note suffisamment élevée peuvent se voir accorder des fonctionnalités supplémentaires, comme la possibilité d'ajouter des étiquettes aux problèmes et de proposer des ensembles de problèmes dans le cadre de concours officiels.
Puzzles (avec des difficultés croissantes), code golf. Organise régulièrement des concours en ligne. Propose également des compétitions courtes Clash of Code permettant à un maximum de 8 joueurs de s'affronter en ligne dans 3 modes de jeux différents (Taille de Code, Rapidité et Reverse) durant au maximum 15 minutes.
HackerRank propose des problèmes de programmation dans différents domaines de l'informatique. Il organise également des Codesprints annuels qui permettent de mettre ne relation les codeurs et les startups de la Silicon Valley.
LeetCode a plus de 2 300 problèmes qui couvrent de nombreux principes et offres des compétitions mensuel et bi-mensuel. Les sujets sont proposé en anglais et en mandarin.
Contient une grande collection de problèmes mathématiques informatiques (qui ne sont pas directement liés à la programmation mais dont la résolution nécessite souvent des compétences en programmation). Contrairement à d'autres juges en ligne, le code sources n'est pas nécessaire pour soumettre des solutions. Pour chaque problème nous avons une entrée généralement imposante et nous devons retourné un fichier qui contient les réponses de ce problèmes. Cela permet de laisser une liberté aux candidats dans les approches pour le résoudre.
Ressource et entreprise américaine qui organise des concours et fournit également des problèmes industriels en tant que travailleur indépendant. Elle propose des dizaines de concours courts et plusieurs longs (« marathons ») chaque année. Particularité : les participants ont la possibilité de vérifier l'exactitude des solutions des autres concurrents après la phase de codage et avant le test automatique final (appelé « Challenge phase »).
Contient exclusivement des problèmes issues de compétition passé. Permet de créer des concours en le composant de problème issue d'autres compétitions.
Est une plateforme française destinée à l'apprentissage de la programmation sportive orientée vers la préparationaux olympiades et concours informatiques comme IOI.
Avantages et critiques
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[23],[26].
La programmation compétitive a également fait l’objet de critiques, notamment de la part des développeurs de logiciels professionnels.[27] 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.).[28],[27] 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.[27]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).[29]
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.[27]
Littérature
Halim, S., Halim, F. (2013). Competitive Programming 3: The New Lower Bound of Programming Contests. Lulu.
Laaksonen, A. (2017). Guide to Competitive Programming (Undergraduate Topics in Computer Science). Édition : Springer International
Xu, X. (2020) Le développement, la prospérité et le déclin de l'olympisme en informatique . Publié en ligne .
Christoph Dürr, Jill-Jênn Vie (2016) Programmation efficace - 128 algorithmes qu’il faut avoir compris et codés en Python au cours de sa vie. Édition : ELLIPSES[30]
↑ abcde et fLuigi, Farina, Laura et Nanni, « oii-web: an Interactive Online Programming oii-web: an Interactive Online Programming Contest Training System », Olympiads in Informatics, vol. 10, , p. 207–222 (DOI10.15388/ioi.2016.13, S2CID6877554, lire en ligne)
↑ a et bCombéfis et Wautelet, « Programming Trainings and Informatics Teaching Through Online Contests », Olympiads in Informatics, vol. 8, , p. 21–34 (lire en ligne)
↑ abc et d(en) Aaron Bloomfield et Borja Sotomayor, « A Programming Contest Strategy Guide », SIGCSE '16: Proceedings of the 47th ACM Technical Symposium on Computing Science Education (conférence), (lire en ligne [PDF]).
↑Jackson, « The Google Technical Interview. How to Get Your Dream Job. », XRDS: Crossroads, the ACM Magazine for Students, vol. 20, no 2, , p. 12–14 (DOI10.1145/2539270, S2CID27549057, lire en ligne)