La programmation compétitive : définition et objectifs
La programmation compétitive est un sport mental qui permet de coder un problème donné sous des contraintes données. Pour être plus précis, prenez n'importe quel sport, considérons le cricket par exemple, vous entrez dans la partie pour la première fois. Un coup et un raté, faites-le plusieurs fois et vous finirez par en frapper un dans les cordes. Maintenant, considérez un concours de programmation comme un jeu de cricket. Vous compilez un code et le soumettez, vous pouvez recevoir un WA (Wrong Answer). Modifiez le code, soumettez-le à nouveau et vous obtiendrez peut-être votre première AC (Accepted/Correct Answer).
Ainsi, la programmation compétitive est un sport intellectuel qui se déroule généralement sur Internet ou sur un réseau local et qui implique des participants essayant de programmer selon des spécifications fournies. Les participants sont appelés programmeurs sportifs. Dans le cadre d'un concours de programmation, l'hôte présente généralement un ensemble de problèmes logiques ou mathématiques - également appelés énigmes - aux participants (dont le nombre peut varier de quelques dizaines à plusieurs milliers), qui doivent écrire des programmes informatiques capables de résoudre chaque problème.
Généralement, l'appréciation du résultat est basée sur le nombre de problèmes résolus dans le temps imparti, mais peut également inclure d'autres facteurs (qualité du résultat produit, temps d'exécution, taille du programme, etc.). Pour les experts, l'objectif unique et clair de ces concours de programmation est de "préparer un programmeur de telle sorte que sa capacité logique augmente et qu'il soit capable d'écrire du code dans une situation difficile". La programmation compétitive est reconnue et soutenue par plusieurs multinationales du logiciel et de l'Internet, telles que Google et Facebook - qui embauchent régulièrement par le biais de ces concours.
Cependant, si la programmation compétitive est devenue très célèbre pendant la dernière décennie - avec la montée en puissance des GAFAM et de nombreuses autres grandes multinationales - des experts pensent qu'elle a aujourd'hui dévié de son objectif initial et tend désormais à devenir inutile. En effet, à mesure que les concours se succédaient, des plateformes de préparation à la programmation compétitive (leetcode, geeksforgeeks, etc.) ont fait leur apparition. Elles ont commencé à rassembler à constituer un recueil des réponses aux exercices de ces concours pour permettre aux candidats de s'exercer avant de se présenter.
Cela dit, selon Kislay Verma, un technologue, les choses ont mal tourné par la suite. Grâce à l'accès croissant à ces questions, les organisateurs de ces concours et les entreprises qui se basent sur ces questions lors d'entretiens d'embauche ont commencé à poser des questions de plus en plus difficiles lors des séries de codage dans le cadre d'entretiens avec des étudiants (souvent avec moins de 5 ans d'expérience). Selon Verma, les attentes pour ces épreuves seraient actuellement dénuées de sens. « Nous avons laissé la compétence derrière nous et nous sommes maintenant dans le domaine du fétichisme », a-t-il déclaré.
La programmation compétitive est-elle devenue inutile ?
« En réaction, les étudiants universitaires s'adonnent désormais à la programmation compétitive de manière obsessionnelle pour rester au sommet. Dans cette étrange course aux armements contre les candidats à l'embauche, les entreprises posent des questions de plus en plus difficiles dans une tentative malavisée d'élever la barre. Les étudiants répondent en ne faisant rien d'autre que de résoudre chaque question disponible sur chaque site Web de programmation compétitive », a ajouté Kislay Verma. Selon ce dernier, le processus d'entretien des jeunes ingénieurs, tel qu'il existe aujourd'hui, présente un problème systémique.
Pour lui, peu importe que les débutants se situent au-dessus d'une certaine barre de compétences en matière de logique, de codage et d'algorithmique - c'est du pareil au même. « Il s'agit d'un cas classique d'utilisation d'une métrique. Une prime est accordée à la capacité de résoudre des questions très complexes sur les structures de données. Pour répondre à ce critère inutilement élevé, les étudiants font tout ce qu'il faut », a-t-il déclaré. Il estime qu'être capable de résoudre des problèmes typiques de structures de données et d'algorithmes est un signal dans le processus d'entretien plus large.
« En abaissant la barre trop haute des questions, les organisations peuvent permettre aux étudiants d'exercer leur curiosité et de développer leur passion pour quelque chose qui leur est propre - leur technologie préférée, leur pile technologique préférée, leur industrie préférée. Cela les aidera à trouver des personnes qui peuvent être formées, qui sont motivées et qui ont un intérêt réel pour la technologie au-delà d'une version gamifiée de celle-ci », préconise Verma. « Tout cela serait bien si cela aidait les gens à devenir des programmeurs infiniment meilleurs (ce n'est pas le cas) ou au moins à se distinguer du lot », déplore-t-il.
D'après Verma, à l'heure actuelle, les étudiants qui ont 37 millions d'étoiles sur codingninjas, un niveau extra-super-avancé sur leetcode ou un statut de uber-coding-lord sur codeforces échouent régulièrement au processus d'entretien parce que TOUT LE MONDE autour d'eux est au même niveau. Et dans la poursuite de ce niveau, ils auraient ignoré beaucoup d'autres principes fondamentaux qu'ils auraient dû apprendre ou des choses qu'ils auraient pu explorer et essayer par eux-mêmes. Il déplore également le fait qu'au cours de ces dernières années, ces étudiants ont limité la programmation à ces concours ou à ces plateformes.
« Lorsqu'on leur demande quel type de technologies ils trouvent intéressant, plusieurs étudiants m'ont dit ces dernières années qu'ils n'étaient enthousiasmés que par la programmation de compétition et qu'ils n'avaient aucun autre intérêt pour le génie logiciel ou la technologie en tant que tels », a déclaré Verma. Selon lui, c'est la responsabilité des organisations d'attirer l'attention sur ce problème et de se concentrer sur d'autres aspects du génie logiciel.
« Au moins sur d'autres sujets académiques, si ce n'est rien d'autre. Mais presque toujours, le premier entretien est un défi très difficile de structures de données que les simples mortels ne peuvent pas surmonter. Ainsi, les tours ultérieurs évaluent toujours les personnes qui ont un biais de programmation compétitif. Cet entonnoir ne permettra jamais à une race différente d'ingénieurs logiciels de passer à travers », met-il en garde.
La programmation compétitive fait fi des fondamentaux
Deux camps s'affrontent en ce qui concerne l'utilité de la programmation compétitive. En premier lieu, les critiques de Verma sont soutenues par un groupe de personnes qui sont d'avis que la programmation compétitive ne fait pas de vous un bon ingénieur logiciel. Le groupe a expliqué que la programmation compétitive vous enseigne de mauvaises pratiques, comme l'abus de constructions de programmation dangereuses ou de structures de données pour optimiser le code ou simplement économiser de la frappe en écrivant le code (comme les noms de variables en une lettre, les macros, etc.), les variables globales et l'état dans le programme, etc.
Elle encouragerait également la non-utilisation de modèles de conception communs, la non-utilisation de la POO, l'absence de documentation du code et, en général, l'écriture d'un code difficile à maintenir parce qu'il n'est pas bien conçu. « On pourrait dire qu'une personne ne fait cela qu'en compétition, mais mon expérience m'a montré que ce n'est pas vrai, car si vous apprenez à programmer d'une certaine manière, vous ferez de même dans d'autres contextes », a déclaré une personne qui est d'avis avec Verma. Selon elle, les compétences que vous allez acquérir en faisant de la programmation en compétition sont plus qu'inutiles.
« Dans la vie réelle, je n'ai pas encore rencontré de situation dans laquelle je devais utiliser un algorithme utilisé dans un concours de programmation. Mais si vous en avez besoin, vous ne les implémentez pas vous-même, mais vous utilisez une bibliothèque qui gère tout le travail », a déclaré le développeur. Selon lui, l'implémentation de Dijkstra que la plupart des programmeurs compétitifs utilisent est un jouet, pas quelque chose que vous n'utiliseriez jamais dans un logiciel d'entreprise. Il estime que la programmation compétitive passe totalement à côté de ce qu'elle est censée faire : "enseigner les fondamentaux aux développeurs".
« La compétence fondamentale que la programmation compétitive ne vous enseigne pas - et qui est pour moi la chose la plus importante pour un bon ingénieur logiciel - est d'utiliser Google pour trouver de la documentation en ligne. La plupart des erreurs que je vois commises par les jeunes ingénieurs en logiciel pourraient facilement être évitées s'ils faisaient une simple recherche sur Google et lisaient la documentation officielle (et non un article de blogue au hasard) », a-t-il déclaré.
« Et pourtant dans les concours de programmation, on vous interdit d'utiliser Internet. Je trouve cela stupide, c'est comme si l’on vous demandait d'écrire du code avec une machine à écrire juste parce que dans le passé, les claviers et les écrans n'existaient pas », a-t-il ajouté.
La programmation compétitive joue tout de même un rôle
Selon le deuxième groupe, la programmation compétitive est utile pour vous apprendre à penser et vous enseigner quelques compétences. Il estime que les impacts les plus utiles de la programmation compétitive ont à voir avec le fait de vous apprendre à programmer efficacement. « Le conseil le plus important que j'ai reçu pour la programmation compétitive était de m'éloigner de l'ordinateur. Le plus grand piège en programmation est d'écrire du code avant de savoir comment résoudre un problème, car cela tend à vous encourager à passer tout votre temps à ne faire aucun progrès pour trouver une solution », a déclaré l'un d'entre eux.
D'après ce dernier, une autre compétence utile est la capacité à déboguer des algorithmes. Déboguer un problème de programmation compétitif revient généralement à prendre une entrée qui échoue et à essayer de comprendre où se trouve l'erreur dans l'algorithme (exprimée dans un code mal écrit et commenté !). Selon lui, le fait d'apprendre à déboguer des algorithmes sous la pression du temps d'une compétition exige également d'être capable de décider rapidement si l'algorithme est mauvais, ou si c'est l'implémentation qui est mauvaise, ainsi que de déterminer les endroits où les erreurs sont le plus susceptibles de se glisser.
« Ce type d'expérience se traduit très utilement dans la programmation professionnelle, et le débogage est une compétence qui semble mal acquise par la plupart des jeunes programmeurs », a-t-il déclaré. Tout en citant plusieurs autres avantages de la programmation compétitive, il reconnaît tout de même que le groupe précédent a raison sur un point. Il estime que la programmation compétitive peut être inutile sous la forme dont elle est présentée par les plateformes comme leetcode. Selon lui, « l'objectif apparent de la programmation compétitive, à savoir la constitution d'un bon répertoire d'algorithmes et de structures de données avancées, est pratiquement inutile ».
« Lorsque la programmation compétitive atteint le niveau où vous devez mémoriser toutes les structures de données et tous les algorithmes avancés pour faire mieux, c'est là que l'amélioration dans les classements ne se traduit plus par de meilleurs programmeurs, à mon avis. Mais il y a encore beaucoup de compétences à acquérir pour monter dans les classements compétitifs avant d'atteindre ce point », a-t-il déclaré.
Sources : Kislay Verma, Coding Ninjas
Et vous ?
Quel est votre avis sur le sujet ?
La programmation compétitive est-elle utile ou inutile ?
La programmation compétitive fait-elle d'un ingénieur un bon programmeur ?
Avez-vous une expérience dans la programmation compétitive ? Si oui, partagez-la avec la communauté.
Voir aussi
Agile pourrait-il conduire les organisations vers une dette technique plus importante ? Oui, selon Don Clos, développeur logiciel, qui propose une analyse détaillée de la situation
Les logiciels de mauvaise qualité coûteraient plus de 2000 milliards de dollars aux entreprises, selon un rapport du CISQ pour les USA
Pourquoi les outils de développement low-code ne permettront pas aux développeurs citoyens de créer 80 % des logiciels d'ici 2024 ? De bons outils ne suffiraient pas pour créer de bons logiciels
Le marché mondial des technologies de développement low-code va augmenter de 23 % en 2021, selon les prévisions de Gartner