<linkrel="alternate"lang="fr"xml:lang="fr"title="Arbres ; Pragmatisme et Formalisme"type="text/html"hreflang="fr"href="/Scratch/fr/blog/2010-05-24-Trees--Pragmatism-and-Formalism/"/>
<linkrel="alternate"lang="en"xml:lang="en"title="Trees; Pragmatism and Formalism"type="text/html"hreflang="en"href="/Scratch/en/blog/2010-05-24-Trees--Pragmatism-and-Formalism/"/>
<li>Then stopped working like an engineer monkey</li>
<li>Used a pen and a sheet of paper</li>
<li>Made some math.</li>
<li>Crushed the problem in 10 minutes</li>
<li>Conclusion: The pragmatism shouldn’t mean “never use theory”.</li>
</ul>
</div>
<h2id="abstract-longer-than-abbr-titletoo-long-dont-readsctldrscabbr">Abstract (longer than <abbrtitle="Too Long; Don't Read"><spanclass="sc">tl;dr</span></abbr>)</h2>
<p>For my job, I needed to resolve a problem. It first seems not too hard.
Then I started working directly on my program.
I entered in the <em>infernal</em>: <em>try & repair loop</em>.
Each step was like:</p>
<blockquote>
<p>– Just this thing to repair and that should be done.<br/>
– OK, now that should just work.<br/>
– Yeah!!!<br/>
– Oops! I forgotten that…<br/>
<code>repeat until death</code></p>
</blockquote>
<p>After two days of this <ahref="http://fr.wikipedia.org/wiki/Sisyphe">Sisyphus</a> work, I finally just stopped to rethink the problem.
I took a pen, a sheet of paper. I simplified the problem, reminded what I learned during my Ph.D. about trees.
Finally, the problem was crushed in less than 20 minutes.</p>
<p>I believe the important lesson is to remember that the most efficient methodology to resolve this <em>pragmatic</em> problem was the <em>theoretical</em> one.
And therefore, argues opposing science, theory to pragmatism and efficiency are fallacies.</p>
</div>
<divclass="corps">
<h1class="first"id="first-my-experience">First: my experience</h1>
<p>Apparently 90% of programmer are unable to program a binary search without bug.
The algorithm is well known and easy to understand.
However it is difficult to program it without any flaw.
I participated to <ahref="http://reprog.wordpress.com/2010/04/19/are-you-one-of-the-10-percent/">this contest</a>.
And you can see the <ahref="http://reprog.wordpress.com/2010/04/21/binary-search-redux-part-1/">results here</a><supid="fnref:1"><ahref="#fn:1"rel="footnote">1</a></sup>.
I had to face a problem of the same kind at my job. The problem was simple to the start. Simply transform an <spanclass="sc">xml</span> from one format to another.</p>
<p>The source <spanclass="sc">xml</span> was in the following general format:</p>
<p>At first sight I believed it will be easy. I was so certain it will be easy that I fixed to myself the following rules:</p>
<ol>
<li>do not use <spanclass="sc">xslt</span></li>
<li>avoid the use of an <spanclass="sc">xml</span> parser</li>
<li>resolve the problem using a simple perl script[^2]</li>
</ol>
<p>You can try if you want. If you attack the problem directly opening an editor, I assure you, it will certainly be not so simple.
I can tell that, because it’s what I’ve done. And I must say I lost almost a complete day at work trying to resolve this. There was also, many small problems around that make me lose more than two days for this problem.</p>
<p>Why after two days did I was unable to resolve this problem which seems so simple?</p>
<p>What was my behaviour (workflow)?</p>
<ol>
<li>Think</li>
<li>Write the program</li>
<li>Try the program </li>
<li>Verify the result</li>
<li>Found a bug</li>
<li>Resolve the bug</li>
<li>Go to step 3.</li>
</ol>
<p>This was a <em>standard</em> workflow for computer engineer. The flaw came from the first step.
I thought about how to resolve the problem but with the eyes of a <em>pragmatic engineer</em>. I was saying:</p>
<blockquote>
<p>That should be a simple perl search and replace program.<br/>
Let’s begin to write code</p>
</blockquote>
<p>This is the second sentence that was plainly wrong. I started in the wrong direction. And the workflow did not work from this entry point.</p>
<h2id="think">Think</h2>
<p>After some times, I just stopped to work. Tell myself <em>“it is enough, now, I must finish it!”</em>.
I took a sheet of paper, a pen and began to draw some trees.</p>
<p>I began by make by removing most of the verbosity.
I first renamed <code><item name="Menu"></code> by simpler name <code>M</code> for example.
<p>Then I made myself the following reflexion:</p>
<p>Considering Tree Edit Distance, each unitary transformation of tree correspond to a simple search and replace on my <spanclass="sc">xml</span> source<supid="fnref:nb"><ahref="#fn:nb"rel="footnote">2</a></sup>.
We consider three atomic transformations on trees:</p>
<ul>
<li><em>substitution</em>: renaming a node</li>
<li><em>insertion</em>: adding a node</li>
<li><em>deletion</em>: remove a node</li>
</ul>
<p>One of the particularity of atomic transformations on trees, is ; if you remove a node, all children of this node, became children of its father.</p>
<p>An example:</p>
<preclass="twilight">
r - x - a
\ \
\ b
y - c
</pre>
<p>If you delete the <code>x</code> node, you obtain</p>
<spanclass="MetaTagAll"><spanclass="MetaTagAll"><</span><spanclass="MetaTagAll">a</span><spanclass="MetaTagAll">></span></span>value for a<spanclass="MetaTagAll"><spanclass="MetaTagAll"></</span><spanclass="MetaTagAll">a</span><spanclass="MetaTagAll">></span></span>
<spanclass="MetaTagAll"><spanclass="MetaTagAll"><</span><spanclass="MetaTagAll">b</span><spanclass="MetaTagAll">></span></span>value for b<spanclass="MetaTagAll"><spanclass="MetaTagAll"></</span><spanclass="MetaTagAll">b</span><spanclass="MetaTagAll">></span></span>
<spanclass="MetaTagAll"><spanclass="MetaTagAll"><</span><spanclass="MetaTagAll">c</span><spanclass="MetaTagAll">></span></span>value for c<spanclass="MetaTagAll"><spanclass="MetaTagAll"></</span><spanclass="MetaTagAll">c</span><spanclass="MetaTagAll">></span></span>
<p>It should seems a bit paradoxal, but sometimes the most efficient approach to a pragmatic problem is to use the theoretical methodology.</p>
<hr/><divclass="footnotes">
<ol>
<liid="fn:1">
<p>Hopefully I am in the 10% who had given a bug free implementation.<ahref="#fnref:1"rev="footnote">↩</a></p>
</li>
<liid="fn:nb">
<p>I did a program which generate automatically the weight in a matrix of each edit distance from data.<ahref="#fnref:nb"rev="footnote">↩</a></p>