<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7659515555534023244</id><updated>2012-02-16T04:24:23.649-08:00</updated><category term='Lean'/><category term='Software Craftsmanship'/><category term='CodeRetreat Grenoble CARA alpesJug'/><category term='TDD'/><category term='OO'/><category term='Simplicité'/><title type='text'>Johan Martinsson</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-1734702651241284221</id><published>2012-01-24T15:02:00.000-08:00</published><updated>2012-01-25T01:43:09.312-08:00</updated><title type='text'>Tester entrées et sorties en Clojure</title><content type='html'>En faisant &lt;a href="http://www.slideshare.net/chrismdp/lean-code"&gt;ce kata&lt;/a&gt; en Clojure j'étais sous pression de temps alors je n'ai pas fait une partie en TDD - l'interaction avec la console. Ca ne me dérange pas plus que ça mais je voulais voir comment on pourrait le faire en TDD. Il se trouve que c'est extrêmement simple!&lt;br /&gt;&lt;br /&gt;Dans cet exercise on doit construire une caisse de primeur qui accepte en entrée (console) des fruits et qui pour chaque entrée affiche le total sur la sortie (console). Pour cela je vais construire une fonction &lt;i&gt;buy &lt;/i&gt;&amp;nbsp;qui va s'appuyer sur la fonction &lt;i&gt;read-line&lt;/i&gt; qui lit une ligne du console et &lt;i&gt;println&lt;/i&gt; qui affiche une ligne sur la console&lt;br /&gt;&lt;br /&gt;Premier besoin : je ne veux pas de boucle fini dans ma fonction - quand j'entre une ligne vide la fonction sort. La syntaxe ici vient de &lt;a href="https://github.com/marick/Midje"&gt;Midje&lt;/a&gt; - un framework de test qui a la particularité (pour un langage fonctionnel) d'être orienté outside-in.&lt;br /&gt;&lt;script src="https://gist.github.com/1669489.js?file=no-infinite-loop.clj"&gt;&lt;/script&gt;&lt;br /&gt;Ici j'aime vraiment la &lt;b&gt;facilité avec laquelle on arrive à faire un bouchon de &lt;i&gt;read-line&lt;/i&gt;&lt;/b&gt;&amp;nbsp;- on déclare simplement que ceci est un fait (&lt;i&gt;fact)&lt;/i&gt;&amp;nbsp;si &lt;i&gt;read-line&lt;/i&gt; renvoie les valeurs énumérés&lt;br /&gt;&lt;br /&gt;Deuxième besoin : On doit afficher le total de l'achat après chaque ligne d'entrée.&lt;br /&gt;&lt;script src="https://gist.github.com/1669489.js?file=print-total-for-every-line.clj"&gt;&lt;/script&gt;&lt;br /&gt;Ici c'est facile, court et ça reste lisible mais &lt;b&gt;il y a du bruit&lt;/b&gt; :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;on est obligé de déclarer la valeur de retour attendue de println (qui renvoie toujours nil), j'ai mis &lt;i&gt;anything&lt;/i&gt;&amp;nbsp;pour signifier que ce n'est pas important&lt;/li&gt;&lt;li&gt;chaque contrainte sur println (d'abord total 100 puis total 175) se déclare sur une ligne. Nous n'avons pas l'expressitivité de du bouchon avec &lt;i&gt;=streams=&amp;gt;. &lt;/i&gt;&amp;nbsp;Dans mes rêves ça aurait été&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;script src="https://gist.github.com/1669489.js?file=in-my-dreams.clj"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div&gt;Et sinon le code ça rend quoi?&lt;/div&gt;&lt;script src="https://gist.github.com/1669489.js?file=buy.clj"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div&gt;Ce à quoi je m'attendais pas en commençant cette exercise c'est que bien qu'on gère de la mutabilité (le prix total du panier s'incrémente)&lt;b&gt; aucune fonction n'est mutable&lt;/b&gt; et aucun variable mutable n'est nécessaire. &lt;b&gt;L'état du panier est contenu dans la recursion&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour moi c'est fascinant de découvrir ce moyen de &lt;b&gt;gérer l'état visible d'une application sans mutabilité&lt;/b&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-1734702651241284221?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/1734702651241284221/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2012/01/tester-entrees-et-sorties-en-clojure.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/1734702651241284221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/1734702651241284221'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2012/01/tester-entrees-et-sorties-en-clojure.html' title='Tester entrées et sorties en Clojure'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-3921052367590410449</id><published>2011-11-27T15:01:00.000-08:00</published><updated>2011-11-27T15:01:06.126-08:00</updated><title type='text'>Mikado à Agile Grenoble 2011</title><content type='html'>Les slides de la présentation de Miguel Moquillon et moi à Agile Grenoble 2011.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_10355287"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/martinsson/mikado-10355287" title="Mikado"&gt;Mikado&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse10355287" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mikado-111127165506-phpapp01&amp;stripped_title=mikado-10355287&amp;userName=martinsson" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"/&gt;&lt;embed name="__sse10355287" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mikado-111127165506-phpapp01&amp;stripped_title=mikado-10355287&amp;userName=martinsson" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/martinsson"&gt;martinsson&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-3921052367590410449?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/3921052367590410449/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2011/11/mikado-agile-grenoble-2011.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/3921052367590410449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/3921052367590410449'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2011/11/mikado-agile-grenoble-2011.html' title='Mikado à Agile Grenoble 2011'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-6527674823794107615</id><published>2011-10-18T14:30:00.000-07:00</published><updated>2011-10-27T06:37:13.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Craftsmanship'/><category scheme='http://www.blogger.com/atom/ns#' term='Simplicité'/><title type='text'>Pas si simple de faire simple</title><content type='html'>La version express de ce billet est que nous ne faisons pas assez la différence entre “construire avec des briques simples” et “faire des objets simples à utiliser”. Ce n’est pas du tout la même chose!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La différence :&lt;/li&gt;&lt;ul&gt;&lt;li&gt;La simplicité d’utilisation est&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Contextuel&lt;/li&gt;&lt;li&gt;Composé&lt;/li&gt;&lt;li&gt;Plutôt fermé à l’évolution&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Les briques simples sont&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Généralistes&lt;/li&gt;&lt;li&gt;Unitaires&lt;/li&gt;&lt;li&gt;Ouverts à l’évolution&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;C’est possible d’avoir les deux.&lt;/li&gt;&lt;/ul&gt;Voici la version longue, avec des explications et, promis, des exemples.&lt;br /&gt;&lt;br /&gt;Dans ce &lt;a href="http://blip.tv/clojure/stuart-halloway-simplicity-ain-t-easy-4842694"&gt;keynote&lt;/a&gt; Stuart Halloway explique que le mot &lt;a href="http://www.linternaute.com/dictionnaire/fr/definition/simple/"&gt;simple&lt;/a&gt; veut dire quelque chose de très fondamentale. Il soutient que la définition du mot &lt;i&gt;simple&lt;/i&gt;  est &lt;i&gt;non composé&lt;/i&gt; ou &lt;i&gt;non assemblé&lt;/i&gt; (&lt;i&gt;non compound&lt;/i&gt; en anglais).&lt;br /&gt;&lt;br /&gt;Puis il continue à nous expliquer pourquoi il est primordiale de construire seulement à partir de choses simples. Notamment il dit&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Essayez de faire quelque chose de simple à partir de choses non simples … C’est impossible&lt;/li&gt;&lt;/ul&gt;Autrement dit, pour avoir une librairie ou application simple, on doit l’assembler de choses simples. Puis il finit son keynote par dire.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si un peu plus du code était écrit dans le respect de la simplicité le monde serait un peu meilleur.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://2.bp.blogspot.com/-egkWOEdRHpo/Tp507ltGgtI/AAAAAAAAEm4/9M9NDKCynXA/s1600/ikea-simple-but-not-simple-to-use.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://2.bp.blogspot.com/-egkWOEdRHpo/Tp507ltGgtI/AAAAAAAAEm4/9M9NDKCynXA/s320/ikea-simple-but-not-simple-to-use.jpg" width="320" /&gt;&lt;/a&gt;Bon finalement c’était juste le &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Single Responsibility Principle&lt;/a&gt; dans une nouvelle sauce. Soit, seulement quelques jours plus tard, il m’est venu à l’ésprit qu’il y a un paradoxe. Car si j’écris tout mon code de cette manière alors il serait chiant à utiliser, même pour moi. Notamment lorsqu’on utilise fréquemment une fonction/objet avec les mêmes paramètres ce serait chouette de ne pas le répéter partout dans le code. &lt;b&gt;Un code simple n’est pas toujours simple à utiliser&lt;/b&gt;. &amp;nbsp; En regardant de près il n’y a pas de paradoxe, mais la réflexion m’a fait comprendre quelque chose que je vais partager ici.&lt;br /&gt;&lt;br /&gt;Pour rendre la vie facile pour ceux qui utilisent notre code (souvent nous mêmes) nous avons tendance à faire du code simple à utiliser. Je suis convaincu que &lt;b&gt;si on échoue à faire quelque chose de simple c’est souvent parce qu’on veut faire quelque chose de simple à utiliser&lt;/b&gt;! Et pourtant ce compromis n'est pas nécessaire.&lt;br /&gt;&lt;br /&gt;Si on revient à la définition de &lt;i&gt;simple&lt;/i&gt; on constate que &lt;b&gt;&lt;i&gt;simple&lt;/i&gt; est une qualité intrinsèque et non contextuelle&lt;/b&gt;. Il est possible de juger de la simplicité de manière objective.&lt;br /&gt;&lt;br /&gt;Avec &lt;i&gt;Simple à utiliser&lt;/i&gt; c’est l’inverse. Par définition c’est simple pour&lt;b&gt; l’utilisation prévue&lt;/b&gt;. Si on change un peu le contexte il y a toutes les chances que ce ne soit plus très simple à utiliser. &lt;b&gt;&lt;i&gt;Simple à utiliser&lt;/i&gt; est contextuel&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Souvent nous trouvons des choses simples à utiliser parce que ça ressemble à quelque chose de connu, par exemple un patron de conception que nous avons déjà utilisé. &lt;b&gt;&lt;i&gt;Simple à utiliser&lt;/i&gt;&amp;nbsp;est subjectif.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ce serait bien dommage de faire des compromis entre une qualité "absolue" et une qualité contextuelle et subjective !&lt;br /&gt;&lt;br /&gt;Prenons par exemple cet objet qui fait partie d’une application de &lt;a href="http://fr.wikipedia.org/wiki/Robot_d%27indexation"&gt;crawl&lt;/a&gt; basique.&lt;br /&gt;&lt;script src="https://gist.github.com/1296674.js?file=BadCrawler.java"&gt;&lt;/script&gt;&lt;br /&gt;BatchCrawler est simple à utiliser car nous n’avons pas à fournir beaucoup d’arguments pour l’instancier.  Par contre il n’est pas Simple car il fait un tas de choses en plus de crawler une liste d’urls : &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il spécifie où est configuré le timeout de chargement d’une page.&lt;/li&gt;&lt;li&gt;Il contraint ce timeout à ne changer dans toute la JVM voire même on doit redéployer pour la changer.&lt;/li&gt;&lt;li&gt;Il contraint à utiliser un RetryingHttpCrawler – qui retente en cas de timeout et qui passe par le protocole HTTP.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Limitant ainsi fortement le potentiel de réutilisation de l’objet.&lt;br /&gt;&lt;br /&gt;Pour que l’objet puisse être qualifié de Simple, le constructeur devrait ressembler à ça&lt;br /&gt;&lt;script src="https://gist.github.com/1296674.js?file=BetterConstructor.java"&gt;&lt;/script&gt;&lt;br /&gt;Mais alors il deviendrait chiant à utiliser. Si cet objet est instancié de plusieurs endroits de l’application il y aurait de la duplication. Nous allons donc réintroduire ce constructeur sous forme de FactoryMethod avec un nom explicatif (documentation) parce qu’&lt;b&gt;il s’agit d'&lt;i&gt;une&lt;/i&gt; façon de configurer&lt;/b&gt; ce graph d’objets. &lt;br /&gt;&lt;script src="https://gist.github.com/1296674.js?file=FactoryMethod.java"&gt;&lt;/script&gt;&lt;br /&gt;Comme avec tout exemple simplifié c’est n’est jamais trop grave. C’est encore suffisamment petit pour être corrigé après-coup. Seulement dans une application réelle ça peut être un cauchemar car régulièrement on se retrouve avec l’initialisation d’une grappe d’objets - ici BatchCrawler initialise un RetryingHttpCrawler etc. Presque à chaque fois l’initialisation des objets plus bas dans le graphe ont des conséquences indésirables, c’est souvent ça qui nous rend les &lt;i&gt;tests après&lt;/i&gt; si difficiles ... Le remplacement d’un objet dans ce graphe n’est pas toujours aisé et le code nécessaire teintera le code d’initialisation avec complèxité.  &lt;br /&gt;&lt;br /&gt;En construisant uniquement avec des objets et fonctions Simples on arrive à l’enrober avec une simplicité d’utilisation… pour le besoin actuellement connu. Quand le besoin change (lire toujours) on est le roi du pétrole. On a le beurre et l’argent du beurre.&lt;br /&gt;&lt;br /&gt;Note : je ne dis pas qu’il faut essayer d’imaginer le besoin futur, seulement qu’il faut décomposer son code actuel en des briques les plus simples possible. Par dessus on peut ensuite construire la simplicité d’utilisation avec par exemple des valeurs par défaut.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Je ne vais pas conseiller de toujours faire ainsi, car à vrai dire rien n’est toujours vrai. Simplement le message que j’essaie de passer est&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il y a une différence importante :&lt;/li&gt;&lt;ul&gt;&lt;li&gt;La simplicité d’utilisation est&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Contextuel&lt;/li&gt;&lt;li&gt;Composé&lt;/li&gt;&lt;li&gt;Plutôt fermé à l’évolution&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Les briques simples sont&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Généralistes&lt;/li&gt;&lt;li&gt;Unitaires&lt;/li&gt;&lt;li&gt;Ouverts à l’évolution&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;C’est possible d’avoir les deux.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-6527674823794107615?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/6527674823794107615/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2011/10/pas-si-simple-de-faire-simple.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/6527674823794107615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/6527674823794107615'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2011/10/pas-si-simple-de-faire-simple.html' title='Pas si simple de faire simple'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-egkWOEdRHpo/Tp507ltGgtI/AAAAAAAAEm4/9M9NDKCynXA/s72-c/ikea-simple-but-not-simple-to-use.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-9012343715824814317</id><published>2011-07-03T09:59:00.000-07:00</published><updated>2011-07-05T05:57:53.653-07:00</updated><title type='text'>Symfony actions ARE easily testable</title><content type='html'>All Symfony experts I've met have told me that I'd better not bother with &lt;b&gt;unit&lt;/b&gt; testing the actions because it's difficult enough that it just isn't worth it. Even an official Sensio Labs trainer that wisited our company said the same thing (I find that quite surprising). Only when you're doing TDD it's rather annoying not to be able to test the first lines of a new feature as it breaks your flow.&lt;br /&gt;&lt;br /&gt;I should never have believed them. Luckily a colleague of mine didn't. In fact it turns out it's strikingly easy so I'd like to share it with you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's an example of a how to unit test a standard action “executeHelloWorld” and an ajax action “executeGoodEvening”. It takes two simple lines in the setUp to prepare instantiation of the action.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1062129.js?file=ActionTest.php"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The rest of the non-magic is in the fact that Symfony actions&amp;nbsp;do not directly return the values we are interrested in. Ordinary (non-ajax) actions do not return anything they just prepare the execution of the template by storing values in a var-holder, we access it by action-&amp;gt;getVar('name'). Ajax actions generally directly compiles the partials with parameters passed in an array and adds all that to action-&amp;gt;response-&amp;gt;content.&lt;br /&gt;&lt;br /&gt;Credits go to Marc Nazarian and Sebastien Fromont without whom I still wouldn't TDD my actions.&lt;br /&gt;&lt;br /&gt;For reference the action code&lt;br /&gt;&lt;script src="https://gist.github.com/1062129.js?file=actions.php"&gt;&lt;/script&gt;&lt;br /&gt;and the partial used&lt;br /&gt;&lt;script src="https://gist.github.com/1062129.js?file=_goodEvening.php"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-9012343715824814317?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/9012343715824814317/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2011/07/symfony-actions-are-easily-testable.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/9012343715824814317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/9012343715824814317'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2011/07/symfony-actions-are-easily-testable.html' title='Symfony actions ARE easily testable'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-8487254069268813412</id><published>2011-05-28T04:05:00.000-07:00</published><updated>2011-05-28T08:59:47.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Craftsmanship'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='OO'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Software Craftsmanship 2011 - décoiffant!</title><content type='html'>&lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }a:link {  }&lt;/style&gt;   &lt;br /&gt;&lt;div style="margin-bottom: 0in;"&gt;Je dois dire qu'une conférence où l'on a l'occasion de parler directement avec Gojko Adzic, Steeve Freeman, Michael Feathers, Jason Gorman, etc est forcément passionnante! C'est sans mentionner des sessions d'un très bon niveau où l'on a l'occasion de pair-programmer avec d'autres passionnés! Puis toutes les conversations entre participants.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Voici un petit résumé des sessions auxquelles j'ai assisté.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: large;"&gt;How object oriented are you feeling today?&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Il fallait résoudre un petit problème tout en respectant &lt;a href="http://www.markhneedham.com/blog/2008/11/06/object-calisthenics-first-thoughts/"&gt;9 principes&lt;/a&gt; qui mènent infailliblement à un code orienté objet.  &lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Ce que j'aime bien avec les exercices bornés par des règles fortes est que ça permet de sortir de ses habitudes et avoir un inspecteur de code derrière le dos pour nous aider à nous mettre en cause. Aussi lorsqu'une alerte est levée par la violation d'une des règles alors c'est souvent pas important quelle règle a été violée mais signe d'un problème plus profond. Par exemple pendant cette session nous nous sommes trouvés à vouloir avoir 3 collaborateurs (le max étant 2) dans un objet Account: Client, Bank et Money. La banque était nécessaire pour autoriser ou pas un transfert (autorisés uniquement au sein de la même banque). Le problème n'était pas d'avoir un troisième collaborateur, mais que le compte allait gérer trop de choses – le transfer ET la demande de l'autorisation. Une meilleure solution est que la banque autorise le transfert puis délégue le transfert au compte (Single Responsability Principle). Les règles nous ont permis de le voir plus tôt.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Les règles que je compte appliquer strictement au jour le jour&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;first class collections (wrapper  chaque collection une classe métier)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;one level of indentation&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0in;"&gt;Celles que je vais essayer d'appliquer un peu plus&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;no else statements (même pas dans  les factories).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;Wrap all primitives and string in  their own class&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0in;"&gt;Détail intéressant, tous les développeurs java à qui j'ai parlé ont adoré, mais j'ai parlé avec deux développeurs Ruby qui trouvaient que ça rendait leur code dégueulasse!&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0in;"&gt;&lt;a href="http://vimeo.com/23404983"&gt;La video de soumission (avec le résumé de l'exercice).&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: large;"&gt;Functional programming with Michael Feathers&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Session pas très bien préparée et pas très avancée. Plutôt dirigée sur la question quels éléments de la programmation fonctionnelle devons nous utiliser dans les langages objet. Il a essentiellement montré les expressions lambda (opérations sans état sur collections), avec la conclusion que parfois ça facilite mais parfois elles manquent un peu d'expressivité (même avec un bon nommage).&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Bon point : tant que l'interface d'une fonction est pure (pas d'effet de bord, toujours le même résultat pour les mêmes entrées) peu importe si tu utilises la mutabilité à l'intérieure.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;J'ai posé la question à Michael Feathers et à Steeve Freeman qui était là aussi «&amp;nbsp;Why should we still develop with object oriented languages today&amp;nbsp;». C'est une question que je me pose depuis environ un an. Et toutes les réponses que j'ai trouvé sont à mon avis insatisfaisantes (performance, habitude des développeurs, moins de pouvoir = moins de risque) c'est certainement pas parce que l'objet est plus facile à maitriser! J'avais trop hâte de connaître le point de vu de ces cadors. Seulement aucun des deux avaient une réponse à part « I haven't yet seen a project of size written in a functional language&amp;nbsp;». On manquerait seulement de recul?  &lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: large;"&gt;Lean code challenge&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;C'était absolument fabuleux! Chris Parsons a traduit 4 des &lt;a href="http://agilesoftwaredevelopment.com/leanprinciples"&gt;principes de Lean&lt;/a&gt;, (waste, deliver fast,  build quality in, customer value) dans un défi ludique de développement.  &lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;A travers 6 itérations de 10 minutes nous avons construit un calculateur de prix de panier de fruits avec des stratégies de prix évolutives et franchement changeantes(!). Je ne peux m'empêcher de dire que les stratégies, quoique réalistes, n'étaient absolument pas lean, où il vaut mieux éliminer la complexité que l'automatiser...&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Nous avons terminé toutes les exercices et avec un code plus qu'acceptable. Si on n'avait pas fait du TDD j'imagine pas comment on aurait pu y arriver. Bel exemple du ROI sur le TDD en seulement 60 minutes! Gojko Adzic a dit qu'il n'avait commencé le TDD qu'au bout de la deuxième ou troisième itération – avant il ne trouvait pas que c'était utile, intéressant.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;a href="http://vimeo.com/23335541"&gt;La vidéo de soumission.&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;L'année prochaine j'y retourne!&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-8487254069268813412?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/8487254069268813412/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2011/05/software-craftsmanship-2011-decoiffant.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/8487254069268813412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/8487254069268813412'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2011/05/software-craftsmanship-2011-decoiffant.html' title='Software Craftsmanship 2011 - décoiffant!'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-5716179064108954372</id><published>2011-04-07T10:12:00.000-07:00</published><updated>2011-04-07T10:14:27.468-07:00</updated><title type='text'>Agile Team Agreement</title><content type='html'>&lt;span id="internal-source-marker_0.8275756304420041" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L'année  dernière j'ai vécu dans une équipe qui marchait particulièrement bien.  En essayant de comprendre les raisons de ce succès avec un autre des  membres, Bernard Huguet, on a mis le doigt sur un pattern qui nous  semble prédominant que l'on avait appelé l'Agile Team Agreement - l'ATA.  On va essayer de décrire ce qu'on entend par ATA et partager la  rétrospective que nous en avons fait. Mais avant d’aller plus loin je  voudrais dire que nous ne l’avons pas inventé, l’idée derrière les &lt;/span&gt;&lt;a href="http://www.teambuildinginc.com/article_createagreement.htm"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;Team Agreements&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;  ou Working Agreements existe sans doute depuis l’aube de l’homme et il  n’y a rien d’obligatoirement agile, cela pourrait fonctionner dans  n’importe quelle équipe. Le contenu serait juste différent.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Quoi de mieux que la photo de notre ATA pour décrire ce que c'est?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;img height="320" src="https://lh6.googleusercontent.com/1GrJvrvR5mae29INdBoOAO4yLWb-iKvrxdQGNCfv9yPCTkptmaKYW33iJcQY3NTJ7cwGt6i1RKBT-19OE_cP-M4co2VEf9I49OqHH49uBKi51eYm0ws" width="400" /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L'équipe  a travaillé ensemble pour trouver et partager les pratiques qui lui  paraissent être les facteurs clés de son bon fonctionnement. Il est  essentiel que ce soit le résultat d'une &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;participation active et équilibrée des membres&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; de l'équipe, peut-importe comment vous y arrivez (pratiques de &lt;/span&gt;&lt;a href="http://pragprog.com/titles/dlret/agile-retrospectives"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;rétrospectives agiles&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; peuvent aider ici). Exprimé sur un simple bout de papier, ce consensus est un réel &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;contrat d'équipe&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; et on s'attend à ce que tout le monde s'implique à 100%.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Au fil des mois on a pu observer un certain nombre de comportements que l’on pourrait imputer à l’ATA:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium; font-weight: bold;"&gt;Fort sentiment d'appartenance à une équipe&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Partager  des valeurs, être fier de ce qu’on fait et savoir qu’on peut compter  sur les autres membres de l’équipe crée un fort sentiment d’appartenance  à cette équipe.&lt;/span&gt;&lt;span style="background-color: transparent; color: blue; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;C'est un élément important de motivation que d’avoir l’impression de faire parti de quelque chose de plus grand que soi.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium; font-weight: bold;"&gt;Les équipiers ont du courage quand il le faut&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Quand  on a pris du retard sur un tâche ou que l’on subit une forte pression  du management et du business, il est très tentant de discrètement  prendre des raccourcis pour finir plus vite. Il y a deux avantages  immédiats, 1) on tient les délais prévus et 2) on ne donne pas  l’impression d’être lent ou mauvais. Certes on peut choisir de prendre  des raccourcis mais ça doit certainement pas être pour sauver sa propre  fierté. Les effets négatifs des raccourcis se font généralement sentir  assez vite et on les paye souvent sur toute la durée de vie du projet.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Les  post-its "Healthy Code", "Rendre problèmes visibles" et "As a team".  Aident justement à donner du courage à rendre les problèmes visibles  afin qu'un décision &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;lucide&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; puisse être prise par l'équipe.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium; font-weight: bold;"&gt;Confiance partagée en chacun des équipiers&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Puisque  tes coéquipiers partagent tes valeurs tu peux avoir confiance dans leur  travail. Par exemple, nous avions “rendre les problèmes visibles” et  “DoD” (Definition of Done) dans notre ATA. Ayant confiance dans le  travail de nos coéquipiers on pouvait se concentrer sur notre travail  avec l’assurance que ça allait bien se passer et que si un problème  survenait, il serait rendu visible rapidement et une action serait  prise.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;span style="font-size: medium; font-weight: bold;"&gt;Tout le monde va dans le même sens&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;De  manière générale on est tous influençable. On a envie de plaire aux  gens de notre entourage. Autrement dit on va naturellement tendre vers  ce que valorise notre entourage …  du moment qu’on sait ce que c’est! &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Puisque l’ATA rend &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;visible&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;  ce qui a beaucoup de valeur pour les équipiers, alors il agit comme un  centre de gravité comportemental qui soude l’équipe et qui l’aide à  avancer dans le même sens.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium; font-weight: bold;"&gt;Défini dans un contexte facile et utilisé dans un contexte difficile&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;SI  quelqu’un vient régulièrement 5 min en retard aux stand-ups, ou si  quelqu’un joue cavalier seul devant le PDG au détriment de quelqu’un  d’autre, il est beaucoup plus facile de rappeler l’ATA que d’initier une  discussion sur la ponctualité, ou de dire à qu’il a fait le beau devant  le management.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large; font-weight: bold;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: medium; font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Cela  a bien marché pour nous et nous n’imaginons pas construire une nouvelle  équipe sans cet ingrédient. C’est pour ça qu’on avait envie de partager  ce bout de recette avec vous.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;D’ailleurs  nous sommes à nouveau tous les deux dans une nouvelle équipe et la  construction de notre ATA est prévue pour demain :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-5716179064108954372?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/5716179064108954372/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2011/04/agile-team-agreement.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/5716179064108954372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/5716179064108954372'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2011/04/agile-team-agreement.html' title='Agile Team Agreement'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-5314799253879029033</id><published>2011-01-22T05:53:00.000-08:00</published><updated>2011-01-24T08:06:06.847-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeRetreat Grenoble CARA alpesJug'/><title type='text'>Le CodeRetreat à Grenoble</title><content type='html'>Vendredi dernier c'était le &lt;a href="http://coderetreat.ning.com/xn/detail/2712512:Event:5797"&gt;CodeRetreat à Grenoble&lt;/a&gt;. Pour tout le monde c'était leur premier retreat, participants comme organisateurs! Pas facile alors de se lancer. C'est certain on y croyait, surtout après nos premiers tentatives sur le problème du Jeu de la Vie de Conway en décembre on a vu que ce problème était excellent pour nous ébranler dans nos habitudes de code et de TDD. Mais on ne savait pas encore si la journée allait être une réussite.&lt;br /&gt;&lt;br /&gt;Maintenant c'est passé et on est très contents de l'avoir fait. C'était une journée intense et tout le monde a vraiment apprécié cette exercice. C'est marrant je crois que tout le monde était fatigué voire vidé à la fin de la journée - ça doit être signe d'avoir appris quelque chose!&lt;br /&gt;&lt;br /&gt;La veille j'avais regardé ce vidéo d'introduction d'un CodeRetreat par le maître Yoda des CodeRetreats, Corey Haines, où il explique très bien que dans la vie de tous les jours on a l'obligation de résultat qui nous pousse à ne pas être parfait, à arrondir les angles, à prendre des raccourcis. Certes, c'est normal, obligé et même une bonne chose mais cela nous aide pas à progresser, à se rapprocher de "parfait". Dans le CodeRetreat c'est different, il n'y a pas d'obligation de résultat, même c'est presque impossible  de finir en 45 minutes (le temps qu'on a avant de devoir effacer le code!!). C'est donc une occasion unique de s'entrainer au perfectionnisme. De recommencer et recommencer jusqu'à cela devient un automatisme.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe src="http://player.vimeo.com/video/18955165?portrait=0" width="400" frameborder="0" height="225"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nous avons fini la journée avec une rétrospective où nous avons posé trois questions à chacun&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Qu'est-ce que tu as ressenti?&lt;/li&gt;&lt;li&gt;Qu'est-ce que tu as appris?&lt;/li&gt;&lt;li&gt;Qu'est-ce que tu appliqueras dès lundi?&lt;/li&gt;&lt;/ol&gt;Ces excellentes questions viennent d'un chevronné des CodeRetreats, &lt;a href="http://www.alexbolboaca.ro/wordpress/articles/how-to-organize-a-code-retreat"&gt;Alex Bolboaca&lt;/a&gt;. En fait la journée est tellement intense et rempli d'expériences qu'il y a besoin de quelque chose de ce genre pour en tirer le maximum de profit. En groupe c'est d'autant plus intéressant car d'un côté le groupe nous oblige de formuler notre pensée la cristallisant ainsi, et de l'autre tout le monde n'a pas appris les mêmes choses et c'est intéressant d'entendre les autres.&lt;br /&gt;&lt;br /&gt;Pour ma part j'ai l'impression d'avoir encore besoin de temps pour digérer les expériences de cette journée - et je n'ai à peine touché un clavier !&lt;br /&gt;&lt;br /&gt;Seul petit bémol, j'aurais bien voulu qu'on ait le temps de faire une rétro de l'animation, mais tout le monde était trop fatigué. J'espère que les participants nous donneront leurs retours et leurs propositions d'améliorations, sans trop de retenu. En gros, lachez-vous ! ;)&lt;br /&gt;&lt;br /&gt;J'ai envie de finir avec quelques commentaires que j'ai entendu au cours de la journée:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"Je vais instaurer le pair-programming au moins une demi-journée par semaine"&lt;/li&gt;&lt;li&gt;"Le Smalltalk c'est cool!"&lt;/li&gt;&lt;li&gt;"Je m'efforçais déjà à prendre des baby-steps mais là je vais le faire encore plus!"&lt;/li&gt;&lt;li&gt;"C'est vraiment bien d'écouter ce que me disent les tests pour trouver un meilleur design"&lt;/li&gt;&lt;li&gt;"C'est génial de pouvoir pairer avec autant de personnes"&lt;/li&gt;&lt;/ul&gt;Si vous n'avez toujours pas envie d'aller à un CodeRetreat ou d'en organiser un, allez donc lire &lt;a href="http://anarchycreek.com/2010/04/26/go-do-a-code-retreat-youll-thank-me/"&gt;ça&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Merci à nos sponsors : le &lt;a href="http://clubagile.org/"&gt;CARA&lt;/a&gt;, l'&lt;a href="http://www.alpesjug.org/"&gt;Alpes-JUG&lt;/a&gt; et l'Ensimag&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-5314799253879029033?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/5314799253879029033/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2011/01/le-code-retreat-grenoble.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/5314799253879029033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/5314799253879029033'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2011/01/le-code-retreat-grenoble.html' title='Le CodeRetreat à Grenoble'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-5006352719772007908</id><published>2010-12-02T14:42:00.000-08:00</published><updated>2010-12-03T15:00:18.223-08:00</updated><title type='text'>Tests super sonics</title><content type='html'>Hier j'ai assisté à une conférence au &lt;a href="http://www.alpesjug.fr/"&gt;Alpes JUG&lt;/a&gt;, enfin plutôt deux du même présentateur,  &lt;a href="http://blog.javabien.net/" target="_blank"&gt;David       Gageot&lt;/a&gt;. Il a d'abord parlé de Git, puis de ce qui m'intéressait plus - comment rendre et les tests très très rapides.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_gu8h5bdrzts/TPgpFeiyxfI/AAAAAAAAEac/SSNhCKmRYUY/s1600/3022798490_e89be65978_m.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 240px; height: 150px;" src="http://2.bp.blogspot.com/_gu8h5bdrzts/TPgpFeiyxfI/AAAAAAAAEac/SSNhCKmRYUY/s320/3022798490_e89be65978_m.jpg" alt="" id="BLOGGER_PHOTO_ID_5546228115181848050" border="0" /&gt;&lt;/a&gt;Algodeal tourne leurs 600 classes de test et 60 classes de tests fonctionnels/intégration en     moins de 4 minutes!! David n'est pas allé dans le détail des métriques, mais cela couvrirait 60.000 lignes de code.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voici la liste de conseils que j'ai trouvé pertinents :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    Effacer du code (et tests) non utilisé (fonctionnalités devenus     obsolètes)&lt;/li&gt;&lt;li&gt;Faire tout in-memory (DB, mail-server, http-server, ...)&lt;/li&gt;&lt;li&gt;Paralléliser (soit les threads junit, soit un projet multi-module)&lt;/li&gt;&lt;li&gt;No file access (Apache VFS, Spring ressources)&lt;/li&gt;&lt;li&gt;Prenez une suite de tests fonctionnels, découpez en UN test     fonctionnel, TOUS les autres cas en tests unitaires.&lt;/li&gt;&lt;li&gt;Dans les tests fonctionnels il n'hésite pas à mocker les     parties coûteuses&lt;/li&gt;&lt;li&gt;Battez-vous contre la complexité de votre application - les     utilisateurs veulent une application simple, et il y a un fort lien     entre la simplicité de l'utilisation et la simplicité de     l'implémentation.&lt;/li&gt;&lt;li&gt;Faites un maximum de choses server-side - c'est bcp moins coûteux     en temps d'exécution et maintenance de tests.&lt;/li&gt;&lt;li&gt;Si vous faites du ajax, encore une fois UN test fonctionnel (éventuellement     pas sur plusieurs browsers). Toutes les variations en TU de     javascript)&lt;/li&gt;&lt;li&gt;Rendez votre application plus rapide, les tests le seront aussi     :-)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;En regardant cette liste je me dis qu'il n'y a rien d'extraordinaire,  mais ça m'a quand même fait l'effet d'une délivrance. C'est une chose  d'avoir un sentiment, voire une conviction. C'est autre chose de voir  quelqu'un l'appliquer avec succès.&lt;br /&gt;&lt;br /&gt;Il a répété plusieurs fois que certes on peut mieux se protéger contre des bugs en prod (et encore je ne suis pas si sûr), mais à quel prix?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/dgageot/lets-make-this-test-suite-run-faster-softshake-2010" target="_blank"&gt;Les        slides&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  Il a aussi parlé de GIT. Je m'en sers au quotidien et je savais déjà que c'était génial. Maintenant je sais que c'est mieux que ça.&lt;br /&gt;  &lt;a href="http://www.slideshare.net/dgageot/git-tours-jug-2010" target="_blank"&gt;Les       slides&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-5006352719772007908?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/5006352719772007908/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2010/12/hier-jai-assiste-une-conference-au.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/5006352719772007908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/5006352719772007908'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2010/12/hier-jai-assiste-une-conference-au.html' title='Tests super sonics'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gu8h5bdrzts/TPgpFeiyxfI/AAAAAAAAEac/SSNhCKmRYUY/s72-c/3022798490_e89be65978_m.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-3582339663401186552</id><published>2010-09-11T02:39:00.001-07:00</published><updated>2010-09-22T02:03:37.438-07:00</updated><title type='text'>Faisons plus d’interfaces fluides – puisque c’est simple!</title><content type='html'>&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font face="Trebuchet MS"&gt;Ca fait quelque temps que j’utilise des frameworks avec une interface fluide (cf &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;Martin Fowler Fluent Interface&lt;/a&gt;). Je pense à &lt;a href="http://mockito.org/"&gt;Mockito&lt;/a&gt;, &lt;a href="http://www.jmock.org/getting-started.html"&gt;JMock2&lt;/a&gt; et &lt;a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html"&gt;Hibernate Query API&lt;/a&gt; entre autres. Depuis peu j’utilise fréquemment le &lt;a href="http://nat.truemesh.com/archives/000727.html"&gt;Test Data Builder Pattern&lt;/a&gt;. Ces derniers sont plutôt des Domain Specific Languages, une version évoluée des interfaces fluides. Mais je n’avais jamais réalisé que ce soit un jeu d’enfant de créer sa propre interface fluide. Prenons par exemple&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;Math.pow(3, 2)&lt;/pre&gt;&lt;br /&gt;Ca fait quoi au juste? Ah oui c’est l’exposant 3 de 2. Ou peut-être l’exposant 2 de 3?&amp;#160; Et si on écrivait plutôt&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;exponent(3).of(2)&lt;/pre&gt;&lt;br /&gt;Ici on voit bien ce qui se passe! Certes la javadoc de Math.pow(double a, double b) est clair et ça marche bien quant on écrit du code, mais pas quand on lit du code déjà écrit. Puisqu’on estime que du code est lu 10-100 fois plus qu’il n’est écrit (sans parler d’un framework open source), il est très important de rendre la vie facile à nos lecteurs.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;Mais alors qu’est-ce ça demande comme effort de transformer Math.pow(a, b) en exponent(a).of(b)? Très peu en fait :&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Exponent {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; exponent;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Exponent(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; exponent) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.exponent = exponent;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Exponent exponent(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; exponent) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exponent(exponent);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; of(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; base) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Math.pow(base,exponent);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;puis un import statique dans la classe client&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Exponent.exponent;&lt;/pre&gt;&lt;br /&gt;L’import statique avec le &lt;a href="http://nat.truemesh.com/archives/000727.html"&gt;Factory Method&lt;/a&gt; exponent() jouent un rôle centrale, ils évitent le bruit syntaxique qu’il y dans &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exponent(3).of(2)&lt;br /&gt;//ou&lt;br /&gt;Exponent.exponent(3).of(2)&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;J’ai pensé à cette astuce lorsque j’étais entrain de travailler sur &lt;a href="http://thycoticsolutionsblog.wordpress.com/2010/08/12/code-challenge-win-a-gyroball/"&gt;un défi TDD&lt;/a&gt; – faire un convertisseur du système décimal vers un système quelconque. Dans ma solution il y avait cette fonction qui sert à calculer le chiffre à une position donnée dans le nouveau système. Ainsi si je veux transformer 3 en système binaire, pour connaitre si j’ai le chiffre à la position 0 (le plus à droite) je fais (3 modulo 2^1) quotient 2^0. Et pour la position 1 soit la plus à droite (3 modulo 2^2) quotient 2^1.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;J’étais moyennement content de ça&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; String digitAtPosition(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; pos, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; tenBaseNumber) {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; nextPos = pos+1;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; remainderOfNextPos = tenBaseNumber % &lt;strong&gt;&lt;font color="#ff0000"&gt;nthPowerOfBase(nextPos)&lt;/font&gt;&lt;/strong&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; digitInTenBase = remainderOfNextPos / &lt;strong&gt;&lt;font color="#ff0000"&gt;nthPowerOfBase(pos)&lt;/font&gt;&lt;/strong&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; convertSingleDigit(digitInTenBase);&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; nthPowerOfBase(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n) {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; round(pow(base,n));&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;on lit plus facilement&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; String digitAtPosition(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; pos, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; tenBaseNumber) {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; nextPos = pos+1;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; remainderOfNextPos = tenBaseNumber % exponent(nextPos).of(base);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; digitInTenBase = remainderOfNextPos / exponent(pos).of(base);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; convertSingleDigit(digitInTenBase);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;De plus cette classe extraite, Exponent, n’a rien de spécifique à mon convertisseur et pourrait potentiellement être utilisée ailleurs, promouvant ainsi la réutilisation. De plus et de manière générale une interface fluide est le début d’un DSL que l’on verrait plus facilement apparaitre à des parties du code fortement utilisés.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Et la performance?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ca doit coûter cher de créer un objet à chaque fois, non? &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Executer exonent(3).of(2) un &lt;strong&gt;million&lt;/strong&gt; de fois prend 0,9s là ou Math.pow(2, 3) prend 0,64s sur mon portable, si j’augmente l’exposant à chacun des un millions d’appels (histoire de ne pas me faire avoir par une optimisation du JVM) j’obtiens 0,84s contre 1,4s. On reste tout de même à l’échelle du nano-second, alors à moins que cela soit le cœur de mon application je m’arrêtes volontiers à la deuxième étape dans &lt;a href="http://c2.com/cgi/wiki?MakeItWorkMakeItRightMakeItFast"&gt;ces bonnes principes&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Make it work &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Make it good &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;(Then perhaps) Make it fast &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et si le besoin de rapidité apparait, il y a plusieurs façons d’attaquer le problème, revenir en arrière, ou introduire un cache des objets crées, ou en modifiant l’interface un poil :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;exponent(3, of(2))&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; of(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; number) {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; number;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Des variantes de la classe Exponent&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Pour ceux qui trouvent que la classe Exponent est trop verbeuse, il y a un peu plus bref ( en utilisant les double accolades pour accéder à l’&lt;a href="http://c2.com/cgi/wiki?DoubleBraceInitialization"&gt;instance initializer&lt;/a&gt;)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Exponent {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; exp;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Exponent exponent(&lt;span style="color: #0000ff"&gt;final&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; exponent) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exponent() {{&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.exp = exponent;&lt;br /&gt;        }};&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; of(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; base) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Math.pow(base,exp);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;encore une autre qui évite la variable d’instance et qui permet d’autres implementations de of() – par exemple log(logBase).of(someNumber).&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FluidMaths {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Exponent exponent(&lt;span style="color: #0000ff"&gt;final&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; exponent) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exponent() {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Long of(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; base) {&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; round(pow(base,exponent));&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; Exponent {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Long of(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; base);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-3582339663401186552?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/3582339663401186552/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2010/09/faisons-plus-dinterfaces-fluides.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/3582339663401186552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/3582339663401186552'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2010/09/faisons-plus-dinterfaces-fluides.html' title='Faisons plus d’interfaces fluides – puisque c’est simple!'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-1867125562626882005</id><published>2010-04-20T23:39:00.001-07:00</published><updated>2010-05-21T06:22:34.102-07:00</updated><title type='text'>Amélioration des rétrospectives – une approche minimaliste</title><content type='html'>&lt;p&gt;Les rétrospectives dans l’équipe dans laquelle je travaille laissent beaucoup de place à l’amélioration : En fin de sprint de deux semaines on fait un tour de table pour avancer les points positifs et les points d’amélioration. Point.&lt;/p&gt;  &lt;p&gt;On était deux dans l’équipe à souhaiter quelque chose de plus ambitieux. Alors on s’était renseigné pour avoir une personne extérieure à l’équipe, voire un coach. Pour divers raisons rien s'était passé en six semaines, alors on a décidé d’améliorer ce que nous avions déjà avec les moyens du bord. Le déclencheur a sans doute été notre présence à XP Days Suisse où nous avons assisté à une session sur les rétrospectives (compte rendu de &lt;a href="http://blog.developpez.com/bruno-orsier/p8781/developpement-agile/compte-rendu-xp-day-suisse-2010/"&gt;Bruno Orsier&lt;/a&gt;, &lt;a href="http://luc-jeanniard.blogspot.com/2010/03/une-retrospective-pas-comme-les-autres.html"&gt;Luc Jeanniard&lt;/a&gt;)   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Nous avons commencé par revoir la dernière rétrospective pour savoir s’il y avait des points importants qui n’avaient pas été adressés. Ensuite nous avons conduit la rétrospective comme avant. &lt;/p&gt;  &lt;p&gt;Au lieu de laisser les points d’amélioration cachés dans une page au fond d’une application quelque part, nous avons priorisé les points. Chacun pouvait voter pour les deux points qu’il trouvait les plus important. L’engagement était de faire quelque chose pour les 2-3 points les plus importants dans le sprint suivant. Voici nos points :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Améliorer la qualité des scénarios de BDD (Behavior driven development) &lt;/li&gt;    &lt;li&gt;Diminuer le délai entre le début d’une livraison et la mise en production (le problème étant surtout un problème de délai et non de charge de travail) &lt;/li&gt;    &lt;li&gt;Faciliter le ramp-up de deux collaborateurs arrivés récemment en imprimant un schema de la base de données. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Le point 3 étant très simple nous l’avons simplement fait le lendemain.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Pour améliorer la phase de déploiement nous avons décidé d’actions concrètes :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Evaluer en détail la faisabilité de plusieurs pistes connus pour simplifier la procédure de déploiement, notamment en éliminant les tâches manuelles. &lt;/li&gt;    &lt;li&gt;Décrire au moins deux options d’architecture pour permettre un &lt;a href="http://martinfowler.com/bliki/BlueGreenDeployment.html"&gt;blue-green deployment&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ces deux actions ont été planifiées dans le sprint AVEC une priorité importante – afin d’être sûr qu’elles seront adressées.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Finalement pour adresser le premier point nous avons discuté avec tous les acteurs concernés afin d’établir un plan d’action. Le voici :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Product Owner : exprime ses idées à travers un scenario      &lt;ul&gt;       &lt;li&gt;afin de venir avec des propositions plus réfléchies &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Product Owner + Scrum Master + Dev Lead : font des backlog reviews systématiques avant le sprint planning. Cette réunion donne lieu à deux livrables      &lt;ul&gt;       &lt;li&gt;DraftScenarios (Des scenarios suffisamment précis pour une estimation en poker planning) &lt;/li&gt;        &lt;li&gt;Une priorisation du product backlog        &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Product Owner + dévelopeur(s) : écrivent ensemble les GoScenarios ( ce qui signifie des scenarios prêts pour être développés). &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;Avec des améliorations ultra simples nous allons, je pense, tirer beaucoup plus des rétrospectives qu’auparavant. C’est tellement simple que j’avais l’impression que c’était bête d’en blogger, mais à mon avis cette équipe n’est pas la seule à faire des rétrospectives bâclées. Et cette expérience montre que même avec peu de moyens en temps et en connaissance on peut faire des améliorations importantes.&lt;/p&gt;  &lt;p&gt;Prochaines étapes : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Lire &lt;a href="http://pragprog.com/titles/dlret/agile-retrospectives"&gt;ce livre&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Faire une rétro un peu plus longue en jouant toutes les &lt;a href="http://www.scrummaster.com.au/Article.mvc/Detail/8"&gt;phases&lt;/a&gt; d'une rétro avec &lt;a href="http://www.crisp.se/henrik.kniberg/cause-effect-diagrams.pdf"&gt;root cause analysis&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Afin d'avoir des animateurs qui ne font pas parti de l'équipe (c'est plus facile d'animer une retro si on est partie prenante!) on a eu l'idée qu'un de nous fasse la rétro d'une autre équipe et que cette autre équipe nous rende le service.    &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-1867125562626882005?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/1867125562626882005/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2010/04/amelioration-des-retrospectives-une.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/1867125562626882005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/1867125562626882005'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2010/04/amelioration-des-retrospectives-une.html' title='Amélioration des rétrospectives – une approche minimaliste'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7659515555534023244.post-4457040043365068524</id><published>2010-01-24T13:29:00.001-08:00</published><updated>2011-04-07T02:17:49.616-07:00</updated><title type='text'>Sonar &amp; eclipse + PMD &amp; Checkstyle &amp; Findbugs</title><content type='html'>&lt;p&gt;J’aime beaucoup le feedback rapide que donne les plugins &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, &lt;a href="http://eclipse-cs.sf.net/"&gt;Checkstyle&lt;/a&gt; et &lt;a href="http://findbugs.cs.umd.edu/"&gt;Findbugs&lt;/a&gt; dans Eclipse. Mais il y avait certains freins à l’utilisation:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Checkstyle a trop de règles activées par défaut. Le travail de désactivation est laborieux. &lt;/li&gt;    &lt;li&gt;Ce n’est pas facile de faire en sorte que tout le monde dans une équipe utilise les même règles. &lt;/li&gt;    &lt;li&gt;Surtout lorsqu’on décide de les mettre à jour. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sonar.codehaus.org/"&gt;Sonar&lt;/a&gt; utilise les mêmes plugins, avec une configuration différente par défaut. Le résultat est que beaucoup de violations perdurent car c’est bien plus compliqué d’aller voir l’interface Sonar que de réagir à un avertissement qui apparait dans l'IDE. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Une solution est de centraliser les règles de à travers Sonar permettant ainsi de maintenir un seul ensemble de règles. Ce que je décris ici est une suite à un &lt;a href="http://sonar.codehaus.org/eclipse-checkstyle-sonar-an-emerging-source-code-management-solution/"&gt;billet&lt;/a&gt; sur Checkstyle par Freddy Mallet.&lt;/p&gt;&lt;p&gt;Installer les plugins &lt;a href="http://eclipse-cs.sourceforge.net/downloads.html"&gt;CheckStyle&lt;/a&gt;, &lt;a href="http://findbugs.sourceforge.net/downloads.html"&gt;FindBugs&lt;/a&gt; et &lt;a href="http://pmd.sourceforge.net/eclipse/"&gt;PMD&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Dans Sonar aller dans Configuration =&amp;gt; Quality Profiles. L'onglet Permalinks copier les liens vers les règles PMD/CheckStyle/Findbugs pour chacun des profiles.&lt;/p&gt;  &lt;p&gt;Dans Eclipse =&amp;gt; Menu Window =&amp;gt; Preferences : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Checkstyle -&amp;gt; New... -&amp;gt; Remote Configuration &lt;/li&gt;    &lt;li&gt;Location : http://&amp;lt;sonar&amp;gt;/rules_configuration/export/java/&amp;lt;rule-name&amp;gt;/checkstyle.xml &lt;/li&gt;    &lt;li&gt;Press 'Set as Default' &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PMD -&amp;gt; (subsection) Configuration des règles -&amp;gt; Tout effacer -&amp;gt; Importer un ensemble de règles : &lt;/li&gt;    &lt;li&gt;http://&amp;lt;sonar&amp;gt;/rules_configuration/export/java/&amp;lt;rule-name&amp;gt;/pmd.xml &lt;/li&gt;    &lt;li&gt;Press OK &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Findbugs &lt;/li&gt;    &lt;li&gt;download file http://&amp;lt;sonar&amp;gt;/rules_configuration/export/java/&amp;lt;rule-name&amp;gt;/findbugs.xml &lt;/li&gt;    &lt;li&gt;Window –&amp;gt; Preferences -&amp;gt; Java -&amp;gt; (subsection) Findbugs -&amp;gt; Filter files &lt;/li&gt;    &lt;li&gt;Add the downloaded file to 'include filter files' &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Petit plus. Je trouve les règles Checkstyle dans le profil par défaut de Sonar beaucoup plus pertinentes que celles livrées avec le plugin pour Eclipse.&lt;/p&gt;&lt;p&gt;Depuis peu un plugin &lt;a href="http://docs.codehaus.org/display/SONAR/Sonar+Eclipse"&gt;sonar pour eclipse&lt;/a&gt; est disponible.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Edit 2011-04-07 :&lt;br /&gt;- mis à jour l'endroit dans sonar où on trouve les liens des profiles&lt;br /&gt;- ajout lien plugin sonar&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7659515555534023244-4457040043365068524?l=martinsson-johan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsson-johan.blogspot.com/feeds/4457040043365068524/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://martinsson-johan.blogspot.com/2010/01/sonar-eclipse-pmd-checkstyle-findbugs.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/4457040043365068524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7659515555534023244/posts/default/4457040043365068524'/><link rel='alternate' type='text/html' href='http://martinsson-johan.blogspot.com/2010/01/sonar-eclipse-pmd-checkstyle-findbugs.html' title='Sonar &amp;amp; eclipse + PMD &amp;amp; Checkstyle &amp;amp; Findbugs'/><author><name>Johan</name><uri>http://www.blogger.com/profile/06338139663667581308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
