<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Do as i say, not as i do &#187; antipatterns</title>
	<atom:link href="http://www.do-as-i-say.com/notes/tag/antipatterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.do-as-i-say.com/notes</link>
	<description>Car dire ça n&#039;est pas toujours faire, mais ça ne coûte rien</description>
	<lastBuildDate>Mon, 26 Apr 2010 11:40:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Réinventer la roue</title>
		<link>http://www.do-as-i-say.com/notes/2010/01/reinventer-la-roue/</link>
		<comments>http://www.do-as-i-say.com/notes/2010/01/reinventer-la-roue/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 07:57:18 +0000</pubDate>
		<dc:creator>LaurentLC</dc:creator>
				<category><![CDATA[3. Sagesse et parts de flan]]></category>
		<category><![CDATA[antipatterns]]></category>
		<category><![CDATA[méthodologie]]></category>
		<category><![CDATA[roue]]></category>
		<category><![CDATA[tradition]]></category>

		<guid isPermaLink="false">http://www.do-as-i-say.com/notes/?p=1047</guid>
		<description><![CDATA[L&#8217;un des arguments principaux justifiant le recours à un framework (par exemple, au hasard, Symfony), contrebalançant le fait qu&#8217;il est un peu &#171;&#160;lourd&#160;&#187;, est que puisqu&#8217;il prend en charge un grand nombre des tâches répétitives de bas niveau, il évite au développeur d&#8217;avoir, selon l&#8217;expression consacrée, à réinventer la roue à chaque fois qu&#8217;il entame [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1065" style="border: 1px solid black;" title="La roue" src="http://www.do-as-i-say.com/notes/wp-content/uploads/roue.jpg" alt="La roue" width="128" height="128" />L&#8217;un des arguments principaux justifiant le recours à un framework (par exemple, au hasard, <a href="http://www.symfony-project.org" target="_blank">Symfony</a>), contrebalançant le fait qu&#8217;il est un peu &laquo;&nbsp;lourd&nbsp;&raquo;, est que puisqu&#8217;il prend en charge un grand nombre des tâches répétitives de bas niveau, il évite au développeur d&#8217;avoir, selon l&#8217;expression consacrée, à réinventer la roue à chaque fois qu&#8217;il entame une nouvelle application ou une nouvelle interface.</p>
<p><span id="more-1047"></span>&laquo;&nbsp;Réinventer la roue&nbsp;&raquo; (ou &laquo;&nbsp;rihinveinte zeu ouhile&nbsp;&raquo;, pour les bilingues), c&#8217;est perdre du temps sur quelque chose qui a déjà été fait, bien fait, mieux fait, bref, faire un travail inutile. En programmation, c&#8217;est même un <a href="/notes/2009/09/design-patterns-symfony-explique-a-ma-maman-2/">antipattern</a> célèbre. Si on peut lui reconnaitre dans une certaine mesure un intérêt pédagogique (l&#8217;impétrant développeur, en passant du temps sur une fonctionnalité déjà réalisée, s&#8217;initie au code et à sa logique &#8211; pour peu qu&#8217;il soit guidé), il est clair qu&#8217;on déconseille fortement de réinventer la roue. Si ça a déjà été inventé, coco, pourquoi perdre du temps à le refaire, d&#8217;autant qu&#8217;il y a fort à parier que tu le referas moins bien. En effet, non seulement la roue a déjà été inventée, mais depuis le temps, elle a été perfectionnée.</p>
<p>La bonne pratique est donc de capitaliser, comme on dit, sur ce que les autres ont déjà fait, testé et éprouvé.<br />
En programmation, où l&#8217;Histoire est encore fraiche et où tout va très vite, ces &laquo;&nbsp;autres&nbsp;&raquo; sont parfois des contemporains (voire sont plus jeunes que vous ; sales jeunes), mais pour généraliser on peut dire que cette bonne pratique consiste à apprendre de ce qui a été fait, donc apprendre du passé, des générations précédentes, en d&#8217;autres termes : de ses aînés. Ce passé qu&#8217;on peut plus ou moins consciemment faire fructifier a un nom : <strong>la tradition</strong>.</p>
<p>L&#8217;Histoire se répétant, chaque nouvelle génération a une tendance plus ou moins forte à vouloir se défaire de la tradition, comme une transposition à l&#8217;échelle socio-culturelle de la crise d&#8217;adolescence, où le besoin de conquérir son individualité se traduit parfois par des chocs violents (tant il est évident que pour chaque jeune, les vieux n&#8217;ont vraiment rien compris, et ne peuvent de toutes façons pas le comprendre lui).</p>
<p>Il y a pourtant une réalité douloureuse, c&#8217;est que globalement, vu que l&#8217;Histoire n&#8217;a pas exactement commencé hier, ni même à la naissance de Bill Kaulitz/Brian Molko/Kurt Cobain/Robert Smith/John Lennon (choisissez pour votre génération ou celle qui vous suit), vu que l&#8217;humanité, donc, a quelques heures de vol derrière elle, excusez du peu, <strong>il y a de fortes chances que <em>tout ait déjà été fait</em>.</strong></p>
<h3>Connais tes classiques</h3>
<p>Bien sûr, l&#8217;accélération (on va appeler ça comme ça) de l&#8217;Histoire dûe à la technologie au sens très large, donc depuis la fin du XIXème siècle, fait que dans pas mal de domaines, le passé est bref. Ça a un côté assez sympathique, on peut croire un peu qu&#8217;on défriche des choses — et ça n&#8217;est en partie pas faux —, mais il ne faut pas non plus se faire avoir par une courante <strong>illusion d&#8217;optique</strong> : même si concrètement le contenu du savoir/de la technologie en question est &laquo;&nbsp;différent&nbsp;&raquo;, dans l&#8217;histoire du savoir, on n&#8217;<em>invente</em> que très rarement quelque chose. Pour ne pas dire jamais. La plupart du temps, on repasse en fait par des chemins qui ont déjà été empruntés, même si on ne le sait pas (et dans ce cas, en un sens, on peut se retrouver à réinventer la roue).</p>
<p>Cette illusion repose principalement sur un aveuglement, dû à un manque de connaissance du passé, et la bonne pratique qui préconise de ne pas réinventer la roue exhorte donc à ouvrir les yeux. Mais pour ça, comme on dit, il faut <em>connaître ses classiques</em>. Lire, écouter. Plus tu connais le passé, plus tu maîtrises le présent, plus tu façonnes le futur comme tu le veux (je devrais écrire des slogans pour ERDF, moi).</p>
<p>Ça peut avoir l&#8217;air déprimant comme ça, mais ça ne l&#8217;est que si l&#8217;on se berce de l&#8217;illusion (une autre) qu&#8217;on est le premier de l&#8217;espèce humaine et que tout nous a attendu. Il faut se réveiller. Personne ne nous a attendu, et <strong>les morts sont plus forts que les vivants</strong>.<br />
Mais en fait, c&#8217;est très bien, et ça laisse quand même de la place. Parce que l&#8217;histoire est une perpétuelle redigestion, qu&#8217;elle engendre quand même du nouveau, et qu&#8217;emprunter un chemin qui a déjà été foulé est toujours un nouveau périple.</p>
<p>La morale de cette histoire (qui n&#8217;en est pas une), c&#8217;est que quand l&#8217;ego a réussi à faire le deuil de sa toute-puissance, à entrer dans son humilité, et pas au sens chrétien du terme, alors les choses intéressantes peuvent éventuellement commencer.<br />
J&#8217;aborderai probablement une autre fois le rapport à la tradition, qui n&#8217;est évidemment pas univoque et ne doit pas consister en une soumission absolue (car, <a href="/notes/2009/09/si-a-50-ans-tas-pas-ecoute-du-mahler/">comme disait l&#8217;autre</a>, la tradition ça peut aussi être de la paresse ou de la négligence. Mais pour contester ou dépasser, il faut connaître ce qu&#8217;on prétend dépasser.</p>
<p>__________________________</p>
<p><em>Illustration fort à propos trouvée fortuitement ici : </em><a href="http://plennevaux.be/alexandre/general/monocycle-par-ben-wilson/" target="_blank">http://plennevaux.be/alexandre/general/monocycle-par-ben-wilson/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.do-as-i-say.com/notes/2010/01/reinventer-la-roue/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony expliqué à ma maman, 2ème partie : les design patterns</title>
		<link>http://www.do-as-i-say.com/notes/2009/09/design-patterns-symfony-explique-a-ma-maman-2/</link>
		<comments>http://www.do-as-i-say.com/notes/2009/09/design-patterns-symfony-explique-a-ma-maman-2/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 14:36:32 +0000</pubDate>
		<dc:creator>LaurentLC</dc:creator>
				<category><![CDATA[2. Des trucs expliqués à ma maman]]></category>
		<category><![CDATA[antipatterns]]></category>
		<category><![CDATA[complexité]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[méthodologie]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.do-as-i-say.com/notes/?p=354</guid>
		<description><![CDATA[
Résumé de l&#8217;épisode précédent : un framework, c&#8217;est une boîte à outils, des briques de base, et une méthodologie pour développer mieux, plus vite, et de manière plus sûre (un peu comme ça, quoi). Mais si ça peut fortement aider, ça n&#8217;est pas magique, et ça demande de suivre les principes du framework lui-même.
Une partie [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-491 alignleft" style="border: 1px solid black;" title="Prendre la quatrième à gauche et tourner à droite après la fontaine" src="http://www.do-as-i-say.com/notes/wp-content/uploads/design_pattern-150x150.jpg" alt="Prendre la quatrième à gauche et tourner à droite après la fontaine" width="128" height="128" /></p>
<p><em>Résumé de l&#8217;<a href="/notes/2009/08/framework-symfony-explique-a-ma-maman-1/">épisode précédent</a> : un </em><em>framework, c&#8217;est une boîte à outils, des briques de base, et une méthodologie pour développer mieux, plus vite, et de manière plus sûre (un peu <a title="Plus dur, meilleur, plus rapide, plus fort" href="http://jiwa.fr/track/La-Pompe-Moderne-101321/Plus-dur-meilleur-plus-rapide-plus-fort-159007/Plus-dur-meilleur-plus-rapide-plus-fort-1207858.html" target="_blank">comme ça, quoi</a>). Mais si ça peut fortement aider, ça n&#8217;est pas magique, et ça demande de suivre les principes du framework lui-même.</em></p>
<p>Une partie des principes méthodologiques qui va avec un framework est  couramment regroupée sous le nom de <em><strong>design patterns</strong></em>. Une fois encore, on s&#8217;abstiendra de traduire l&#8217;expression (la version française préconisée étant <em>patrons de conception</em>, et ça sonne un peu Bergère de France&#8230;)</p>
<p><span id="more-354"></span></p>
<p>Pour faire court (dans un premier temps), disons qu&#8217;<strong>un design pattern est une façon de résoudre un problème type.</strong> Il ne s&#8217;agit donc pas d&#8217;une solution en tant que telle, mais plutôt d&#8217;une recette, c&#8217;est-à-dire la description d&#8217;une manière d&#8217;opérer face à un certain type de problème.</p>
<p>Historiquement, la théorisation des design patterns fait beaucoup référence, et c&#8217;est une <a href="/notes/2009/08/le-carreleur-et-le-developpeur/">chose qui ne nous étonnera pas</a>, au domaine de l&#8217;architecture, de l&#8217;urbanisme et de la construction, notamment suite au travaux de <a href="http://fr.wikipedia.org/wiki/Christopher_Alexander" target="_blank">Christopher Alexander</a> dans les années 70.<br />
Constatant que la conception en architecture en particulier, mais aussi en ingénierie en général, conduisait à affronter des problèmes récurrents (isolation, solidité des structures, communication entre l&#8217;intérieur et l&#8217;extérieur&#8230;) il abstrait des archétypes destinés à couvrir tous ces aspects.</p>
<p>Un <em>pattern</em> est ainsi à comprendre comme un <strong>&laquo;&nbsp;modèle&nbsp;&raquo; éprouvé reliant une solution à un problème dans un certain contexte</strong>.</p>
<p>Tout problème de conception, dirait Alexander, met en jeu un seul individu face à une immensité. Ce problème contient un certain nombre de variables qui, combinées en sous-ensembles, représentent un nombre de cas débordant rapidement les capacités limitées de son cerveau.<br />
D&#8217;où l&#8217;intérêt de diviser et de hiérarchiser ces sous-ensembles pour les étudier à part, et recourir à ce qu&#8217;on pourrait nommer le bon sens collectif de l&#8217;histoire (capitaliser sur les solutions qui ont prouvé qu&#8217;elles marchaient).<br />
Dès ses premiers travaux Alexander met l&#8217;accent sur la nécessité de comprendre les rapports entre les parties et le tout, et de savoir comment s&#8217;y prendre pour traiter ce tout. Ce que nous avons appelé dans l&#8217;épisode précédent <strong><em>faire face à la complexité</em></strong>.</p>
<h3>De l&#8217;urbanisme à la POO</h3>
<p>En 1995, les quatre mousquetaires du pattern, le bien nommé &laquo;&nbsp;Gang Of Four&nbsp;&raquo;, s&#8217;inspirent d&#8217;une partie de ces travaux et transposent la méthode dans la programmation orientée objet. Comme Alexander, même si la démarche est, disons, moins empreinte d&#8217;une sourde angoisse métaphysique quant à l&#8217;appréhension de l&#8217;infini, leur but est de proposer des outils conceptuels pour gérer la complexité, en l&#8217;occurrence, posée par certains problèmes récurrents en programmation.<br />
Ils sont issus des bonnes trouvailles et des bonnes pratiques de générations de développeurs et dispensent ainsi, comme on dit souvent, de réinventer le fil à couper la roue.</p>
<p>J&#8217;avais commencé un paragraphe complet donnant un exemple (en choisissant le pattern <em>bridge</em>, un modèle assez &laquo;&nbsp;simple&nbsp;&raquo;), et j&#8217;ai renoncé, car on ne peut pas en dire grand chose sans évoquer la programmation orientée objet, que ma chère maman n&#8217;est pas censée connaître, donc qui déborde le cadre de cette page.<br />
Je tâcherai de présenter en revanche dans un épisode prochain le <strong>MVC</strong>, un design pattern assez connu — qui est en fait, pour être rigoureux, une combinaison de patterns. Retenons juste ceci en attendant, et au risque de me répéter : il ne s&#8217;agit pas de classes ou de bouts de programme, mais de façons de structurer son modèle de données, son architecture, son application, et ultimement son code (quelque soit le langage objet).</p>
<p>En guise de conclusion, et pour s&#8217;éloigner définitivement d&#8217;Alexander, signalons qu&#8217;on parle aussi de temps en temps du négatif des patterns, les <strong>antipatterns</strong>.</p>
<p>Comme leur nom l&#8217;indique, il s&#8217;agit des façons de faire qui sont exactement ce qu&#8217;il faut éviter. On regroupe sous ce nom des pratiques hétérogènes aux noms parfois sympatoches, comme <em>la coulée de lave</em> (mise en production d&#8217;un code non stabilisé qui de fait devient de moins en moins modifiable, se &laquo;&nbsp;solidifiant&nbsp;&raquo; comme de la lave), <em>l&#8217;ancre de bateau</em> (code conservé pour des raisons &laquo;&nbsp;politiques&nbsp;&raquo;, pour ne pas fâcher un développeur et/ou en se disant qu&#8217;il servira plus tard&#8230;), ou <em>l&#8217;objet divin</em> (méthode ou fonction servant à trop de choses, et dont on finit par ne plus trop savoir comment elle marche).<br />
Elles sont évidemment, presque autant que les autres, utiles au développeur — qui aura toujours au début de son existence mis en œuvre, même à son corps défendant, au moins l&#8217;un d&#8217;eux, sinon presque tous.</p>
<p><em>Dans le prochain épisode, cette fois, on parlera de MVC&#8230;</em></p>
<p>___________________________________</p>
<p><em>Image du Schéma empruntée ici : <a href="http://www.simonwhatley.co.uk/coldfusion-and-design-patterns" target="_blank">http://www.simonwhatley.co.uk/coldfusion-and-design-patterns</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.do-as-i-say.com/notes/2009/09/design-patterns-symfony-explique-a-ma-maman-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
