Construire Bencher en 2026 : open source, autofinancé et converti aux agents

Everett Pompeii

Everett Pompeii


Cet essai a Ă©tĂ© initialement soumis au concours The Pragmatic Engineer’s How Software Engineering is Changing Essay Challenge le 4 octobre 2026.

Cette annĂ©e a marquĂ© un changement radical dans ma façon de construire des logiciels. Je suis ingĂ©nieur logiciel de niveau staff. Au cours des six derniĂšres annĂ©es, j’ai travaillĂ© professionnellement en Rust, Ă  la fois pour une licorne soutenue par YC et a16z et pour une entreprise du Fortune 500. En tant que dĂ©veloppeur C++ repenti, j’ai Ă©tĂ© attirĂ© par la profondeur et le savoir-faire qu’exigeait Rust. J’étais devenu un artisan expert dans l’art de ciseler Ă  la main des logiciels systĂšmes temps rĂ©el. Au cours des dix derniers mois, j’ai dĂ» enterrer cette identitĂ©. MĂȘme si mon intitulĂ© de poste indique toujours “ingĂ©nieur logiciel”, mon mĂ©tier est dĂ©sormais celui d’“ingĂ©nieur de contexte”.

Ces quatre derniĂšres annĂ©es, j’ai passĂ© mes soirĂ©es et mes week-ends Ă  construire une entreprise open source et autofinancĂ©e, Bencher. Bencher est une plateforme de benchmarking continu qui aide les ingĂ©nieurs en logiciels systĂšmes Ă  dĂ©tecter les rĂ©gressions de performance avant qu’elles ne soient fusionnĂ©es. Il faut toute une suite d’outils pour y parvenir : un CLI, un serveur API et une console web frontend. Chacun de ces composants a Ă©tĂ© Ă©crit, Ă  une erreur d’arrondi prĂšs, par moi. J’ai eu quelques contributeurs open source notables au fil des annĂ©es, mais la grande majoritĂ© de Bencher le projet open source et 100 % de Bencher l’entreprise ont Ă©tĂ© conçus et implĂ©mentĂ©s par moi-mĂȘme.

Pendant ces quatre annĂ©es, je n’ai pas non plus vĂ©cu dans une grotte. Je me suis fiancĂ©, mariĂ©, et j’ai eu mon premier enfant. Il me fallait des semaines, et parfois des mois, pour venir Ă  bout de l’implĂ©mentation d’une grosse fonctionnalitĂ© et la dĂ©ployer. Je devais jongler entre le dĂ©veloppement et le support. Bencher avait dĂ©jĂ  de nombreux utilisateurs, alors je passais pas mal de temps Ă  rĂ©pondre aux questions et Ă  corriger le bug occasionnel.

En 2022, mon utilisation des LLM se rĂ©sumait Ă  la version gratuite pour Rust de TabNine, un outil de dĂ©veloppement d’autocomplĂ©tion par tabulation créé par un Ă©tudiant, l’un des premiers stagiaires d’OpenAI, qui travaillait sur un drĂŽle de petit projet nommĂ© Codex. Une fois GitHub Copilot lancĂ©, avec un support officieux de Rust, j’ai mis la main au portefeuille : 10 $/mois pour une licence personnelle.

C’était laborieux. Mais ça ressemblait quand mĂȘme un peu Ă  de la magie. Je me souviens avoir Ă©tĂ© bluffĂ©, peu aprĂšs l’ajout du chat Ă  l’extension VSCode de GitHub Copilot, par sa capacitĂ© Ă  crĂ©er des macros procĂ©durales Rust. En gĂ©nĂ©ral, je devais un peu retoucher le rĂ©sultat, mais Ă  quelques reprises, il a rĂ©ussi du premier coup. Dingue ! C’était cool et ça m’a probablement fait gagner un peu de temps, mais je travaillais encore essentiellement de la mĂȘme maniĂšre qu’avant.

À partir de lĂ , j’étais convaincu que Microsoft Ă©tait Ă  l’avant-garde avec GitHub Copilot. MĂȘme si ces nouveaux labos dernier cri balançaient des “agents” Ă  tout-va, je pouvais compter sur GitHub Copilot pour suivre le mouvement s’il y avait quoi que ce soit d’intĂ©ressant. J’entendais des gens comme Dan Shipper sur le Lenny’s Podcast, et leur description des capacitĂ©s des modĂšles ne collait tout simplement ni avec mon expĂ©rience ni avec mon niveau d’exigence.

Au dĂ©but de l’annĂ©e derniĂšre, j’ai Ă©crit un article revenant sur trois ans de dĂ©veloppement de Bencher, Revue d’IngĂ©nierie : Édition 2025. Dans cet article, je passais en revue toutes mes grandes dĂ©cisions d’ingĂ©nierie pour construire Bencher : frontend, backend, environnement de dĂ©veloppement, CI, et j’en passe. J’ai consacrĂ© un paragraphe entier Ă  pester contre la difficultĂ© que j’avais eue, deux ans plus tĂŽt, Ă  comprendre CUE lang. Pourtant, il n’y a pas une seule mention de l’IA, des LLM, ni mĂȘme de Copilot dans ces 3 500 mots.

Avance rapide, moins d’un an plus tard, et me voilà à compatir avec We mourn our craft.

Claude aide à sauver Noël

Comme beaucoup d’autres, pendant les vacances d’hiver 2025, j’ai eu l’occasion de vraiment utiliser Claude Opus 4.5. J’étais Ă  Londres avec ma femme et mon enfant, chez ma sƓur et sa famille. Ma sƓur venait de donner naissance Ă  des jumeaux, donc j’étais censĂ© ĂȘtre lĂ  pour donner un coup de main. Au lieu de ça, j’étais terrĂ© Ă  l’étage Ă  essayer de repousser du spam par e-mail et des attaques DDoS contre Bencher. Claude a Ă©tĂ© super utile pour diagnostiquer ce qui se passait et imaginer des solutions possibles.

J’ai fini par migrer Bencher derriĂšre Cloudflare et par mettre en place reCAPTCHA. C’était encore moi qui faisais l’essentiel du travail, mais Opus 4.5 marquait un net progrĂšs dans sa capacitĂ© Ă  rĂ©soudre des problĂšmes face Ă  de nombreuses contraintes de conception concurrentes. Cela dit, il m’a bien suggĂ©rĂ© un changement qui a rendu inutilisable le script pratique d’installation du CLI Bencher pendant une demi-journĂ©e. Oups.

Nouvelle année, nouveau harnais

En janvier de cette annĂ©e, ça faisait des mois que j’entendais dire Ă  quel point Claude Code Ă©tait impressionnant. Je m’étais retenu de l’essayer jusque-lĂ  parce qu’Opus 4 n’atteignait tout simplement pas mon niveau d’exigence pour que je fasse confiance Ă  son travail. Maintenant qu’Opus 4.5 avait franchi ce cap, je voulais aussi donner sa chance Ă  Claude Code. Le bond en avant que j’ai constatĂ© en passant de Copilot Ă  Claude Code comme harnais Ă©tait tout aussi grand que celui en passant d’Opus 4/GPT-5.2/Gemini 2.5 Pro Ă  Opus 4.5 comme modĂšle.

DĂšs mon tout premier week-end avec Claude Code, j’ai fait un test pas trĂšs contrĂŽlĂ© face Ă  Copilot. Je voulais que Copilot transforme un PDF en livre audio. MĂȘme en “Agent Mode”, Copilot avançait de cinq ou six Ă©tapes puis s’arrĂȘtait tout simplement jusqu’à ce que je le relance. Pendant ce temps, Claude Code bossait d’arrache-pied Ă  construire un hyperviseur sur mesure, aprĂšs ĂȘtre passĂ© par un Plan mode approfondi. J’ai acquis la conviction absolue que le niveau d’abstraction Ă©tait montĂ© du modĂšle au harnais et que Copilot ne rattraperait plus jamais son retard.

RĂȘver de Bencher Bare Metal

Depuis les tout dĂ©buts de Bencher, je rĂȘvais de construire une flotte de benchmarking sur bare metal. Les runners de CI traditionnels, du fait mĂȘme qu’ils sont des machines virtuelles, ont trop de bruit pour vous donner des rĂ©sultats de benchmark cohĂ©rents. Vous pourriez dĂ©tecter, disons, une hausse de 200 % de la latence, mais vous ne pourriez jamais dĂ©tecter une hausse de 20 % de maniĂšre fiable. Le comptage d’instructions est une possibilitĂ© pour le benchmarking en CI. Il est en grande partie dĂ©terministe. Cependant, le nombre d’instructions n’est qu’un indicateur indirect de ce qui vous importe vraiment : le temps rĂ©el Ă©coulĂ©. Tout ce qui s’exĂ©cute dans une “simulation de CPU” et recrache des nombres d’instructions ne peut qu’ĂȘtre corrĂ©lĂ© Ă  la vitesse. Le problĂšme, c’est que vous ne savez jamais de combien il se trompe, beaucoup ou peu, Ă  moins de mesurer rĂ©ellement sur bare metal.

L’un des tout premiers utilisateurs de Bencher a Ă©tĂ© le projet Rustls. J’ai contribuĂ© Ă  leur Rustls bench runner. Cependant, ce n’était pas une bonne fondation sur laquelle bĂątir une flotte de benchmarking sur bare metal. Il tournait sur un seul hĂŽte et considĂ©rait toutes les charges de travail de benchmark comme fiables. Cela veut dire pas de PR provenant de forks et pas de multi-location. En plus, la plupart des Ă©quipes ne veulent pas payer plus de 100 $ par mois par serveur de benchmarking bare metal.

J’avais envisagĂ© d’utiliser GitHub Actions pour la couche d’orchestration, mais cette approche prĂ©sentait quelques dĂ©fauts fondamentaux. Pour commencer, le GitHub Actions Runner est Ă©crit en C#. Cela signifie que son ramasse-miettes peut se dĂ©clencher au milieu de votre exĂ©cution et fausser vos rĂ©sultats de benchmark. Ah, et pensez Ă  dĂ©sactiver la mise Ă  jour automatique pour qu’elle ne se dĂ©clenche pas en pleine exĂ©cution, mais ne l’oubliez pas trop longtemps, sinon vos jobs cesseront de s’exĂ©cuter !

MĂȘme si le GitHub Actions Runner avait Ă©tĂ© un joli binaire Rust bien silencieux, le problĂšme plus fondamental Ă©tait qu’il Ă©tait liĂ© Ă  GitHub Actions. Depuis le dĂ©but, Bencher est pensĂ© CLI d’abord. Pour le meilleur ou pour le pire, je n’ai jamais voulu lier Bencher trop Ă©troitement Ă  un fournisseur de CI en particulier. Il existe une GitHub Action pour le CLI Bencher, mais tout ce qu’elle fait, c’est installer le CLI pour vous. Je voulais que Bencher Bare Metal fonctionne partout oĂč le CLI fonctionne, pas seulement dans GitHub Actions.

L’idĂ©e qui m’est venue Ă©tait d’utiliser des images OCI pour empaqueter la charge de travail de benchmarking, avec un bac Ă  sable optionnel et trĂšs lĂ©ger, pour n’exĂ©cuter qu’un seul job Ă  la fois sur un hĂŽte bare metal donnĂ©. La perspective de construire tout ça seul, sur mes soirĂ©es et mes week-ends, Ă©tait intimidante. Avec un emploi de jour et une famille, il m’aurait fallu au moins un an Ă  grignoter le projet petit Ă  petit tout seul.

Construire Bencher Bare Metal

Avec Opus 4.5 et Claude Code en main en janvier de cette annĂ©e, j’avais l’impression de voir enfin un chemin concret pour construire Bencher Bare Metal. J’ai de nouveau mis la main au portefeuille, cette fois Ă  hauteur de 200 $/mois pour l’abonnement Claude Max 20x. Probablement la meilleure dĂ©pense professionnelle de tous les temps.

Je me suis mis Ă  carburer Ă  fond et j’ai fait de mon mieux pour Ă©puiser chaque semaine le quota de mon abonnement Claude. J’ai arrĂȘtĂ© d’écrire du code Ă  la main, aussi bien sur Bencher qu’à mon travail de jour. À ce stade, j’itĂ©rais encore en boucles assez serrĂ©es, en utilisant le Plan mode, en lisant toute la sortie et en travaillant en mode Accept edits. Je ne faisais pas encore confiance Ă  l’agent pour toucher Ă  git/jj, donc je gĂ©rais moi-mĂȘme tout le contrĂŽle de version. Je me voyais comme une Ralph Loop avec un humain dans la boucle. À partir de cinq agents environ en parallĂšle, mon cerveau commençait Ă  fondre.

Une suggestion que j’avais entendue Ă©tait de confier l’implĂ©mentation et la revue Ă  des agents distincts, alors j’ai commencĂ© Ă  faire des revues contradictoires sĂ©parĂ©es. Ces revues contradictoires semblaient vraiment amĂ©liorer la qualitĂ© du rĂ©sultat. J’ai créé mon propre bot de revue GitHub Actions qui utilisait la clĂ© API de mon abonnement Claude Code. Je faisais ensuite itĂ©rer mon agent local avec ce relecteur en CI pour Ă©conomiser des cycles sur ma machine locale.

À un moment donnĂ©, j’ai cru que j’allais demander Ă  Claude de construire son propre hyperviseur pour le bac Ă  sable de benchmarking. J’ai alors demandĂ© Ă  Claude de faire une revue contradictoire du plan dans la peau de Linus Torvalds, et il m’a rĂ©pondu que j’étais stupide et que c’était une idĂ©e trĂšs, trĂšs, trĂšs bĂȘte. Pas de complaisance quand Linus est dans votre contexte ! Alors j’ai abandonnĂ© ce plan et je suis parti sur Firecracker.

L’ennemi d’un bon benchmarking, c’est la variance, pas la vitesse en soi. Donc mĂȘme si Firecracker ajoute un surcoĂ»t en tant qu’hyperviseur, c’est un surcoĂ»t trĂšs constant, surtout avec une seule microVM en cours d’exĂ©cution Ă  la fois. Cela permet aux runners partagĂ©s de Bencher Bare Metal d’offrir Ă  la fois la multi-location et des rĂ©sultats de benchmark trĂšs cohĂ©rents. J’ai aussi travaillĂ© avec Claude en Plan mode pour concevoir les choses de sorte que le bac Ă  sable soit optionnel. Si un utilisateur veut exĂ©cuter ses benchmarks sur son propre serveur dĂ©diĂ©, oĂč il fait confiance Ă  chaque charge de travail, alors il peut se passer de Firecracker avec un surcoĂ»t quasi nul.

DĂ©velopper le runner de Bare Metal a Ă©tĂ© une grande leçon pour moi sur l’importance pour les agents d’avoir une boucle de rĂ©troaction courte. MĂȘme aprĂšs la sortie d’Opus 4.6, Claude semblait avoir du mal Ă  faire fonctionner le tout de maniĂšre fiable. Une fois que je lui ai donnĂ© accĂšs Ă  un environnement de dĂ©veloppement avec KVM activĂ© (nĂ©cessaire pour faire tourner Firecracker), les choses ont vraiment commencĂ© Ă  se mettre en place. Ces agents ne sont pas omniscients, ils sont juste vraiment tenaces.

Le niveau d’examen auquel je soumettais le travail de Claude dĂ©pendait de la partie de la base de code dans laquelle il travaillait. Le code purement dĂ©diĂ© Ă  Bare Metal, comme le registre OCI et le binaire runner, je ne l’ai relu que lĂ©gĂšrement. Tant qu’il passait la revue contradictoire, que les tests de bout en bout passaient et que les choses n’avaient pas l’air trop horribles, je fusionnais. Pour le code qui touchait au cƓur existant, la mise en file d’attente des jobs et le traitement des rapports, j’étais aussi tatillon que jamais.

Fin mars de cette annĂ©e, j’ai publiĂ© Bencher Bare Metal dans le cadre de la v0.6.0. Pour la flotte bare metal publique, j’envisageais d’utiliser AWS EC2 Bare Metal. Cependant, ces machines sont Ă  la fois Ă©normes et uniquement ARM. Pour correspondre Ă  la plupart des charges de travail du monde rĂ©el, je voulais de bonnes machines Intel x86 prolĂ©taires. J’ai cherchĂ© avec Claude le meilleur foyer pour la flotte qui respecterait les contraintes de conception. Nous avons fini par pouvoir proposer sur Bencher Cloud la Spec intel-v1, qui offre aux utilisateurs 4 vCPU, 48 Go de mĂ©moire et 128 Go de disque, facturĂ©s Ă  la minute. Sur des benchmarks bien structurĂ©s, j’obtenais systĂ©matiquement une variance <2% entre les exĂ©cutions sur l’ensemble de la flotte.

Authentification des agents

Jusqu’à Bencher Bare Metal, toute l’authentification reposait sur des JWT. De gros, beaux et incomprĂ©hensibles JWT. L’authentification des runners Bare Metal, elle, utilisait une clĂ© API prĂ©fixĂ©e par un nom, par ex. bencher_runner_abc123....

CĂŽtĂ© client, je voulais donner aux agents autre chose Ă  utiliser que le jeton API JWT de l’utilisateur lui-mĂȘme. Le compromis que j’ai trouvĂ© a Ă©tĂ© d’enfin implĂ©menter une fonctionnalitĂ© demandĂ©e depuis longtemps : l’authentification Ă  l’échelle du projet. Claude m’a aidĂ© Ă  crĂ©er des clĂ©s API de projet sĂ©curisĂ©es et prĂ©fixĂ©es. Ces clĂ©s API sont restreintes Ă  des permissions Ă©quivalentes Ă  ce qu’effectue la commande CLI bencher run : des lectures limitĂ©es au projet et des Ă©critures non destructives. Cela fait aussi de ces clĂ©s API un choix naturel pour les workflows de CI de benchmarking continu.

Plus tard, quand j’ai ajoutĂ© le Bencher MCP, ces clĂ©s API de projet ont aussi servi Ă  l’authentification. Le standard MCP dĂ©signe OAuth 2.1, mais celui-ci est encore Ă  l’état de brouillon, donc je ne voulais pas encore l’implĂ©menter. HonnĂȘtement, je suis un peu sceptique vis-Ă -vis du MCP. Je pense toujours qu’un bon CLI + des skills est une maniĂšre plus efficace et plus portable d’exposer un service Ă  un agent. Le plus gros problĂšme des CLI, cependant, c’est l’absence de mĂ©canisme d’authentification standard. Donc mĂȘme si OAuth 2.1 est encore Ă  l’état de brouillon, au moins le MCP couvre ce point. Et une bonne solution d’authn compte vraiment pour les entreprises.

Claude le polyglotte

En 2023, j’ai dĂ©cidĂ© que je voulais que la documentation de Bencher soit disponible en 9 langues : anglais, chinois, espagnol, portugais brĂ©silien, russe, japonais, français, allemand et corĂ©en. Comment ai-je choisi ces neuf langues ? Ce sont les langues dans lesquelles la documentation de GitHub Ă©tait disponible, alors je me suis dit que c’était une approximation suffisante. Le seul problĂšme, c’est que je ne parle couramment que l’anglais. J’ai donc fait traduire la documentation par GPT-4. À l’époque, GPT-4 n’avait qu’une fenĂȘtre de contexte de 8k tokens. Cela signifiait que je devais dĂ©couper toutes mes pages de documentation en “chunks” de moins de 8k tokens. Ensuite, j’ai dĂ» crĂ©er un outil CLI pour gĂ©rer la traduction, et trĂšs souvent la retraduction, des chunks aprĂšs leur mise Ă  jour.

C’était un processus trĂšs fastidieux et sujet aux erreurs. Je devais retoucher Ă  la main les fichiers traduits parce que, mĂȘme avec des instructions trĂšs explicites dans le prompt systĂšme, le modĂšle massacrait quand mĂȘme les chemins d’import ou fourrait tout dans une couche supplĂ©mentaire de bloc Markdown, surtout en japonais, allez savoir pourquoi.

Une fois que j’ai commencĂ© Ă  utiliser Claude Code avec Opus 4.5, tout cela a disparu. Maintenant, l’agent s’en charge, tout simplement. La convention qui dĂ©finit ce qu’est un chunk se trouve dans la base de code, et Claude la suit, tout simplement. Quand j’ai rĂ©digĂ© la documentation technique de Bencher Bare Metal, Claude s’est simplement occupĂ© du dĂ©coupage en chunks et de l’orchestration des traductions. MĂȘme si la taille du contexte est dĂ©sormais largement suffisante pour gĂ©rer une page entiĂšre, j’aime avoir les chunks. Ils permettent de garder les changements isolĂ©s, de sorte que seules les sections pertinentes d’une page sont retraduites lors d’une rĂ©vision.

Qui n’a pas construit de harnais en 2026 ?

Tout en construisant Bencher Bare Metal, j’ai aussi demandĂ© Ă  Claude de crĂ©er ses propres outils pour gĂ©rer la flotte. Cela se composait de deux parties : un CLI dans le dĂ©pĂŽt bencher pour les tĂąches de routine et un nouveau mĂ©ta-dĂ©pĂŽt. Ce mĂ©ta-dĂ©pĂŽt contient toute la documentation et tout le contexte de Bencher en tant que produit. Chaque autre dĂ©pĂŽt de l’organisation GitHub bencherdev est un sous-module de ce mĂ©ta-dĂ©pĂŽt. Le mĂ©ta-dĂ©pĂŽt permet Ă  l’agent de travailler facilement sur une tĂąche qui peut s’étendre sur plusieurs dĂ©pĂŽts et de rĂ©diger des documents que je prĂ©fĂšre ne pas rendre publics (stratĂ©gie produit, rapports d’incident, etc.).

Je voulais construire mon propre agent par-dessus le CLI Claude Code, qui ferait passer ce mĂ©ta-dĂ©pĂŽt du statut d’artefact Ă  celui de partie proactive du cycle de dĂ©veloppement. Une fois Fable 5 disponible, j’ai concentrĂ© une grande partie de mon Ă©nergie sur la construction de cet agent. Je voulais pouvoir faire confiance Ă  cet agent pour fonctionner de maniĂšre autonome. Une grande partie de cela tenait Ă  la sĂ©curitĂ© (c.-Ă -d. attĂ©nuer les injections de prompt). Je l’ai conçu de sorte que les agents de travail ne dĂ©tiennent jamais aucun secret. Tous les secrets sont injectĂ©s par un proxy rĂ©seau et restreints Ă  des points de terminaison sur liste blanche. Les agents eux-mĂȘmes tournaient dans encore une autre microVM Firecracker, cette fois avec du parallĂ©lisme. La machine de contrĂŽle des agents et le proxy rĂ©seau + les bacs Ă  sable tournaient sur des hĂŽtes complĂštement diffĂ©rents.

Ma grande vision Ă©tait que l’interface soit une file d’attente classĂ©e par prioritĂ© des tĂąches. Autrement dit, le but de cet agent serait de me montrer la tĂąche la plus importante Ă  un instant donnĂ©. LĂ  oĂč les fils d’actualitĂ© de Facebook/Instagram/Twitter/X/TikTok sont optimisĂ©s pour l’engagement, ce fil serait optimisĂ© pour ce qui est important pour moi.

Je voulais crĂ©er l’outil qui me placerait en dessous de l’API. Je m’étais rendu compte que je passais le plus clair de mon temps Ă  changer de contexte et Ă  sauter d’un fil Ă  l’autre. J’espĂ©rais que l’agent pourrait m’aider Ă  allĂ©ger ce jonglage en classant les choses par ordre d’importance pour moi. Avec un systĂšme de votes positifs/nĂ©gatifs Ă  la Reddit, je pourrais entraĂźner l’agent Ă  savoir si ce nouveau message Slack Ă©tait vraiment la chose la plus importante Ă  laquelle prĂȘter attention.

Je me suis aussi rendu compte qu’une grande partie de mon travail consiste dĂ©sormais Ă  ĂȘtre le Rubeus Hagrid de mon agent, son “gardien des clĂ©s”. L’injection au niveau du proxy rĂ©seau avec une liste blanche restreinte de points de terminaison Ă©tait la meilleure solution que Claude et moi ayons trouvĂ©e pour Ă  la fois empĂȘcher l’agent d’avoir jamais accĂšs Ă  un secret et lui permettre quand mĂȘme d’utiliser des outils comme le CLI gh tels quels.

L’autre objectif phare Ă©tait de ne jamais quitter l’interface de l’agent. Quitter l’agent pour quelque raison que ce soit est considĂ©rĂ© comme un Ă©chec du harnais. J’ai créé un systĂšme de composants d’UI procĂ©dural pour que l’agent travaillant sur une tĂąche puisse construire une interface inĂ©dite Ă  la volĂ©e ou choisir l’un des composants existants de la bibliothĂšque en fonction de la tĂąche en cours. Code, e-mail, Slack, agenda, donnĂ©es de tĂ©lĂ©mĂ©trie de production, suivi des erreurs, tout dans une seule interface, tout dans une seule file d’attente priorisĂ©e.

J’ai mis en route une version minimale de tout cela. Cependant, il reste encore beaucoup d’aspĂ©ritĂ©s. Pour l’instant, je suis bien plus productif si j’utilise simplement l’application de bureau Claude. Et en ce moment, j’ai besoin de toute la productivitĂ© immĂ©diate possible pour suivre la demande.

Que se passe-t-il quand le nombre de développeurs est multiplié par 100 ?

En 2022, je cherchais un nouveau projet parallĂšle. J’avais mis fin Ă  ma prĂ©cĂ©dente aventure d’apprenti entrepreneur en 2020. Conseil de pro : Ă©coutez Jason Cohen, n’essayez pas d’autofinancer une marketplace.

À mon travail de jour, je construisais en Rust un parseur et analyseur statique de bash, et je me suis retrouvĂ© Ă  devoir utiliser un tableur pour suivre mes rĂ©sultats de benchmark. Le projet Rust dispose de rustc-perf pour suivre les performances du compilateur lui-mĂȘme. Pourtant, il n’existait pas de bon outil pour faire la mĂȘme chose sur mon propre code.

J’ai fait Ă©normĂ©ment de recherches sur l’art antĂ©rieur dans le domaine. Pendant plusieurs mois, j’ai eu des appels avec plusieurs dĂ©veloppeurs qui avaient soit construit, soit dĂ©fendu la construction d’outils de benchmarking continu. Tout le monde rĂ©inventait la roue. Je pensais avoir trouvĂ© un joli coin tranquille dans les eaux du marchĂ©. Il y avait un besoin Ă©vident et permanent. Beaucoup d’équipes payaient dĂ©jĂ  plus de 100 $/mois pour leurs propres runners bare metal. Il y avait donc une volontĂ© de payer. Pourtant, le cas d’usage Ă©tait de niche. La plupart des logiciels modernes sont dĂ©ployĂ©s en tant que service, donc faire du shift left sur les tests de performance n’était pas vraiment une prioritĂ© pour la plupart des Ă©quipes. Elles se contentaient de configurer des alertes dans Grafana aprĂšs le dĂ©ploiement et de rattraper aprĂšs coup tout ce qui serait passĂ© entre les mailles du filet.

Avec l’arrivĂ©e d’agents trĂšs performants, cependant, deux facteurs ont considĂ©rablement augmentĂ© l’utilisation de Bencher :

  1. Le besoin d’adopter les bonnes pratiques du gĂ©nie logiciel afin de tester de maniĂšre dĂ©terministe la production des agents
  2. La facilitĂ© d’adopter les bonnes pratiques du gĂ©nie logiciel avec l’aide des agents

Les LLM, et par extension les agents, sont des systĂšmes non dĂ©terministes et stochastiques. Comme les dĂ©veloppeurs humains, ils ont besoin de garde-fous pour s’assurer qu’ils maintiennent la qualitĂ© du code. Les moyens d’y parvenir ne sont pas nouveaux : un systĂšme de types robuste, un formateur standard, un linter rĂ©glĂ© sur 11, des tests, des tests et encore des tests. Le tout exĂ©cutĂ© en CI. Pour les charges de travail sensibles aux performances, ces tests incluent des benchmarks qui sont suivis. Suivre les performances d’un logiciel dans le temps vous permet de dĂ©tecter les rĂ©gressions de performance en CI. C’est ce qu’on appelle le benchmarking continu. Mettre en place le benchmarking continu a toujours Ă©tĂ© un peu une corvĂ©e. Seules les Ă©quipes qui tenaient vraiment, vraiment aux performances le faisaient, et elles faisaient d’excellents utilisateurs de Bencher !

Avec l’avĂšnement des agents, cependant, le coĂ»t d’ajout du benchmarking continu Ă  votre workflow avec Bencher ne tient plus qu’à un court prompt. C’est difficile Ă  mesurer prĂ©cisĂ©ment, mais je parierais que la grande majoritĂ© des inscriptions entrantes de Bencher viennent dĂ©sormais de la recommandation d’un agent, ou d’un agent qui s’inscrit lui-mĂȘme. Ce sera de plus en plus vrai avec le temps, Ă  mesure que davantage de dĂ©veloppeurs adopteront des agents et leur donneront les moyens du commerce agentique. Que ce soit ou non le protocole x402, je pense qu’une grande partie des dĂ©penses en outils de dĂ©veloppement passera Ă  l’avenir par des agents. Je vous recommande de rĂ©server votre Cloudflare Wallet et votre Stripe Wallet, si ce n’est pas dĂ©jĂ  fait.

Presque tous les outils de dĂ©veloppement devront passer Ă  une tarification Ă  l’usage Ă  l’ùre agentique. La tarification par siĂšge n’a aucun sens quand ce sont les agents qui utilisent votre service. Bencher a toujours eu une tarification Ă  l’usage. Cependant, avec l’aide de Claude, j’ai rĂ©cemment remaniĂ© le modĂšle de tarification pour le rendre encore plus adaptĂ© aux agents. Auparavant, Bencher facturait par MĂ©trique. Une MĂ©trique est un rĂ©sultat de benchmark unique Ă  un instant donnĂ©. Par exemple, si vous avez 1 benchmark et que vous l’exĂ©cutez 5 fois, cela crĂ©e 5 MĂ©triques. Claude m’a aidĂ© Ă  analyser les retours des utilisateurs et les schĂ©mas d’utilisation. J’en suis arrivĂ© Ă  la conclusion que l’unitĂ© utilisĂ©e pour notre modĂšle de tarification Ă  l’usage devait changer. DĂ©sormais, Bencher facture par SĂ©rie de Benchmark. Une SĂ©rie de Benchmark est un benchmark suivi dans le temps. Pour reprendre notre exemple, si vous avez 1 benchmark et que vous l’exĂ©cutez 5 fois, cela fait 1 SĂ©rie de Benchmark. Ce nouveau modĂšle de tarification offre beaucoup plus de prĂ©visibilitĂ© aux utilisateurs. Vous pouvez confier un problĂšme d’optimisation Ă  un agent, et il peut faire du hill climbing sur vos benchmarks historiques sans engendrer le moindre coĂ»t supplĂ©mentaire.

L’une des choses que je n’ai pas vues changer cette annĂ©e, ce sont les contributions open source. Bencher a reçu quelques PR d’AI slop. Le principal problĂšme de ces PR, c’est qu’elles corrigeaient des bugs alĂ©atoires, sans rapport, trouvĂ©s en chemin. Mais c’étaient quand mĂȘme de vrais bugs ! Alors j’ai un peu haussĂ© les Ă©paules et j’ai fusionnĂ© les PR, aprĂšs les avoir fait relire par mon propre agent, bien sĂ»r. C’est un peu triste, mais je ne vois plus vraiment l’intĂ©rĂȘt de courtiser les contributeurs open source. Que ce soient leurs tokens ou les miens, je dois quand mĂȘme fournir le mĂȘme effort pour relire le code. Il me faut dĂ©sormais beaucoup plus d’énergie pour relire la PR d’un contributeur que pour itĂ©rer moi-mĂȘme avec Claude.

Quel est l’avenir du Benchmarking Continu ?

Quand on essaie de deviner ce que l’avenir nous rĂ©serve, la rĂšgle semble ĂȘtre de regarder ce que font les laboratoires de pointe eux-mĂȘmes. Nous y serons tous d’ici six Ă  douze mois, semble-t-il. L’article de The Pragmatic Engineer Inside OpenAI’s agentic software factory apporte un Ă©clairage intĂ©ressant sur ce sujet du point de vue du benchmarking continu :

Nouveau : un “perf harness” : l’agent utilise aussi un perf harness pour envoyer les PR problĂ©matiques au framework A/B Synthetics afin d’évaluer leurs implications sur les performances. Comme mentionnĂ© plus haut, la charge sur les systĂšmes de CI a fortement augmentĂ© au cours des six derniers mois.

Le “perf harness” d’OpenAI semble trĂšs similaire Ă  la pratique Ă©tablie du benchmarking continu relatif. La nouveautĂ© apportĂ©e par l’IA, c’est la partie synthĂ©tique du framework A/B. Les donnĂ©es de test synthĂ©tiques n’ont rien de nouveau. Mais pouvoir façonner de maniĂšre autonome ces donnĂ©es synthĂ©tiques pour Ă©valuer les performances du changeset en question, ça, c’est clairement nouveau ! Faire en sorte qu’un dĂ©veloppeur Ă©crive rĂ©ellement les benchmarks a toujours Ă©tĂ© le point difficile. Maintenant, c’est automatisĂ©. De la mĂȘme maniĂšre que les agents ont considĂ©rablement augmentĂ© la couverture des tests fonctionnels, ils nous permettent aussi d’augmenter considĂ©rablement la couverture des tests de performance.

OpenAI n’est pas seul dans cette quĂȘte. Anthropic a publiĂ© peu aprĂšs How we made claude.ai 3x faster in two weeks. Ils y dĂ©crivent eux aussi la construction de benchmarks Ă  la volĂ©e. Une diffĂ©rence clĂ© est qu’Anthropic a trouvĂ© des comptages dĂ©terministes corrĂ©lĂ©s aux performances : instructions, commits par interaction, appels de fonction, recalculs de style et mutations du DOM. Claude a ensuite fait du hill climbing sur ces comptages pour optimiser les performances de leur application. À la fin de la passe d’optimisation, ils ont vĂ©rifiĂ© que leurs optimisations basĂ©es sur les comptages se traduisaient rĂ©ellement par des gains de temps rĂ©el Ă©coulĂ© dans le monde rĂ©el.

Ces mĂ©thodologies rejoignent ce que je vis personnellement en travaillant sur Bencher. Cela dit, mes tests de performance A/B ont tous Ă©tĂ© exĂ©cutĂ©s en local ou sur la machine de travail d’un agent, pas dans une boucle de CI. Chaque fois que je m’apprĂȘte Ă  faire un changement important sur une requĂȘte ou une migration de schĂ©ma consĂ©quente, je demande Ă  Claude de faire une Ă©valuation exhaustive des performances du changement. Cela inclut toujours le temps rĂ©el Ă©coulĂ© et parfois quelques comptages dĂ©terministes corollaires (par ex. les instructions de la machine virtuelle SQLite).

À cause des problĂšmes de voisins bruyants, ces passes d’optimisation des performances menĂ©es par des agents ont eu des barres d’erreur assez larges. Je cherche Ă  ajouter des fixtures (entrĂ©es de benchmark supplĂ©mentaires) et des artefacts (sorties de benchmark supplĂ©mentaires) Ă  Bencher Bare Metal afin de mieux permettre Ă  mon agent d’exĂ©cuter ces tĂąches d’optimisation des performances avec un niveau de confiance plus Ă©levĂ©. L’agent fera toujours l’essentiel de son travail d’optimisation en local, en faisant du hill climbing du mieux qu’il peut sur le temps rĂ©el Ă©coulĂ© ou sur des comptages dĂ©terministes. Ensuite, il utilisera Bencher Bare Metal pour vĂ©rifier son travail, comme une sorte de pied Ă  coulisse du temps rĂ©el.

MĂȘme si je pense que la plupart des “utilisateurs” de Bencher seront des agents d’ici un an environ, je pense toujours que la plupart des humains voudront une interface visuelle quand ils viendront jeter un Ɠil. Je suis actuellement plongĂ© jusqu’au cou dans une refonte totale de l’interface de Bencher avec l’aide de Claude. Écrite par un ingĂ©nieur Rust qui faisait de l’Anyscript Ă  l’époque de l’autocomplĂ©tion par tabulation de GitHub Copilot, l’interface actuelle laisse beaucoup Ă  dĂ©sirer. La réécriture de l’interface est cependant bloquĂ©e par un autre chantier encore plus ambitieux : une nouvelle version du Bencher Metric Format (BMF).

Le BMF est le format central dans lequel les rĂ©sultats de benchmark sont normalisĂ©s au sein de Bencher. Il traverse tout. Cette nouvelle version du BMF permettra de paramĂ©trer les benchmarks. Vous pourrez dĂ©clarer my_benchmark avec les paramĂštres size: 16 MB et size: 32 MB, au lieu d’avoir deux benchmarks distincts, my_benchmark_16_mb et my_benchmark_32_mb. La nouvelle version du BMF permettra aussi des noms de mĂ©triques arbitraires. Vous pourrez fournir des mĂ©triques mean, p95 et p99 pour vos mesures Latency, au lieu de n’avoir que mean ou de devoir crĂ©er Latency (mean), Latency (p95) et Latency (p99) comme mesures distinctes.

Prendre en charge cette nouvelle version du BMF reprĂ©sente une refonte massive du cƓur de Bencher. Je ne me serais pas senti Ă  l’aise de faire ce travail avec quoi que ce soit d’antĂ©rieur Ă  Fable 5. Comme Ă©voquĂ© plus haut, l’essentiel du travail sur Bare Metal Ă©tait orthogonal au cƓur de Bencher : suivre les performances dans le temps et alerter en cas de rĂ©gression. Le BMF est au centre de cette proposition de valeur. Ma confiance en Fable 5, et plus encore en Fable 5.1 et Opus 5.5, m’a de nouveau permis de dĂ©marrer un projet qui m’aurait demandĂ© des annĂ©es de soirĂ©es et de week-ends. Auparavant, j’avais dĂ» passer pas mal de temps Ă  optimiser SQLite pour Bencher. Maintenant, chaque fois que je fais Ă©voluer le modĂšle, je demande simplement Ă  Claude de lancer un agent pour mener une enquĂȘte approfondie sur les performances, afin de m’assurer que tout reste performant. À l’avenir, je ne pense mĂȘme pas que j’aurai Ă  le demander.

Comment je code aujourd’hui

À l’époque oĂč j’utilisais GitHub Copilot, c’était une extension dans VSCode. Quand je suis passĂ© Ă  Claude Code, j’utilisais le CLI. J’avais trois fenĂȘtres de terminal, chacune dans son propre Space macOS. Chaque fenĂȘtre de terminal avait deux onglets. Un onglet pour Claude, l’autre pour Jujutsu (jj). Je gĂ©rais encore moi-mĂȘme le contrĂŽle de version et les workspaces jj.

Aujourd’hui, j’utilise simplement l’application de bureau Claude Code. Chaque nouvelle session que je dĂ©marre part de mon mĂ©ta-dĂ©pĂŽt avec la case worktree cochĂ©e. J’ai arrĂȘtĂ© d’utiliser le Plan mode il y a quelques mois. Je n’ai jamais installĂ© le skill /grill-me de Matt Pocock. Je demande simplement Ă  Claude de “me cuisiner sur toutes les dĂ©cisions de conception” dans le prompt, et Ă  ce stade le modĂšle sait quoi faire. Mon CLAUDE.md AGENTS.md est plutĂŽt bien rĂ©glĂ© sur la façon dont je veux que le modĂšle se comporte.

J’ai pratiquement mis hors service mon workflow de CI Claude Review. L’agent se charge dĂ©sormais de lancer un relecteur contradictoire en local sans mĂȘme que j’aie Ă  le demander. Ensuite, ils itĂšrent jusqu’à converger, parfois jusqu’à une demi-douzaine de tours. J’ai commencĂ© Ă  expĂ©rimenter le transfert du travail de dĂ©veloppement vers des machines de travail externes, en ne gardant ma machine locale que comme orchestrateur.

Les seules fois oĂč je touche encore moi-mĂȘme au contrĂŽle de version, c’est quand j’essaie de rĂ©cupĂ©rer un build pour tester des choses moi-mĂȘme ou quand je crĂ©e une release taguĂ©e et versionnĂ©e de Bencher. Cela arrive environ une fois par semaine et une fois par mois, respectivement. À part ça, je laisse dĂ©sormais Claude s’en occuper. J’utilise abondamment les PR en brouillon et, maintenant qu’elles sont disponibles sur GitHub, les PR empilĂ©es. Je ne regarde pas le code avant que la PR soit ouverte. Je parcours encore le code de Bencher, mais Ă  ce stade c’est plus une vĂ©rification de bon sens qu’une vĂ©ritable revue de code.


Quand, dans un an, je relirai ce que j’ai Ă©crit ici, aurai-je un autre moment “Tu n’as mĂȘme pas mentionnĂ© l’IA“” ? Une moitiĂ© de moi se dit que ce serait gĂ©nial. L’autre moitiĂ© est absolument terrifiĂ©e.


Bencher: Benchmarking Continu

Bencher est une suite d’outils de benchmarking continu. Avez-vous dĂ©jĂ  eu une rĂ©gression de performance qui a impactĂ© vos utilisateurs ? Bencher aurait pu empĂȘcher cela de se produire. Bencher vous permet de dĂ©tecter et de prĂ©venir les rĂ©gressions de performance avant qu’elles ne soient fusionnĂ©es.

  • ExĂ©cuter: ExĂ©cutez vos benchmarks localement ou en CI en utilisant exactement les mĂȘmes runners bare metal et vos outils de benchmarking prĂ©fĂ©rĂ©s. La CLI bencher orchestre l’exĂ©cution de vos benchmarks sur bare metal et stocke ses rĂ©sultats.
  • Suivre: Suivez les rĂ©sultats de vos benchmarks au fil du temps. Surveillez, interrogez et graphiquez les rĂ©sultats Ă  l’aide de la console web Bencher en fonction de la branche source, du banc d’essai et de la mesure.
  • DĂ©tecter: DĂ©tectez les rĂ©gressions de performances localement ou en CI en utilisant exactement le mĂȘme matĂ©riel bare metal. Bencher utilise des analyses de pointe et personnalisables pour dĂ©tecter les rĂ©gressions de performances avant qu’elles ne soient fusionnĂ©es.

Pour les mĂȘmes raisons que les tests unitaires sont exĂ©cutĂ©s pour prĂ©venir les rĂ©gressions de fonctionnalitĂ©s, les benchmarks devraient ĂȘtre exĂ©cutĂ©s avec Bencher pour prĂ©venir les rĂ©gressions de performance. Les bugs de performance sont des bugs !

Commencez Ă  dĂ©tecter les rĂ©gressions de performances — essayez Bencher Cloud gratuitement.

đŸ€– Ce document a Ă©tĂ© automatiquement traduit par IA. Il peut ne pas ĂȘtre prĂ©cis et peut contenir des erreurs. Si vous trouvez des erreurs, veuillez ouvrir une issue sur GitHub.