<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabin ✨✨</title>
    <description>The latest articles on DEV Community by Gabin ✨✨ (@gabinaureche).</description>
    <link>https://dev.to/gabinaureche</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F567292%2Ff2ef9968-fc65-4ac9-a926-c105b73c3d76.jpg</url>
      <title>DEV Community: Gabin ✨✨</title>
      <link>https://dev.to/gabinaureche</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabinaureche"/>
    <language>en</language>
    <item>
      <title>Guide : simuler revenu freelance vs salaire</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Thu, 30 Mar 2023 13:47:14 +0000</pubDate>
      <link>https://dev.to/gabinaureche/guide-simuler-revenu-freelance-vs-salaire-1kel</link>
      <guid>https://dev.to/gabinaureche/guide-simuler-revenu-freelance-vs-salaire-1kel</guid>
      <description>&lt;p&gt;Calculer son tarif en freelance est l'une des premières étapes quand on se lance. Ce guide propose une formule, des références et des outils qui t'aideront à faire un choix éduqué.&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 1 : regarde ta fiche de paie
&lt;/h2&gt;

&lt;p&gt;Pour convertir ton salaire actuel en revenu freelance, commence par regarder ta fiche de paie et identifie ces éléments :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ton &lt;strong&gt;salaire net après impôt&lt;/strong&gt;. Il correspond à ce qui est versé sur ton compte bancaire à la fin du mois. C'est avec ça que tu paies tes factures et que tu te fais plaisir.&lt;/li&gt;
&lt;li&gt;Ton &lt;strong&gt;salaire net avant impôt&lt;/strong&gt;. Il y a encore pas si longtemps c'est cette somme que tu touchais mais il fallait en reverser une partie en impôts sur le revenu. C'est maintenant ton employeur qui s'en occupe, comme ça tu n'as plus rien à payer sur ce qui arrive dans tes poches.&lt;/li&gt;
&lt;li&gt;Ton &lt;strong&gt;salaire brut&lt;/strong&gt;. Comme tu le sais probablement, une partie de ton salaire est dédié au financement de contributions et cotisations. C'est ce qui finance la retraite, l'assurance maladie et le chômage, entre autres.&lt;/li&gt;
&lt;li&gt;Ton &lt;strong&gt;coût total employeur&lt;/strong&gt;. Il correspond à ton salaire brut plus la part de contributions et cotisations versées par l'employeur.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour tout savoir sur les fiches de paie, lis cette édition de la newsletter &lt;a href="https://www.snowball.xyz/"&gt;Snowball&lt;/a&gt; : &lt;a href="https://open.substack.com/pub/snowball/p/augmenter-son-salaire-net-et-apprendre?r=1v1nc8&amp;amp;utm_campaign=post&amp;amp;utm_medium=web"&gt;Augmenter son salaire net et apprendre à lire sa fiche de paie&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Le coût total employeur représente ce que ton employeur est prêt à payer pour toi tous les mois. C'est donc une bonne base et ce qu'on va utiliser pour la suite du calcul.&lt;/p&gt;

&lt;p&gt;Pour la suite de ce guide, imaginons que tu es dans &lt;a href="https://www.silkhom.com/salaire-informatique-electronique-2022/"&gt;la moyenne des développeurs fullstack JavaScript avec 5 ans d'expérience&lt;/a&gt; et que tu as un salaire brut annuel de &lt;strong&gt;60 000€&lt;/strong&gt; avec &lt;a href="https://mon-entreprise.urssaf.fr/simulateurs/salaire-brut-net?salaire-brut=60000%E2%82%AC%2Fan&amp;amp;utm_source=sharing"&gt;un coût total employeur annuel de &lt;strong&gt;84 943€&lt;/strong&gt; pour un salaire mensuel net après impôt de &lt;strong&gt;3 384€&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 2 : soustrait les congés payés et jours fériés
&lt;/h2&gt;

&lt;p&gt;À priori &lt;a href="https://www.syntec.fr/convention-collective/conges/"&gt;d'après la convention Syntec tu as droit à 25 jours de congés payés par an&lt;/a&gt; (voir un peu plus selon ton ancienneté). Les congés payés n'existent pas en freelance, si tu prends des vacances il te restera moins de temps pour atteindre ton chiffre d'affaire.&lt;/p&gt;

&lt;p&gt;Les jours fériés aussi sont rémunérés en salarié, même si tu ne travailles pas (en moyenne 7 jours par an).&lt;/p&gt;

&lt;p&gt;Mit bout à bout, un freelance dispose de 32 jours de moins par an. Si une année compte 52 semaines et que tu travailles 5 jours par semaine, il te reste alors 260 - 32 : &lt;strong&gt;228 jours&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 3 : soustrait le temps de prospection et de gestion
&lt;/h2&gt;

&lt;p&gt;En freelance tu vas être amené à travailler avec différents clients qu'il faudra aller chercher. Tu vas aussi devoir passer un peu de temps à gérer ta société. C'est très variable mais partons du principe que tu y dédies &lt;strong&gt;20% de ton temps tous les ans&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il ne reste plus que &lt;strong&gt;182 jours&lt;/strong&gt; sur les 228 de départ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 4 : calcul du tarif journalier
&lt;/h2&gt;

&lt;p&gt;Si tu veux réaliser un chiffre d'affaire annuel de 84 943€ en 182 jours, il faut que tu factures &lt;strong&gt;466€ par jour&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si ce tarif te permet d'atteindre le même coût employeur qu'en salarié, la différence en terme de rémunération net est importante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 5 : calcul du revenu net
&lt;/h2&gt;

&lt;p&gt;En freelance tu as besoin de créer une société qui peut avoir différentes formes. Les plus fréquentes sont : micro entreprise, EIRL, SASU ou EURL. Chaque statut a ses avantages et inconvénients qui correspond à des objectifs différents.&lt;/p&gt;

&lt;p&gt;Le statut de la société influence grandement ton revenu net alors voyons combien tu pourrais gagner avec un chiffre d'affaire annuel de 84 943€ pour chacun d'entre eux :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mon-entreprise.urssaf.fr/simulateurs/auto-entrepreneur?dirigeant+.+auto-entrepreneur+.+chiffre+d%27affaires=84943%E2%82%AC%2Fan&amp;amp;entreprise+.+activit%C3%A9+.+nature=%27lib%C3%A9rale%27&amp;amp;entreprise+.+activit%C3%A9+.+nature+.+lib%C3%A9rale+.+r%C3%A9glement%C3%A9e=non&amp;amp;utm_source=sharing"&gt;Micro entreprise : 56 523€ par an, &lt;strong&gt;4 710€ par mois&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mon-entreprise.urssaf.fr/simulateurs/eirl?CA=84943%E2%82%AC%2Fan&amp;amp;entreprise+.+activit%C3%A9+.+nature=%27lib%C3%A9rale%27&amp;amp;entreprise+.+imposition=%27IS%27&amp;amp;utm_source=sharing"&gt;EIRL : 48 227€ par an, &lt;strong&gt;4 019€ par mois&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mon-entreprise.urssaf.fr/simulateurs/sasu?dirigeant+.+r%C3%A9mun%C3%A9ration+.+totale=84943%E2%82%AC%2Fan&amp;amp;utm_source=sharing"&gt;SASU : 40 596€ par an, &lt;strong&gt;3 383€ par mois&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mon-entreprise.urssaf.fr/simulateurs/eurl?dirigeant+.+r%C3%A9mun%C3%A9ration+.+totale=84943%E2%82%AC%2Fan&amp;amp;entreprise+.+activit%C3%A9+.+nature=%27lib%C3%A9rale%27&amp;amp;entreprise+.+imposition=%27IS%27&amp;amp;utm_source=sharing"&gt;EURL : 48 226€ par an, &lt;strong&gt;4 019€ par mois&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tu l'auras compris, il y a de fortes chances pour que ton revenu net augmente. Mais ce n'est pas tout, les simulations au dessus partent du principe que tu te verses 100% de ton chiffre d'affaire en salaire. En freelance tu as plein d'autres options qui s'offrent à toi.&lt;/p&gt;

&lt;p&gt;Tu peux par exemple opter pour un régime d'imposition différent (impôt sur le revenu ou impôt sur les sociétés), choisir de te verser des dividendes ou encore investir via ta société. Tu peux aussi choisir des protections mieux optimisées pour tes besoins, prendre plus ou moins de vacances et faire payer tes frais par ta société (matériel, loyer, abonnement internet / téléphone), entre autres.&lt;/p&gt;

&lt;p&gt;À l'inverse, avoir une société engendre des frais. Là aussi on est bien loti mais pense quand même à : comptable, assurance professionnel, mutuelle, prévoyance, compte bancaire professionnel et déplacements (train, repas, logement).&lt;/p&gt;

&lt;p&gt;Je t'en dis plus sur les options qui s'offrent à toi et les différentes pistes d'optimisations dans un autre article très bientôt !&lt;/p&gt;

&lt;h2&gt;
  
  
  Simulateurs en ligne
&lt;/h2&gt;

&lt;p&gt;Comprendre la méthode de calcul est intéressant pour comprendre l'état d'esprit et l'approche à avoir en freelance. Mais pas besoin de refaire les calculs à chaque fois, utilise plutôt un simulateur :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mon-entreprise.urssaf.fr/simulateurs-et-assistants"&gt;Simulateurs de l'Urssaf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simulateurs.shine.fr/developpeur"&gt;Simulateur de revenus freelancing vs salariat&lt;/a&gt; de &lt;a href="https://www.shine.fr/referral/GABIN9568"&gt;Shine&lt;/a&gt; (lien de parrainage)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfin, tu peux également t'inspirer du TJM pratiqué par les autres. Pour ça tu peux faire une recherche sur les plateformes de freelance comme &lt;a href="https://www.malt.fr/"&gt;Malt&lt;/a&gt;.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mise à jour le 11/04/2023&lt;/strong&gt; : l'Urssaf travaille sur un nouveau simulateur qui permet de comparer les différents statuts au niveau de la rémunération mais aussi de la retraite, santé et autres : &lt;a href="https://mon-entreprise.urssaf.fr/simulateurs/comparaison-r%C3%A9gimes-sociaux"&gt;Comparateur de statut juridique&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je tweet chaque jour ce que ces 10 dernières années m'ont apprises : freelance, clean code, side projects et découvertes.&lt;/p&gt;

&lt;p&gt;Pour ne rien rater, &lt;a href="https://twitter.com/gabinaureche"&gt;suis moi sur Twitter : @gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>french</category>
      <category>freelance</category>
      <category>career</category>
    </item>
    <item>
      <title>Garder le Dependabot sous contrôle</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Sun, 27 Mar 2022 14:52:16 +0000</pubDate>
      <link>https://dev.to/gabinaureche/garder-le-dependabot-sous-controle-3h7n</link>
      <guid>https://dev.to/gabinaureche/garder-le-dependabot-sous-controle-3h7n</guid>
      <description>&lt;p&gt;Le &lt;a href="https://github.com/dependabot"&gt;Dependabot&lt;/a&gt; est un bot intégré à GitHub qui scanne les dépendances d'un dépôt afin de détecter celles qui ont été signalées comme vulnérables. Lorsque c'est le cas, il crée une alerte visible dans l'onglet "Security / Dependabot alerts" sur GitHub et soumet une pull request avec un correctif qui met à jour la version figurant dans le manifest (par exemple le fichier &lt;code&gt;package-lock.json&lt;/code&gt; et / ou &lt;code&gt;package.json&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Le bot est assez malin pour proposer une montée de version qui soit la moins éloignée possible de l'actuelle en respectant les conditions fixées par le manifest. Parfois il n'y arrive pas, &lt;a href="https://docs.github.com/en/code-security/dependabot/working-with-dependabot/troubleshooting-dependabot-errors"&gt;pour diverses raisons&lt;/a&gt; mais dans ce cas l'alerte est accompagnée d'un message assez clair sur la marche à suivre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le Dependabot, ce voisin bruyant
&lt;/h2&gt;

&lt;p&gt;Le problème du Dependabot c'est que par défaut, il peut être assez bruyant. Le fait est que l'arbre de dépendances d'un projet JavaScript moyen est très... riche (les packages JavaScript ont tendance à suivre le principe du "&lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;fais une chose mais fais le bien&lt;/a&gt;"). Quand on additionne les dépendances du projet avec ses sous dépendances, ses sous-sous dépendances, et etc. on multiplie les chances d'être touché par une vulnérabilité.&lt;/p&gt;

&lt;p&gt;En revanche ces vulnérabilités ne sont pas toujours exploitables dans le contexte du projet. Par exemple la dépendance vulnérable n'est peut-être utilisé qu'au moment de build l'application. Ce qui se fait en général dans un environnement isolé où le code vulnérable n'est pas accessible par un attaquant potentiel. Ou alors la vulnérabilité fait partie du code publié mais les conditions de son exploitation ne sont pas réunies. Par exemple elle concerne une partie d'une librairie qui est inutilisée.&lt;/p&gt;

&lt;p&gt;Recevoir de nombreuses alertes non pertinentes en continue peut distraire une équipe et lui faire baisser sa garde. Si on s'habitue au bruit et qu'on l'ignore, il devient facile de passer à côté d'une vraie alerte. C'est là le vrai danger du bruit et c'est pour cette raison qu'il faut tout faire pour le réduire et le rendre pertinent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurer le Dependabot pour le rendre pertinent
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mise à jour du 04/05/2023 :&lt;/strong&gt; GitHub a publié une nouvelle fonctionnalité qui permet de rejeter automatiquement les "faux-positifs". Pas évident de savoir ce qu'ils entendent exactement par là mais ils mentionnent notamment les &lt;code&gt;devDependencies&lt;/code&gt;. Commence par l'essayer avant de te résoudre à le configurer manuellement :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Annonce : &lt;a href="https://github.blog/2023-05-02-dependabot-relieves-alert-fatigue-from-npm-devdependencies/"&gt;Dependabot relieves alert fatigue from npm devDependencies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation de la fonctionnalité : &lt;a href="https://docs.github.com/en/code-security/dependabot/dependabot-alerts/using-alert-rules-to-prioritize-dependabot-alerts"&gt;Using alert rules to prioritize Dependabot alerts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Suivre les mises à jour : &lt;a href="https://github.blog/changelog/label/dependabot/"&gt;Changelog Dependabot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un bon moyen de limiter les alertes au code sensible du projet c'est d'indiquer au Dependabot de ne s'intéresser qu'aux dépendances de "production". C'est à dire les dépendances dont le code est exploitable par un attaquant potentiel. Pour un projet JavaScript, il s'agit des dépendances listées dans le champ &lt;code&gt;dependencies&lt;/code&gt; du manifest &lt;code&gt;package.json&lt;/code&gt;. À l'inverse, le champ &lt;code&gt;devDependencies&lt;/code&gt; lui liste les dépendances qui ne sont utilisées que dans un environnement de développement. Pour ça, il suffit de &lt;a href="https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file"&gt;créer le fichier &lt;code&gt;.github/dependabot.yml&lt;/code&gt;&lt;/a&gt; avec la configuration suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;updates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;package-ecosystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npm"&lt;/span&gt;
    &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/"&lt;/span&gt;
    &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily"&lt;/span&gt;
    &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;dependency-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais attention, si vous vous arrêtez là vous allez réveiller la partie en sommeil du Dependabot qui va se mettre à vous proposer de mettre à jour toutes vos dépendances. En effet, si le Dependabot est activé par défaut sur les dépôts publics pour les mises à jour de sécurité, l'ajout de ce fichier de configuration activera également les montées de version. Le bot se mettra alors à proposer de mettre à jour les dépendances vers des versions plus récentes. Si votre intention était de réduire le bruit, il y a des chances que ce comportement ne soit pas le bienvenue. Pour désactiver cette partie du Dependabot et affecter les mises à jour de sécurité quand même, il vous faudra la configuration suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;updates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;package-ecosystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npm"&lt;/span&gt;
    &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/"&lt;/span&gt;
    &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily"&lt;/span&gt;
    &lt;span class="na"&gt;open-pull-requests-limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;dependency-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L'astuce consiste à mettre une &lt;a href="https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#open-pull-requests-limit"&gt;limite de 0 au nombre de pull requests&lt;/a&gt; que le Dependabot peut ouvrir. Ce paramètre est l'un de ceux qui n'a pas d'influence sur les mises à jour de sécurité. L'autre paramètre incompatible est &lt;a href="https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#target-branch"&gt;&lt;code&gt;target-branch&lt;/code&gt;&lt;/a&gt; qui permet de spécifier la branche cible pour les pull requests. Si il pourrait être tentant de faire passer la mise à jour par une étape de recette en mergeant sur une branche du type &lt;code&gt;develop&lt;/code&gt;, ce n'est pas possible. Et c'est même pire que ça puisque la documentation indique que si ce paramètre est présent, les mises à jour de sécurité ignoreront complètement la configuration :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you use this option, the settings for this package manager will no longer affect any pull requests raised for security updates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On peut comprendre la motivation, ça n'a pas de sens de mettre une limite sur le nombre d'alertes. Et quand une vulnérabilité est signalée, c'est déjà trop tard. Elle est dans la nature depuis un certain temps et des attaquants l'exploitent peut-être déjà. Il faut donc proposer un correctif le plus vite possible en production. Mais c'est à garder à l'esprit si vous souhaitez configurer les deux aspects du Dependabot.&lt;/p&gt;

&lt;p&gt;Enfin, si cette approche est un bon moyen de réduire les chances de passer à côté d'un vrai risque, il ne faut pas s'arrêter là. Ce n'est pas parce que le code vulnérable n'est utilisé qu'en développement que ce n'est pas un risque. Si il s'exécute sur la machine d'un développeur, il pourrait lui voler sa clé ssh, lire les variables d'environnement, ou encore envoyer des fichiers. Des attaques qui peuvent finir par avoir un impact sur le projet ou l'équipe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Au delà du Dependabot
&lt;/h2&gt;

&lt;p&gt;Il ne faut donc pas tomber dans le piège de tout ignorer et rejeter. La présence de bruit dans les processus d'une équipe peut être le symptôme d'un problème plus grand. Peut-être que l'équipe manque de temps pour les tâches de maintenance parce qu'elles ne font pas partie intégrante de leur routine. Dans ce cas il serait intéressant de les considérer comme les autres tâches, en les ajoutant au sprint.&lt;/p&gt;

&lt;p&gt;Enfin, il existe des alternatives ou compléments au Dependabot comme &lt;a href="https://snyk.io/"&gt;Snyk&lt;/a&gt; ou &lt;a href="https://socket.dev/"&gt;Socket&lt;/a&gt;. Ces services proposent souvent plus d'options de configuration et des interfaces qui donnent un plus grand contrôle. C'est un bon moyen de se simplifier la vie tout en prenant le sujet au sérieux.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je tweet chaque jour plein de retours d'expérience comme celui-ci qui te feront gagner du temps : &lt;a href="https://twitter.com/gabinaureche"&gt;@gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>french</category>
      <category>security</category>
      <category>github</category>
    </item>
    <item>
      <title>Un side project n'a pas besoin d'être sérieux</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Thu, 10 Mar 2022 08:15:53 +0000</pubDate>
      <link>https://dev.to/gabinaureche/un-side-project-na-pas-besoin-detre-serieux-mk4</link>
      <guid>https://dev.to/gabinaureche/un-side-project-na-pas-besoin-detre-serieux-mk4</guid>
      <description>&lt;p&gt;Depuis longtemps maintenant, je passe une partie de mon temps libre à sauter de side project en side project. Il s'agit pour la plupart d'idées anecdotiques mais j'y met parfois un peu plus d'énergie. Ceci dit, je n'ai jamais eu l'intention d'en gagner de l'argent. Je trouve qu'on entend beaucoup trop parler des side projects qui ont la vocation de devenir un business et pas assez de tous les autres. Ça a pour conséquence de faire circuler l'idée qu'un side project doit forcément être sérieux et qu'il n'a pas de raison d'être si il ne connaît pas le succès. J'ai souvent eu l'occasion d'en discuter avec des ami.e.s, collègues, autres connaissances et pour celles et ceux qui aimeraient avoir un side project mais n'en ont pas, j'ai eu deux catégories d'explication :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Je n'ai pas d'idée.&lt;/li&gt;
&lt;li&gt;J'ai une idée, mais je ne suis pas sûr.e que ça marcherait.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;C'est dommage d'avoir envie de faire quelque chose mais d'être bloqué.e par ça. Et en vérité dans les deux cas il y a un même problème de jugement de ce qu'est une idée.&lt;/p&gt;

&lt;h2&gt;
  
  
  Je n'ai pas d'idée
&lt;/h2&gt;

&lt;p&gt;Des idées on en a toutes et tous mais pour s'en rendre compte il faut déjà faire sauter quelques verrous : une idée ça n'a pas besoin d'être révolutionnaire ou utile. Ça peut être quelque chose de déjà vu et complètement inutile. Une idée, ça peut être nulle. Mais même avec une idée nulle, on peut faire plein de choses. Essayer de faire quelque chose de bien avec une idée nulle ça peut amener à explorer des solutions intéressantes. Histoire que ça soit un peu plus concret, laissez moi vous présenter une de mes idées les plus nulles.&lt;/p&gt;

&lt;p&gt;Je bossais sur un projet où il fallait éditer des fichiers qui étaient copiés à plusieurs endroits. Je me suis dit, et si on pouvait lancer une interface qui affiche les différences entre les fichiers avec un bouton pour choisir la bonne version et copier partout ? Ça a donné &lt;a href="https://github.com/zhouzi/sync-copies"&gt;zhouzi/sync-copies&lt;/a&gt;. On a dû s'en servir quelques fois avant que ça passe à l'abandon et finisse dans l'oubli. D'après l'historique git j'ai bossé dessus pendant une semaine à raison de quelques heures par ci par là. Ça fait beaucoup pour quelque chose qui a servit à rien.&lt;/p&gt;

&lt;p&gt;Mais je n'ai aucun regret, pour plusieurs raisons. La première c'est qu'en me lançant sur ce projet j'avais conscience que c'était de l'over engineering et que personne ne se donnerait la peine de s'en servir. Si je me suis lancé quand même c'est parce que j'y voyais des challenges intéressants à relever. Par exemple ça m'a permit de voir comment ouvrir une interface utilisateur sympa via une ligne de commande. J'ai aussi pu tester des outils de diffing de fichiers avec affichage, et d'autres technos pas du tout adaptées au projet.&lt;/p&gt;

&lt;p&gt;Ce qui m'amène au point suivant...&lt;/p&gt;

&lt;h2&gt;
  
  
  J'ai une idée, mais je ne suis pas sûr.e que ça marcherait
&lt;/h2&gt;

&lt;p&gt;Par "une idée qui marche" est sous-entendu qui connaît le succès. Parce que beaucoup de monde s'y intéresse et/ou parce que ça génère de l'argent. C'est une motivation tout à fait valable. Vous pouvez avoir envie de vous lancer dans un truc en cherchant le succès. Mais il y a plein d'autres raisons d'avoir un side project.&lt;/p&gt;

&lt;p&gt;Un side project, une idée, ça peut être un prétexte pour apprendre, essayer de nouvelles choses ou faire des expérimentations. La seule chose, c'est qu'il faut en être conscient dès le début. C'est important de savoir pourquoi vous vous lancez sur un projet parce que c'est ce qui définit comment vous allez l'approcher.&lt;/p&gt;

&lt;p&gt;Par exemple si votre ambition c'est de bosser sur un side project qui va marcher, un gros effort de marketing sera nécessaire. Il faut que la proposition soit alléchante, et il faut en parler.&lt;/p&gt;

&lt;p&gt;Par contre si vous le faites dans l'objectif d'apprendre et de vous amuser, pas besoin de marketing puisque vous n'avez qu'une seule personne à satisfaire : vous. Et c'est jamais du temps perdu, c'est toujours une expérience qui a de la valeur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Morale de l'histoire : faites des trucs nuls !
&lt;/h2&gt;

&lt;p&gt;Si vous avez envie de bosser sur un side project, regardez dans votre quotidien et vous trouverez plein de prétextes à essayer des choses. Ne cherchez pas l'idée du siècle, ça ne paiera peut-être pas en argent mais en expérience.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je partage mes side projects et autres idées honteuses sur Twitter : &lt;a href="https://twitter.com/gabinaureche"&gt;@gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>french</category>
      <category>sideprojects</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Suivre les tendances sans s'arracher les cheveux</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Sun, 20 Feb 2022 23:39:47 +0000</pubDate>
      <link>https://dev.to/gabinaureche/suivre-les-tendances-sans-sarracher-les-cheveux-7c6</link>
      <guid>https://dev.to/gabinaureche/suivre-les-tendances-sans-sarracher-les-cheveux-7c6</guid>
      <description>&lt;p&gt;Le monde de la tech évolue à une telle vitesse que suivre les tendances peut être usant. Le fait est que la veille est souvent présentée comme un effort proactif. Il faut suivre les bonnes personnes, les bons blogs et les consulter régulièrement. Avec un gestionnaire de flux RSS, vous pouvez vous transformer en trader qui tente de tirer quelque chose de flux de données interminables.&lt;/p&gt;

&lt;p&gt;C'est faux. Au fil des années j'ai tenté plein d'approches pour rester dans le coup et j'ai fini par trouver quelque chose qui marche, avec peu d'efforts. Mais avant de parler méthodologie, une prise de conscience est nécessaire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Face à un travail sans fin, il faut choisir ses combats
&lt;/h2&gt;

&lt;p&gt;Tout suivre, c'est impossible. On parle d'un secteur qui est extrêmement vaste et riche. Par exemple si votre kiff c'est le développement front-end, c'est bien de savoir que Kubernetes existe mais vous avez déjà une liste interminable de sujets à éplucher sur ce qui vous branche.&lt;/p&gt;

&lt;p&gt;Et même en recentrant sur le développement front-end, entre celui qui aime faire de belles pages animées et celui qui préfère les applications métiers, les technos sont très différentes. Le premier pourrait chercher à devenir un expert de &lt;a href="https://www.framer.com/motion/"&gt;Framer Motion&lt;/a&gt; quand le second s'intéressera à du serverless avec &lt;a href="https://firebase.google.com/"&gt;Firebase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On pourrait continuer à recentrer et se rendre compte que le développeur qui veut faire de belles pages à animer, il a un paquet de choix à faire. Au final, les sujets qu'on maîtrise  vraiment ne sont pas nombreux et sont le résultat de ce qui nous intéresse vraiment. De ce pour quoi on souhaite se vendre.&lt;/p&gt;

&lt;p&gt;Il est donc important d'accepter qu'il est impossible de tout maîtriser. Attention, l'idée n'est pas de mettre les œillères et faire abstraction de tout ce qui est périphérique à vos centres d'intérêts. C'est plutôt que suivre les tendances, faire de la veille, c'est surtout une histoire de culture.&lt;/p&gt;

&lt;p&gt;Si vous êtes développeur front-end avec une spécialité sur les belles pages animées, c'est bien de savoir que &lt;a href="https://kubernetes.io/fr/"&gt;Kubernetes&lt;/a&gt; existe, d'avoir une vague idée de ce que ça fait et de comment ça marche. Et ça peut s'arrêter là.&lt;/p&gt;

&lt;p&gt;Mais alors comment faire pour entendre parler de Kubernetes ?&lt;/p&gt;

&lt;h2&gt;
  
  
  La veille sans effort, ça passe par les newsletters
&lt;/h2&gt;

&lt;p&gt;Faire de la veille ça peut être usant pour trois raisons :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Il faut aller chercher les informations, sur Twitter, des blogs ou autres.&lt;/li&gt;
&lt;li&gt;Parmi ces informations, il faut filtrer ce qui a de l'intérêt : parce que ça a de la traction ou que c'est innovant par exemple.&lt;/li&gt;
&lt;li&gt;Enfin, il faut creuser ces informations et approfondir.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tout ça c'est beaucoup de boulot. Un boulot qui est fait par des gens supers dans des newsletters. Parce que c'est exactement ça une newsletter : une liste de ressources filtrées et bien choisies. Et la beauté du truc c'est que ça vient à vous, directement dans votre boîte email.&lt;/p&gt;

&lt;p&gt;Gardez quand même à l'esprit qu'une newsletter est une liste limitée de liens sélectionnés par un être humain. Donc pour éviter les biais et avoir une grande et large couverture, le mieux est d'être abonné à plusieurs d'entre elles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les newsletters que je recommande
&lt;/h2&gt;

&lt;p&gt;Voici donc une liste de newsletters auxquelles je suis abonné et que je recommande :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.getrevue.co/profile/sebastien-lorber"&gt;React Hebdo&lt;/a&gt; - Français, maintenu par &lt;a href="https://sebastienlorber.com/"&gt;Sébastien Lorber&lt;/a&gt;. Pour chaque lien il propose son analyse et / ou un résumé. Top pour se faire une idée sans forcément tout lire en détail.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bytes.dev?x=1569297333"&gt;Bytes&lt;/a&gt; - Intéressant et toujours très drôle.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sidebar.io"&gt;Sidebar&lt;/a&gt; - Très orienté design.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://web-design-weekly.com"&gt;Web Design Weekly&lt;/a&gt; - Web Design.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://javascriptweekly.com"&gt;JavaScript Weekly&lt;/a&gt; - JavaScript dans son ensemble, donc top pour ne pas s'enfermer sur une techno.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://frontendfoc.us"&gt;Frontend Focus&lt;/a&gt; - Pour les amoureux du front-end.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://react.statuscode.com"&gt;React Status&lt;/a&gt; - React.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.producthunt.com/newsletter"&gt;ProductHunt Daily&lt;/a&gt; - Un bon moyen de connaître les tendances sur ProductHunt qui est devenu un passage un peu obligatoire pour tout produit.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://thechattymammoth.com/?invite=167"&gt;The Chatty Mammoth&lt;/a&gt; - Rien à voir avec la tech ou le web. Il s'agit d'une newsletter payante qui propose 3 articles très variés tous les jours avec un résumé pour chacun d'entre eux. C'est chouette pour s'ouvrir l'esprit et les résumés sont bien faits. Je vous ai mis un lien de parrainage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà qui devrait donner du grain à moudre. À noter que j'ai testé beaucoup d'autres newsletters, cette liste contient ce qui a tenu dans la durée. Je me suis désabonné des autres.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apprendre à lire en diagonale
&lt;/h2&gt;

&lt;p&gt;En s'abonnant à différentes newsletter, on s'économise la recherche et le filtrage. Ceci dit, il en reste quand même beaucoup d'informations quand une newsletter contient quarante liens. Alors pour réussir à en venir à bout, il faut apprendre à lire en diagonale. L'idée est tout simplement de dérouler un email en lisant les titres. De cette façon vous vous ferez une culture des sujets du moment. Et lorsqu'un article attire votre attention, ouvrez le. Là aussi vous avez deux possibilités. Soit l'article vous intéresse vraiment et / ou il est assez pointilleux. Dans ce cas une lecture attentive est nécessaire. Autrement, on peut se faire une bonne idée d'un article juste en lisant l'introduction, les titres et les premières phrases de chaque partie.&lt;/p&gt;

&lt;p&gt;Encore une fois, j'insiste, l'idée c'est de vous faire une culture des tendances et de vous intéresser de plus près aux sujets qui vous tiennent à cœur.&lt;/p&gt;

&lt;p&gt;Et puis en étant inscrit à plusieurs newsletters, il arrive assez régulièrement qu'un article soit partagé dans plusieurs d'entre elles. C'est un bon moyen de détecter les trucs dont tout le monde parle en ce moment. Si ce n'est pas en même temps, ça peut arriver à plusieurs semaines d'intervalles. Par exemple vous pourriez voir un sujet une première fois, puis sous une autre forme quelques semaines plus tard. Là aussi c'est un signe qu'il s'agit de quelque chose qui a de la traction.&lt;/p&gt;

&lt;p&gt;Ca n'a donc rien de négatif. Lire en diagonale c'est vous faire une culture, vous laisser du temps pour les sujets qui vous intéressent et ça vous permet de détecter les tendances.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour compléter, passez par vos médias favoris
&lt;/h2&gt;

&lt;p&gt;Si il vous reste un peu de temps et que vous souhaitez l'utiliser pour de la veille, faites vous plaisir. Ne vous forcez pas à passer des heures sur Twitter si c'est une corvée. Par exemple je passe beaucoup de temps sur &lt;a href="https://www.reddit.com"&gt;Reddit&lt;/a&gt;, pour les memes bien sûr mais il y a aussi beaucoup de contenu très intéressant qui arrive souvent avant les autres médias. Mais je consulte aussi mon flux GitHub, où je suis des développeurs dont j'apprécie le boulot. Mais il y a aussi &lt;a href="https://news.ycombinator.com"&gt;Hacker News&lt;/a&gt;, &lt;a href="https://www.producthunt.com"&gt;Product Hunt&lt;/a&gt;, &lt;a href="https://www.indiehackers.com"&gt;Indie Hackers&lt;/a&gt;, etc.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rendez-vous sur Twitter pour encore plus de conseils de flemmard (mais pas que) : &lt;a href="https://twitter.comgabinaureche"&gt;@gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>french</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Partager l'état d'une application sans base de donnée</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Mon, 14 Feb 2022 08:49:21 +0000</pubDate>
      <link>https://dev.to/gabinaureche/partager-letat-dune-application-sans-base-de-donnee-4bok</link>
      <guid>https://dev.to/gabinaureche/partager-letat-dune-application-sans-base-de-donnee-4bok</guid>
      <description>&lt;p&gt;La plupart de mes projets personnels sont des applications web sans serveur derrière. La principale raison c'est qu'en terme d'hébergement il existe plein d'offres gratuites sans restrictions pour du "statique". À l'inverse héberger un serveur web c'est souvent payant ou limité, avec par exemple une mise en veille après un certain délai d'inactivité. C'est pas la mer à boire pour de petits projets mais si je peux éviter, j'aime autant.&lt;/p&gt;

&lt;p&gt;S'imposer de ne pas avoir de serveur lorsqu'on développe une application web, ça rajoute un challenge qui demande d'être créatif. Par exemple quand on aurait bien besoin d'une base de donnée. On peut y trouver différentes solutions selon le besoin. Si l'objectif est de conserver des données saisies par l'utilisateur courant, on peut passer par du stockage navigateur. Ça se complique si on souhaite que l'utilisateur puisse partager ces données, c'est à ce besoin que cet article apporte des solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemple d'état à partager
&lt;/h2&gt;

&lt;p&gt;Imaginons que vous créez un jeu de quizz qui génère un nouveau questionnaire avec différents paramètres à chaque fois que l'utilisateur lance une partie. Imaginons maintenant que vous souhaitez que l'utilisateur puisse partager ce challenge unique avec d'autres personnes, en partageant une URL.&lt;/p&gt;

&lt;p&gt;Pour l'exemple, voilà à quoi pourrait ressembler un questionnaire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gameState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;modifiers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;timePerQuestion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quelle est la couleur du cheval blanc d'Henri IV ?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bleu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;isCorrect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Blanc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;isCorrect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rouge&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;isCorrect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Ici on peut imaginer qu'il y ait encore d'autres questions.&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  La solution simple mais limitée
&lt;/h2&gt;

&lt;p&gt;Si on veut permettre à l'utilisateur de partager sa partie, le plus simple serait de le passer en paramètre d'URL :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gameState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/* le questionnaire présenté un peu plus haut */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shareableUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://mon-questionnaire.com/?gameState=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
  &lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gameState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Lorsque cette URL est partagée et qu'on la rencontre, pour restituer le questionnaire il suffirait alors de l'extraire :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gameState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gameState&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;C'est simple et potentiellement suffisant mais cette approche a plusieurs limites. La première c'est que les données sont clairement visibles, il n'est pas trop compliqué de trouver les bonnes réponses aux questions. La deuxième c'est qu'on peut se retrouver avec des URLs très longues selon le nombre de questions. Et enfin les données peuvent être éditées et corrompues. J'ajouterai aussi que ça ne fait pas une très jolie URL mais ça c'est mon fétiche.&lt;/p&gt;

&lt;p&gt;Dans l'idéal, il faut donc qu'on masque ce qui est partagé, qu'on rende la longueur de la chaîne aussi courte que possible et enfin qu'on s'assure que ce qu'on récupère est valide.&lt;/p&gt;
&lt;h2&gt;
  
  
  La solution plus complète
&lt;/h2&gt;

&lt;p&gt;Pour obfusquer les données on peut les chiffrer de façon à ce qu'elle ne soit pas lisible dans l'URL mais déchiffrable par notre application à la réception. Ça fait la première partie du boulot mais ça complique un peu la deuxième, qui consiste à raccourir au maximum la taille de ce qu'on met dans l'URL.&lt;/p&gt;

&lt;p&gt;Plutôt que chiffrer les données, on peut les compresser. Ça aura pour résultat de les obfusquer tout en raccourcissant la chaîne :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;lzString&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lz-string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gameState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/* le questionnaire présenté un peu plus haut */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shareableUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://mon-questionnaire.com/?gameState=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
  &lt;span class="nx"&gt;lzString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compressToEncodedURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gameState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Cet exemple utilise la librairie &lt;a href="https://github.com/pieroxy/lz-string" rel="noopener noreferrer"&gt;lz-string&lt;/a&gt; qui permet de compresser une chaîne de caractère dans un format donné, ici en quelque chose de compatible pour une URL. Ça produit quelque chose du type &lt;code&gt;NoIgpghgzgniA0wBMAGJAWAbC+BGArErigOzyq6b5mpIDMK65aSAnABx6F3HNL1NcdfriaoGrJHx6sAurKA&lt;/code&gt;, c'est toujours assez long mais plus acceptable.&lt;/p&gt;

&lt;p&gt;Ceci étant dit, on peut aller plus loin dans la compression. Jusqu'à maintenant on a compressé la chaîne de caractère résultante de la sérialisation en JSON du questionnaire. Mais on peut également compresser notre questionnaire en lui même. Par exemple le questionnaire donné en exemple plus haut pourrait être transformé comme suit :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;compressedGameState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// difficulty.id :&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// questions :&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;// id :&lt;/span&gt;
      &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// On part du principe que les réponses à une question&lt;/span&gt;
      &lt;span class="c1"&gt;// sont tirées au hasard. Elles ne sont donc pas statiques&lt;/span&gt;
      &lt;span class="c1"&gt;// mais propres à ce questionnaire.&lt;/span&gt;
      &lt;span class="c1"&gt;// answers :&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="c1"&gt;// title :&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bleu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="c1"&gt;// isCorrect :&lt;/span&gt;
          &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="c1"&gt;// title :&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Blanc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="c1"&gt;// isCorrect :&lt;/span&gt;
          &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="c1"&gt;// title :&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rouge&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="c1"&gt;// isCorrect :&lt;/span&gt;
          &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pour résumer : on supprime les clés et tout ce qui est statique, qu'on peut retrouver dans notre code. Voilà à quoi pourrait ressembler le code qui permet de passer de l'état non compressé à l'état compressé :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;compressGameState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gameState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GameState&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;CompressedGameState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;gameState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;gameState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isCorrect&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Et pour décompresser l'état :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DIFFICULTIES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;QUESTIONS&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./constants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;decompressGameState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressedGameState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressedGameState&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;GameState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;difficultyId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;compressedGameState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DIFFICULTIES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;difficultyId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;questionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;questionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;QUESTIONS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;questionId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isCorrect&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;isCorrect&lt;/span&gt;
      &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Combiné avec la compression de chaîne, ça donne :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;lzString&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lz-string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gameState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/* le questionnaire présenté un peu plus haut */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shareableUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://mon-questionnaire.com/?gameState=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
  &lt;span class="nx"&gt;lzString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compressToEncodedURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nf"&gt;compressGameState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gameState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;La dernière chose qui nous manque maintenant c'est de s'assurer qu'on récupère de l'URL quelque chose de valide en se protégeant d'une éventuelle malformation. Il s'agit tout simplement de la validation d'un objet, il existe des librairies bien faites si le cas d'usage est complexe mais sinon ça pourrait donner :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deserializeGameState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressedString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;GameState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nf"&gt;decompressGameState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;lzString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decompressFromEncodedURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nx"&gt;compressedString&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Questionnaire corrompu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Cet exemple illustre la technique du paresseux mais en cas de besoin d'une gestion d'erreur plus fine, il est tout à fait possible de valider les éléments un par un.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exemple réel et complet
&lt;/h2&gt;

&lt;p&gt;J'ai eu l'occasion de mettre en oeuvre cette approche sur &lt;a href="https://name-the-gwent-card.gabinaureche.com/" rel="noopener noreferrer"&gt;Name the Gwent Card&lt;/a&gt; :&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/zhouzi" rel="noopener noreferrer"&gt;
        zhouzi
      &lt;/a&gt; / &lt;a href="https://github.com/zhouzi/name-the-gwent-card" rel="noopener noreferrer"&gt;
        name-the-gwent-card
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      In this mini-game, your goal is to name a random Gwent card from its illustration.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;name-the-gwent-card&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://app.netlify.com/sites/name-the-gwent-card/deploys" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9e1c16098fa1470e84d61e3691061704a5beb462abfa84487034e09b55ea2900/68747470733a2f2f6170692e6e65746c6966792e636f6d2f6170692f76312f6261646765732f66616539666263372d643234662d343365662d623664612d6461653465666130373335392f6465706c6f792d737461747573" alt="Netlify Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/zhouzi/name-the-gwent-card./CODE_OF_CONDUCT.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b939bc6b6e2370a6266a694cc4f0a583fbb99d28a82d0e5088f21739c369d3c7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e7472696275746f72253230436f76656e616e742d76322e3025323061646f707465642d6666363962342e737667" alt="Contributor Covenant"&gt;&lt;/a&gt;
&lt;a href="http://makeapullrequest.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/88482ebfc5e3e4f2d667148ab6a3eb55948789f1dba71dfa0eb2e05afe02958c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="PRs Welcome"&gt;&lt;/a&gt;
&lt;a href="https://github.com/zhouzi/name-the-gwent-card./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6cd0120cc4c5ac11d28b2c60f76033b52db98dac641de3b2644bb054b449d60c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/zhouzi/name-the-gwent-card#contributors-" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4723c4f0d7afbcd8646a66fc1dfe893ceea7f399b51c62dc1cbe6509ba07aacb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f616c6c5f636f6e7472696275746f72732d322d6f72616e67652e7376673f7374796c653d666c61742d737175617265" alt="All Contributors"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this mini game, your goal is to name a random Gwent card from its illustration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gau.re/ntgc" rel="nofollow noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;This is an unofficial fan work under the &lt;a href="https://www.playgwent.com/en/fan-content" rel="nofollow noopener noreferrer"&gt;Gwent Fan Content Guidelines&lt;/a&gt;. Not approved/endorsed by CD PROJEKT RED.&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Credits&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;This project was inspired by one of &lt;a href="https://www.twitch.tv/faberstein" rel="nofollow noopener noreferrer"&gt;Faberstein&lt;/a&gt;'s mini game he does with his viewers.&lt;/li&gt;
&lt;li&gt;Some assets are taken from &lt;a href="https://playgwent.com" rel="nofollow noopener noreferrer"&gt;Gwent's official website&lt;/a&gt;, &lt;a href="http://www.mlakuss.eu/trendygwentleman/" rel="nofollow noopener noreferrer"&gt;Trendy Gwentleman&lt;/a&gt;, and &lt;a href="https://gwent.one/en/taunts/" rel="nofollow noopener noreferrer"&gt;Gwent.one&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The fire sparks particles are taken from &lt;a href="https://codepen.io/coral84/pen/wRZLBe" rel="nofollow noopener noreferrer"&gt;codepen.io/coral84/pen/wRZLBe&lt;/a&gt;, it uses &lt;a href="https://vincentgarreau.com/particles.js/" rel="nofollow noopener noreferrer"&gt;particles.js&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The cards list comes from &lt;a href="https://teamleviathangaming.com/" rel="nofollow noopener noreferrer"&gt;Team Leviathan&lt;/a&gt;'s &lt;a href="https://teamleviathangaming.com/meta/" rel="nofollow noopener noreferrer"&gt;meta report&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Note that you do not need to install this application on your machine if you want to use it.
Installation is only required if you want to run a development version (e.g to contribute).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Node.js.&lt;/li&gt;
&lt;li&gt;Clone this repository.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm install&lt;/code&gt; in the repository's directory.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm start&lt;/code&gt; to start the application.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This project was…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/zhouzi/name-the-gwent-card" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Toute la logique de compression / décompression et de validation se trouve dans &lt;a href="https://github.com/zhouzi/name-the-gwent-card/blob/master/src/app/GameState.ts" rel="noopener noreferrer"&gt;src/app/GameState.ts&lt;/a&gt;. Pour voir un exemple, cliquez simplement sur "Play" ou "Jouer" sur la page d'accueil du jeu et observez l'URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  TLPL
&lt;/h2&gt;

&lt;p&gt;Trop long pas lu, un résumé de l'article en quelques points :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compresser l'état en supprimant tout ce qui est statique : clés, constantes. Par exemple &lt;code&gt;{ answer: "Réponse", isCorrect: true }&lt;/code&gt; devient &lt;code&gt;["Réponse", true]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Convertir l'état compressé en chaîne de caractères JSON puis la compresser, par exemple avec &lt;a href="https://github.com/pieroxy/lz-string" rel="noopener noreferrer"&gt;lz-string&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Passer le résultat en paramètre d'URL.&lt;/li&gt;
&lt;li&gt;Mettre en place une logique de sérialisation et désérialisation de cette URL vers un état valide.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suis moi sur Twitter pour des conseils et astuces tous les jours : &lt;a href="https://twitter.com/gabinaureche" rel="noopener noreferrer"&gt;@gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>french</category>
    </item>
    <item>
      <title>Des technos prometteuses #1</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Tue, 08 Feb 2022 07:09:25 +0000</pubDate>
      <link>https://dev.to/gabinaureche/des-technos-prometteuses-en-janvier-2022-3jpg</link>
      <guid>https://dev.to/gabinaureche/des-technos-prometteuses-en-janvier-2022-3jpg</guid>
      <description>&lt;p&gt;Parmi toutes les technologies qui naissent chaque jour, parfois j'en identifie quelques unes qui pourraient remplacer ou complémenter les outils que j'utilise au quotidien. Quand c'est le cas je les mets de côté pour les suivre, me documenter à leur sujet et enfin les essayer. Dans cette article je vous partage une sélection de celles que je suis depuis quelques temps et que je testerai dans mes prochains projets. Il ne s'agit pas nécessairement de technologies très récentes mais plutôt du bon moment pour s'y intéresser.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/dBOSUER_5T4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Supabase est une alternative open source à Firebase. C'est à dire qu'il s'agit d'un service qui propose authentification, base de donnée, hébergement, stockage de fichiers et fonctions serverless. Côté client il propose une librairie pour se brancher sur la base de donnée sans avoir un serveur intermédiaire.&lt;/p&gt;

&lt;p&gt;Ce que je trouve génial dans ce type de service c'est qu'il fournit tout ce qui est commun à presque tous les projets. En s'économisant l'implémentation de briques génériques, on peut se concentrer sur les fonctionnalités uniques à notre produit. Celles qui créent vraiment de la valeur.&lt;/p&gt;

&lt;p&gt;Là où il faut être prudent c'est que ça crée une dépendance forte à plusieurs niveaux avec ce service, qui peut devenir dur à quitter. En l'occurence le risque est minimisé par le fait qu'il s'agisse d'un projet open source qu'il est possible d'héberger soit même. Mais quand même, ce n'est pas adapté à tous les projets.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://graphcdn.io/" rel="noopener noreferrer"&gt;GraphCDN&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/563893703" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;GraphCDN est un CDN qui répond aux problématiques spécifiques des APIs GraphQL. Le challenge principal tient dans le fait qu'une API GraphQL n'est servit que sur une seule URL. C'est le corps de la requête qui détermine ce qui est demandé et ce qui est attendu en retour. Pour qu'un CDN puisse faire de la mise en cache, il faut donc qu'il soit capable de comprendre ces requêtes.&lt;/p&gt;

&lt;p&gt;C'est ce que propose GraphCDN. Dans l'idée ça veut dire qu'avec un cache bien fait, certaines requêtes de l'utilisateur n'arrivent jamais jusqu'au serveur. Ça permet d'avoir des requêtes plus rapides et de soulager la charge. Sur le papier l'idée est géniale, je suis quand même curieux de vérifier que ça ne devienne pas rapidement un cauchemar de configuration et de débogage.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://usefathom.com/" rel="noopener noreferrer"&gt;Fathom&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RN1BUVVgAi8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Fathom est un service d'analytique pour le web. Pour rappel, ce type de service permet de savoir qualifier les visiteurs d'une page web pour détecter des usages et des comportements. Ces informations permettent ensuite de prendre des actions pour améliorer certains aspects d'un produit. Le géant historique du secteur est bien sûr Google Analytics.&lt;/p&gt;

&lt;p&gt;Là où Fathom semble se différencier c'est d'abord parce qu'il est respectueux de la vie privée des utilisateurs. Ensuite le service semble proposer des analyses dont il est plus facile à tirer des actions. Là où Google Analytics est une vraie usine à gaz (parce que très puissant).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://planetscale.com/" rel="noopener noreferrer"&gt;Planetscale&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tv5z4ddi4fwzrpanrre.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tv5z4ddi4fwzrpanrre.png" alt="Capture d'écran du site de Planetscale"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Planetscale est une plateforme de base de donnée dans le cloud. Le service offre donc tout ce qui est nécessaire au bon fonctionnement d'une base de donnée comme des sauvegardes régulières et une mise à l'échelle facilité.&lt;/p&gt;

&lt;p&gt;N'étant moi même pas très ops, j'apprécie particulièrement ce genre de service qui permet de déléguer cette partie. Le coeur même de l'application étant de fournir une base de donnée, on peut être tranquille sur le fait que les bonnes pratiques soient suivis.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://mantine.dev/" rel="noopener noreferrer"&gt;Mantine&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe73o7pujhj971h3wk6c7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe73o7pujhj971h3wk6c7.png" alt="Capture d'écran du site de Mantine"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mantine est une librairie de composants React comme il en existe plein. Si je m'y intéresse à celle-ci maintenant c'est parce que j'en entends parler de plus en plus et en bien. &lt;/p&gt;

&lt;p&gt;Et effectivement, Mantine propose de nombreux composants mais également des hooks. Ce qui veut dire que d'un côté on a plein de choses toutes faites et prêtes à l'emploi et de l'autre on a aussi la possibilité de construire soit même du plus spécifique avec les hooks. En revanche ce qui m'embête un peu avec ce type de librairie c'est la personnalisation. En l'occurence Mantine le propose via la modification du thème. Bien souvent ça reste limité, surtout sur des personnalisations structurelles.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.radix-ui.com/" rel="noopener noreferrer"&gt;Radix UI&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq222gnzsv5n4r0u4shk8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq222gnzsv5n4r0u4shk8.png" alt="Capture d'écran du site de Radix UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Radix UI est également une librairie de composants React, mais sans style cette fois-ci. De base les composants ont une apparence très basique, bien souvent celle du navigateur. Mais ils fonctionnent quand même en respectant les règles d'accessibilité.&lt;/p&gt;

&lt;p&gt;Ce type de librairie est donc hautement personnalisable. Ce qui en fait un bon outil pour les équipes avec un designer. L'idée là encore c'est d'éviter aux développeurs d'avoir à re-développer des composants génériques en se ratant sur la gestion de l'accessibilité.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je partage plein d'outils sur Twitter où j'annonce également les nouveaux numéros de cette série : &lt;a href="https://twitter.com/gabinaureche" rel="noopener noreferrer"&gt;@gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>watercooler</category>
      <category>tooling</category>
      <category>french</category>
    </item>
    <item>
      <title>Faut-il bloguer en anglais ou en français ?</title>
      <dc:creator>Gabin ✨✨</dc:creator>
      <pubDate>Sun, 30 Jan 2022 15:21:56 +0000</pubDate>
      <link>https://dev.to/gabinaureche/faut-il-bloguer-en-anglais-ou-en-francais--4al</link>
      <guid>https://dev.to/gabinaureche/faut-il-bloguer-en-anglais-ou-en-francais--4al</guid>
      <description>&lt;p&gt;Tous les jours on fait notre veille en anglais, on lit de la documentation en anglais, on communique en anglais, on utilise des services en anglais. C'est vrai pour nous français mais c'est vrai aussi pour les autres. Et c'est plutôt cool, c'est ce qui nous permet de lire du contenu écrit par des allemands, des indiens ou tout autre nationalité sans avoir à parler la langue.&lt;/p&gt;

&lt;p&gt;L'un dans l'autre, j'ai longtemps conclu que l'anglais était un choix évident pour bloguer et partager du contenu. Jusqu'à ce qu'un jour, parce que je voulais écrire un article un poil plus intime et destiné à un public pas à l'aise avec l'anglais, j'ai fait l'expérience d'écrire en français.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://wizbii.tech/maman-papa-je-suis-d%C3%A9veloppeur-front-end-et-voil%C3%A0-ce-que-%C3%A7a-veut-dire-fb7d98c5e0b8"&gt;Maman, Papa, je suis développeur front-end et voilà ce que ça veut dire&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C'est rapidement devenu mon article avec les meilleurs statistiques sur Medium. Mais j'ai également reçu de nombreux retours positifs en dehors de la plateforme. Cette expérience m'a amené à réaliser que si j'avais bien cerné les inconvénients du français, j'étais passé à côté de ses avantages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les avantages de l'anglais
&lt;/h2&gt;

&lt;p&gt;Déjà il y a l'évident : écrire en anglais c'est s'adresser à une très large population. On a donc vite fait de croire que c'est plus facile d'être lu, après tout il y a plus de potentiels lecteurs. Sauf que ce qu'on oublie c'est qu'il y a aussi beaucoup plus de créateurs. C'est un rapport qui a tendance à s'équilibrer.&lt;/p&gt;

&lt;p&gt;Un autre avantage de l'anglais c'est que c'est la langue utilisé par une grande partie de nos sources de veille. Quand on écrit en anglais, on s'offre l'opportunité d'apparaître dans l'une d'entre elles. En revanche aucune chance d'être listé dans &lt;a href="https://sidebar.io/"&gt;Sidebar.io&lt;/a&gt;, &lt;a href="https://javascriptweekly.com/"&gt;JavaScript Weekly&lt;/a&gt;, ou bien encore &lt;a href="https://frontendfoc.us/"&gt;Frontend Focus&lt;/a&gt; en écrivant en français. C'est vrai pour les newsletters et blogs mais c'est vrai aussi pour les plateformes qu'on utilise pour bloguer. Bien souvent elles ont une newsletter dans laquelle elles partagent des articles sélectionnés par la communauté. C'est pas si compliqué d'être sélectionné en choisissant bien ses tags. Mais là encore, le contenu doit être anglais parce que ces plateformes n'ont pas de segmentation forte par langue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les avantages du français
&lt;/h2&gt;

&lt;p&gt;Si on décrit le public anglais comme un public de masse, le français serait plutôt une niche. Et les niches, ça a de nombreux avantages ! Parce que le contenu en français est plus rare, il est d'autant plus apprécié. C'est ce que j'ai pu observer avec mon expérience. La première fois que j'ai écrit en français je me suis rendu compte que j'ai mis des mots sur un sentiment commun, qu'on pouvait partager plus facilement. Il y a un vrai sentiment de communauté en français, une volonté de s'entraider pour faire briller les initiatives.&lt;/p&gt;

&lt;p&gt;Et parce que les plateformes et newsletters sont plus rares, celles qui existent ont une vraie puissance de partage.&lt;/p&gt;

&lt;p&gt;Enfin, j'aimerai qu'on détruise cette idée que ce qu'il y a de meilleur se fait en anglais. Quand on sort de l'école, on a souvent envie d'aller travailler pour Google, Amazon ou Facebook. La réalité c'est que bosser pour ces boîtes c'est tout sauf un rêve, là où on est entouré en France de plein de très beaux projets et de personnes brillantes.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;👋 Restons en contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je tweet en français tous les jours sur des sujets tech et retours d'expérience de ce que ces 10 dernières années m'ont apprises : &lt;a href="https://twitter.com/gabinaureche"&gt;@gabinaureche&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>french</category>
      <category>writing</category>
      <category>webdev</category>
      <category>career</category>
    </item>
  </channel>
</rss>
