<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>The .Net frog</title>
	
	<link>http://www.thedotnetfrog.fr</link>
	<description>Pensées et critiques sur le développement logiciel et .Net depuis le pays des grenouilles!</description>
	<lastBuildDate>Mon, 29 Nov 2010 21:12:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ThedotnetFrog-fr" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="thedotnetfrog-fr" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Build your own service bus – par ou commencer ?</title>
		<link>http://www.thedotnetfrog.fr/2010/11/29/build-your-own-service-bus-%e2%80%93-par-ou-commencer/</link>
		<comments>http://www.thedotnetfrog.fr/2010/11/29/build-your-own-service-bus-%e2%80%93-par-ou-commencer/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 21:12:19 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Alt.net]]></category>
		<category><![CDATA[Command Query Responsibility Segregation]]></category>
		<category><![CDATA[Rencontres Alt.net]]></category>
		<category><![CDATA[amqp]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[masstransit]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[nservicebus]]></category>
		<category><![CDATA[rabbitmq]]></category>
		<category><![CDATA[service bus]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=191</guid>
		<description><![CDATA[Quelle meilleure façon de réveiller ce blog que de parler de la dernière soirée Alt.net ? Soirée sur le thème de « Build your own service bus » et co-présentée par Romain Verdier et moi-même.
Comme faut pas pousser mémé, je me contenterai d’inclure les slides et je me concentrerai sur un point précis. D’autres personnes plus littéraires [...]]]></description>
			<content:encoded><![CDATA[<p>Quelle meilleure façon de réveiller ce blog que de parler de la dernière soirée <a href="http://www.altnetfr.org" onclick="javascript:pageTracker._trackPageview('/http://www.altnetfr.org');">Alt.net</a> ? Soirée sur le thème de « Build your own service bus » et co-présentée par <a href="http://www.codingly.com" onclick="javascript:pageTracker._trackPageview('/http://www.codingly.com');">Romain Verdier</a> et moi-même.</p>
<p>Comme faut pas pousser mémé, je me contenterai d’inclure les slides et je me concentrerai sur un point précis. D’autres personnes plus littéraires que moi auront probablement l'occasion de vous résumer la soirée ! :-)</p>
<div class="prezi-player" style="margin-left:50px"><!-- .prezi-player { width: 550px; } .prezi-player-links { text-align: center; } --><object id="prezi_ezeeeo6xysbz" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="prezi_ezeeeo6xysbz" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="prezi_id=ezeeeo6xysbz&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0" /><param name="src" value="http://prezi.com/bin/preziloader.swf" /><embed id="prezi_ezeeeo6xysbz" type="application/x-shockwave-flash" width="550" height="400" src="http://prezi.com/bin/preziloader.swf" flashvars="prezi_id=ezeeeo6xysbz&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0" bgcolor="#ffffff" allowscriptaccess="always" allowfullscreen="true" name="prezi_ezeeeo6xysbz"></embed></object></p>
<div class="prezi-player-links">
<p><em><a href="http://prezi.com/ezeeeo6xysbz/altnet-build-your-own-service-bus/" onclick="javascript:pageTracker._trackPageview('/http://prezi.com/ezeeeo6xysbz/altnet-build-your-own-service-bus/');">Ça c’est fait !</a></em></div>
</div>
<p>&nbsp;</p>
<h3>Hey Julien, c’est marrant ton histoire, mais il est ou l’arrêt le plus proche pour monter dans ton bus?</h3>
<p>Tout d’abord, il faut bien comprendre qu’un service bus n’est qu’un <strong>framework</strong> pour simplifier la <strong>communication</strong> dans un <strong>système distribué</strong>. Voici donc quelques idées à creuser pour assimiler les concepts…</p>
<p>&nbsp;</p>
<h3>1. Acquérir des notions de messaging</h3>
<p>Je vous suggère notamment de regarder MSMQ (ou son pendant portable et open source : <a href="http://activemq.apache.org" onclick="javascript:pageTracker._trackPageview('/http://activemq.apache.org');">ActiveMQ</a>) et <a href="http://ww.rabbitmq.com" onclick="javascript:pageTracker._trackPageview('/http://ww.rabbitmq.com');">RabbitMQ</a>. Ce dernier à la particularité d’utiliser un broker (les queues sont donc distantes) tandis que MSMQ permet la communication point à point mais rend l’écriture de scénarios publish-subscribe plus complexe. Pourquoi ne pas développer un petit chat pour se faire la main ? Cet exercice vous forcera a explorer les différents modèles sur le PubSub ou encore à étudier un minimum la serialization (astuce : n’essayez pas de recoder un protocole de communication a base de commandes en texte comme le FTP, on peut faire plus sympa ! :-)) .</p>
<p>En bonus, je vous conseille vivement d’acheter ce livre pour noel :</p>
<p align="center"><a href="http://www.amazon.fr/gp/product/0321200683?ie=UTF8&amp;tag=netinthepoc-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=0321200683"><br />
<img class="alignnone size-full wp-image-205" title="Enterprise Integration Patterns" src="http://www.thedotnetfrog.fr/wp-content/uploads/2010/11/51tVn4YqQUL._SL160_.jpg" alt="Enterprise Integration Patterns" width="121" height="160" /><br />
Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions</a></p>
<blockquote><p>
This book provides a consistent vocabulary and visual notation framework  to describe large-scale integration solutions across many technologies.  It also explores in detail the advantages and limitations of  asynchronous messaging architectures. The authors present practical  advice on designing code that connects an application to a messaging  system, and provide extensive information to help you determine when to  send a message, how to route it to the proper destination, and how to  monitor the health of a messaging system. If you want to know how to  manage, monitor, and maintain a messaging system once it is in use, get  this book
</p></blockquote>
<p>&nbsp;</p>
<h3>2. Acquérir des notions d’architecture sur les systèmes distribués et la SOA</h3>
<p>Comme expliqué plus haut, un service bus n’est qu’un framework. Avant de se lancer tête baissée, il faut comprendre les principes sous-jacents. Mon auteur préféré sur la question est <a href="http://www.udidahan.com" onclick="javascript:pageTracker._trackPageview('/http://www.udidahan.com');">Udi Dahan</a>, l'homme derrière <a href="http://www.nservicebus.com" onclick="javascript:pageTracker._trackPageview('/http://www.nservicebus.com');">NServiceBus</a>...<br />
Udi étant un conférencier assez actif, il est facile de trouver nombre de ses présentations sur le net. En voici quelques une :</p>
<ul>
<li><a href="http://www.infoq.com/presentations/SOA-Business-Autonomous-Components" onclick="javascript:pageTracker._trackPageview('/http://www.infoq.com/presentations/SOA-Business-Autonomous-Components');">Avoid a Failed SOA: Business &amp; Autonomous Components to the Rescue</a></li>
<li><a href="http://vimeo.com/5022174" onclick="javascript:pageTracker._trackPageview('/http://vimeo.com/5022174');">Udi Dahan on SOA @ E-VAN 01 June 2009</a></li>
<li><a href="http://vimeo.com/6222577" onclick="javascript:pageTracker._trackPageview('/http://vimeo.com/6222577');">Udi Dahan presents on Reliability, Availability, and Scalability</a></li>
</ul>
<p>Et pour les plus curieux d'entre vous (disclaimer : on sort du cadre des service bus !) :</p>
<ul>
<li><a href="http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311" onclick="javascript:pageTracker._trackPageview('/http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311');">Command Query Responsibility Segregation</a></li>
</ul>
<p>Enfin, si vous avez beaucoup de transport en commun, vous pouvez également trouver un paquet de podcasts :</p>
<ul>
<li><a href="http://www.hanselman.com/blog/HanselminutesPodcast176NServiceBusWithUdiDahan.aspx" onclick="javascript:pageTracker._trackPageview('/http://www.hanselman.com/blog/HanselminutesPodcast176NServiceBusWithUdiDahan.aspx');">Hanselminutes Podcast 176 - NServiceBus with Udi Dahan</a></li>
<li><a href="http://herdingcode.com/?p=229" onclick="javascript:pageTracker._trackPageview('/http://herdingcode.com/?p=229');">Herding Code 67: Udi Dahan on Scalability</a></li>
<li><a href="http://deepfriedbytes.com/deepfriedbytes/podcast/episode-49-getting-the-right-message-about-nservicebus-with-udi-dahan/" onclick="javascript:pageTracker._trackPageview('/http://deepfriedbytes.com/deepfriedbytes/podcast/episode-49-getting-the-right-message-about-nservicebus-with-udi-dahan/');">Deepfried Bytes : Getting the Right Message about NServiceBus with Udi Dahan</a></li>
</ul>
<p>&nbsp;</p>
<h3>3. Explorer les framework open sources</h3>
<p>Et notamment leurs samples !</p>
<ul>
<li><a href="http://www.nservicebus.com" onclick="javascript:pageTracker._trackPageview('/http://www.nservicebus.com');">NServiceBus</a></li>
<li><a href="http://masstransit-project.com/" onclick="javascript:pageTracker._trackPageview('/http://masstransit-project.com/');">MassTransit</a></li>
<li><a href="https://github.com/ayende/rhino-esb" onclick="javascript:pageTracker._trackPageview('/https://github.com/ayende/rhino-esb');">Rhino Service Bus</a> (GL HF comme on je disais dans le temps, parce que niveau documentation, Rhino Service Bus est limité !)</li>
</ul>
<p>&nbsp;</p>
<h3>4. La méthode du Sioux !</h3>
<p>Si vous ne connaissez rien a tout ça mais que vous déchirez quand même en développement, <a href="http://www.thedotnetfrog.fr/wp-content/uploads/2010/04/Offre-SID1001-Ingenieur-Développement-Agile-C-NET.pdf" >jetez un œil à notre dernière offre d'emploi</a> et contactez-mois si ça vous intéresse ! On se fera un plaisir de partager avec vous tout ce qu'on sait ! :-)</p>
<p>Bon courage !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2010/11/29/build-your-own-service-bus-%e2%80%93-par-ou-commencer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>« Bounded contexts » et persistance</title>
		<link>http://www.thedotnetfrog.fr/2010/01/18/bounded-contexts-et-persistance/</link>
		<comments>http://www.thedotnetfrog.fr/2010/01/18/bounded-contexts-et-persistance/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 13:15:58 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Command Query Responsibility Segregation]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[DDDD]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=185</guid>
		<description><![CDATA[Dans mon billet précédant, je faisais remarquer que la persistance pouvait être implémentée de différente façon au sein d'un même système dans le cadre d'une approche SOA/CQRS. Laissez moi clarifier ce que j'entends par cela (ou plutôt ce que j'ai appris du maitre, Udi Dahan !).
Il est possible de faire varier la persistance selon (au [...]]]></description>
			<content:encoded><![CDATA[<p>Dans mon<a href="http://www.thedotnetfrog.fr/2010/01/17/command-query-responsibility-segregation-et-bounded-contexts/" > billet précédant</a>, je faisais remarquer que la persistance pouvait être implémentée de différente façon au sein d'un même système dans le cadre d'une approche SOA/CQRS. Laissez moi clarifier ce que j'entends par cela (ou plutôt ce que j'ai appris du maitre, <a href="http://www.udidahan.com" onclick="javascript:pageTracker._trackPageview('/http://www.udidahan.com');">Udi Dahan</a> !).</p>
<p>Il est possible de faire varier la persistance selon (au moins) 2 axes.</p>
<p>Tout d'abord, nous pouvons utiliser un ORM (Nhibernate, Entity Framework, etc) ou avoir une approche plus directe de type ado.net ou procédure stockée. L'idée ici est d'adapter la solution au contexte spécifique du cas d'utilisation.  Voici 2 exemples :</p>
<ul>
<li> On souhaite mettre à jour l'ensemble des commande en cours d'un client pour changer le mode de livraison. Ce processus doit inspecter les commandes non traitées pour vérifier si le poids des colis est compatible avec le nouveau mode de livraison.<br />
=&gt; Ici, le processus de selection ést plus ou moins complexe ET le nombre de commandes en cours est probablement réduit. Un modèle objet est probablement adapté au traitement.</li>
<li>Notre système stocke des cours de bourse. Une société annonce un "split" (chaque action sera "coupée" en X de sorte que 1 action avant le split = X actions après le split. =&gt; Une société peut être amené à faire ce genre de choses quand elle estime qu'une action est devenue trop onéreuse). On souhaite appliquer le coefficient sur l'ensemble des cours stockés en base pour faciliter certains calculs. On a donc potentiellement des centaines ou des milliers de cours à mettre à jour.<br />
=&gt; Ici, utiliser un modèle objet n'a aucun sens. Une simple requête SQL du type "UPDATE quotes SET price = (price / X) WHERE ..." est clairement plus simple à mettre en œuvre et sera surtout beaucoup plus optimisée !</li>
</ul>
<p>Peut importe la solution retenue, le plus important est d'assigner la responsabilité du schéma et la lecture/écriture à un seul et unique bounded context. Ce point est capital : il nous garantit de ne pas intégrer différents systèmes par l'intermédiaire d'un point central (la base de données relationnelles) qui sera :</p>
<ul>
<li> difficile à faire évoluer, car couplé à l'ensemble du système</li>
<li>un point de défaillance unique</li>
<li>un goulot d'étranglement en terme de performances/montée en charge</li>
</ul>
<p>Par conséquent, chaque bounded doit pouvoir faire évoluer sa persistance de façon transparente pour le reste du système, ce qui implique également que le support retenu peut être différent pour chaque cas (SQL, base objet, base de documents, fichier texte, etc).<br />
Cependant, ce type de décisions sera fortement influencé par l'organisation interne du projet et la taille des équipes. Après tout, si chaque développeur choisit sa propre technologie, il sera difficile de coordoner le transfert de connaissance ou encore les backups. Il est donc tout à fait possible dans un premier temps de se limiter à un même support (ex : SQL Serveur) mais de séparer logiquement les bounded contexts en créeant des bases de données distinctes. Il faudra ensuite veiller à ce que les différents logins utilisé ait un accès limité à une seule et unique base.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2010/01/18/bounded-contexts-et-persistance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>« Command Query Responsibility Segregation » et « bounded contexts ».</title>
		<link>http://www.thedotnetfrog.fr/2010/01/17/command-query-responsibility-segregation-et-bounded-contexts/</link>
		<comments>http://www.thedotnetfrog.fr/2010/01/17/command-query-responsibility-segregation-et-bounded-contexts/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 17:44:09 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Command Query Responsibility Segregation]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[DDDD]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Systèmes distribués]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=181</guid>
		<description><![CDATA[Je sors de mon sommeil pour aborder une question posée sur la mailing list française d'Alt.net qui me tient à coeur. Pour paraphraser, nous avons le cas d'un client qui devient privilégié sur un site de e-commerce, ce qui lui donne droit à une livraison expresse pour toutes ses commandes en cours. L'auteur de la [...]]]></description>
			<content:encoded><![CDATA[<p>Je sors de mon sommeil pour aborder <a href="http://groups.google.com/group/parisaltnet/browse_thread/thread/9c50615c93271267" onclick="javascript:pageTracker._trackPageview('/http://groups.google.com/group/parisaltnet/browse_thread/thread/9c50615c93271267');">une question</a> posée sur la <a href="http://groups.google.com/group/parisaltnet" onclick="javascript:pageTracker._trackPageview('/http://groups.google.com/group/parisaltnet');">mailing list française</a> d'Alt.net qui me tient à coeur. Pour paraphraser, nous avons le cas d'un client qui devient privilégié sur un site de e-commerce, ce qui lui donne droit à une livraison expresse pour toutes ses commandes en cours. L'auteur de la question souhaite comprendre comment est réparti la logique (mise à jour du client / passage des commandes en cours à une livraison expresse) et pourquoi <a href="http://www.udidahan.com/?blog=true" onclick="javascript:pageTracker._trackPageview('/http://www.udidahan.com/?blog=true');">Udi Dahan</a> considère que l'utilisation d'un modèle objet pour représenter<a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/" onclick="javascript:pageTracker._trackPageview('/http://www.udidahan.com/2009/12/09/clarified-cqrs/');"> le domaine est un détail d'implémentation dans le cadre d'une approche CQRS</a>.</p>
<p>Voici mon interprétation après avoir assisté à la formation d'Udi sur le SOA :<br />
<strong><br />
Commençons par la répartition de la logique : </strong><br />
Dans cet exemple, notre commande "MakeCustomerPreferred" sera exécuté dans un <a href="http://domaindrivendesign.org/node/91" onclick="javascript:pageTracker._trackPageview('/http://domaindrivendesign.org/node/91');">bounded context</a> (entendez "service") différent de celui qui gère les ventes en cours. "MakeCustomerPreferred" semble par exemple rattaché à un service de CRM ou de marketing. En conséquence, cette commande ne peut pas mettre à jour directement une entité du bounded context "ventes". Ce n'est pas sa responsabilité (pensez "loose coupling" !) et ce ne serait pas scalable. Une fois que "MakeCustomerPreferred" aura été exécuté, le message handler (l'unité qui va traiter une commande ou un évènement donné) pourra lever un évènement du type "CustomerBecamePreferred". Ce dernier pourra lui même être écouté par un autre bounded context, comme celui des ventes, qui pourra à son tours décider de mettre à jour son sous système en conséquence.<br />
<strong><br />
En ce qui concerne l'utilisation d'un modèle objet du domaine : </strong><br />
Quand on applique cette approche architecturale de façon globale, le choix d'utiliser un modèle objet ou une approche "transaction script" devient du cas par cas. Chaque message handler  étant indépendant, on est libre de choisir le meilleur outil pour chaque cas d'utilisation. Par exemple, si on ne fait que mettre à jour un champ d'une table : pas besoin d'ORM ! On pourrait tout à fait imaginer n'exécuter qu'une simple requête SQL de type UPDATE. Au contraire, si l'exécution d'une logique complexe fait parti du processus de mise à jour, alors il se peut qu'un modèle objet soit plus adéquat. (Et d'ailleurs, qui à dit que SQL était le système de persistance le plus adapté à notre cas d'utilisation? Tout dépend !)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2010/01/17/command-query-responsibility-segregation-et-bounded-contexts/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>XP Day France, Jour 1</title>
		<link>http://www.thedotnetfrog.fr/2009/05/25/xp-day-france-jour-1/</link>
		<comments>http://www.thedotnetfrog.fr/2009/05/25/xp-day-france-jour-1/#comments</comments>
		<pubDate>Mon, 25 May 2009 18:04:46 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[extreme programming france]]></category>
		<category><![CDATA[xp]]></category>
		<category><![CDATA[xp day]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=176</guid>
		<description><![CDATA[Me voila de retour à la maison après une 1ère journée au XP Day (une conférence sur les méthodes agiles organisée par l'association eXtremme programming France) ; et autant dire que je suis ravi d'avoir fait le déplacement. D'autant que je ne savais pas trop à quoi m'attendre dans la mesure ou c'était la première [...]]]></description>
			<content:encoded><![CDATA[<p>Me voila de retour à la maison après une 1ère journée au <a href="http://xpday.fr/" onclick="javascript:pageTracker._trackPageview('/http://xpday.fr/');">XP Day</a> (une conférence sur les méthodes agiles organisée par l'association <a href="http://xp-france.net/" onclick="javascript:pageTracker._trackPageview('/http://xp-france.net/');">eXtremme programming France</a>) ; et autant dire que je suis ravi d'avoir fait le déplacement. D'autant que je ne savais pas trop à quoi m'attendre dans la mesure ou c'était la première fois que je venais.</p>
<p>J'ai donc assisté à 5 sessions aujourd'hui :</p>
<ul>
<li>Introduction à Scrum</li>
<li>Retrospectives, la clef de l'amélioration continue</li>
<li>XP 2.0 : améliorer l'amélioration continue avec Lean</li>
<li>Product Owner, qui es-tu, que fais-tu?</li>
<li>Acquérir de l'expertise Lean</li>
</ul>
<p>Soit 2 grands thèmes : Scrum (que l'on ne présente plus) et Lean qui est très "branché" ces temps-ci.</p>
<p>Globalement c'était très intéressant avec cependant quelques bas sur les sessions retrospectives (un peu trop récité) et  Product Owner. J'ai malheureusement retrouvé sur cette derniètre un anti-pattern classique pour les présentations dont l'audience n'est pas débutante : on se perd dans les questions pointues, les speakers n'avancent pas au rythme prévu et du coup une bonne partie du message passe à la trappe !</p>
<p>Les sessions sur Lean étaient pour moi une vraie découverte. J'avais entendu parlé du terme plusieurs fois mais je n'appréhendais toujours pas les grands principes. Cette 1ère journée m'a permise d'en savoir un peu plus. Il est un peu tôt pour moi pour en parler en profondeur, mais j'ai eu l'impression que Lean et Agile agissent sur des axes différents ce qui est une sorte de mini-révélation à mon niveau :-).</p>
<p>Quelques mots également sur l'organisation : elle était tout bonnement parfaite vu le tarif de l'inscription. Le cadre etait très agréable (ok, il faisait un peu chaud mais ce n'est certainement pas la faute des organisateurs :-)), le timing était globalement respecté, on a eu le droit a de petits goodies sympas (planning cards, mug, chronomètre, ...) et le repas du midi était très bon (je ne savais même pas que c'était inclus!). Pour 230€, je dis chapeau bas messieurs !</p>
<p>A quand un évènement équivalent pour <a href="http://www.altnetfr.org" onclick="javascript:pageTracker._trackPageview('/http://www.altnetfr.org');">Alt.net</a>?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2009/05/25/xp-day-france-jour-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Revue rapide du livre « Implementation Patterns »</title>
		<link>http://www.thedotnetfrog.fr/2009/03/01/revue-rapide-du-livre-implementation-patterns/</link>
		<comments>http://www.thedotnetfrog.fr/2009/03/01/revue-rapide-du-livre-implementation-patterns/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 21:11:38 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Livres]]></category>
		<category><![CDATA[collections]]></category>
		<category><![CDATA[implementation patterns]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[kent beck]]></category>
		<category><![CDATA[livre]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=172</guid>
		<description><![CDATA[J'ai fini il y a quelques jours le dernier livre de Kent Beck : "Implementation patterns" publié à la fin de l'année 2007. Pour rappel, Kent Beck c'est l'homme derrière l'eXtreme Programming ou encore JUnit. Autant dire un gourou de l'industrie, duquel on attends énormément de ses livres et diverses publications.
Ce livre, c'est avant tout [...]]]></description>
			<content:encoded><![CDATA[<p>J'ai fini il y a quelques jours le dernier livre de <a href="http://en.wikipedia.org/wiki/Kent_Beck" onclick="javascript:pageTracker._trackPageview('/http://en.wikipedia.org/wiki/Kent_Beck');">Kent Beck</a> : "<a href="http://www.amazon.fr/Implementation-Patterns-Kent-Beck/dp/0321413091/ref=sr_1_1?ie=UTF8&amp;s=english-books&amp;qid=1235940954&amp;sr=8-1" onclick="javascript:pageTracker._trackPageview('/http://www.amazon.fr/Implementation-Patterns-Kent-Beck/dp/0321413091/ref=sr_1_1?ie=UTF8&amp;s=english-books&amp;qid=1235940954&amp;sr=8-1');">Implementation patterns</a>" publié à la fin de l'année 2007. Pour rappel, Kent Beck c'est l'homme derrière l'<a href="http://www.extremeprogramming.org/" onclick="javascript:pageTracker._trackPageview('/http://www.extremeprogramming.org/');">eXtreme Programming</a> ou encore <a href="http://www.junit.org/" onclick="javascript:pageTracker._trackPageview('/http://www.junit.org/');">JUnit</a>. Autant dire un gourou de l'industrie, duquel on attends énormément de ses livres et diverses publications.</p>
<p>Ce livre, c'est avant tout l'explication d'un terme qui ne m'était pas familier : "Implementation patterns". Concrètement, si les design pattern se focalisent sur l'interaction que plusieurs classent peuvent avoir pour fournir une fonctionnalité, les "patterns d'implémentation" agissent à un niveau plus bas : ce sont des recettes qui s'appliquent à chaque ligne de code et donc plusieurs dizaines de fois par jour. Par exemple, on parle de nomage, de décomposition en fonctions, de getters/setters, de choix de collections (Java...) et évidemment de pleins d'autres choses.</p>
<p>Le fait est que je suis vraiment resté sur ma faim avec ce livre... Certes il parle de plein de choses intéressantes, mais on éfleure à peine le sujet sans jamais avoir les tenants ou les aboutissants de tel ou tel conseil. Ce n'est d'ailleurs pas très surprenant quand on voit la taille du bouquin : 150 pages. J'ai l'impression que ce livre n'a pas trouvé son audience : trop abstrait pour un public de débutants, trop léger pour des développeurs plus expérimentés. Dommage Mr Beck !</p>
<p>"Implementation patterns" me rappelle d'ailleurs l'excellent livre de <a href="http://www.stevemcconnell.com/" onclick="javascript:pageTracker._trackPageview('/http://www.stevemcconnell.com/');">Steve McConnell</a> : <a href="http://www.amazon.fr/Code-Complete-Steven-C-McConnell/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;s=english-books&amp;qid=1235942031&amp;sr=8-1" onclick="javascript:pageTracker._trackPageview('/http://www.amazon.fr/Code-Complete-Steven-C-McConnell/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;s=english-books&amp;qid=1235942031&amp;sr=8-1');">Code Complete</a>. Si vous ne l'avez pas lu, n'hésitez plus ! Vous en retirerez bien plus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2009/03/01/revue-rapide-du-livre-implementation-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alt.net : nouveau site !</title>
		<link>http://www.thedotnetfrog.fr/2009/03/01/altnet-nouveau-site/</link>
		<comments>http://www.thedotnetfrog.fr/2009/03/01/altnet-nouveau-site/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 20:41:29 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Alt.net]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=170</guid>
		<description><![CDATA[Alt.net FR possède désormais un nouveau site, mettez à jour vos favoris : www.altnetfr.org !
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.altnetfr.org" onclick="javascript:pageTracker._trackPageview('/http://www.altnetfr.org');">Alt.net FR</a> possède désormais un nouveau site, mettez à jour vos favoris : <a href="http://www.altnetfr.org" onclick="javascript:pageTracker._trackPageview('/http://www.altnetfr.org');">www.altnetfr.org</a> !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2009/03/01/altnet-nouveau-site/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rapidité VS Qualité</title>
		<link>http://www.thedotnetfrog.fr/2009/02/08/rapidite-vs-qualite/</link>
		<comments>http://www.thedotnetfrog.fr/2009/02/08/rapidite-vs-qualite/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 21:30:08 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Gestion de projet]]></category>
		<category><![CDATA[qualité]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=147</guid>
		<description><![CDATA[On a trop souvent tendance à opposer rapidité de développement et qualité. Ces 2 caractéristiques ne sont en fait pas situées sur le même axe : faire diminuer la qualité n'implique pas une accélération du temps de développement. Bien au contraire.
Le raisonnement est généralement le suivant : il faut implémenter le plus rapidement une solution [...]]]></description>
			<content:encoded><![CDATA[<p>On a trop souvent tendance à opposer rapidité de développement et qualité. Ces 2 caractéristiques ne sont en fait pas situées sur le même axe : faire diminuer la qualité n'implique pas une accélération du temps de développement. Bien au contraire.</p>
<p>Le raisonnement est généralement le suivant : il faut implémenter le plus rapidement une solution qui "fonctionne", pas besoin de faire quelque chose de spécialement brillant ou "beau techniquement". Malheureusement, c'est oublier une vérité fondamentale du développement logiciel :</p>
<p style="text-align: center;"><em><strong>Le coût total d'un projet est égal à la somme du coût de développement et du coût de maintenance.</strong></em></p>
<p>Il se trouve que dans notre industrie, le coût de maintenance représente généralement plusieurs fois le coût de développement d'une solution. Chaque ligne de code sera lue plusieurs dizaines de fois après son écriture, chaque classe sera modifiée par plusieurs développeurs, des fonctionnalités devront être ajoutées dans chaque couche, sur chaque écran... La nature changeante des besoins des utilisateurs d'un produit font que ce dernier est systématiquement amené à évoluer.</p>
<p>Il est alors intéressant de pousser l'analyse un cran plus bas... En effet, un projet est lui même une suite de mini-projets qui, bout-à-bout, forment un tout cohérent et utilisable. Par exemple, pour implémenter une fonctionnalité on aura besoin d'aller préciser le besoin auprès du business, de réfléchir à l'implémentation, de réaliser l'implémentation, de tester la solution développée, ou de la documenter. Il faudra la débugger plusieurs fois et de la modifier pour faire face à de nouveaux besoins... Ces différentes étapes s'étalent dans le temps et peuvent impliquer une ou plusieurs personnes. Un projet peut donc être découpé en plusieurs dizaines ou centaines de mini-projets.</p>
<p>Or la définition du coût total d'un projet est aussi applicable pour l'ensemble de ces mini-projets. Autrement dit, chaque fois que la qualité est mise de coté dans un mini-projet, on augmente de façon significative le coût de maintenance pour ce dernier. Par conséquent, on augmente également la durée et le coût de développement pour le projet parent de manière générale (la maintenance d'un mini-projet faisant parti du coût de développement du projet parent). La vision court-termiste consistant à sacrifier la qualité sur l'hôtel de la rapidité de développement revient à se tirer une balle dans le pied.</p>
<p><strong>Pour s'en convaincre, il suffit de prendre un exemple très simple :</strong></p>
<p>Considérons un projet X constitué de 10 mini-projets. Dans un scénario idéal ou la qualité interne de mon projet reste élevée, chaque mini-projet nécessite un temps de développement de 3 (jours, mois, points, patates, peut importe :-)) et un temps de maintenance de 7. La durée totale du projet X est donc de 100.</p>
<p>Admettons maintenant qu'en sautant les étapes permettant de garder une qualité élevée, j'arrive à faire baisser le temps de développement initial de chaque mini-projet à 2. "Hourra ! Je viens de gagner 10 sur la durée totale, mon patron va me féliciter ! Mais? Mais? pourquoi mes développeurs ont de plus en plus de mal à modifier et debugger l'application? Damn it !" Mon coût de maintenance vient en fait de passer à 10 pour chaque mini-projet, soit un coût total de 120. On commence à comprendre pourquoi la plupart des projets informatiques sont en retard voir annulés...</p>
<p>Une fois que l'on est convaincu par cette analyse, il devient très simple de comprendre une autre vérité fondamentale du développement logiciel :</p>
<p style="text-align: center;"><em><strong>L'augmentation de la qualité interne d'une solution provoque une augmentation de la rapidité de développement.</strong></em></p>
<p>Et non pas l'inverse !</p>
<p>Par conséquent, il est important de prendre le temps nécessaire pour <a href="http://www.refactoring.com/" onclick="javascript:pageTracker._trackPageview('/http://www.refactoring.com/');">refactoriser</a> sa solution logicielle, sous peine de voir la <a href="http://www.martinfowler.com/bliki/TechnicalDebt.html" onclick="javascript:pageTracker._trackPageview('/http://www.martinfowler.com/bliki/TechnicalDebt.html');">dette technique</a> exploser. Cet investissement est systématiquement bénéfique !</p>
<p><strong>Edit :</strong> Scott bellware nous présente <a href="http://blog.scottbellware.com/2009/02/design-flaws-hernias-and-anemic-quality.html" onclick="javascript:pageTracker._trackPageview('/http://blog.scottbellware.com/2009/02/design-flaws-hernias-and-anemic-quality.html');">une excellente métaphore</a> sur la qualité logicielle et pourquoi elle est primordiale. Je garde son exemple basé sur la colonne vertébrale en tête !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2009/02/08/rapidite-vs-qualite/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Comment détecter les copier-coller dans un projet?</title>
		<link>http://www.thedotnetfrog.fr/2009/01/31/comment-detecter-les-copier-coller-dans-un-projet/</link>
		<comments>http://www.thedotnetfrog.fr/2009/01/31/comment-detecter-les-copier-coller-dans-un-projet/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 16:11:37 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[outils]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[dry]]></category>
		<category><![CDATA[Simian]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=133</guid>
		<description><![CDATA[Parceque rare sont les équipes ou l'ensemble des développeurs applique le principe de ne jamais répéter du code (DRY!), il peut être utile d'avoir un petit outil sous la main pour détecter les éventuelles duplications au sein d'une solution.
En effet, tout code dupliqué pose des problèmes de maintenabilité accrus. Dans la majorité des cas on [...]]]></description>
			<content:encoded><![CDATA[<p>Parceque rare sont les équipes ou l'ensemble des développeurs applique le principe de ne jamais répéter du code (DRY!), il peut être utile d'avoir un petit outil sous la main pour détecter les éventuelles duplications au sein d'une solution.<br />
En effet, tout code dupliqué pose des problèmes de maintenabilité accrus. Dans la majorité des cas on modifiera le code en question à un endroit, mais on oubliera systématiquement la copie qui se trouve ici ou là...<br />
<a href="http://www.redhillconsulting.com.au/products/simian/"><br />
Simian</a> est un outil qui permet d'avoir rapidement un apperçu de l'étendu des dégats en un temps record (20 secondes pour 200 000 lignes de code). Il s'intégre directement dans visual studio en tant qu'"Outil externe" et sa configuration se fait en à peine 2 minutes.</p>
<p>Autrement dit, il suffit de suivre les instructions suivantes :</p>
<ol>
<li><a href="http://www.redhillconsulting.com.au/products/simian/simian-2.2.24.tar.gz" onclick="javascript:pageTracker._trackPageview('/http://www.redhillconsulting.com.au/products/simian/simian-2.2.24.tar.gz');">Télécharger</a> et installer Simian</li>
<li>Dans Visual Studio, aller dans "Outils" =&gt; "Outils externe..."</li>
<li>Cliquer sur "Ajouter"</li>
<li>Utiliser les paramètres suivants (sans les guillemets) :Titre : "Simian - Solution" (modifier par ce que vous arrange)<br />
Commande : Chemin ou vous Simian est installé<br />
Arguments : "-formatter=vs -excludes=**/*.Designer.cs **/*.cs"<br />
Répertoire initial :  "$(SolutionDir)"</li>
<li>Répéter la même opération 2 fois avec les paramètres suivants :Titre : "Simian - Projet courant"<br />
Arguments : "-formatter=vs -includes=**/*.cs -excludes=**/*.Designer.cs  $(ProjectDir)"<br />
Répertoire initial :  "$(ProjectDir)"</p>
<p>Titre : "Simian - Fichier courant"<br />
Arguments : "-formatter=vs $(ItemFileName) $(ItemExt)"<br />
Répertoire initial :  "$(ItemDir)"</li>
<li>Il n'y a plus qu'a aller dans le menu "Outils" pour lancer l'analyse!</li>
</ol>
<p>A noter que vous pouvez double cliquer sur les lignes du résultat de l'analyse pour naviguer directement vers le code en question.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2009/01/31/comment-detecter-les-copier-coller-dans-un-projet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sortie de la Release Candidate d’Asp.net MVC</title>
		<link>http://www.thedotnetfrog.fr/2009/01/27/sortie-de-la-release-candidate-daspnet-mvc/</link>
		<comments>http://www.thedotnetfrog.fr/2009/01/27/sortie-de-la-release-candidate-daspnet-mvc/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 22:24:16 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Asp.net MVC]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=137</guid>
		<description><![CDATA[Je ne commente que très rarement les annonces faites ici et la sur Net... Pourtant, j'ai envie de faire une exception avec celle qui vient d'être publiée un peu plus tôt aujourd'hui par Scott Guthrie et Phil Haack : l'annonce de la RC d'Asp.net MVC.
Asp.net MVC est un produit à part chez Microsoft, c'est une [...]]]></description>
			<content:encoded><![CDATA[<p>Je ne commente que très rarement les annonces faites ici et la sur Net... Pourtant, j'ai envie de faire une exception avec celle qui vient d'être publiée un peu plus tôt aujourd'hui par <a href="http://weblogs.asp.net/scottgu/archive/2009/01/27/asp-net-mvc-1-0-release-candidate-now-available.aspx" onclick="javascript:pageTracker._trackPageview('/http://weblogs.asp.net/scottgu/archive/2009/01/27/asp-net-mvc-1-0-release-candidate-now-available.aspx');">Scott Guthrie</a> et <a href="http://haacked.com/archive/2009/01/27/aspnetmvc-release-candidate.aspx" onclick="javascript:pageTracker._trackPageview('/http://haacked.com/archive/2009/01/27/aspnetmvc-release-candidate.aspx');">Phil Haack</a> : l'annonce de la RC d'<a href="http://www.asp.net/mvc/" onclick="javascript:pageTracker._trackPageview('/http://www.asp.net/mvc/');">Asp.net MVC</a>.</p>
<p>Asp.net MVC est un produit à part chez Microsoft, c'est une ALTernative à une technologie bien connue sous la plateforme .Net : les Webforms. C'est surtout l'un des tout premiers efforts de Microsoft pour adhérer à une certaine façon de développer des logiciels. Entendez par là agilité, tests, <a href="http://www.thedotnetfrog.fr/2008/04/25/3-acronymes-pour-ameliorer-la-qualite-de-votre-code/" >DRY</a> ou encore SOLID.</p>
<p>C'est aussi un autre regard sur la communauté : jamais auparavant un framework n'aura tant bénéficier des retours des utilisateurs. Pour s'en convaincre il suffit de voir les points d'extensions qui ont été ajoutés, les signatures qui ont été refactorisées pour éliminer les dépendances vers les briques non testables, ou encore les nouveaux helpers dans <a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=22359" onclick="javascript:pageTracker._trackPageview('/http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=22359');">MVC Futures</a> qui sont dérivés de projets open source comme <a href="http://www.codeplex.com/MVCContrib" onclick="javascript:pageTracker._trackPageview('/http://www.codeplex.com/MVCContrib');">MVC Contrib</a>.</p>
<p>Mais enfin de compte, cette release candidate est avant toute chose une victoire. Une victoire pour tout ceux qui militent pour développer des logiciels autrement. Aujourd'hui tout ces gens ne sont plus marginaux sur la plateforme .Net, ils ont désormais le soutient de Microsoft!</p>
<p>Alors ce framework n'est pas parfait. Des ALTernatives très puissantes existent d'ailleurs sous d'autres plateformes (<a href="http://rubyonrails.org/" onclick="javascript:pageTracker._trackPageview('/http://rubyonrails.org/');">Ruby On Rails</a> pour n'en citer qu'une). Sous .Net, nous avons depuis longtemps <a href="http://www.castleproject.org/MonoRail/" onclick="javascript:pageTracker._trackPageview('/http://www.castleproject.org/MonoRail/');">Monorail</a>, qui est peut être d'ailleurs plus mature ou plus puissant, je n'ai pas d'avis sur la question. Le fait est que c'est un tel changement de paradigme au sein de cette communauté que l'on ne peut que se réjouir de cette annonce!</p>
<p>Longue vie à Asp.net MVC !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2009/01/27/sortie-de-la-release-candidate-daspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Découvrez Resharper!</title>
		<link>http://www.thedotnetfrog.fr/2008/12/18/decouvrez-resharper/</link>
		<comments>http://www.thedotnetfrog.fr/2008/12/18/decouvrez-resharper/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 12:15:05 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[outils]]></category>
		<category><![CDATA[jetbrains]]></category>
		<category><![CDATA[outil]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[resharper]]></category>

		<guid isPermaLink="false">http://www.thedotnetfrog.fr/?p=116</guid>
		<description><![CDATA[Resharper est pour moi l'outil le plus important en dehors de Visual Studio pour développer en .Net. C'est simple, je suis incapable de travailler sans, et la plupart des personnes que je connais qui l'utilisent sont dans le même cas. Je vous parle d'une productivité augmenté de plusieurs dizaines de pour cent pour les taches [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jetbrains.com/resharper/index.html" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/index.html');">Resharper </a>est pour moi l'outil le plus important en dehors de Visual Studio pour développer en .Net. C'est simple, je suis incapable de travailler sans, et la plupart des personnes que je connais qui l'utilisent sont dans le même cas. Je vous parle d'une productivité augmenté de plusieurs dizaines de pour cent pour les taches de développements! Et d'une qualité accrue pour la simple raison que l'on se permets de refactoriser le code  en permanence comme l'opération devient indolore et peu couteuse. Pourtant, pour avoir rencontré un certain nombre d'éditeurs de logiciels récemment, je peux vous assurer que le taux de pénétration de cet add-in magique reste faible, trop faible.</p>
<p>Certes, parler de resharper ici revient à précher aux convaincus. Si vous lisez ce blog, il y a de fortes chances pour que vous soyez déjà utilisateur... Si ce n'est pas le cas, je vous invite non seulement à lire la suite mais surtout à <a href="http://www.jetbrains.com/resharper/download/index.html?top" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/download/index.html?top');">essayer et faire essayer</a> cet outil !</p>
<p><strong>Resharper, ça sert à quoi ?</strong></p>
<p>Resharper est un outil qui permet d'améliorer significativement la productivité des développeurs. Ses fonctionnalités couvrent les points suivants :</p>
<ul>
<li>Refactoring</li>
<li>Analyse de code</li>
<li>Génération de code</li>
<li>Formatage de code</li>
<li>Navigation</li>
<li>Exécution des tests unitaires</li>
</ul>
<p>Concrètement, Resharper vous permet de passer moins de temps sur l'accessoire et plus sur l'essentiel. Vous ne me croyez pas? voici quelques exemples de fonctionnalités (non exhaustif !):</p>
<p><strong>Refactoring :</strong></p>
<ul>
<li>Créer une interface à partir d'une classe</li>
<li>Créer une méthode à partir du code sélectionné</li>
<li>Introduire un membre, une variable ou un paramètre à partir d'une expression</li>
<li>Changer la signature d'une méthode (par exemple, modifier l'ordre des paramètres)</li>
<li>Réécrire des expressions pour utiliser l'opérateur ??</li>
</ul>
<p><strong>Analyse de code : </strong></p>
<ul>
<li>Détecter toutes les erreurs de compilation dans la solution (sans compiler)</li>
<li>Détecter le code non utilisé dans la solution</li>
<li>Détecter les exceptions potentielles de type NullReferenceException</li>
<li>Suggestions sur les paramètres des fonctions. Par exemple utiliser un ICollection en paramètre plutôt qu'un IList si on n'utilise que des membres de ICollection dans le code de la fonction</li>
</ul>
<p><strong>Génération de code :</strong></p>
<ul>
<li>Générer les propriétés pour les membres sélectionnés (totalement configurable pour utiliser des propriétés automatiques ou non, des propriétés en lecture seule, etc.)</li>
<li>Générer un constructeur à partir des membres sélectionnés</li>
<li>Implémenter une interface en générant la structure des méthodes</li>
<li>Générer un membre (par exemple, après avoir tapé _foo = new Foo(); je peux générer _foo automatiquement avec un raccourci)</li>
<li>Générer une méthode (par exemple, après avoir tapé foo.Bar(); je peux générer la méthode Bar dans la classe Foo avec un raccourci)</li>
<li>Suggestion des using à ajouter au fur et à mesure que l'on écrit le code</li>
<li>Templates pour le code et les fichiers</li>
</ul>
<p><strong>Formatage de code : </strong></p>
<ul>
<li>Retirer les using inutile</li>
<li>Trier les membres d'une classe par visibilité (private, protected, internal, public)</li>
<li>Organiser la classe avec des régions de façon automatique</li>
</ul>
<p><strong>Navigation : </strong></p>
<ul>
<li>Trouver toutes les utilisations d'un symbole (Visual Studio le fait déjà mais très lentement par rapport à Resharper)</li>
<li>Surligner l'utilisation d'un symbole</li>
<li>Accès rapide aux fichiers, types et symboles en tapant leur nom ou initiales</li>
<li>Aller à la classe dont la classe courante hérite, à la classe fille.</li>
</ul>
<p><strong>Exécution des tests unitaires :</strong></p>
<ul>
<li>Exécuter le test spécifié</li>
<li>Exécuter tous les tests</li>
</ul>
<p>Le plus simple pour se faire une idée concrète est encore de visionner les nombreux webcasts réalisés ici et la :</p>
<ul>
<li>Les <a href="http://www.jetbrains.com/resharper/documentation/index.html" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/documentation/index.html');">démos</a> officielles, notamment <a href="http://www.jetbrains.com/resharper/documentation/presentation/codingSession/CodingSession.wmv" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/documentation/presentation/codingSession/CodingSession.wmv');">celle ci</a> ou <a href="http://www.jetbrains.com/resharper/documentation/presentation/Editor_Feature_Highlights/ReSharperEFH.html" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/documentation/presentation/Editor_Feature_Highlights/ReSharperEFH.html');">celle la</a></li>
<li>Une <a href="http://www.viddler.com/explore/Lostechies/videos/1/" onclick="javascript:pageTracker._trackPageview('/http://www.viddler.com/explore/Lostechies/videos/1/');">démo</a> faite par <a href="http://www.lostechies.com" onclick="javascript:pageTracker._trackPageview('/http://www.lostechies.com');">Los Techies</a>. Tellement impressionnante que je l'inclue directement dans le billet :</li>
</ul>
<p><object width="545" height="429" data="http://www.viddler.com/simple/4944a678/" type="application/x-shockwave-flash"><param name="id" value="viddler_4944a678" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><param name="src" value="http://www.viddler.com/simple/4944a678/" /><param name="name" value="viddler_4944a678" /><param name="allowfullscreen" value="true" /></object></p>
<p>Vous pouvez également lire l'excellente série <a href="http://blog.excastle.com/2007/01/31/blog-event-the-31-days-of-resharper/" onclick="javascript:pageTracker._trackPageview('/http://blog.excastle.com/2007/01/31/blog-event-the-31-days-of-resharper/');">31 days of Resharper</a>.</p>
<p>Enfin, si vous téléchargez la démo, je vous conseille vivement de télécharger et d'imprimer la feuille résumant les raccourcis :</p>
<ul>
<li><a href="http://www.jetbrains.com/resharper/docs/ReSharper40DefaultKeymap2.pdf" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/docs/ReSharper40DefaultKeymap2.pdf');">Avec le mapping Resharper</a> (celui que j'utilise personnellement)</li>
<li><a href="http://www.jetbrains.com/resharper/docs/ReSharper40DefaultKeymap.pdf" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/docs/ReSharper40DefaultKeymap.pdf');">Avec le mapping Visual Studio</a></li>
</ul>
<p>Toutes ces fonctionalités ont évidemment <a href="http://www.jetbrains.com/resharper/buy/index.jsp?top" onclick="javascript:pageTracker._trackPageview('/http://www.jetbrains.com/resharper/buy/index.jsp?top');">un prix</a>, soit 315€ pour la version complète (c# + vb.net) ou 225€ pour la version C# seulement. Je peux vous assurer que c'est rentabilisé en 1 semaine !</p>
<p>P.S : Non, je n'ai pas d'actions chez Jetbrains, le créateur de Resharper :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetfrog.fr/2008/12/18/decouvrez-resharper/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

