AdventOfCodeTechnologyProgrammingChallenges

Un jour, un langage : Advent of Code 2022

31/12/2022
9 minutes de lecture
Éric Philippe

Éric Philippe

Full-Stack Developer & Designer

Un jour, un langage : mon aventure Advent of Code 2022

Parfois, les meilleurs défis naissent de conversations anodines. Imaginez la scène : je traîne avec un pote quand il me parle de ce truc appelé Advent of Code. "C'est comme Noël pour les programmeurs", qu'il me dit. "Chaque jour du 1er au 25 décembre, tu as un nouveau casse-tête de programmation à résoudre."

Mon cerveau s'est immédiatement dit : "Je pourrais rendre ça plus intéressant, non ?"

Spoiler : c'était bien plus compliqué que prévu, mais ça valait totalement le marathon de code qui a suivi.

C'est quoi Advent of Code au juste ?

Pour ceux qui ne connaissent pas, Advent of Code c'est un festival de programmation qui dure tout le mois. Chaque décembre, Eric Wastl publie des défis de programmation quotidiens qui commencent simples et vous font progressivement remettre en question vos choix de vie. Chaque puzzle a deux parties : la première est généralement gérable, puis la deuxième partie vous balance un twist qui vous fait réaliser que vous avez mal appréhendé le problème depuis le début.

AoC

Le truc génial ? Vous pouvez le résoudre dans n'importe quel langage de programmation. La plupart des gens choisissent leur langage préféré et s'y tiennent pour tout le mois.

Mais oĂą serait le fun lĂ -dedans ?

L'idée "simple" qui ne l'était pas

Après avoir entendu parler d'Advent of Code, mon cerveau a décidé de chercher encore plus loin : "Et si j'utilisais un langage de programmation différent chaque jour ?"

Ça semblait être l'occasion parfaite de :

  • Apprendre de nouveaux langages
  • AmĂ©liorer mes compĂ©tences sur diffĂ©rents paradigmes
  • M'amuser en me lançant un dĂ©fi
  • Frimer un peu (soyons honnĂŞtes)

Quelle difficulté ça pouvait représenter d'apprendre 25 langages de programmation en 25 jours tout en résolvant des puzzles de plus en plus difficiles ?

Narrator voice: It was very hard.

La phase de planification

J'ai commencé par lister les langages que je connaissais bien, mélangés avec d'autres dont j'avais entendu parler mais auxquels je n'avais jamais touché. Ma logique était brillamment défaillante : "Les premiers défis sont censés être faciles, donc je vais commencer par les langages que je ne connais pas et garder ceux que je maîtrise pour les trucs difficiles à la fin."

Le problème ? Je n'avais planifié que les dix premiers langages environ. Je n'avais aucune idée de comment j'allais gérer les quinze jours restants. Grand classique : résoudre le problème d'aujourd'hui, s'inquiéter des problèmes de demain... demain.

Mais attendez, il y a mieux ! J'ai aussi décidé que ce serait "amusant" (pourquoi ??) de tout implémenter en utilisant le TDD (Test-Driven Development). Pour ceux qui ne connaissent pas, le TDD consiste à écrire les tests avant d'écrire le code qui les fait passer. C'est une excellente pratique pour s'assurer que votre code fonctionne comme prévu.

TDD

Combiner le TDD avec l'apprentissage quotidien de nouveaux langages ? Du pur génie, non ?

La première moitié : confiance temporaire

Les dix premiers jours se sont étonnamment bien passés. J'ai pris des langages que je connaissais – Python, JavaScript, Java – implémenté des tests unitaires simples, et écrit du code qui les faisait passer. Les premiers puzzles étaient effectivement plus faciles, et je me sentais plutôt bien dans mon élan.

First part

J'ai même commencé à partager mes progrès quotidiens sur la communauté Reddit officielle d'Advent of Code. La réaction était encourageante ! Les gens étaient vraiment intéressés par mon expérience "un langage par jour". La communauté là-bas est incroyable – vous y trouverez tout, des solutions élégantes aux délires complets comme résoudre les puzzles en un minimum de lignes ou utiliser des langages complètement obscurs.

Reddit Comments

C'était parfait parce que je commençais à manquer de langages familiers. La communauté Reddit est devenue ma bouée de sauvetage pour découvrir de nouveaux langages et des guides de démarrage rapide.

La deuxième moitié : retour à la réalité

Puis la seconde moitié de décembre est arrivée, et tout a changé.

Non seulement les défis devenaient considérablement plus difficiles, mais je devais maintenant gérer des langages comme F#, Q, D, C, et R. Ma routine quotidienne est devenue ce magnifique chaos :

  1. 1
    Regarder le défi du jour
  2. 2
    Passer 1h+ Ă  installer et configurer le langage que j'avais choisi
  3. 3
    Comprendre comment implémenter les tests unitaires dans ce langage
  4. 4
    Résoudre le puzzle (la partie facile, croyez-le ou non)
  5. 5
    Partager la solution sur Reddit
  6. 6
    Recommencer demain avec un écosystème complètement différent

Timeline

Je passais plus de temps sur la configuration des langages que sur la résolution des problèmes !

J'ai tellement mis le bazar dans mon système que j'ai fini par le réinstaller complètement plusieurs fois. Quel bonheur.

À un moment, en regardant ma liste de langages, j'ai réalisé que j'étais accidentellement en train de parcourir l'alphabet. F#, puis G (Go), puis... attendez, est-ce que j'allais vraiment tenter tout l'alphabet ?

L'histoire d'horreur WSL

Laissez-moi prendre un moment pour apprécier le chaos que j'ai créé dans mon environnement de développement. Imaginez : chaque jour, j'installe de nouveaux compilateurs, interpréteurs, gestionnaires de paquets et outils de développement. Certains langages nécessitaient des versions spécifiques de dépendances. D'autres avaient des exigences conflictuelles.

Ma pauvre installation WSL (Windows Subsystem for Linux) ressemblait au sous-sol d'un collectionneur compulsif – couches sur couches d'environnements de développement à moitié configurés, chacun laissant des traces de son existence. Au jour 20, je n'étais même plus sûr de ce qui fonctionnait encore.

Broken WSL

Le point de rupture est arrivé quand j'ai essayé d'installer un langage obscur qui nécessitait une version spécifique d'une bibliothèque qui entrait en conflit avec quelque chose que j'avais installé pour le langage d'un jour précédent. Tout le système est devenu si instable que j'ai juste... recommencé. Deux fois.

Vaincre le boss final

Les derniers défis étaient vraiment difficiles. On parle d'algorithmes complexes, de structures de données, et de problèmes qui vous font fixer votre écran en vous demandant si vous avez oublié comment coder.

Ma stratégie a évolué : je résolvais d'abord chaque puzzle en Python (ma zone de confort) pour comprendre le problème et valider mon approche. Ensuite, j'essayais de porter la solution vers le nouveau langage que j'apprenais ce jour-là.

Ce n'était pas de la triche – c'était de la survie. L'alternative était de passer des journées entières coincé sur une syntaxe inconnue ET des défis algorithmiques complexes simultanément.

Quand le 25 décembre est finalement arrivé et que j'ai posté ma dernière solution, le sentiment d'accomplissement était incroyable. Je l'avais vraiment fait; 25 jours, 25 langages, 50 parties de puzzles résolues.

La reconnaissance inattendue

Le meilleur ? La communauté l'a remarqué. J'ai fini par être sélectionné comme l'un des 10 meilleurs dépôts de l'année sur le subreddit Advent of Code. Pour ma première année de participation, c'était incroyable !

Reddit

J'étais aussi fier de maintenir une série parfaite de commits – chaque jour de décembre avait au moins un commit dans mon dépôt de solutions. Il y a quelque chose de satisfaisant à voir ce graphique complètement vert.

Ce que j'ai vraiment appris

Au-delà de l'évidence ("n'installez pas 25 environnements de programmation différents en un mois"), cette expérience m'a enseigné des leçons précieuses :

La diversité des langages est belle

Chaque langage a sa propre philosophie et ses forces. Certains excellent dans les opérations mathématiques, d'autres dans le traitement de texte. Certains privilégient la sécurité, d'autres la performance. Certains vous font écrire des romans (Coucou Java), d'autres vous permettent d'exprimer des idées complexes en quelques lignes.

Diversity

Le temps de configuration est du vrai temps

La partie la plus frustrante n'était pas le codage – c'était la configuration de l'environnement. Chaque langage a son propre écosystème, ses gestionnaires de paquets, ses frameworks de test, et ses bizarreries. Prévoyez du temps pour ça, surtout si vous explorez un territoire inconnu.

La communauté compte

La communauté Advent of Code sur Reddit était inestimable. Pas seulement pour découvrir de nouveaux langages, mais pour la motivation, l'aide au débogage, et célébrer les petites victoires. La programmation peut être isolante ; la communauté la rend amusante.

TDD + apprentissage = compliqué

Essayer d'apprendre une nouvelle syntaxe tout en implémentant des pratiques de test appropriées était... ambitieux. Les deux sont des compétences précieuses, mais les combiner créait une charge cognitive inutile. Choisissez un objectif d'apprentissage à la fois.

Les langages qui m'ont surpris

Certains langages que je pensais difficiles se sont révélés délicieux (Rust). D'autres que j'imaginais simples, m'ont posé des défis inattendus (Haskell).

Les langages de programmation fonctionnelle m'ont poussé à penser différemment la résolution de problèmes. Les langages avec des paradigmes uniques m'ont forcé à complètement restructurer mon approche de certains problèmes.

Est-ce que je recommencerais ?

Absolument, mais avec des modifications. La contrainte "un langage par jour" était à la fois la force et la faiblesse du défi. Ça forçait l'exploration rapide mais empêchait la compréhension profonde.

Pour les futurs événements Advent of Code, je pourrais essayer :

  • Planifier effectivement les 25 langages Ă  l'avance (rĂ©volutionnaire, je sais)

...

Réflexions finales

Advent of Code 2022 était plus qu'un simple défi de programmation, c'était une exploration d'un mois des langages de programmation, des paradigmes, et de mes propres limites. J'ai découvert des langages que je veux explorer davantage, renforcé mon appréciation pour de bons outils, et gagné en confiance dans ma capacité à maîtriser rapidement de nouvelles technologies.

Plus important encore, ça m'a rappelé pourquoi j'aime la programmation en premier lieu. Chaque langage est la tentative de quelqu'un de rendre l'expression d'idées en code meilleure, plus rapide, ou plus élégante. Expérimenter cette diversité de première main était vraiment inspirant.

Si vous envisagez de participer à Advent of Code, je le recommande vivement. Peut-être ne poussez pas la bêtise aussi loin que moi avec le changement de langages et le TDD, mais profitez définitivement du défi. La communauté est accueillante, les problèmes sont bien conçus, et vous apprendrez plus que vous ne l'attendez.

Et qui sait ? Vous pourriez bien trouver votre nouveau langage de programmation préféré en chemin.

Vous pensez à essayer Advent of Code vous-même ? N'hésitez pas à me contacter – j'adorerais entendre parler de vos propres aventures dans les défis de programmation quotidiens.

Dans le même esprit, n'hésitez pas à jeter un œil à mon post où je raconte comment j'ai organisé et réalisé ma propre compétition inspirée d'Advent of Code : AlgoHive

Tous les articles
Merci de votre lecture ! 🚀