ChallengeDéveloppement WebAdventOfCodeTechnologie

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

14/06/2025
13 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 cherche une idĂ©e 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

Admin structure

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 :

First Draft Architecture

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.

Puzzle Creation

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.

First Draft Database Schema

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.

Admin Panel

Ne faites pas attention aux données de test, j'essayais juste d'obtenir l'interface utilisateur correcte tout en ayant un match de Rocket League en arriÚre-plan...

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. 🐝

Repositories

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. Le tout en gardant en tĂȘte de faire quelque chose de responsive pour que les Ă©tudiants puissent participer depuis n'importe quel appareil.

Mockups

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.

Le serveur principal n'a alors qu'Ă  servir de proxie pour les requĂȘtes pour les Ă©nigmes, tout en permettant de pouvoir distribuer la charge entre plusieurs instances BeeAPI si besoin.

BeeAPI Architecture

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. L'application se met en relation directe avec les BeeAPI pour pouvoir gĂ©rer les diffĂ©rents catalogues de puzzles, sous tous les environnements. Le tout protĂ©gĂ© d'une part par un systĂšme d'API Key, et d'une autre part par une isolation en ne gardant accessible que ce que le service doit voir.

BeeHub

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
Enfin une bonne excuse pour faire usage de WebSockets et de l’API REST.

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.

Cela a Ă©tĂ© pour moi une occasion de me challenger sur la crĂ©ation de puzzles. J’ai pu tester des idĂ©es, des mĂ©caniques de jeu, et surtout, j’ai appris Ă  crĂ©er des Ă©nigmes qui tiennent la route. Ca m'a permis par exemple de faire une Ă©nigme oĂč les Ă©tudiants devaient implĂ©menter le jeu de la vie de Conway !

Conway

J'ai aussi pu implémenter un systÚme de prévention à l'utilisation abusive de l'IA. J'ai fais en sorte que, dans les consignes de chaque puzzle, il y ait des prompts transparents, se déplacant dans le texte, pour éviter que les étudiants ne puissent simplement copier-coller les instructions dans une IA.

IA

Solide solution pour calmer les ardeurs des étudiants professionnels du "Copier-Coller IA".

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.

Docker packages

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.

Grafana Dashboard

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.

A ce moment-lĂ , j’avais une plateforme prĂȘte Ă  l’emploi. Le panneau d’admin Ă©tait fonctionnel, l’interface Ă©tudiant Ă©tait peaufinĂ©e, et les services backend tournaient comme une horloge.

Final Architecture

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
 BIM. 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.

Too Many Requests

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.

Juste aprÚs la compétition, j'ai également pris la casquette de graphiste pour créer des visuels pour compiler les résultats des trois campus. J'en ai également profité pour faire un second visuel rassemblant les quelques statistiques du développement de la plateforme.

Statistics

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.

Roadmap

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Ă .

AlgoHive on GitHub

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 ! 🚀