279 lines
20 KiB
HTML
279 lines
20 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>YBlog - Arbres ; Pragmatisme et Formalisme</title>
|
||
<meta name="keywords" content="XML, Perl, programmation, arbre, théorie, mathématiques, regexp, script" />
|
||
|
||
<link rel="shortcut icon" type="image/x-icon" href="../../../../Scratch/img/favicon.ico" />
|
||
<link rel="stylesheet" type="text/css" href="../../../../css/y.css" />
|
||
<link rel="stylesheet" type="text/css" href="/css/legacy.css" />
|
||
<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<link rel="apple-touch-icon" href="../../../../Scratch/img/about/FlatAvatar@2x.png" />
|
||
<!--[if lt IE 9]>
|
||
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
|
||
<![endif]-->
|
||
<!-- IndieAuth -->
|
||
<link href="https://twitter.com/yogsototh" rel="me">
|
||
<link href="https://github.com/yogsototh" rel="me">
|
||
<link href="mailto:yann.esposito@gmail.com" rel="me">
|
||
<link rel="pgpkey" href="../../../../pubkey.txt">
|
||
</head>
|
||
<body lang="fr" class="article">
|
||
<div id="content">
|
||
<div id="header">
|
||
<div id="choix">
|
||
<span id="choixlang">
|
||
<a href="../../../../Scratch/en/blog/2010-05-24-Trees--Pragmatism-and-Formalism/">Anglais</a>
|
||
</span>
|
||
<span class="tomenu"><a href="#navigation">↓ Menu ↓</a></span>
|
||
<span class="flush"></span>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="titre">
|
||
<h1>Arbres ; Pragmatisme et Formalisme</h1>
|
||
<h2>Quand la théorie est plus pratique que la pratique</h2>
|
||
|
||
</div>
|
||
<div class="flush"></div>
|
||
<div id="afterheader" class="article">
|
||
<div class="corps">
|
||
<div class="intro">
|
||
<p><span class="sc"><abbr title="Trop long; pas lu">tlpl</abbr>: </span> :</p>
|
||
<ul>
|
||
<li>J’ai essayé de programmer un simple filtre ;</li>
|
||
<li>J’ai été bloqué pendant deux jours ;</li>
|
||
<li>J’ai arrêté de penser comme un robot ;</li>
|
||
<li>J’ai utilisé un papier et un stylo ;</li>
|
||
<li>J’ai fait un peu de maths ;</li>
|
||
<li>J’ai résolu le problème en 10 minutes ;</li>
|
||
<li>Conclusion: Pragmatisme n’est pas : «n’utilisez jamais la théorie».</li>
|
||
</ul>
|
||
</div>
|
||
<h2 id="résumé-plus-long-que-le-tlpl">Résumé (plus long que le <span class="sc"><abbr title="Trop long; pas lu">tlpl</abbr>: </span>)</h2>
|
||
<p>Je devais résoudre un problème à mon travail. Au début cela semblait assez facile. J’ai donc commencé à programmer tout de suite. Je suis alors entré dans un cercle infernal d’essais et de réparations. Voilà à quoi ressemblait cet étrange état de boucle infini :</p>
|
||
<blockquote>
|
||
<p>– Plus que ça a réparer et ça devrait être bon.<br />
|
||
– Très bien, maintenant ça doit marcher.<br />
|
||
– Oui !!<br />
|
||
– Ah mince! J’ai oublié ce détail…<br />
|
||
<code>répéter jusqu'à la mort</code></p>
|
||
</blockquote>
|
||
<p>Après deux jours à me prendre pour <a href="http://fr.wikipedia.org/wiki/Sisyphe">Sisyphe</a>, je me suis arrêté pour repenser le problème. J’ai pris un stylo et une feuille de papier. Je me suis souvenu de de ce que j’avais appris sur les arbres pendant mon doctorat. Finalement, le problème fut résolu en moins de 20 minutes.</p>
|
||
<p>Je pense que la leçon à retenir de cette expérience est de se souvenir que la méthodologie la plus efficace pour résoudre ce problème <em>pragamtique</em> était la méthode <em>théorique</em>. Ça ne signifie pas que la méthode théorique est toujours la meilleure, mais en tout cas, il ne faut pas l’écarter.</p>
|
||
<hr />
|
||
<h1 id="lanecdote">L’anecdote</h1>
|
||
<p>Apparemment 90% des programmeurs sont incapable de programmer une recherche binaire sans faire de bug. L’algorithme est pourtant connu et facile à comprendre. Cependant, il est difficile à programmer sans bug. J’ai participé à <a href="http://reprog.wordpress.com/2010/04/19/are-you-one-of-the-10-percent/">ce concours</a>. Vous pouvez voir les <a href="http://reprog.wordpress.com/2010/04/21/binary-search-redux-part-1/">résultats ici</a><a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a>. J’ai dû faire face à un problème similaire à mon travail. Il paraissait simple au départ. Transformer un <sc>xml</sc> d’un format à un autre.</p>
|
||
<p>Voici le format général du <sc>xml</sc> source :</p>
|
||
<div class="sourceCode" id="cb1"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb1-1" title="1"><span class="kw"><rubrique></span></a>
|
||
<a class="sourceLine" id="cb1-2" title="2"> <span class="kw"><contenu></span></a>
|
||
<a class="sourceLine" id="cb1-3" title="3"> <span class="kw"><tag1></span>value1<span class="kw"></tag1></span></a>
|
||
<a class="sourceLine" id="cb1-4" title="4"> <span class="kw"><tag2></span>value2<span class="kw"></tag2></span></a>
|
||
<a class="sourceLine" id="cb1-5" title="5"> ...</a>
|
||
<a class="sourceLine" id="cb1-6" title="6"> <span class="kw"></contenu></span></a>
|
||
<a class="sourceLine" id="cb1-7" title="7"> <span class="kw"><enfant></span></a>
|
||
<a class="sourceLine" id="cb1-8" title="8"> <span class="kw"><rubrique></span></a>
|
||
<a class="sourceLine" id="cb1-9" title="9"> ...</a>
|
||
<a class="sourceLine" id="cb1-10" title="10"> <span class="kw"></rubrique></span></a>
|
||
<a class="sourceLine" id="cb1-11" title="11"> ...</a>
|
||
<a class="sourceLine" id="cb1-12" title="12"> <span class="kw"><rubrique></span></a>
|
||
<a class="sourceLine" id="cb1-13" title="13"> ...</a>
|
||
<a class="sourceLine" id="cb1-14" title="14"> <span class="kw"></rubrique></span></a>
|
||
<a class="sourceLine" id="cb1-15" title="15"> <span class="kw"></enfant></span></a>
|
||
<a class="sourceLine" id="cb1-16" title="16"><span class="kw"></menu></span></a></code></pre></div>
|
||
<p>et le format d’arrivé est celui-ci :</p>
|
||
<div class="sourceCode" id="cb2"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb2-1" title="1"><span class="kw"><item</span><span class="ot"> name=</span><span class="st">"Menu0"</span><span class="kw">></span></a>
|
||
<a class="sourceLine" id="cb2-2" title="2"> <span class="kw"><value></span></a>
|
||
<a class="sourceLine" id="cb2-3" title="3"> <span class="kw"><item</span><span class="ot"> name=</span><span class="st">"menu"</span><span class="kw">></span></a>
|
||
<a class="sourceLine" id="cb2-4" title="4"> <span class="kw"><value></span></a>
|
||
<a class="sourceLine" id="cb2-5" title="5"> <span class="kw"><item</span><span class="ot"> name=</span><span class="st">"tag1"</span><span class="kw">></span></a>
|
||
<a class="sourceLine" id="cb2-6" title="6"> <span class="kw"><value></span>value1<span class="kw"></value></span></a>
|
||
<a class="sourceLine" id="cb2-7" title="7"> <span class="kw"></item></span></a>
|
||
<a class="sourceLine" id="cb2-8" title="8"> <span class="kw"><item</span><span class="ot"> name=</span><span class="st">"tag2"</span><span class="kw">></span></a>
|
||
<a class="sourceLine" id="cb2-9" title="9"> <span class="kw"><value></span>value2<span class="kw"></value></span></a>
|
||
<a class="sourceLine" id="cb2-10" title="10"> <span class="kw"></item></span></a>
|
||
<a class="sourceLine" id="cb2-11" title="11"> ...</a>
|
||
<a class="sourceLine" id="cb2-12" title="12"> <span class="kw"><item</span><span class="ot"> name=</span><span class="st">"menu"</span><span class="kw">></span></a>
|
||
<a class="sourceLine" id="cb2-13" title="13"> <span class="kw"><value></span></a>
|
||
<a class="sourceLine" id="cb2-14" title="14"> ...</a>
|
||
<a class="sourceLine" id="cb2-15" title="15"> <span class="kw"></value></span></a>
|
||
<a class="sourceLine" id="cb2-16" title="16"> <span class="kw"><value></span></a>
|
||
<a class="sourceLine" id="cb2-17" title="17"> ...</a>
|
||
<a class="sourceLine" id="cb2-18" title="18"> <span class="kw"></value></span></a>
|
||
<a class="sourceLine" id="cb2-19" title="19"> <span class="kw"></item></span></a>
|
||
<a class="sourceLine" id="cb2-20" title="20"> <span class="kw"></value></span></a>
|
||
<a class="sourceLine" id="cb2-21" title="21"> <span class="kw"></item></span></a>
|
||
<a class="sourceLine" id="cb2-22" title="22"> <span class="kw"></value></span></a>
|
||
<a class="sourceLine" id="cb2-23" title="23"><span class="kw"></item></span></a></code></pre></div>
|
||
<p>À première vue, cela m’a paru simple. J’étais certain de pouvoir y arriver en me fixant les règles suivantes :</p>
|
||
<ol type="1">
|
||
<li>ne pas utiliser <sc>xslt</sc> ;</li>
|
||
<li>ne pas utiliser de parseur <sc>xml</sc> ;</li>
|
||
<li>résoudre le problème en utilisant un simple script perl</li>
|
||
</ol>
|
||
<p>Vous pouvez essayer si vous le souhaitez. Si vous attaquez ce problème directement en écrivant le programme, ce ne sera certainement pas si simple. Je peux le dire, parce que c’est ce que j’ai fait. Et je dois dire que j’ai perdu une journée de travail complète en m’y prenant de la sorte. En réalité, il y avait pas mal de petits détails dont je ne parle pas qui m’ont induis en erreur et qui m’ont fait perdre encore plus de temps.</p>
|
||
<p>Pourquoi étais-je incapable de résoudre ce problème si simple en aparence ?</p>
|
||
<p>Voici comment je m’y suis pris :</p>
|
||
<ol type="1">
|
||
<li>Réfléchir</li>
|
||
<li>Écrire le programme</li>
|
||
<li>Essayer le programme</li>
|
||
<li>Vérifier les résultats</li>
|
||
<li>Trouver un bug</li>
|
||
<li>Résoudre le bug</li>
|
||
<li>Reprendre à l’étape 3</li>
|
||
</ol>
|
||
<p>Il s’agissait d’une méthode de travail standard pour un ingénieur en informatique. L’erreur venait de la première étape. J’ai d’abord pensé à comment résoudre le problème mais avec des yeux d’<em>ingéinieur pragmatique</em>. Je me suis simplement dit :</p>
|
||
<blockquote>
|
||
<p>Ça à l’air de pouvoir se résouvre avec un petit script de <em>search&replace</em> en perl Commençons à écrire le code maintenant.</p>
|
||
</blockquote>
|
||
<p>C’est la deuxième phrase qui est complètement fausse. Parce que j’avais mal commencé et que cette méthodologie de travail ne fonctionne pas lorsque l’on part vraiment mal.</p>
|
||
<h2 id="réfléchir">Réfléchir</h2>
|
||
<p>Après un certain temps, j’ai arrêté de programmer et je me suis dit : «Maintenant, ça suffit !». J’ai pris une feuille et un stylo et j’ai commencé à dessiner des arbres.</p>
|
||
<p>J’ai commencer par simplifier un peu en enlevant le maximum de verbiage. Tout d’abord en renommant <code><item name="Menu"></code> par un simple <code>M</code> par exemple. J’ai obtenu quelque chose comme :</p>
|
||
<p><img src="../../../../Scratch/en/blog/2010-05-24-Trees--Pragmatism-and-Formalism/code/The_source_tree.png" alt="L'arbre source" /></p>
|
||
<p>et</p>
|
||
<p><img src="../../../../Scratch/en/blog/2010-05-24-Trees--Pragmatism-and-Formalism/code/The_destination_tree.png" alt="L'arbre destination" /></p>
|
||
<p>Puis, je me suis fait la réflexion suivante :</p>
|
||
<p>Dans les distances d’éditions sur les arbres, chaque opération atomique correspond à un simple <em>search and replace</em> sur mon fichier <sc>xml</sc> source<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a>. On considère trois opérations atomiques sur les arbres :</p>
|
||
<ul>
|
||
<li><em>substitution</em>: renommer un nœud</li>
|
||
<li><em>insertion</em>: ajouter un nœud</li>
|
||
<li><em>délétion</em>: supprimer un nœud</li>
|
||
</ul>
|
||
<p>Une des particularité avec les transformations sur les arbres est celle-ci : supprimer un nœud et tous ses enfants deviendront les enfants du père de ce nœud.</p>
|
||
<p>Un exemple:</p>
|
||
<pre class="twilight">
|
||
r - x - a
|
||
\ \
|
||
\ b
|
||
y - c
|
||
</pre>
|
||
<p>Si vous supprimez le nœud <code>x</code>, vous obtenez</p>
|
||
<pre class="twilight">
|
||
a
|
||
/
|
||
r - b
|
||
\
|
||
y - c
|
||
</pre>
|
||
<p>Et regardez ce que ça implique quand on l’écrit en <sc>xml</sc> :</p>
|
||
<div class="sourceCode" id="cb3"><pre class="sourceCode xml"><code class="sourceCode xml"><a class="sourceLine" id="cb3-1" title="1"><span class="kw"><r></span></a>
|
||
<a class="sourceLine" id="cb3-2" title="2"> <span class="kw"><x></span></a>
|
||
<a class="sourceLine" id="cb3-3" title="3"> <span class="kw"><a></span>value for a<span class="kw"></a></span></a>
|
||
<a class="sourceLine" id="cb3-4" title="4"> <span class="kw"><b></span>value for b<span class="kw"></b></span></a>
|
||
<a class="sourceLine" id="cb3-5" title="5"> <span class="kw"></x></span></a>
|
||
<a class="sourceLine" id="cb3-6" title="6"> <span class="kw"><y></span></a>
|
||
<a class="sourceLine" id="cb3-7" title="7"> <span class="kw"><c></span>value for c<span class="kw"></c></span></a>
|
||
<a class="sourceLine" id="cb3-8" title="8"> <span class="kw"></y></span></a>
|
||
<a class="sourceLine" id="cb3-9" title="9"><span class="kw"></r></span></a></code></pre></div>
|
||
<p>Alors supprimer tous les nœuds <code>x</code> revient à faire passer le <sc>xml</sc> à travers le filtre suivant :</p>
|
||
<div class="sourceCode" id="cb4"><pre class="sourceCode perl"><code class="sourceCode perl"><a class="sourceLine" id="cb4-1" title="1"><span class="kw">s/</span><span class="ot"><\/</span><span class="ch">?</span><span class="ot">x></span><span class="kw">//g</span></a></code></pre></div>
|
||
<p>Par conséquent, s’il existe un transducteur déterministe à un état qui permet de transformer mes arbres ; je suis capable de transformer le <sc>xml</sc> d’un format à l’autre en utilisant une simple liste de <em>search and replace</em>.</p>
|
||
<h1 id="solution">Solution</h1>
|
||
<p>Transformer cet arbre :</p>
|
||
<pre class="twilight">
|
||
R - C - tag1
|
||
\ \
|
||
\ tag2
|
||
E -- R - C - tag1
|
||
\ \ \
|
||
\ \ tag2
|
||
\ E ...
|
||
R - C - tag1
|
||
\ \
|
||
\ tag2
|
||
E ...
|
||
</pre>
|
||
<p>en celui-ci :</p>
|
||
<pre class="twilight">
|
||
tag1
|
||
/
|
||
M - V - M - V - tag2 tag1
|
||
\ /
|
||
M --- V - tag2
|
||
\ \
|
||
\ M
|
||
\ tag1
|
||
\ /
|
||
V - tag2
|
||
\
|
||
M
|
||
</pre>
|
||
<p>peut-être fait en utilisant le transducteur déterministe à un état suivant:</p>
|
||
<blockquote>
|
||
<p>C -> ε<br />
|
||
E -> M<br />
|
||
R -> V</p>
|
||
</blockquote>
|
||
<p>Ce qui peut-être traduit par les simples directives Perl suivantes :</p>
|
||
<div class="sourceCode" id="cb5"><pre class="sourceCode perl"><code class="sourceCode perl"><a class="sourceLine" id="cb5-1" title="1"><span class="kw">s/</span><span class="ot">C</span><span class="kw">//g</span></a>
|
||
<a class="sourceLine" id="cb5-2" title="2"><span class="kw">s/</span><span class="ot">E</span><span class="kw">/</span><span class="st">M</span><span class="kw">/g</span></a>
|
||
<a class="sourceLine" id="cb5-3" title="3"><span class="kw">s/</span><span class="ot">R</span><span class="kw">/</span><span class="st">V</span><span class="kw">/g</span></a></code></pre></div>
|
||
<p>Une fois adapté au <sc>xml</sc> cela devient :</p>
|
||
<div class="sourceCode" id="cb6"><pre class="sourceCode perl"><code class="sourceCode perl"><a class="sourceLine" id="cb6-1" title="1"><span class="kw">s%</span><span class="ot"></</span><span class="ch">?</span><span class="ot">contenu></span><span class="kw">%%g</span></a>
|
||
<a class="sourceLine" id="cb6-2" title="2"><span class="kw">s%</span><span class="ot"><enfant></span><span class="kw">%</span><span class="st"><item name="menu"></span><span class="kw">%g</span></a>
|
||
<a class="sourceLine" id="cb6-3" title="3"><span class="kw">s%</span><span class="ot"></enfant></span><span class="kw">%</span><span class="st"></item></span><span class="kw">%g</span></a>
|
||
<a class="sourceLine" id="cb6-4" title="4"><span class="kw">s%</span><span class="ot"><rubrique></span><span class="kw">%</span><span class="st"><value></span><span class="kw">%g</span></a>
|
||
<a class="sourceLine" id="cb6-5" title="5"><span class="kw">s%</span><span class="ot"></rubrique></span><span class="kw">%</span><span class="st"></value></span><span class="kw">%g</span></a></code></pre></div>
|
||
<p>Et c’est tout.</p>
|
||
<h1 id="conclusion">Conclusion</h1>
|
||
<p>Même si cela peut sembler paradoxal, parfois la solution la plus efficace à un problème pragmatique est d’utiliser une méthodologie théorique.</p>
|
||
<section class="footnotes">
|
||
<hr />
|
||
<ol>
|
||
<li id="fn1"><p>Normalement, je fais parti des 10% qui ont fourni une implémentation sans bug.<a href="#fnref1" class="footnote-back">↩</a></p></li>
|
||
<li id="fn2"><p>J’ai programmé un outil qui calcule automatiquement le poids de chaque élément des matrices d’édition à partir de données.<a href="#fnref2" class="footnote-back">↩</a></p></li>
|
||
</ol>
|
||
</section>
|
||
</div>
|
||
<div id="afterarticle">
|
||
<div id="social">
|
||
<a href="/rss.xml" target="_blank" rel="noopener noreferrer nofollow" class="social">RSS</a>
|
||
·
|
||
<a href="https://twitter.com/home?status=http%3A%2F%2Fyannesposito.com/Scratch/fr/blog/2010-05-24-Trees--Pragmatism-and-Formalism/%20via%20@yogsototh" target="_blank" rel="noopener noreferrer nofollow" class="social">Tweet</a>
|
||
·
|
||
<a href="http://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fyannesposito.com/Scratch/fr/blog/2010-05-24-Trees--Pragmatism-and-Formalism/" target="_blank" rel="noopener noreferrer nofollow" class="social">FB</a>
|
||
<br />
|
||
<a class="message" href="../../../../Scratch/fr/blog/Social-link-the-right-way/">Ces liens sociaux préservent votre vie privée</a>
|
||
</div>
|
||
<div id="navigation">
|
||
<a href="../../../../">Accueil</a>
|
||
<span class="sep">¦</span>
|
||
<a href="../../../../Scratch/fr/blog">Blog</a>
|
||
<span class="sep">¦</span>
|
||
<a href="../../../../Scratch/fr/softwares">Logiciels</a>
|
||
<span class="sep">¦</span>
|
||
<a href="../../../../Scratch/fr/about">Auteur</a>
|
||
</div>
|
||
<div id="totop"><a href="#header">↑ Top ↑</a></div>
|
||
<div id="bottom">
|
||
<div>
|
||
Published on 2010-05-24
|
||
</div>
|
||
<div>
|
||
<a href="https://twitter.com/yogsototh">Follow @yogsototh</a>
|
||
</div>
|
||
<div>
|
||
<a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US">Yann Esposito©</a>
|
||
</div>
|
||
|
||
<div>
|
||
Done with
|
||
<a href="http://www.vim.org" target="_blank" rel="noopener noreferrer nofollow"><strike>Vim</strike></a>
|
||
<a href="http://spacemacs.org" target="_blank" rel="noopener noreferrer nofollow">spacemacs</a>
|
||
<span class="pala">&</span>
|
||
<a href="http://nanoc.ws" target="_blank" rel="noopener noreferrer nofollow"><strike>nanoc</strike></a>
|
||
<a href="http://jaspervdj.be/hakyll" target="_blank" rel="noopener noreferrer nofollow">Hakyll</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|