ChallengeDéveloppement WebAdventOfCodeTechnologie

J'ai créé et hébergé mon propre défi type Advent of Code

14/06/2025
11 minutes de lecture
Éric Philippe

Éric Philippe

Full-Stack Developer & Designer

CrĂ©er mon propre Advent of Code : d’un simple appel Ă  l'aide Ă  une plateforme complĂšte en un mois

Parfois, les meilleurs projets commencent avec le stress de quelqu’un d’autre. Imaginez : je suis en 4e annĂ©e d’informatique sur le campus Ynov de Toulouse, tranquille, quand des membres du personnel viennent me voir avec cette tĂȘte si particuliĂšre.

“Hey Éric, on a besoin d’aide pour un concours de programmation destinĂ© aux Ă©tudiants de 2e annĂ©e. À la base, c’était national, mais maintenant chaque campus doit se dĂ©brouiller. Ah, et il nous reste un mois. Sans pression.”

Mon cerveau a rĂ©agi au quart de tour : “Je pourrais recrĂ©er Advent of Code, non ? Non ?”

Spoiler : bien plus compliquĂ© que prĂ©vu
 mais ça valait totalement la folie qui a suivi.

C’est quoi Advent of Code dĂ©jĂ  ?

Pour ceux qui n’ont pas encore plongĂ© dans l’univers d’Advent of Code : c’est un calendrier de l’Avent pour dĂ©veloppeurs. Chaque jour de dĂ©cembre, un nouveau puzzle de programmation dĂ©barque. Au dĂ©but ça va, puis trĂšs vite tu remets en question tes choix de vie.

Le concept malin ? Chaque participant a des donnĂ©es d’entrĂ©e uniques, donc pas moyen de tricher en copiant un camarade. Et chaque problĂšme vient avec une histoire qui se dĂ©veloppe jour aprĂšs jour, ce qui rend l’assistance d’une IA bien moins efficace, vu que ChatGPT galĂšre vite Ă  suivre le contexte narratif.

AprĂšs deux annĂ©es Ă  y participer (et Ă  adorer chaque minute de frustration), je me suis dit : “Ça ne peut pas ĂȘtre si compliquĂ© de faire ma propre version ?”

Ahem.

Les “simples” besoins

Les attentes du staff semblaient assez basiques :

  • Une plateforme oĂč les Ă©tudiants pourraient rĂ©soudre des Ă©nigmes
  • Des entrĂ©es uniques pour chaque participant (pas de triche !)
  • Un systĂšme de scores en temps rĂ©el avec classement
  • De quoi les occuper pendant une journĂ©e entiĂšre
  • Et, bien sĂ»r, un mois pour tout faire

Avec le recul, j’aurais dĂ» leur recommander une plateforme existante. Mais oĂč est le fun lĂ -dedans ?

Le POC (Proof of Concept) et la claque de la réalité

Je sors mon fidĂšle laptop et je commence un prototype en Python. L’idĂ©e tenait la route : un systĂšme pour gĂ©nĂ©rer des entrĂ©es uniques et valider automatiquement les rĂ©ponses. Python, parfait pour ça, avec toutes ses libraries.

Mais trùs vite, je me rends compte que ce n’est pas juste une histoire de puzzles. Il me fallait :

  • Une vraie gestion des utilisateurs
  • Des interfaces d’admin pour le staff
  • Un systĂšme de gestion des compĂ©titions
  • Un scoring en temps rĂ©el
  • Un outil pour crĂ©er/dĂ©ployer les Ă©nigmes

Et tout ça devait ĂȘtre simple Ă  utiliser, mĂȘme pour des Ă©tudiants qui voulaient juste rĂ©soudre des problĂšmes sans galĂ©rer avec la plateforme.

Le choix de la stack

Je décide de séparer le projet en trois blocs principaux :

Frontend : l’expĂ©rience cĂŽtĂ© Ă©tudiant

React avec Vite. Rapide, efficace, et je pouvais construire une interface moderne (pas un truc des années 2000, coucou les plateformes scolaires classiques). Pour le style : Tailwind CSS. Propre et rapide à intégrer.

Backend : les gros muscles

C’est lĂ  que je tente quelque chose de nouveau : Go. J’étais curieux, et c’était l’occasion parfaite. Go + Gin = performances, surtout si des centaines d’étudiants se connectent et demandent des entrĂ©es uniques en mĂȘme temps.

Gestion des puzzles : la sauce secrĂšte

Petit moment “eureka” : je me souvenais que les fichiers .docx ou .xlsx sont en fait des .zip avec du XML dedans. L’idĂ©e a mĂ»ri : et si je crĂ©ais mon propre format .alghive, un .zip contenant du XML pour les mĂ©tadonnĂ©es, et des scripts Python pour la gĂ©nĂ©ration d’inputs et la validation ?

RĂ©sultat : les puzzles peuvent ĂȘtre créés avec des outils familiers, et le systĂšme les traite automatiquement. Bingo.

Le marathon de développement

Base de donnĂ©es d’abord

PostgreSQL en base principale, Redis pour le cache. J’ai commencĂ© par le schĂ©ma, vu que le panneau d’admin allait ĂȘtre un gros morceau – rĂŽles, groupes d’étudiants, compĂ©titions, etc.

Le schĂ©ma de dĂ©part a plutĂŽt bien tenu la route, mĂȘme si j’ai dĂ» faire Ă©voluer la gestion des compĂ©titions plusieurs fois.

DĂ©veloppement de l’API en Go

Le serveur web en Go a Ă©tĂ© une vraie satisfaction. Swagger m’a sauvĂ© la vie pour documenter l’API. Authentification, users, CRUD, tout s’est construit couche par couche.

Le calvaire du panneau d’administration

Pas sexy, mais indispensable. Des composants React à la chaßne : gestion des users, campus, compétitions, déploiement de puzzles... Le royaume du CRUD.

Au bout d’un moment, j’ai rĂ©alisĂ© que mon projet Ă©tait un repository monolithique avec des dossiers Frontend/ et Backend/. Ça devenait ingĂ©rable. Il Ă©tait temps de structurer un peu tout ça.

Le plot twist : multi-campus

Juste quand je commençais Ă  prendre mon rythme, le campus de Montpellier m’appelle: ils veulent aussi organiser leur propre Ă©vĂ©nement, et certains Ă©tudiants veulent contribuer Ă  la crĂ©ation des puzzles.

Et lĂ , mon “petit projet scolaire” devient un systĂšme multi-campus, collaboratif, avec dĂ©ploiement automatique. C’est lĂ  que j’ai dĂ©cidĂ© d’assumer l’ambition et de crĂ©er un vrai Ă©cosystĂšme.

J’ai tout dĂ©placĂ© dans une organisation GitHub et sĂ©parĂ© le monolithe, et en ai profitĂ© pour introduire de nouveaux services :

  • HiveCraft : une lib Python pour crĂ©er les puzzles (disponible sur PyPI)
  • HiveCraft CLI : des outils en ligne de commande pour gĂ©rer ses Ă©nigmes
  • BeeHive : un Ă©diteur graphique (Non terminĂ©)
  • GitHub Actions : compilation et dĂ©ploiement automatisĂ©s des puzzles

Le thĂšme des abeilles est arrivĂ© tout seul
 et j’ai dĂ©cidĂ© de le garder. 🐝

Le rush sur l’interface

À deux semaines de l’échĂ©ance, j’avais un backend solide et un panneau d’admin fonctionnel
 mais rien cĂŽtĂ© Ă©tudiant. Bon.

Et en fait, c’est lĂ  que le fun est revenu. AprĂšs des semaines Ă  coder de l’admin, construire une interface sympa et moderne pour les Ă©tudiants m’a remotivĂ©. Je voulais quelque chose de plus propre et agrĂ©able Ă  utiliser – loin des plateformes institutionnelles tristes qu’on connaĂźt tous.

L’explosion de l’écosystĂšme

Au fil de l’eau, j’ai compris qu’il me fallait des services annexes :

BeeAPI

Un service Go Ă  part pour l’exĂ©cution des puzzles, la gĂ©nĂ©ration des entrĂ©es, la validation. SĂ©parĂ© du serveur principal, plus performant et plus sĂ©curisĂ©. Et surtout, facile Ă  scaler si besoin.

BeeHub

Quand les Ă©tudiants de Montpellier ont voulu crĂ©er et tester des puzzles Ă  plusieurs, j’ai codĂ© une app web dĂ©diĂ©e. Backend Flask, frontend React. C’est devenu leur QG de crĂ©ation.

Le sprint final

À deux semaines de la deadline, le campus de Lyon dĂ©barque aussi. LĂ , j’ai compris que j’avais sans le vouloir bĂąti un projet qui dĂ©passait largement le cadre initial.

L’architecture finale gĂ©rait :

  • Trois campus diffĂ©rents
  • Des compĂ©titions distinctes
  • Un systĂšme de dĂ©ploiement temps rĂ©el
  • Une crĂ©ation collaborative de puzzles
  • Un scoring automatique avec leaderboard

Créer un puzzle, concrÚtement

Chaque compĂ©tition durait 6h, avec 16 puzzles max par Ă©tudiant (donc 32 parties, difficultĂ© croissante). Et grĂące au format .alghive, ajouter un puzzle Ă©tait aussi simple qu’un upload de fichier.

Déploiement & Docker

DĂšs le dĂ©but, j’ai pensĂ© au dĂ©ploiement. Chaque service dans un conteneur Docker, avec des docker-compose diffĂ©rents pour le dev, le staging, et la prod. Je pouvais tester et mettre Ă  jour sans crainte de casser la plateforme en live.

Sécurité & monitoring de derniÚre minute

Juste avant le jour J, un éclair de lucidité : et si tout plantait et que je ne savais pas pourquoi ?

J'ai dĂ©cidĂ© d'installer en express Grafana et Prometheus: Monitoring CPU, mĂ©moire, rĂ©ponses API, connexions DB – je voulais tout voir.

CĂŽtĂ© sĂ©curitĂ© j'en ai profitĂ© pour implĂ©menter une limitation de requĂȘtes sur les endpoints sensibles, une validation des entrĂ©es, vĂ©rification de l’auth. Mieux vaut prĂ©venir que guĂ©rir.

Le jour J (et la galĂšre des 429)

Le jour de la compétition arrive. Tout roule. Les étudiants se connectent, je surveille mes dashboards de prÚs.

Puis
 BAM. 5 minutes aprùs le lancement.

“On n’arrive plus à se connecter !”

Des erreurs, des requĂȘtes refusĂ©es. Les 429 Too Many Requests explosent sur ma dashboard Grafana.

Le problĂšme ? Ma propre protection contre le DDOS.

Tous les Ă©tudiants Ă©taient connectĂ©s sur le mĂȘme rĂ©seau Wi-Fi
 donc mĂȘme IP. Et j’avais oubliĂ© ce dĂ©tail. RĂ©sultat : ma limite de requĂȘtes par IP bloquait tout le monde.

Imaginez-moi, en SSH sur le serveur en prod, pendant une compĂ©tition en live, en train de modifier mes rĂšgles de rate limiting dans l’urgence pendant que 100 Ă©tudiants attendent. Pas idĂ©al.

Heureusement, Grafana m’a permis de tout visualiser et ajuster rapidement. En 15 minutes, le problĂšme Ă©tait rĂ©solu.

Moralité : il faut tester dans des conditions réalistes. Les compétiteurs cliquent bien plus vite que des utilisateurs normaux.

Le succĂšs

AprĂšs cette crise express, tout s’est bien dĂ©roulĂ©. Les Ă©tudiants ont codĂ©, rĂ©solu des puzzles, se sont affrontĂ©s sur le leaderboard. L’infra a tenu, les puzzles ont gĂ©nĂ©rĂ© leurs entrĂ©es sans bug.

Voir les Ă©tudiants utiliser une plateforme que j’avais bĂątie de zĂ©ro
 ça valait toutes les nuits blanches.

Si je devais le refaire, je corrigerais ce problĂšme avec un captcha sur la page de login, ou un systĂšme d’empreinte navigateur pour limiter les requĂȘtes par utilisateur rĂ©el.

Ce que j’ai appris

  1. 1
    Le scope explose vite – “juste une plateforme simple” est devenu un Ă©cosystĂšme complet
  2. 2
    SĂ©parer les services, c’est vital – ça m’aurait Ă©vitĂ© bien des maux de tĂȘte
  3. 3
    Une bonne doc, c’est la vie – Swagger m’a sauvĂ©
  4. 4
    Choisir Go, super idĂ©e – les perfs Ă©taient au rendez-vous
  5. 5
    UX > fonctionnalitĂ©s – les Ă©tudiants veulent une expĂ©rience fluide avant tout
  6. 6
    Monitoring obligatoire – sans Grafana, j’étais dans le flou
  7. 7
    Tester dans les vraies conditions – les compĂ©titions, c’est pas du trafic “normal”
  8. 8
    Toujours un plan B – et ĂȘtre capable de rĂ©agir vite

Quelques chiffres

CÎté développement :

  • 1 mois de dev
  • 200+ heures de code (soit ~47h/semaine, ~7h/jour avec les week-ends)
  • 11 services diffĂ©rents
  • 70K+ lignes de code (merci TypeScript
)
  • 572 Mo d’images Docker, dĂ©pendances et DB comprises

CÎté événement :

  • 100+ Ă©tudiants participants sur 3 campus
  • 1449 puzzles rĂ©solus
  • 2992 soumissions (oui, certains ont spammĂ© les mauvaises rĂ©ponses
)
  • 19 minutes en moyenne pour rĂ©soudre une Ă©nigme

Bilan

Franchement, ce projet m’a appris bien plus en un mois que certains semestres entiers. J’ai pu mettre en pratique plein de technos que je voulais tester : Go, microservices, monitoring temps rĂ©el, Docker
 tout y est passĂ©.

Mais au-delĂ  des technos, j’ai surtout compris ce que ça impliquait d’hĂ©berger un vrai concours Ă  grande Ă©chelle : gestion d’infrastructure, UX, sĂ©curitĂ©, monitoring. Travailler en direct avec les Ă©tudiants et les voir apprĂ©cier l'expĂ©rience, c’était gĂ©nial.

Et maintenant ?

Ce qui Ă©tait censĂ© ĂȘtre un petit service pour mon Ă©cole est devenu quelque chose de bien plus gros. Mon but maintenant : faire d’AlgoHive une rĂ©fĂ©rence, pour les campus comme pour les entreprises qui veulent organiser des concours de code.

Tout l’écosystĂšme, les libraries, les outils de crĂ©ation, la doc : je veux que tout soit dispo et facile Ă  utiliser, sans devoir tout recoder Ă  la main comme je l’ai fait.

Il reste un boulot monstrueux, Ă©videmment. AmĂ©liorer la sĂ©curitĂ©, la stabilitĂ©, l’ergonomie. Je veux ajouter des catalogues de puzzles, de vraies stats, des outils collaboratifs
 peut-ĂȘtre mĂȘme une marketplace d’énigmes.

La suite

Pour ma derniĂšre annĂ©e d’études, je veux en faire un vrai projet d’équipe. M’entourer de profils qualifiĂ©s : experts sĂ©curitĂ©, UI/UX, crĂ©ateurs de puzzles. J’ai rĂ©ussi Ă  faire ça tout seul, mais ça peut ĂȘtre 10x mieux avec les bonnes personnes.

On prĂ©voit plus d’évĂ©nements dans les campus de Toulouse, peut-ĂȘtre ailleurs en France. L’objectif : crĂ©er un rĂ©seau d’évĂ©nements de prog compĂ©titive que les Ă©tudiants attendent avec impatience.

Je veux aussi bùtir une vraie communauté autour du projet : une doc claire, des tutos, un forum, et pourquoi pas des ateliers pour les campus qui veulent se lancer.

En conclusion

Est-ce que je referais ce projet ? Sans hésiter. Mais avec un scope mieux défini et des délais plus réalistes.

Cette expĂ©rience m’a prouvĂ© que les meilleurs apprentissages naissent souvent d’un “oui” un peu fou. Les dĂ©fis techniques, la gestion de projet, et l’impact direct sur des centaines de personnes
 aucune salle de classe ne m’aurait appris ça.

La plateforme AlgoHive est et restera open-source, prĂȘte Ă  l’emploi pour celles et ceux qui veulent se lancer dans leur propre compĂ©tition de programmation. Que vous soyez une Ă©cole, une entreprise ou juste un·e passionné·e de puzzles
 tout est lĂ .

J’espĂšre que ce post vous aura donnĂ© un bon aperçu du parcours, et peut-ĂȘtre l’envie de lancer votre propre projet (presque) impossible.

Pour accĂ©der Ă  tout l’écosystĂšme AlgoHive, rendez-vous sur GitHub. Docs, guides de dĂ©ploiement, tout y est. Attention, crĂ©er des puzzles est hautement addictif.

Tous les articles
Merci de votre lecture ! 🚀