Des guides pratiques et perennes pour les developpeurs. Chacun s’appuie sur de vraies commandes et des exemples concrets, et dit clairement quand ne pas utiliser l’outil traite.
Tout est ci-dessous, du plus recent au plus ancien.
Des guides pratiques et perennes pour les developpeurs. Chacun s’appuie sur de vraies commandes et des exemples concrets, et dit clairement quand ne pas utiliser l’outil traite.
Tout est ci-dessous, du plus recent au plus ancien.
Pourquoi any fait-il perdre le type que vous avez passĂ© ? Typez un paramĂštre en any et TypeScript arrĂȘte de vĂ©rifier tout ce qui sort de la fonction : 1 2 3 4 5 6 function firstElement(arr: any[]): any { return arr[0]; } const n = firstElement([1, 2, 3]); n.toUpperCase(); // compile, plante Ă l'exĂ©cution Vous savez que vous avez passĂ© un tableau de nombres. Le compilateur, non, car any lui dit dâarrĂȘter de regarder. n est de type any, donc appeler une mĂ©thode de string sur un number compile sans problĂšme et lĂšve TypeError: n.toUpperCase is not a function Ă lâexĂ©cution. ...
Ouvrez un fichier qui nâexiste pas en Python, open() lĂšve un FileNotFoundError qui remonte hors de votre fonction. Faites la mĂȘme chose en Go, os.ReadFile vous renvoie une valeur error accompagnĂ©e dâun slice dâoctets nil. MĂȘme Ă©chec, deux formes de code complĂštement diffĂ©rentes autour. La diffĂ©rence nâest pas cosmĂ©tique. Elle dĂ©cide si lâappelant peut ignorer lâĂ©chec par accident, et si le compilateur le repĂšre quand ça arrive. Quâest-ce que les exceptions et les valeurs dâerreur font rĂ©ellement diffĂ©remment ? Une exception est un flux de contrĂŽle qui saute. Quelque chose Ă©choue, la fonction lĂšve, et lâexĂ©cution quitte la pile dâappels en cours pour atterrir dans le premier bloc catch ou except correspondant, peu importe le nombre de niveaux au-dessus. La signature de la fonction ne donne aucun indice que cela puisse arriver. loadConfig(path: string): Config en TypeScript ressemble exactement Ă une fonction qui ne peut pas Ă©chouer, jusquâĂ ce quâelle lĂšve une exception pour un fichier manquant. ...
Vous ĂȘtes en plein travail sur une branche de feature, trois fichiers modifiĂ©s, rien de commitĂ©, quand un collĂšgue vous signale un crash null-pointer en production. Le rĂ©flexe habituel : git stash, checkout de main, correction, push, puis git stash pop, en espĂ©rant que rien dans votre feature inachevĂ©e ne dĂ©pendait des fichiers que vous venez dâabandonner. git worktree Ă©vite cette gymnastique. Il fait le checkout de la branche de hotfix dans un second dossier, Ă cĂŽtĂ© de votre branche de feature, les deux sâappuyant sur le mĂȘme dĂ©pĂŽt. ...
Un client coincĂ© dans une boucle de retry sans backoff peut mettre plus de charge sur votre API en une minute que vos dix mille autres clients rĂ©unis. De votre cĂŽtĂ©, ça ne ressemble pas Ă une attaque. Ăa ressemble Ă un bug chez eux, et ça devient un incident chez vous. Un rate limiter bloque ce client avant quâil nâen arrive lĂ . Que dĂ©cide vraiment un rate limiter ? Ă chaque requĂȘte, le rate limiter se pose une seule question : cette clĂ© a-t-elle fait trop de requĂȘtes dans la fenĂȘtre actuelle ? Trois choix transforment cette question en quelque chose dâimplĂ©mentable. ...
Ce que fait rĂ©ellement le function calling dans un LLM Demandez Ă un modĂšle « quel temps fait-il Ă Austin en ce moment » sans aucune connexion au monde extĂ©rieur, et il nâa que deux options : dire quâil ne sait pas, ou inventer quelque chose. Le function calling lui offre une troisiĂšme option. Il dĂ©crit ce dont il a besoin, transmet cette description Ă votre code et attend une vraie rĂ©ponse avant de rĂ©pondre Ă son tour. ...
Un listener scroll sur window peut se dĂ©clencher des centaines de fois pendant un seul swipe. Si vous exĂ©cutez getBoundingClientRect() sur chaque carte dâun feed Ă chacun de ces Ă©vĂ©nements, cinquante images suffisent Ă faire ralentir la page. LâIntersection Observer API retire cette vĂ©rification du scroll : vous enregistrez les Ă©lĂ©ments Ă observer, et le navigateur vous prĂ©vient quand leur visibilitĂ© change rĂ©ellement. Comment fonctionne IntersectionObserver Un observer surveille un ou plusieurs Ă©lĂ©ments target par rapport Ă un root (le viewport, par dĂ©faut) et appelle une callback chaque fois quâun target franchit un seuil de visibilitĂ©. ...
Ouvrez un fichier enregistrĂ© en UTF-8 avec un outil qui suppose un autre encodage, et cafĂ© devient cafĂ©. Les octets sur le disque nâont pas changĂ©. Seule la rĂšgle utilisĂ©e pour les retransformer en caractĂšres a changĂ©, et les deux rĂšgles ne sont pas dâaccord sur ce que signifie lâoctet 0xC3. La plupart des bugs de âcaractĂšres bizarresâ partagent la mĂȘme origine : noms de fichiers cassĂ©s, formulaires illisibles, un emoji qui fait Ă©chouer un insert en base de donnĂ©es, deux chaĂźnes identiques Ă lâĆil mais diffĂ©rentes Ă la comparaison. Dans chaque cas, on confond deux choses distinctes : Unicode et UTF-8. ...
Quâest-ce quâune closure en JavaScript ? 1 2 3 4 5 6 7 8 9 10 11 12 function makeCounter() { let count = 0; return function () { count += 1; return count; }; } const counter = makeCounter(); console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3 makeCounter sâexĂ©cute une fois, renvoie une fonction, et câest tout : son stack frame nâexiste plus. Pourtant, chaque appel Ă counter() lit et met Ă jour count, une variable dĂ©clarĂ©e Ă lâintĂ©rieur dâune fonction dĂ©jĂ terminĂ©e. count ne revient pas Ă 0, et nâest pas copiĂ©e. Câest la mĂȘme variable, toujours vivante, trois appels plus tard. ...
Un test Ă©crit aprĂšs le code tend Ă vĂ©rifier ce que le code fait, pas ce quâil Ă©tait censĂ© faire. Le dĂ©veloppement pilotĂ© par les tests (TDD) corrige cela en inversant lâordre : vous Ă©crivez le test, vous le regardez Ă©chouer, puis vous Ă©crivez le plus petit bout de code qui le fait rĂ©ussir. Comme le test existe avant le code quâil vĂ©rifie, il ne peut pas valider silencieusement tout ce que le code renvoie. Kent Beck a formalisĂ© cette boucle sous le nom red, green, refactor dans son livre de 2002 Test-Driven Development: By Example. Le nom est restĂ©. ...
Lancez npm install sur un projet, puis pnpm install sur le mĂȘme package.json : vous obtenez deux arborescences node_modules diffĂ©rentes et deux lockfiles diffĂ©rents. Ajoutez un collĂšgue qui utilise Yarn, et le dĂ©pĂŽt finit avec trois lockfiles dans son historique, chacun dĂ©crivant une arborescence de dĂ©pendances lĂ©gĂšrement diffĂ©rente. Les trois lisent le mĂȘme package.json et tĂ©lĂ©chargent depuis le mĂȘme registre npm. Ce sur quoi ils ne sont pas dâaccord, câest ce quâil faut Ă©crire sur le disque. ...