<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[métier]]></title><description><![CDATA[métier]]></description><link>https://damien.pobel.fr</link><generator>metalsmith-feed</generator><lastBuildDate>Mon, 11 May 2026 10:18:06 GMT</lastBuildDate><atom:link href="https://damien.pobel.fr/rss/métier.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[React est horrible (React is awful)]]></title><description><![CDATA[<figure class="object-center bordered">
  <a href="/images/react-est-horrible-tout-va-bien.png">
    <img loading="lazy" src="/images/660x/react-est-horrible-tout-va-bien.png" alt="Mème : à gauche, un lapin au milieu d'un appartement en feu, avec pour légende « React est horrible », est serein sur son tabouret. À droite, le lapin dit « Tout va bien. » en souriant." />
  </a>
  <footer>Généré par <a href="https://framamemes.org/?meme=this_is_fine">Framamèmes</a></footer>
</figure>

<p><a href="https://a.tldrnewsletter.com/web-version?ep=1&lc=fbbfb5c8-4b42-11f0-b9e7-9716091ed4a1&p=5581b3de-831c-11f0-a328-396c2123b42d&pt=campaign&t=1756294286&s=d02fe564622c4f4c98bd71950074e83b99e3b9616eedb4aafede024c1f0acae6">Extrait de la newsletter TLDR Web Dev du 27 août 2025</a>,</p>
<p><strong><a href="https://github.com/cloudstreet-dev/React-is-Awful">React-is-Awful</a></strong></p>
<blockquote>
<p>An AI generated book about React that teaches React and humorously complains about its complexity and design decisions.</p>
</blockquote>
<p>Cette courte description a piqué ma curiosité autant pour le côté généré par IA
que sur le fond avec un petit bonus pour la <em>plainte humoristique</em>.</p>
<p>Dès le README du dépôt git, le ton est donné :</p>
<blockquote>
<h3 id="what-youll-learn">What You&#39;ll Learn</h3>
<ul>
<li>❌ Why it exists (Facebook&#39;s notification counter was sometimes wrong)</li>
<li>❌ The Virtual DOM (a solution to a problem React created)</li>
<li>❌ JSX (HTML and JavaScript had a baby nobody asked for)</li>
<li>❌ Hooks (functions that remember things, breaking everything functions stand for)</li>
<li>❌ useEffect (the footgun you&#39;ll shoot yourself with)</li>
<li>✅ How to get a job anyway</li>
</ul>
</blockquote>
<p>et ce ton humoristique voire sarcastique se poursuit tout au long du livre et
rend sa lecture très amusante ce qui est quand même rare dans un livre
<em>technique</em>.</p>
<p>Cet ouvrage a donc, a priori, été généré par une IA générative (Claude) et si ce
n&#39;était pas précisé dès le départ, je suis pas certain que je l&#39;aurais remarqué
en le lisant. Il y a certes quelques tournures et enchaînements qui semblent un
peu maladroits mais on en trouve aussi dans des livres écrits par des humains.
Je serais quand même curieux de voir le ou les prompts qui permettent d&#39;obtenir
ce résultat.</p>
<p>Sur le fond, le livre vise plutôt juste dans ses critiques de React (en tout cas
cohérentes avec ma propre expérience) et dans <a href="https://github.com/cloudstreet-dev/React-is-Awful/blob/main/18-chapter-acceptance.md">ses préconisations pour <em>faire
avec</em></a>.
Et contrairement à ce que pourrait suggèrer le titre, le livre reconnaît tout de
même quelques mérites à React. Il n&#39;y a guère que <a href="https://github.com/cloudstreet-dev/React-is-Awful/blob/main/14-chapter-testing-nightmare.md">le chapitre sur les
tests</a>
qui, certes, pointe un problème réel mais mériterait sans doute un peu plus de
nuances. En vrai, ce chapitre pourrait faire l&#39;objet d&#39;un livre entier à lui
tout seul 🫠</p>
<p>Bref, <a href="https://github.com/cloudstreet-dev/React-is-Awful">React-is-Awful</a> est à
la fois un ovni dans le paysage des livres techniques et un bon ouvrage pour
approfondir la compréhension de React et des compromis que son usage impose.</p>
]]></description><link>https://damien.pobel.fr/post/react-est-horrible</link><guid isPermaLink="true">https://damien.pobel.fr/post/react-est-horrible</guid><category><![CDATA[veille]]></category><category><![CDATA[métier]]></category><category><![CDATA[react]]></category><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[qualité]]></category><category><![CDATA[code]]></category><category><![CDATA[ingénierie logicielle]]></category><pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[Chasser le superflu]]></title><description><![CDATA[<p>Il y a quelques jours, je suis tombé sur <a href="https://qntm.org/devphilo">Developer
philosophy</a>. Je trouve l&#39;exercice amusant, je vais
essayer de faire plus ou moins la même chose ici en listant et détaillant ce que
j&#39;appellerais plutôt des principes qui me semblent essentiels et qui sont issus
de mon expérience.</p>
<figure class="object-center bordered">
  <a href="/images/superflu-superheros-inutile.png">
    <img loading="lazy" src="/images/660x/superflu-superheros-inutile.png" alt="Superflu, le superhéros inutile">
  </a>
  <footer>Extrait de <a href="https://editions.ptilouk.net/superflu/">Les aventures inutiles de Superflu</a> par <a href="https://ptilouk.net/">Gee</a> sous licence <a href="https://creativecommons.org/licenses/by-sa/2.0/fr/">CC BY-SA 2.0</a></footer>
</figure>

<p>Je commence donc par le premier qui me vient à l&#39;esprit que j&#39;aime bien exprimé
avec la citation suivante attribuée à Antoine de Saint-Exupéry :</p>
<blockquote>
<p>La perfection est atteinte, non pas lorsqu&#39;il n&#39;y a plus rien à ajouter, mais
lorsqu&#39;il n&#39;y a plus rien à retirer.</p>
</blockquote>
<p>En d&#39;autres termes, je déclare la chasse au superflu ouverte 😃
En pratique, qu&#39;est ce que cela signifie ?</p>
<p>L&#39;application la plus évidente de ce principe consiste à éliminer ce qu&#39;on
appelle <a href="https://refactoring.guru/smells/dead-code">le code mort (<em>dead code</em>)</a>.
Il s&#39;agit sans doute de l&#39;un des <em>code smells</em> les plus connus qui désigne le code
qui ne peut pas être atteint. Équipé·e d&#39;un bon <abbr title="Environnement de
développement intégré">IDE</abbr>, de quelques outils d&#39;analyse statique et <a href="/post/bon-test-unitaire-integration-fonctionnel/">de
bons tests automatisés</a>, il
est relativement facile de le détecter et de l&#39;éliminer au niveau d&#39;une fonction
ou d&#39;un fichier. En revanche, au niveau d&#39;un projet conséquent avec un peu
d&#39;historique (comprendre du code <em>legacy</em> 😜) c&#39;est une autre histoire. Petite
anecdote, il y a quelques mois, sur deux projets TypeScript j&#39;ai poussé pour
essayer de rationaliser l&#39;usage du mot clé <code>export</code> en introduisant un script
dans la CI pour détecter les changements qui incluent des <code>export</code> inutilisés
(basé sur <a href="https://www.npmjs.com/package/ts-unused-exports">ts-unused-export</a>)
et pour progressivement éliminer les <code>export</code> inutilisés existants. Cette
démarche s&#39;inscrivait déjà dans une volonté de <em>chasser le superflu</em> mais mon but
initial était surtout de faciliter le <em>refactoring</em> (sans mot clé <code>export</code>, on
est certain d&#39;avoir un périmètre limité au fichier) et au final, cet exercice
a permis de déterrer une quantité de code mort plus que conséquente (plusieurs
milliers de lignes de code 😮) qui n&#39;était là que être exporté sans être
utilisé et qui occasionnait de la confusion et zéro valeur ajoutée. Hop <a href="/post/dette-technique-partie-tetris/">un peu
moins de dette technique</a> !</p>
<figure class="object-center bordered">
  <a href="/images/superflu-manque-rien.png">
    <img loading="lazy" src="/images/660x/superflu-manque-rien.png" alt="Superflu, le superhéros inutile">
  </a>
  <footer>Extrait de <a href="https://editions.ptilouk.net/superflu/">Les aventures inutiles de Superflu</a> par <a href="https://ptilouk.net/">Gee</a> sous licence <a href="https://creativecommons.org/licenses/by-sa/2.0/fr/">CC BY-SA 2.0</a></footer>
</figure>

<p>Si on prend un peu de hauteur, appliquer ce principe dans le design d&#39;une API
(d&#39;une simple méthode comme d&#39;une API web type REST ou GraphQL) est un bon outil
pour s&#39;éviter un peu de complexité. Par exemple, si une méthode accepte des
paramètres optionnels mais qu&#39;ils ne sont jamais utilisés ou que cette méthode
reçoit un paramètre avec toujours la même valeur ou que sa valeur de retour
n&#39;est jamais utilisée vous avez probablement du <em>superflu</em> sous les yeux qui
induit <a href="/post/complexite-charge-cognitive/">une certaine complexité</a> et qui
aurait tout intérêt à être éliminé pour améliorer la maintenabilité. On parle
parfois de <em>réduire la surface d&#39;API</em>. L&#39;exercice est assez mécanique et
d&#39;autant plus simple si on l&#39;applique à la création du code en question. Pour ce
qui me concerne, c&#39;est le genre de chose que je fais au fil de l&#39;eau et que je
vérifie <a href="/post/vertus-revue-de-code/">dans une revue de code</a>.</p>
<p>Si on prend encore un peu plus de hauteur, ce principe s&#39;applique aussi très
bien à l&#39;ajout de toute fonctionnalité. Dit autrement, il est toujours
intéressant de questionner la solution vis à vis du besoin qu&#39;on cherche à
satisfaire pour systématiquement en tirer l&#39;essentiel et surtout en retirer tout le
reste. Dans ce contexte, cette démarche permet de restreindre autant que
possible le périmètre des changements et encore une fois de réduire la
complexité mais également de permettre de se concentrer sur l&#39;essentiel et
d&#39;obtenir un résultat satisfaisant le plus rapidement possible et, à partir de
là, d&#39;itérer jusqu&#39;à atteindre une solution qui apporte suffisamment de valeur.
Toute ressemblance avec l&#39;un <a href="https://agilemanifesto.org/iso/fr/principles.html">des principes du manifeste
agile</a> n&#39;est PAS fortuite
😛 :</p>
<blockquote>
<p>La simplicité – c’est à dire l&#39;art de minimiser la quantité de travail
inutile – est essentielle.</p>
</blockquote>
<p>Et puis cette démarche va au delà du code et des fonctionnalités, elle
s&#39;applique par exemple très bien au <em>workflow</em> des développeur·ses. Qui n&#39;a
jamais subi un <em>workflow</em> (CI, CD, <em>commit hook</em>,…) plus lourd que nécessaire ?
Ou à toutes ces réunions qui pourraient être un simple email 🫠 Ici, il s&#39;agit
plus <a href="/post/maximiser-efficacite-developpeurs/">d&#39;un potentiel problème
d&#39;efficacité</a> au quotidien mais là
encore le superflu peut peser lourd.</p>
<hr>
<p>Bref, sans surprise, identifier et <em>chasser le superflu</em> est un exercice
bénéfique pour la qualité d&#39;un projet logiciel et la productivité des
développeur·ses. Plus qu&#39;une simple habitude, pour moi, <strong>cette démarche doit
être active et systématique</strong>. Je la considère comme une clé dans l&#39;obtention
d&#39;un code maintenable sur le long terme et dans l&#39;efficience au quotidien.</p>
]]></description><link>https://damien.pobel.fr/post/chasser-le-superflu</link><guid isPermaLink="true">https://damien.pobel.fr/post/chasser-le-superflu</guid><category><![CDATA[code]]></category><category><![CDATA[métier]]></category><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[ingénierie logicielle]]></category><category><![CDATA[qualité]]></category><category><![CDATA[complexité]]></category><category><![CDATA[dette technique]]></category><pubDate>Mon, 21 Apr 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[La qualité est systémique]]></title><description><![CDATA[<figure class="object-center bordered">
    <img loading="lazy" src="/images/660x/feuille.jpg" alt="Photo d'une feuille mettant en évidence sa structure">
    <footer>Photo de <a href="https://unsplash.com/fr/@ohutcherson">Olivia Hutcherson</a></footer>
</figure>

<p>Je suis tombé aujourd&#39;hui sur <a href="https://jacobian.org/2022/sep/9/quality-is-systemic/">Quality is
systemic</a> de <a href="https://jacobian.org/">Jacob
Kaplan-Moss</a> que je trouve particulièrement juste.</p>
<p>Traduction rapide du premier paragraphe :</p>
<blockquote>
<p>La qualité logicielle est plus le résultat d&#39;un système conçu pour produire de
la qualité et pas tellement le résultat de performances individuelles.
C&#39;est-à-dire : un groupe de programmeurs médiocres travaillant avec une
structure conçue pour produire de la qualité produira un meilleur logiciel
qu&#39;un groupe de programmeurs fantastiques travaillant dans un système conçu
pour d&#39;autres objectifs.</p>
</blockquote>
<p>En d&#39;autres termes pour obtenir de la qualité il faut une organisation
construite pour la produire. L&#39;auteur donne quelques exemples de
caractéristiques systémiques permettant de produire de la qualité :</p>
<ul>
<li>une organisation et une culture qui permettent et encouragent <a href="/post/bon-test-unitaire-integration-fonctionnel/">l&#39;écriture de
bons tests</a> ;</li>
<li>une culture qui ne pousse pas à mettre en production du code qui n&#39;est pas
prêt ou <a href="/post/au-cas-ou/">qui est inutile</a> ;</li>
<li>une cadence de développement qui permet de correctement architecturer le code
et de le documenter ;</li>
<li>un environnement de travail où les personnes se sentent en sécurité et
n&#39;hésitent pas à demander de l&#39;aide au besoin ;</li>
<li>une culture où les échecs sont analysés sans chercher de coupable et où le
système est amélioré pour éviter les échecs similaires.</li>
</ul>
<p>Je trouve ce dernier point particulièrement important. À titre personnel c&#39;est
quelque chose que je m&#39;attache à toujours faire mais j&#39;ai vu relativement peu
d&#39;organisations où c&#39;était une démarche systématique.</p>
<p>Et il existe probablement des tas d&#39;autres paramètres comme une culture qui
permet une forme d&#39;auto-organisation et offre une certaine liberté, une
organisation où on ne travaille que sur un seul sujet à la fois ou encore une
culture qui célèbre autant voire plus la suppression de code que l&#39;ajout… Tout
ceci fait largement écho à <a href="/post/maximiser-efficacite-developpeurs/">Maximiser l&#39;efficacité des
développeur·ses</a> sous un angle plus…
systémique.</p>
]]></description><link>https://damien.pobel.fr/post/la-qualite-est-systemique</link><guid isPermaLink="true">https://damien.pobel.fr/post/la-qualite-est-systemique</guid><category><![CDATA[veille]]></category><category><![CDATA[métier]]></category><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[qualité]]></category><category><![CDATA[code]]></category><category><![CDATA[architecture]]></category><category><![CDATA[unit test]]></category><category><![CDATA[ingénierie logicielle]]></category><pubDate>Sat, 23 Mar 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[La maintenabilité comme critère de décision]]></title><description><![CDATA[<figure class="object-center bordered">
  <img loading="lazy" src="/images/660x/shrug.png" alt="Image où il est inscrit
  ¯\_(ツ)_/¯ qui signifie shrug ou haussement d'épaule.">
</figure>

<p>En début d&#39;année, j&#39;ai lu <a href="https://www.packtpub.com/product/get-your-hands-dirty-on-clean-architecture-second-edition/9781805128373">Get Your Hands Dirty on Clean Architecture (Second
Edition)</a>
de <a href="https://reflectoring.io/authors/tom/">Tom Hombergs</a>. Comme son titre
l&#39;indique, ce très bon livre traite de la <em>Clean Architecture</em> et plus
particulièrement de <a href="https://fr.wikipedia.org/wiki/Architecture_hexagonale">l&#39;architecture
hexagonale</a>. Tout au long
des quelques 140 pages, l&#39;auteur aborde ce type d&#39;architecture sous différents
aspects mais il en est un qui revient régulièrement tout en étant le sujet du
premier chapitre : <strong>la maintenabilité</strong>.</p>
<p>Une bonne partie de ce premier chapitre peut se résumer par cette expression
<em>pseudo-mathématique</em> :</p>
<pre><code class="language-plaintext">maintenabilité &gt;&gt;&gt; tout le reste
</code></pre>
<p>Dans <em>tout le reste</em> rentrent les qualités qu&#39;on cherche souvent à atteindre
dans la construction d&#39;un logiciel par exemple les performances, la
<em>scalabilité</em>, la robustesse, la flexibilité et bien d&#39;autres… Et comme
l&#39;explique très bien l&#39;auteur, la maintenabilité a ceci de spécial qu&#39;elle est
une qualité qui permet d&#39;atteindre toutes les autres. En effet, dès qu&#39;un
logiciel est maintenable, il est facile à faire évoluer pour atteindre certaines
qualités <a href="/post/au-cas-ou/">dès que le besoin émerge</a>. Évidemment, l&#39;ajout de
fonctionnalités et la correction des bugs sont également d&#39;autant plus simples que le
code est maintenable. En d&#39;autres termes, la maintenabilité aide à la fois à
atteindre des objectifs fonctionnels et non fonctionnels.</p>
<p>Je formule généralement cette idée de la manière suivante :</p>
<blockquote>
<p>Un bon code est un code facile à changer.</p>
</blockquote>
<p>Ni plus, ni moins. Jusque là, rien de très original je crois mais ça va mieux en
le disant 😁</p>
<p>Dans ce chapitre, Tom Hombergs pousse la réflexion un peu plus loin et notamment
en énonçant ce qui m&#39;apparaît maintenant comme un corollaire :</p>
<blockquote>
<p>Whenever we have to decide between multiple options, we can choose the one
that makes the code easier to change in the future. No more agonizing between
different options. We just take the one that increases maintainability the
most.</p>
</blockquote>
<p>ce qui peut se traduire par :</p>
<blockquote>
<p>Chaque fois que nous devons choisir entre plusieurs options, nous pouvons
choisir celle qui rendra le code plus facile à changer dans le futur. Plus
besoin de se torturer l&#39;esprit entre différentes options. Nous choisissons
simplement celle qui augmente le plus la maintenabilité.</p>
</blockquote>
<p>Quand j&#39;ai lu cette partie, je dois dire qu&#39;une petite lumière s&#39;est allumée
dans ma tête 💡 J&#39;ai beau être convaincu de l&#39;importance de la maintenabilité
depuis de nombreuses années maintenant, je n&#39;avais jamais considéré cette
qualité comme une aide à la décision de manière aussi directe. Et forcément, en
regardant un peu dans le rétroviseur, je me rends compte qu&#39;appliquer ce
principe dans certaines décisions aurait potentiellement mener à de meilleurs
choix.</p>
<p>Comme souvent avec ce genre de principe général, il s&#39;agit d&#39;un élément parmi
beaucoup d&#39;autres et comme l&#39;indique Tom Hombergs, le <em>bon</em> choix n&#39;est parfois
pas celui qui améliore ou conserve la maintenabilité. Néanmoins opter pour ce
principe par défaut me semble être une bonne approche.</p>
]]></description><link>https://damien.pobel.fr/post/la-maintenabilite-comme-critere-de-decision</link><guid isPermaLink="true">https://damien.pobel.fr/post/la-maintenabilite-comme-critere-de-decision</guid><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[métier]]></category><category><![CDATA[travail]]></category><category><![CDATA[qualité]]></category><category><![CDATA[code]]></category><category><![CDATA[veille]]></category><category><![CDATA[ingénierie logicielle]]></category><pubDate>Sat, 02 Mar 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Utils et helper sont sur un bateau…]]></title><description><![CDATA[<figure class="object-center bordered">
  <img loading="lazy" src="/images/660x/plouf.jpg" alt="Petites vaguelettes
  provoquées par un objet tombant à l'eau avec une luminosité évoquant un
  coucher de soleil">
</figure>

<p>Et si on les <del>jetait à l&#39;eau</del> <em>refactorisait</em> ? 😀</p>
<p>Dans <a href="/post/vertus-revue-de-code/">une revue de code</a> ou en explorant une base
code, ces noms là, tout comme dans une certaine mesure les <em>handlers</em> et autres
<em>managers</em>, déclenchent systématiquement dans ma tête une petite alarme 🔔 qui
appelle à aller regarder de plus près ce qui se cache derrière.</p>
<p>Ces termes sont très génériques même si ils sont souvent
accompagnés d&#39;un préfixe, d&#39;un suffixe ou d&#39;un chemin un peu spécifique (encore
qu&#39;on a tous dû tomber au moins une fois sur un <code>src/utils.js</code> quand ce n&#39;est
pas <code>src/tools/utils.js</code> 😉). Et par
conséquent, la ou les responsabilités de ces composants sont loin d&#39;être
claires. D&#39;ailleurs, ce genre de composant a une sérieuse tendance à être un
fourre-tout avec beaucoup plus qu&#39;une unique responsabilité.</p>
<p>Aussi, quand ce genre de composant occupe une place importante dans le code en
terme de quantité de logique, c&#39;est autant de logique qui n&#39;est pas là où elle
aurait plus de sens. L&#39;utilisation abusive de ce genre de composant va de pair
avec d&#39;autres <em>code smells</em>, notamment :</p>
<ul>
<li><a href="https://martinfowler.com/bliki/AnemicDomainModel.html">des objets
anémiques</a> : les objets
métiers se retrouvent dépourvus de comportement puisqu&#39;il est relégué dans ces
<em>helpers</em> et <em>utils</em> ;</li>
<li><a href="https://fr.wikipedia.org/wiki/Encapsulation_(programmation)">un manque
d&#39;encapsulation</a> :
les objets exposent nécessairement plus qu&#39;ils ne devraient pour que ces
composants puissent faire leur travail ;</li>
<li>des abstractions manquantes : là encore, une responsibilité qui pourrait être
proprement isolée dans un composant bien nommé se retrouve diluée.</li>
</ul>
<p>C&#39;est pourquoi, en ce qui me concerne, chaque mention d&#39;un <em>utils</em> ou d&#39;un
<em>helper</em> me rend plus que méfiant. Quasiment systématiquement il existe une
meilleure solution en terme d&#39;expressivité, de qualité de code et <a href="/post/la-maintenabilite-comme-critere-de-decision/">de
maintenabilité</a>.</p>
]]></description><link>https://damien.pobel.fr/post/utils-helper-sont-sur-un-bateau</link><guid isPermaLink="true">https://damien.pobel.fr/post/utils-helper-sont-sur-un-bateau</guid><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[métier]]></category><category><![CDATA[travail]]></category><category><![CDATA[qualité]]></category><category><![CDATA[code]]></category><category><![CDATA[ingénierie logicielle]]></category><pubDate>Fri, 23 Feb 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Quelques défis liés à l'édition d'un logiciel destiné à être intégré]]></title><description><![CDATA[<figure class="object-center bordered">
    <img loading="lazy" src="/images/660x/shape.jpg" alt="Une poterie en cours
    de façonnage">
    <footer>
    Photo par <a
    href="https://pixabay.com/users/marcelkessler-3217273/">marcelkessler</a>
    </footer>
</figure>

<p>J&#39;ai écrit un petit blabla sur le tout neuf <a href="https://developers.front-commerce.com/blog">Developers blog de
Front-Commerce</a> (oui on a pas
vraiment fait dans l&#39;originalité 😉) sur quelques défis lié à l&#39;édition d&#39;un
logiciel destiné à être intégré par rapport à d&#39;autres contextes comme le service
ou la distribution en <abbr title="Software As A Service, Logiciel en tant que
service">SAAS</a>.</p>
<p>Traduction libre de l&#39;introduction:</p>
<blockquote>
<p>Pour l&#39;essentiel, Front-Commerce est un logiciel destiné à être intégré par
des développeurs pour qu&#39;un marchand puisse vendre des produits à ses clients
dans une boutique en ligne à son image et même en s&#39;appuyant sur une
infrastructure existante. S&#39;il s&#39;agit probablement de la définition la plus
simple de Front-Commerce (plus ou moins celle que j&#39;utilise pour décrire mon
travail à ma famille et mes amis 😉), elle cache néanmoins un certain nombre
de défis au quotidien.</p>
</blockquote>
<p>La suite <del>va vous étonner</del> est disponible dans <a href="https://developers.front-commerce.com/blog/some-challenges-of-being-the-editor-of-a-software-intended-to-be-integrated#three-targets-developers-merchants-and-customers">Some challenges of being the editor of
a software intended to be
integrated</a> (en anglais).</p>
]]></description><link>https://damien.pobel.fr/post/quelques-defis-editeur-logiciel-integration</link><guid isPermaLink="true">https://damien.pobel.fr/post/quelques-defis-editeur-logiciel-integration</guid><category><![CDATA[travail]]></category><category><![CDATA[métier]]></category><category><![CDATA[code]]></category><pubDate>Wed, 07 Dec 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Maximiser l'efficacité des développeur·ses]]></title><description><![CDATA[<p>Je viens de lire <a href="https://martinfowler.com/articles/developer-effectiveness.html">Maximizing Developer
Effectiveness</a>
et comme souvent sur le site de Martin Fowler c&#39;est un excellent article
(même si il n&#39;en est pas l&#39;auteur). Et je ne peux que vous conseillez chaudement
cette lecture.</p>
<figure class="object-center bordered">
    <img loading="lazy" src="/images/660x/automatisation.jpg" alt="Un jouet robot sur un tapis jaune">
    <footer>Photo de <a href="https://unsplash.com/@phillipglickman">Phillip Glickman</a></footer>
</figure>

<p>Voici une traduction de la partie <em>Une journée dans un environnement hautement
efficace</em> (qui fait un peu rêver mais c&#39;est plus agréable à lire que l&#39;exemple
de basse efficacité 😉):</p>
<blockquote>
<p>La développeuse ou le développeur :</p>
<ul>
<li>consulte dans l&#39;outil de gestion de projet et assiste au <em>standup</em> où <strong>les
  tâches à accomplir sont sans ambiguïté</strong></li>
<li>constate que l&#39;environnement de développement a été <strong>automatiquement mis à
  jour</strong>, notamment les dépendances sont à jour et <strong>cohérente avec la production</strong>
  et <strong>les vérifications automatiques sur la CI/CD passent avec succès</strong></li>
<li>récupère la dernière version du code et fait des changements <strong>incrémentaux</strong> sur
  le code qui sont <strong>rapidement</strong> vérifiés par des tests unitaires et déployés sur
  un environnement local</li>
<li>en cas de dépendance avec une autre équipe, <strong>la documentation et/ou les
  spécifications des APIs sont facilement accessibles</strong> sur un portail dédié. En
  cas de nécessité, il ou elle peut facilement et <strong>rapidement obtenir de l&#39;aide
  auprès de ses collègues</strong> par exemple sur Slack</li>
<li>peut se concentrer sur <strong>sa tâche</strong> pendant plusieurs heures <strong>sans interruptions</strong></li>
<li><strong>peut faire une pause</strong>, prendre un café, aller faire un tour à pied ou jouer au
  tennis de table avec les collègues</li>
<li><em>commit</em> les changements dans le code qui sont alors <strong>examinés par des tests
  automatisés</strong> avant d&#39;être déployés en production. Les utilisateur·rices
  reçoivent les mises à jour progressivement, <strong>ce processus est <em>monitoré</em></strong>.</li>
</ul>
<p>En bref, le développeur ou la développeuse est en capacité de faire <strong>des
changements incrémentaux dans une journée</strong> et peut rentrer à la maison avec la
satisfaction d&#39;avoir progressé.</p>
</blockquote>
<p>J&#39;ai ajouté du gras sur les parties qui me semblent essentielles. Bien sûr
certains aspects dépendent fortement du contexte notamment <em>le déploiement en
production</em> et <em>la réception des mises à jour par les utilisateur·rices</em>
correspondent bien au développement d&#39;un logiciel de type <abbr title="Software as
a Service">SaaS</abbr> moins à un logiciel au sens plus traditionnel du terme.</p>
<p>En résumé, dans un environnement de haute efficacité :</p>
<ul>
<li>les tâches à réaliser sont <em>sans ambiguïté</em>, en d&#39;autres termes elles
  ont été spécifiées et discutées pour avoir pour chacune, une vision claire
  du problème à résoudre, de la cible et des cas d&#39;utilisation (<em>use cases</em>)
  et si en plus le périmètre a été réduit à son strict minimum, c&#39;est
  parfait ;</li>
<li>les tâches récurrentes et/ou celles où
  l&#39;intervention humaine n&#39;a aucune valeur ajoutée sont automatisées. Je pense
  bien sûr <a href="/post/bon-test-unitaire-integration-fonctionnel">aux tests</a> mais
  également aux mises à jour de dépendances, au déploiement ou encore au
  formatage du code ;</li>
<li>l&#39;environnement de travail est performant autant en terme de matériel que sur
  la plateforme
  de <abbr title="Continuous Integration">CI</abbr>/<abbr title="Continuous
  Delivery">CD</abbr>. Le but étant d&#39;avoir un certain confort mais surtout des
  boucles de <em>feedback</em> les plus courtes possible ;</li>
<li>chacun·e travaille sur un unique sujet à la fois mais <a href="/post/travail-d-equipe/">comme une vraie
  équipe</a>, le multitâche c&#39;est pour les
  ordinateurs (et encore !) ;</li>
<li>chacun·e peut se concentrer sans être interrompu ;</li>
<li>les applications sont <em>monitorées</em> correctement pour détecter au plus vite les
  soucis et avoir des données d&#39;utilisation réelles et fiables ;</li>
<li>les développements se font de manière incrémentale ce qui signifie notamment
  travailler systématiquement sur le plus petit périmètre possible et itérer
  jusqu&#39;à obtenir un résultat satisfaisant (<em>Better done than perfect</em>) ;</li>
<li>une certaine autonomie est laissée dans la manière de travailler (outils,
  rythme,…).</li>
</ul>
<p>Cette liste ressemble à de l&#39;enfonçage de portes ouvertes et pourtant, pour ce
qui me concerne, je crois pas avoir un connu d&#39;environnement qui cochait toutes
les cases même si en général, mais pas toujours, la dynamique était plutôt dans
le bon sens.</p>
<p>Bref, tout ceci touche à ce qu&#39;on appelle parfois la <em>Developer eXperience</em>
(<abbr>DX</abbr>) et qui, bien trop souvent, n&#39;est pas prise en compte
suffisamment sérieusement.</p>
]]></description><link>https://damien.pobel.fr/post/maximiser-efficacite-developpeurs</link><guid isPermaLink="true">https://damien.pobel.fr/post/maximiser-efficacite-developpeurs</guid><category><![CDATA[veille]]></category><category><![CDATA[métier]]></category><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[ingénierie logicielle]]></category><pubDate>Sun, 07 Feb 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[« Clean Code » résumé en quelques lignes]]></title><description><![CDATA[<p class="note">
Ce texte est une traduction et une adaptation de <a
href="https://gist.github.com/cedrickchee/55ecfbaac643bf0c24da6874bf4feb08">Summary
of 'Clean code' by Robert C. Martin</a>.
</p>

<p>Voici un résumé des principales idées du livre « <a href="https://www.decitre.fr/livres/clean-code-9780132350884.html">Clean Code: A Handbook of Agile
Software
Craftsmanship</a> » de
Robert C. Martin (Uncle Bob).</p>
<p>Du code est propre (<em>clean</em>) si il peut être compris facilement - par chaque
personne de l&#39;équipe. Un code propre (<em>Clean code</em>) peut être lu et amélioré par
un·e développeur·se autre que la personne qui l&#39;a écrit. Avec la
compréhensibilité vient la lisibilité, la facilité à changer, l&#39;extensibilité et
<a href="/post/la-maintenabilite-comme-critere-de-decision/">la maintenabilité</a>.</p>
<figure class="object-center bordered">
    <img loading="lazy" src="/images/660x/water-drop.jpg" alt="Une goutte d'eau">
</figure>

<h2 id="règles-générales">Règles générales</h2>
<ol>
<li>Suivez <strong>des conventions reconnues</strong>.</li>
<li><em>Keep it <strong>simple</strong> stupid</em>. Plus simple est toujours mieux. <a href="/post/complexite-charge-cognitive/">Réduisez la
complexité</a> autant que possible.</li>
<li><strong>Règle du boy scout</strong> : laissez le camp plus propre que l&#39;état dans lequel
vous l&#39;avez trouvé.</li>
<li>Lors de résolution d&#39;un problème, toujours chercher et trouver <strong>la cause
racine</strong>.</li>
<li>Suivez <a href="https://fr.wikipedia.org/wiki/Principe_de_moindre_surprise"><strong>le principe de moindre
surprise</strong></a>.</li>
<li><abbr title="Don't Repeat Youself">DRY</abbr> : ne vous répétez pas, et <a href="https://medium.com/@nicolopigna/this-is-not-the-dry-you-are-looking-for-a316ed3f445f">mais
attention à l&#39;interprétation de ce
principe</a>.</li>
</ol>
<h2 id="règles-de-design">Règles de design</h2>
<ol>
<li>Gardez les données configurables (par exemple les constantes) à hauts
niveaux. Elles devraient être <strong>faciles à changer</strong>.</li>
<li>Préférez le polymorphisme aux <code>if</code>/<code>else</code> ou <code>switch</code>/<code>case</code>.</li>
<li>Évitez la sur-configurabilité et <a href="/post/au-cas-ou/">tout ce qui n&#39;a pas prouvé sa
nécessité</a>.</li>
<li>Utilisez <strong>l&#39;injection de dépendances</strong>.</li>
<li>Suivez <a href="https://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter"><strong>la loi de
Déméter</strong></a> : une
classe ne devrait connaître que ses dépendances directes.</li>
</ol>
<h2 id="astuces-pour-la-compréhensibilité">Astuces pour la compréhensibilité</h2>
<ol>
<li>Soyez <strong>cohérent</strong>. Si vous faites quelque chose d&#39;une certaine manière,
toutes les choses similaires devraient être faites de la même manière.</li>
<li>Utilisez <strong>des noms de variables explicites</strong>.</li>
<li><strong>Encapsulez les conditions limites</strong> : elles sont compliquées à suivre. Il
vaut mieux les isoler à un endroit.</li>
<li>Préférez <a href="https://patricklouys.com/2017/06/04/value-objects-explained/">des <strong><em>value objects</em>
spécifiques</strong></a>
plutôt que des types primitifs</li>
<li><strong>Évitez les dépendances logiques</strong> : n&#39;écrivez pas de méthodes qui dépendent
d&#39;autre chose dans la même classe.</li>
<li><strong>Évitez les conditions négatives</strong>.</li>
</ol>
<h2 id="règles-de-nommages">Règles de nommages</h2>
<ol>
<li>Choisissez <strong>des noms descriptifs et sans ambiguïté</strong>.</li>
<li>Faites <strong>des distinctions qui ont du sens</strong>.</li>
<li>Utilisez <strong>des noms prononçables</strong>.</li>
<li>Utilisez <strong>des noms cherchables</strong>.</li>
<li>Remplacez les nombres magiques par <strong>des constantes bien nommées</strong>.</li>
<li>Évitez d&#39;ajouter des préfixes ou des informations sur les types.</li>
</ol>
<h2 id="règles-relatives-aux-fonctions">Règles relatives aux fonctions</h2>
<ol>
<li><strong>Courtes</strong>.</li>
<li><strong>Ne fait qu&#39;une chose</strong> et la fait bien.</li>
<li>Utilisez <strong>des noms descriptifs</strong>.</li>
<li>Préférez les avec <strong>le moins d&#39;arguments possibles</strong>, idéalement pas plus de 3.</li>
<li><strong>Sans effet de bord</strong>.</li>
<li><a href="https://ariya.io/2011/08/hall-of-api-shame-boolean-trap">N&#39;utilisez pas de
<em>flag</em></a> : écrivez
plutôt plusieurs méthodes sans ce type d&#39;argument.</li>
</ol>
<h2 id="règles-relatives-aux-commentaires">Règles relatives aux commentaires</h2>
<ol>
<li>Essayez d&#39;écrire <a href="/post/juste-dose-commentaires-dans-le-code/"><strong>du code expressif</strong> ne nécessitant pas de
commentaire</a>. Si c&#39;est
impossible, prenez le temps d&#39;écrire un bon commentaire.</li>
<li>Ne soyez pas redondant (par exemple : <code>i++; // increment i</code>).</li>
<li>N&#39;ajoutez pas de bruit évident.</li>
<li>N&#39;utilisez pas les commentaires de fermeture de bloc (par exemple : <code>} // end of function</code>).</li>
<li><strong>Ne commentez pas de code</strong>. Supprimez ce code.</li>
<li>Utilisez des commentaires <strong>pour expliquer l&#39;intention</strong>.</li>
<li>Utilisez des commentaires <strong>pour avertir des conséquences</strong>.</li>
</ol>
<h2 id="structure-du-code-source">Structure du code source</h2>
<ol>
<li><strong>Séparez les concepts verticalement</strong>.</li>
<li><strong>Le code lié</strong> devrait apparaître <strong>dense verticalement</strong>.</li>
<li>Déclarez les <strong>variables à proximité de leurs usages</strong>.</li>
<li><strong>Les fonctions dépendantes les unes des autres</strong> devraient être <strong>à
proximité</strong>.</li>
<li><strong>Les fonctions similaires</strong> devraient être <strong>à proximité les unes des
autres</strong>.</li>
<li>Placez les fonctions dans <strong>la direction descendante</strong>.</li>
<li>Gardez les <strong>lignes courtes</strong>.</li>
<li>N&#39;alignez rien horizontalement.</li>
<li>Utilisez des <strong>espaces pour associer des choses liées</strong> et dissocier des
choses liées faiblement.</li>
<li><strong>Ne cassez pas l&#39;indentation</strong>.</li>
</ol>
<h2 id="objets-et-structures-de-données">Objets et structures de données</h2>
<ol>
<li>Cachez les structures internes.</li>
<li>Devraient être <strong>petits</strong>.</li>
<li><strong>Ne font qu&#39;une chose</strong>.</li>
<li><strong>Possèdent un petit nombre de variables d&#39;instance</strong>. Si votre classe a trop
de variables d&#39;instance, il est probable que votre objet fasse plus qu&#39;une
chose.</li>
<li>Une classe de base ne devrait rien connaître de ses classes dérivées.</li>
<li><strong>Il vaut mieux avoir plusieurs fonctions</strong> que de passer du code à une
fonction pour qu&#39;elle choisisse un comportement.</li>
<li><strong>Préférez des méthodes non statiques</strong>.</li>
</ol>
<h2 id="tests"><a href="/post/bon-test-unitaire-integration-fonctionnel/">Tests</a></h2>
<ol>
<li><strong>Un concept</strong> par test.</li>
<li><strong>Rapides</strong>.</li>
<li><strong>Indépendants</strong>.</li>
<li><strong>Répétables</strong>.</li>
<li><strong>Auto validants</strong>.</li>
<li><strong>Utiles</strong>.</li>
<li><strong>Lisibles</strong>.</li>
<li><strong>Faciles à lancer</strong>.</li>
<li><a href="/post/code-coverage-taux-couverture-tests/">Utilisez un <strong>outil de génération de
couverture de code</strong></a>.</li>
</ol>
<h2 id="indicateurs-dun-code-pas-terrible-code-smells">Indicateurs d&#39;un code pas terrible (<em>Code smells</em>)</h2>
<ol>
<li><strong>Rigidité</strong> : le logiciel est difficile à faire évoluer. Une petite
modification peut causer une cascade de changements.</li>
<li><strong>Fragilité</strong> : le logiciel dysfonctionne en plusieurs endroits en
réponse à un unique changement.</li>
<li><strong>Immobilité</strong> : vous ne pouvez pas réutiliser une partie du code dans
d&#39;autres projets car cette opération est risquée ou nécessite un grand
effort.</li>
<li><a href="/post/complexite-charge-cognitive/"><strong>Complexité inutile</strong></a>.</li>
<li><strong>Répétition inutile</strong>.</li>
<li><strong>Opacité</strong> : le code est difficile à comprendre.</li>
</ol>
<h2 id="gestion-des-erreurs">Gestion des erreurs</h2>
<ol>
<li><strong>Ne mélangez pas</strong> la gestion des erreurs et le code.</li>
<li>Utilisez des <strong>Exceptions</strong> au lieu de renvoyer des codes d&#39;erreurs.</li>
<li><strong>Ne retournez pas <code>null</code></strong>, <a href="/post/mauvaises-pratiques-bugs/">n&#39;utilisez pas <code>null</code> non
plus</a>.</li>
<li>Lancer des exceptions <strong>avec du contexte</strong>.</li>
</ol>
]]></description><link>https://damien.pobel.fr/post/clean-code</link><guid isPermaLink="true">https://damien.pobel.fr/post/clean-code</guid><category><![CDATA[complexité]]></category><category><![CDATA[métier]]></category><category><![CDATA[qualité]]></category><category><![CDATA[code]]></category><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[traduction]]></category><category><![CDATA[clean code]]></category><category><![CDATA[unit test]]></category><category><![CDATA[ingénierie logicielle]]></category><pubDate>Tue, 16 Jun 2020 23:28:00 GMT</pubDate></item><item><title><![CDATA[La complexité…]]></title><description><![CDATA[<p><a href="https://www.lilobase.me/la-complexite-une-histoire-de-charge-cognitive/">La complexité, une histoire de charge
cognitive</a>
et sa suite <a href="https://www.lilobase.me/savoir-faire-des-choses-compliquees-ne-fait-pas-de-vous-un-bon-developpeur/">Savoir faire des choses compliquées ne fait pas de vous un bon
développeur</a>
méritent le détour. J&#39;avoue que deux aspects de ces articles résonnent
particulièrement dans ma tête.</p>
<figure class="object-center bordered">
    <img loading="lazy" src="/images/660x/complexite.jpg" alt="Cockpit d'un avion volant de nuit">
</figure>

<h2 id="labstraction-comme-outil-de-diminution-de-la-charge-cognitive">L&#39;abstraction comme outil de diminution de la charge cognitive</h2>
<p>Cet énoncé peut sembler contre-intuitif et pourtant l&#39;abstraction peut être un
outil au service d&#39;une certaine simplification :</p>
<blockquote>
<p>Une bonne abstraction, en éliminant le besoin de connaitre les détails
d’implémentation, est un outil particulièrement puissant pour diminuer la
charge cognitive. Attention à ne pas créer des abstractions inutiles, ou
d&#39;abstraire trop tôt certains concepts : l’over-ingénierie n’est jamais très
loin. Et vous vous retrouvez avec la situation inverse de celle que vous
espériez.</p>
</blockquote>
<p>Comme toujours dans le monde du développement, tout est question de dosage et
surtout de compromis dont les termes doivent être compris et choisis au lieu
d&#39;être subis.</p>
<h2 id="combattre-la-complexité-au-lieu-de-la-célébrer">Combattre la complexité au lieu de la célébrer</h2>
<p>Ce point est pour une bonne part une question d&#39;état d&#39;esprit.</p>
<blockquote>
<p>[…] des intervenants qui se vantent d’avoir réussi à
construire des systèmes aussi compliqués […]</p>
<p>Malheureusement, ce que ces gens prouvent, c’est qu’ils sont capables de
travailler dans un contexte de très forte charge cognitive.</p>
<p>Et ce faisant, ils compliquent d’autant plus le travail de leurs futurs
collègues en les obligeant à devoir absorber une plus grande charge cognitive
pour pouvoir intervenir sur le projet.</p>
</blockquote>
<p>Tout le problème réside dans le fait que la complexité est à la fois très
attrayante intellectuellement et particulièrement gênante sur le long terme
dès qu&#39;il s&#39;agira de maintenir et de faire évoluer un bout de code trop
complexe.</p>
<p>Cette partie me rappelle <a href="https://www.azquotes.com/quote/669106">une citation assez
célèbre</a> de <a href="https://fr.wikipedia.org/wiki/Brian_Kernighan">Brian
Kernighan</a>. Je ne sais pas si il
faut vraiment être deux fois plus intelligent·e pour débugguer un bout de code
que pour l&#39;écrire initialement, en revanche, je suis certain que la corrélation est forte
entre l&#39;intelligence mise dans l&#39;écriture initiale et celle nécessaire à la sur
la maintenance.</p>
]]></description><link>https://damien.pobel.fr/post/complexite-charge-cognitive</link><guid isPermaLink="true">https://damien.pobel.fr/post/complexite-charge-cognitive</guid><category><![CDATA[veille]]></category><category><![CDATA[complexité]]></category><category><![CDATA[métier]]></category><category><![CDATA[qualité]]></category><category><![CDATA[code]]></category><category><![CDATA[bonnes pratiques]]></category><category><![CDATA[ingénierie logicielle]]></category><category><![CDATA[clean code]]></category><pubDate>Tue, 12 May 2020 18:16:00 GMT</pubDate></item><item><title><![CDATA[Veille de la semaine #17 de 2019]]></title><description><![CDATA[<ul>
<li><a href="https://www.geek-directeur-technique.com/2019/04/18/les-generateurs-en-php">Les générateurs en PHP</a> (fr)&nbsp;: pas forcément le truc qu&#39;on utilise tous les jours mais les générateurs peuvent être utiles.</li>
<li><a href="https://timkadlec.com/remembers/2019-04-18-new-network-fallacies/">New Network Fallacies</a> (en)&nbsp;: <a href="https://fr.wikipedia.org/wiki/Paradoxe_de_Jevons">Le paradoxe de Jevons</a> appliqué aux performances des réseaux</li>
<li><a href="https://medium.com/javascript-scene/tdd-changed-my-life-5af0ce099f80">TDD Changed My Life</a> (en)&nbsp;: c&#39;est le confort et la sérénité dont je parlais dans <a href="/post/bon-test-unitaire-integration-fonctionnel/">Au fait, c&#39;est quoi un bon test unitaire, d&#39;intégration ou fonctionnel ?</a></li>
<li><a href="https://technology.blog.gov.uk/2019/04/18/why-we-focus-on-frontend-performance/">Why we focus on frontend performance</a> (en)&nbsp;: pourquoi les performances sont un point important sur les sites du gouvernement britannique.</li>
<li><a href="https://wiki.php.net/rfc/deprecate_php_short_tags">PHP: rfc:deprecate_php_short_tags</a> (en)&nbsp;: c&#39;est bientôt la fin des <em>short open tags</em> (<code>&lt;?</code>) dans PHP, une (petite) bizarrerie historique de PHP de plus qui disparaît :)</li>
<li><a href="https://philippe.bourgau.net/you-should-refuse-to-develop-what-you-dont-understand/">You should refuse to develop what you don’t understand</a> (en)&nbsp;: absolument !</li>
</ul>
<p>Et un peu hors-sujet&nbsp;:</p>
<ul>
<li><a href="https://reflets.info/articles/ce-que-vous-ne-voyez-pas">Ce que vous ne voyez pas</a> (fr)&nbsp;: <em>La France devient-elle un état policier ?</em></li>
</ul>
<p>(En plus du <a href="/rss.xml">flux RSS global</a>, les billets <em>veille</em>
et uniquement ceux là sont listés dans le <a href="/rss/veille.xml">flux RSS correspondant</a>)</p>
]]></description><link>https://damien.pobel.fr/post/veille-semaine-17-2019</link><guid isPermaLink="true">https://damien.pobel.fr/post/veille-semaine-17-2019</guid><category><![CDATA[veille]]></category><category><![CDATA[code]]></category><category><![CDATA[métier]]></category><category><![CDATA[php]]></category><category><![CDATA[performances]]></category><category><![CDATA[unit test]]></category><pubDate>Thu, 25 Apr 2019 10:12:18 GMT</pubDate></item></channel></rss>