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

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 :
- Le besoin dâadopter les bonnes pratiques du gĂ©nie logiciel afin de tester de maniĂšre dĂ©terministe la production des agents
- 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.mdAGENTS.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
bencherorchestre 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.