<?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>Le Touilleur Express</title>
	<atom:link href="http://www.touilleur-express.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touilleur-express.fr</link>
	<description>Blog sur Java, J2EE, Scrum,Apple,iphone par Nicolas Martignole</description>
	<lastBuildDate>Fri, 12 Mar 2010 18:13:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pourquoi le client ne parle pas votre langue</title>
		<link>http://www.touilleur-express.fr/2010/03/12/client-ubiquitous-language/</link>
		<comments>http://www.touilleur-express.fr/2010/03/12/client-ubiquitous-language/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 17:17:16 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>
		<category><![CDATA[humeur]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3314</guid>
		<description><![CDATA[Je suis développeur. Tu es développeur. Nous nous reconnaissons car nous avons les bouts des doigts carrés. A force d&#8217;appuyer sur un clavier, nous avons déformé l&#8217;extrémité de nos phalanges. Plus grave, à force de travailler avec des clients différents, nous avons abandonné l&#8217;idée que le client comprenne notre boulot. Alors forcément, vu du point de vue du client, nous ressemblons de plus en plus à une caste sociale difficile à gérer. Peut-être qu&#8217;un jour nous serons derrière des barreaux comme au Zoo, et que les clients nous apporterons des ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.touilleur-express.fr/wp-content/main_ordinateur.jpg"><img src="http://www.touilleur-express.fr/wp-content/main_ordinateur.jpg" alt="" title="main_ordinateur" width="200" height="200" class="alignright size-full wp-image-3319" /></a><strong>Je suis développeur. Tu es développeur. Nous nous reconnaissons car nous avons les bouts des doigts carrés. A force d&#8217;appuyer sur un clavier, nous avons déformé l&#8217;extrémité de nos phalanges. Plus grave, à force de travailler avec des clients différents, nous avons abandonné l&#8217;idée que le client comprenne notre boulot. Alors forcément, vu du point de vue du client, nous ressemblons de plus en plus à une caste sociale difficile à gérer. Peut-être qu&#8217;un jour nous serons derrière des barreaux comme au Zoo, et que les clients nous apporterons des spécifications à manger avec une fourche&#8230; </strong></p>
<p>Soyons sérieux. </p>
<p>Il semble important d&#8217;apprendre aux développeurs quelques techniques pour parler avec le client. Cet enseignement vient de ce que j&#8217;ai vu lors de <a href="http://www.touilleur-express.fr/2010/02/15/formation-domain-driven-design-avec-eric-evans-jour-1/" target="test">ma formation Domain Driven Design</a> chez Zenika : l&#8217;importance d&#8217;un langage unique, ce que l&#8217;on appelle  &laquo;&nbsp;<em><a href="http://domaindrivendesign.org/node/132">Ubiquitous Language</a></em>&laquo;&nbsp;. Je ne parle pas des règles de politesses, mais bien de l&#8217;importance de définir une sémantique claire entre l&#8217;équipe de réalisation d&#8217;une part, et l&#8217;équipe de maîtrise d&#8217;œuvre d&#8217;autre part. </p>
<p>L&#8217;Ubiquitous Language dans l&#8217;approche Domain Driven Design, est un langage défini autour du modèle du domaine, utilisé par toutes les équipes pour communiquer autour du logiciel réalisé. En l&#8217;absence d&#8217;UL, il y a un risque important que le travail des développeurs ne correspondent pas à la demande du client. Il s&#8217;avère que les développeurs ne font pas toujours l&#8217;effort d&#8217;apprendre les termes et la langue de travail du domaine. D&#8217;un autre côté, certains experts du domaine se rendent inaccessible en ne faisant aucuns efforts de vulgarisation ou d&#8217;explications. </p>
<p>Je me souviens de cette charmante personne dans mon ancienne société qui venait nous parler des CDS (Credit defaut swap). On y comprenait rien. Pourtant la définition est très simple :</p>
<blockquote><p>
A credit default swap (CDS) is a swap contract in which the buyer of the CDS makes a series of payments to the seller and, in exchange, receives a payoff if a credit instrument (typically a bond or loan) undergoes a &#8216;Credit Event&#8217; (often described as a default) defined as events such as restructuring, bankruptcy or even downgrade of credit rating (less common).
</p></blockquote>
<p>C&#8217;est super simple non ? Allez vous me faîtes un petit modèle simple sur cette base et on se revoit demain&#8230;.</p>
<p>Ce qui est intéressant avec les CDS, c&#8217;est qu&#8217;ils sont à la source de la faillite de l&#8217;assureur <a href="http://fr.wikipedia.org/wiki/American_International_Group">AIG</a> en 2008. La banque Lehman Brothers était le premier acteur sur ce marché. Les CDS sont des contrats de protections financières entre les acheteurs et les vendeurs, mis en place pour couvrir les risques de crédit. Lorsque vous achetez une maison, votre assurance santé couvre le risque de défaillance de paiement en offrant une couverture en cas de soucis de santé. Les CDS sont des contrats qui protègent le vendeur en cas d&#8217;événements de crédits graves comme la faillite d&#8217;une banque, une crise monétaire ou autre. C&#8217;est plus clair ? </p>
<p>Lorsque le langage n&#8217;est pas clair, votre projet informatique prend un sérieux risque de ne pas concrétiser vos attentes. Il est donc primordial de trouver des personnes de la maîtrise d&#8217;ouvrage ou de la maîtrise d&#8217;œuvre en mesure de parler avec les développeurs. Dès lors que les mots ne sont pas clairs, il y a un risque de dérapage.</p>
<p><strong>Le développeur doit apprendre une langue métier</strong><br />
<a href="http://www.touilleur-express.fr/wp-content/149172094_f4a814bf30.jpg"><img src="http://www.touilleur-express.fr/wp-content/149172094_f4a814bf30-150x150.jpg" alt="" title="149172094_f4a814bf30" width="150" height="150" class="alignleft size-thumbnail wp-image-3326" /></a><br />
<em>Crédit photo:<a href="http://www.flickr.com/photos/shawnecono/149172094/"> Shawn Econo</a></em><br />
Parlons un peu de vous, messieurs les développeurs. Quel nom allez-vous donner à votre Class Java, à vos méthodes et vos objets ? Quels mots allez-vous utiliser dans vos schémas d&#8217;architecture ? C&#8217;est là qu&#8217;il devient important d&#8217;utiliser l&#8217;UL (Ubiquitous Language). </p>
<p>Lorsque les mots ne sont pas clairs, les développeurs entre eux ne peuvent pas se comprendre. Que voulez-vous dire exactement par &laquo;&nbsp;Adapteur&nbsp;&raquo; ici sur ce schéma ? Il s&#8217;agit d&#8217;un convertisseur de flux financier ? D&#8217;un adapteur réseau ? D&#8217;un mot qui ne veut rien dire ? </p>
<p>Il est cependant important de dire qu&#8217;il y aura un décalage entre le code écrit et la langue des clients, de l&#8217;équipe métier. Trouver le bon nom d&#8217;une classe pourra demander plusieurs itérations. Travailler même avec des développeurs d&#8217;un autre pays demandera un effort de vulgarisation et de documentation plus important que prévu.  </p>
<p><strong>Comment s&#8217;en sortir alors ?</strong><br />
Revenez sur votre modèle. Je ne parle pas forcément UML ici. Je parle simplement de ce schéma qui décrit votre logiciel. En fait, il ne doit contenir que des mots validés par le métier. Si quelque part je vois &laquo;&nbsp;ESB&nbsp;&raquo; alors je dis : &laquo;&nbsp;danger !!!&nbsp;&raquo;. Un ESB ne veut rien dire pour quelqu&#8217;un qui n&#8217;est pas développeur. </p>
<p>Imaginez les cartes routières. Pensez-vous que celles-ci seraient exploitables si elles utilisaient le format de l&#8217;armée ? Ou celui des géomètres ? Non !<br />
Il y a eu un effort de transcription et de simplification pour que vous, le client lambda, soyez en mesure de comprendre et de vous y retrouver.</p>
<p><div id="attachment_3330" class="wp-caption alignright" style="width: 310px"><a href="http://www.flickr.com/photos/andrea_r/"><img src="http://www.touilleur-express.fr/wp-content/124417204_11a1a69b8f-300x225.jpg" alt="Dessin d&#039;enfant" title="124417204_11a1a69b8f" width="300" height="225" class="size-medium wp-image-3330" /></a><p class="wp-caption-text">Crédit photo : Andrea_r</p></div><br />
Il doit en être de même de vos schémas d&#8217;architecture. Votre épouse/époux doit pouvoir lire et comprendre ce que fait votre logiciel. En fait, votre fils de 6 ans doit pouvoir redessiner ce schéma. Bon j&#8217;exagère un peu, mais vous comprenez le sens de ce que je veux dire.</p>
<p>Le langage dépasse les schémas. Ce sera surtout cet ensemble de mots que vos développeurs utiliseront chaque jour. Lorsqu&#8217;un développeur dira &laquo;&nbsp;événement financier avec risque&nbsp;&raquo; ou &laquo;&nbsp;emprunts&nbsp;&raquo;, chacun aura une vision claire. </p>
<p>Lorsque je dis &laquo;&nbsp;<em>moteur de génération de rapports financiers</em>&nbsp;&raquo; il n&#8217;y a pas d&#8217;ambiguïté sur le fond. Parler de &laquo;&nbsp;<em>moteur transactionnel de génération de rapports BIRT</em>&nbsp;&raquo; à un financier n&#8217;a pas de sens. De même, parler de &laquo;&nbsp;<em>plateforme d&#8217;externalisation des documents légaux financiers par voie électronique</em>&nbsp;&raquo; ne parlera pas à un développeur. Soyez créatif, inventez-vous un vocabulaire et une langue de travail. </p>
<p>En cas de doutes sur la signification d&#8217;un terme, il faut faire appel à l&#8217;expert du domaine. C&#8217;est la personne qui représente le client, et qui a assez d&#8217;autorité pour trancher. Ne prenez pas de décisions sans en parler avec lui. </p>
<p><strong>Conclusion</strong><br />
L&#8217;Ubiquitous Language de la pratique du Domain Driven Design demande aux développeurs et aux architectes d&#8217;améliorer leur communication avec le client. Pour cela, les architectes doivent travailler avec les clients du projet afin de capturer les mots, de définir les notions et le sens de chaque élément. Essayez de reprendre vos schémas fonctionnels, et assurez-vous qu&#8217;il n&#8217;y ait pas trop d&#8217;abréviations. Je déteste cela. Je trouve que c&#8217;est un moyen trop facile de jargoniser son projet. Pensez à celui qui arrive dans le projet. Ce n&#8217;est pas à lui de vous comprendre, c&#8217;est à vous de vous faire comprendre. Soyez humble, abandonnez cette chaise de juge arbitre de Tennis, d&#8217;où vous jetez les acronymes sur la population du développeur.</p>
<p>Quant à toi mon cher développeur, tu ne t&#8217;en sortiras pas comme cela. Si je te vois encore parler de transaction sérialisée en SGBDR, de 2-phases-commit, de repository de datas ou de je ne sais quelle perle de geek à ton client, tu vas entendre parler de moi. C&#8217;est à toi d&#8217;apprendre à parler Klingons, pas à eux. </p>
<p>Sur ce, je vous laisse, j&#8217;ai mal aux doigts après avoir tapé cet article, j&#8217;ai les bouts des doigts carrés&#8230; bizarre.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/12/client-ubiquitous-language/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Conférence Agile France 2010, le 31 mai et 1er juin</title>
		<link>http://www.touilleur-express.fr/2010/03/12/conference-agile-france-2010-le-31-mai-et-1er-juin/</link>
		<comments>http://www.touilleur-express.fr/2010/03/12/conference-agile-france-2010-le-31-mai-et-1er-juin/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 09:44:35 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3309</guid>
		<description><![CDATA[
C&#8217;est reparti pour la conférence la plus intéressante de l&#8217;année sur l&#8217;Agilité. Comme l&#8217;an dernier, l&#8217;équipe d&#8217;organisation vous invite 2 jours à Paris, plus exactement à Vincennes, dans un cadre magnifique. Que vous soyez développeurs, chef de projets, maîtrise d&#8217;ouvrage ou plutôt maîtrise d&#8217;oeuvre, c&#8217;est votre conférence. 
Cette conférence essentiellement francophone, est aussi le point de rendez-vous de nos voisins Suisses, Belges et Canadien comme l&#8217;an passé. Avec 280 personnes l&#8217;an passé, chaque session fut bien remplie. Les sponsors sont invités à se faire connaître pour aider l&#8217;équipe Agile France ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://conf.agile-france.org/media/img/agileLogo2.png" alt="Agile France" border="0" align="left"/><br />
C&#8217;est reparti pour <strong>la conférence la plus intéressante de l&#8217;année sur l&#8217;Agilité</strong>. Comme l&#8217;an dernier, l&#8217;équipe d&#8217;organisation vous invite 2 jours à Paris, plus exactement à Vincennes, dans un cadre magnifique. Que vous soyez développeurs, chef de projets, maîtrise d&#8217;ouvrage ou plutôt maîtrise d&#8217;oeuvre, c&#8217;est votre conférence. </p>
<p>Cette conférence essentiellement francophone, est aussi le point de rendez-vous de nos voisins Suisses, Belges et Canadien comme l&#8217;an passé. Avec 280 personnes l&#8217;an passé, chaque session fut bien remplie. Les sponsors sont invités à se faire connaître pour aider l&#8217;équipe Agile France qui fait un travail remarquable. </p>
<p>Le site Agile France vous donnera tous les détails nécessaires :  <a href="http://conf.agile-france.org/">http://conf.agile-france.org/</a></p>
<p>Voici les articles publiés sur le Touilleur Express l&#8217;an dernier, afin de vous donner un avant-goût de ce qui vous attend :<br />
<a href="http://www.touilleur-express.fr/2009/05/27/xp-day-france-2009-journee-1/" target="new">XP Day France 2009 – journée 1</a> <em>publié  le 2009-05-27 00:22:41</em><br />
<a href="http://www.touilleur-express.fr/2009/05/27/xp-day-france-2009-jour-2/" target="new">XP Day France 2009 – jour 2</a> <em>publié  le 2009-05-27 20:03:05</em><br />
<a href="http://www.touilleur-express.fr/2009/05/29/xp-day-france-2009-scrum-est-il-dangereux/" target="new">XP Day France 2009, Scrum est-il dangereux ?</a> <em>publié  le 2009-05-29 21:50:38</em><br />
<a href="http://www.touilleur-express.fr/2009/05/31/xp-day-france-2009-jour-2-dans-la-peau-du-challenger-et-business-value-game/" target="new">XP Day France 2009 – jour 2, Dans la peau du Challenger et Business Value Game</a> <em>publié  le 2009-05-31 13:57:32</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/12/conference-agile-france-2010-le-31-mai-et-1er-juin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lancement du Paris Scala User Group</title>
		<link>http://www.touilleur-express.fr/2010/03/12/lancement-du-paris-scala-user-group/</link>
		<comments>http://www.touilleur-express.fr/2010/03/12/lancement-du-paris-scala-user-group/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 08:05:30 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3306</guid>
		<description><![CDATA[Et un autre ce matin : 
Alexis Agahi lance le Paris Scala User Group. L&#8217;objectif de ce user group est de regrouper les fans de Scala qui travaillent en Ile-de-France. L&#8217;adresse du site officiel : http://groups.google.com/group/paris-scala-user-group.
La première rencontre aura lieu à l&#8217;occasion de la soirée Scala du Paris Java User Group en avril.
]]></description>
			<content:encoded><![CDATA[<p>Et un autre ce matin : </p>
<p>Alexis Agahi lance le Paris Scala User Group. L&#8217;objectif de ce user group est de regrouper les fans de Scala qui travaillent en Ile-de-France. L&#8217;adresse du site officiel : <a href="http://groups.google.com/group/paris-scala-user-group">http://groups.google.com/group/paris-scala-user-group</a>.<br />
La première rencontre aura lieu à l&#8217;occasion de la soirée Scala du Paris Java User Group en avril.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/12/lancement-du-paris-scala-user-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lancement du BIRT User Group FR</title>
		<link>http://www.touilleur-express.fr/2010/03/12/lancement-du-birt-user-group-fr/</link>
		<comments>http://www.touilleur-express.fr/2010/03/12/lancement-du-birt-user-group-fr/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 08:00:04 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3303</guid>
		<description><![CDATA[Je fais suivre les informations concernant les naissances et les heureux événements. Donc hop, en voici un nouveau pour ce matin : 
Communiqué  de presse – Jeudi 11 mars 2010
Lancement du Birt User Group FR 
Le Birt User Group FR naît!  
Pour la première fois un User Group consacré à BIRT est créé en France.
Le Birt User Group France est le groupe des utilisateurs BIRT Français ayant pour objectif de réunir la communauté afin d&#8217;échanger des retours d&#8217;expérience, des idées et de discuter des nouveautés de cet outil ...]]></description>
			<content:encoded><![CDATA[<p>Je fais suivre les informations concernant les naissances et les heureux événements. Donc hop, en voici un nouveau pour ce matin : </p>
<blockquote><p>Communiqué  de presse – Jeudi 11 mars 2010</p>
<p>Lancement du Birt User Group FR </p>
<p>Le Birt User Group FR naît!  </p>
<p>Pour la première fois un User Group consacré à BIRT est créé en France.<br />
Le Birt User Group France est le groupe des utilisateurs BIRT Français ayant pour objectif de réunir la communauté afin d&#8217;échanger des retours d&#8217;expérience, des idées et de discuter des nouveautés de cet outil de reporting Open-Source. </p>
<p>Ce groupe sera l&#8217;occasion de créer une véritable synergie autour de la technologie BIRT dans un esprit de partage des connaissances. Le fonctionnement est simple, les membres pourront librement échanger sur ce sujet en s&#8217;exprimant directement sur ce groupe.  </p>
<p>Afin de faciliter les interactions entre membres, des rencontres sur Paris seront organisées tous les deux mois sous la forme d&#8217;ateliers de discussion sur des thématiques pré-définies ou de discussions libres.</p>
<p>Les membres planifieront eux-même les rencontres et leurs contenus. Par exemple, selon les besoins et demandes identifiés lors des précédents échanges, des conférences pourrons être programmées. </p>
<p>Par ailleurs, tous les événements spécifiques à BIRT seront annoncés afin de permettre aux membres de se tenir informés des nouveautés et ainsi fédérer la communauté BIRT grandissante. </p>
<p>Le premier rendez-vous aura lieu <strong>mercredi 07 avril sur Paris à 19h</strong>.</p>
<p>Il sera animé  par Paul Clenahan, membre actif du projet Eclipse BIRT, qui nous donnera une vision interne de cet outil devenu en quelques années la solution de reporting Open-Source de référence. </p>
<p>Les inscriptions à l&#8217;événement sont, d&#8217;ores et déjà, ouvertes sur <a href="http://birt-user-group-france.eventbrite.com">http://birt-user-group-france.eventbrite.com</a>. </p>
<p>Toute inscription au BIRT User Group France se fera directement sur le Google Groupe : <a href="http://groups.google.fr/group/birt-user-group-france">http://groups.google.fr/group/birt-user-group-france</a>. </p>
<p>Pour plus d&#8217;informations, contactez Birt User Group France : birt-user-group-france@googlegroups.com.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/12/lancement-du-birt-user-group-fr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scala, partie 2</title>
		<link>http://www.touilleur-express.fr/2010/03/11/scala-partie-2/</link>
		<comments>http://www.touilleur-express.fr/2010/03/11/scala-partie-2/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 16:48:30 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3254</guid>
		<description><![CDATA[[update] cet article a été mis à jour suite aux retours d&#8217;Alexandre Bertails
Après un premier article qui vous a fait pas mal réagir, je vais vous parler des Traits et des Collections. J&#8217;ajoute un peu plus de programmation fonctionnelle dans cet épisode. 
Les Traits
Les Traits en Scala sont un nouveau concept qui demande un peu de temps à un développeur Java du Canal Historique comme moi. Regardons les limitations des interfaces en Java : une classe peut implémenter un certain nombre d&#8217;interfaces. Or une interface ne nous permet pas de ...]]></description>
			<content:encoded><![CDATA[<p><strong>[update] cet article a été mis à jour suite aux retours d&#8217;Alexandre Bertails</strong></p>
<p><a href="http://www.touilleur-express.fr/wp-content/lipstick2w.jpg"><img src="http://www.touilleur-express.fr/wp-content/lipstick2w.jpg" alt="" title="lipstick2w" width="300" height="300" class="alignleft size-full wp-image-3255" /></a>Après <a href="http://www.touilleur-express.fr/2010/03/08/scala-partie-1/">un premier article</a> qui vous a fait pas mal réagir, je vais vous parler des Traits et des Collections. J&#8217;ajoute un peu plus de programmation fonctionnelle dans cet épisode. </p>
<p><strong>Les Traits</strong><br />
Les Traits en Scala sont un nouveau concept qui demande un peu de temps à un développeur Java du Canal Historique comme moi. Regardons les limitations des interfaces en Java : une classe peut implémenter un certain nombre d&#8217;interfaces. Or une interface ne nous permet pas de définir du code commun justement pour l&#8217;ensemble des classes qui implémentent celle-ci. Au lieu de cela, il faut mettre en place des stratégies et des patterns pour regrouper des ensembles fonctionnels. Bref nous nous en sortons, avec un peu de gymnastique. A ce propos, lorsque je vois l&#8217;utilisation des annotations en Java sur certains projets, j&#8217;ai le sentiment de voir des cas d&#8217;usages similaires aux Traits en Scala, que nous avons comblé avec des annotations. </p>
<p>Les Traits en Scala sont empilables, ce qui permet d&#8217;ajouter de multiples caractéristiques définies dans différents Traits. Contrairement à une interface Java, les Traits peuvent implémenter des méthodes. Il ne sera alors pas nécessaire de les redéfinir dans les classes qui étendent ces Traits. </p>
<p>J&#8217;aime l&#8217;idée qu&#8217;une Interface est un espace de nom qui permet de regrouper par caractéristiques des objets (Serializable, Comparable). Cela me fait penser que les Traits sont similaires à des adjectifs que l&#8217;on ajoute à un objet. . Attention, il ne s&#8217;agit pas d&#8217;héritage multiple comme en C++, mais de la possibilité d&#8217;étendre des interfaces, en définissant un ordre. La notion de Trait est inspiré des Mix-In du langage Ruby. </p>
<p>Les Traits sont donc comme des interfaces avec une implémentation partielle, et ils permettent d&#8217;empiler dans un certain ordre un ensemble de fonctionnalités  à une Class. Nous verrons avec les Collections que c&#8217;est très pratique.</p>
<p>Prenons par exemple un panier sur un site Web. Ce panier est capable d&#8217;accumuler des articles. Nous allons voir comment il est possible d&#8217;enrichir les possibilités de notre objet initial en y ajoutant des traits, sans cependant faire de l&#8217;héritage multiple. </p>
<p>Je commence par définir une classe abstraite pour définir la notion de Scanner de prix. Un Scanner est capable d&#8217;additionner le prix de chaque article qui passe, et ensuite de vous donner le total à payer</p>
<pre class="brush:scala">
abstract class PriceScanner {
    def scanArticle(x: Double)
    def getTotalPrice(): Double
}
</pre>
<p>Définissons ensuite un simple Scanner </p>
<pre class="brush:scala">
class ClassicPriceScanner extends PriceScanner {
  private var total:Double = 0.0

  def scanArticle(x: Double) = { total+=x }

  def getTotalPrice() = { total }
}
</pre>
<p>Je vais vous montrer qu&#8217;il est possible d&#8217;empiler les Traits pour ajouter de manière sélective quelques opérations. Nous allons définir un Trait pour calculer la TVA lorsqu&#8217;un article est scanné, et un Trait pour convertir en US Dollar le prix final :</p>
<pre class="brush:scala">
// Scala
// Compute the price with Value Added Taxes
trait FrenchTaxIncluded extends PriceScanner {
  // Add the French V.A.T.
  abstract override def scanArticle(x: Double) { super.scanArticle(x * 0.196 + x)}
}
</pre>
<p>Notez que le Trait étend la classe de base</p>
<pre class="brush:scala">
/**
 * Convert to US Dollar the total amount.
 */
trait InUSDollar extends PriceScanner {
  abstract override def getTotalPrice() = { super.getTotalPrice()*1.3556  }
}
</pre>
<p>Les Traits sont réellement des caractéristiques que nous allons ajouter à la création de nos instances, au lieu de devoir les ajouter à la définition de notre classe. C&#8217;est maintenant que cela devient intéressant. Dans l&#8217;exemple ci-dessous j&#8217;ai déclaré 3 scanners différents. Chacun de ces Scanners dispose de plus ou moins de fonctionnalités selon les Traits. Notez aussi l&#8217;usage du mot clé &laquo;&nbsp;<strong>with</strong>&nbsp;&raquo; qui permet de donner l&#8217;ordre dans lequel les Traits seront ajoutés à la classe initiale :</p>
<pre class="brush:scala">

object Test {

  def main(args: Array[String]) = {
    val myPanier = new ClassicPriceScanner()  with FrenchTaxIncluded
    myPanier.scanArticle(100.0)

    val myUSDPanier : ClassicPriceScanner = new ClassicPriceScanner() with InUSDollar
    myUSDPanier.scanArticle(100.0)

    val myUSDPanierAndVAT : ClassicPriceScanner = new ClassicPriceScanner() with InUSDollar with FrenchTaxIncluded
    myUSDPanierAndVAT.scanArticle(100.0)

    println("Total in EUR: "+myPanier.getTotalPrice())
    println("Total in USD: "+myUSDPanier.getTotalPrice())
    println("Total in USD with VAT: "+myUSDPanierAndVAT.getTotalPrice())

  }
}
</pre>
<p>L&#8217;exécution de ce programme donne alors le résultat suivant : </p>
<pre>
Total in EUR: 119.6
Total in USD: 135.56
Total in USD with VAT: 162.12975999999998
</pre>
<p>Notez que ces tests ne sont pas très élégants. Pourquoi ne pas utiliser dès maintenant la librairie Specs de Scala Tools afin d&#8217;écrire des tests orientés développements ? La pratique du Behavior-Driven Development dont je pourrai parler dans un autre article, consiste à décrire sous forme de spécifications exécutables le résultat attendu.<br />
Télécharger <a href="http://scala-tools.org/repo-releases/org/specs/specs/1.4.3/">specs-1.4.3.jar</a> et ajoutez-le dans votre Classpath pour pouvoir lancer cette spécification :</p>
<pre class="brush:scala">
package org.letouilleur.tutorial.test

/**
 * BDD Specification for Traits article.
 * @author Nicolas Martignole
 */

import org.specs._

object PriceScannerSpec extends Specification {
  "ClassicPriceScanner with 2 articles at 100.0 EUR each " should {
    "return a total of 200.0 " in {
      val cp = new ClassicPriceScanner()
      cp.scanArticle(100.0)
      cp.scanArticle(100.0)
      cp.getTotalPrice() mustEqual 200.0
    }
  }

  "ClassicPriceScanner with 2 articles at 100.0 EUR each decorated with the FrenchTaxIncluded Trait" should {
    "return a total of 238.2 EUR" in {
      val cp = new ClassicPriceScanner() with FrenchTaxIncluded
      cp.scanArticle(100.0)
      cp.scanArticle(100.0)
      cp.getTotalPrice() mustEqual 239.2
    }
  }
}
</pre>
<p>Lorsque l&#8217;on exécute cette spécification, voici le résultat :</p>
<pre class="brush:scala">
Specification "PriceScannerSpec"
  ClassicPriceScanner with 2 articles at 100.0 EUR each  should
  + return a total of 200.0 

  Total for SUT "ClassicPriceScanner with 2 articles at 100.0 EUR each ":
  Finished in 0 second, 0 ms
  1 example, 1 expectation, 0 failure, 0 error

  ClassicPriceScanner with 2 articles at 100.0 EUR each decorated with the FrenchTaxIncluded Trait should
  + return a total of 238.2 EUR

  Total for SUT "ClassicPriceScanner with 2 articles at 100.0 EUR each decorated with the FrenchTaxIncluded Trait":
  Finished in 0 second, 0 ms
  1 example, 1 expectation, 0 failure, 0 error

Total for specification "PriceScannerSpec":
Finished in 0 second, 44 ms
2 examples, 2 expectations, 0 failure, 0 error
</pre>
<p>Sympa non ? Au passage vous noterez que Scala est particulièrement à l&#8217;aise dans le domaine des DSL. </p>
<p>Je m&#8217;arrête là pour les Traits. Je sais que les Aficionados de Scala vont largement commenter mes petits tests, qui ne doivent pas casser 2 pattes à un canard. Je débute les gars, donc cool, respirez un coup et pensez aux lecteurs qui n&#8217;y connaissent rien. Soyez pédagogue. </p>
<p><strong>Les Collections</strong><br />
Deuxième sujet aujourd&#8217;hui dont je veux vous parler : les Collections. Nous ouvrons la boîte de la programmation fonctionnelle dans cette partie. Je ne vais pas vous expliquer ce qu&#8217;est une Map ou un Set. En Scala nous retrouvons des objets List, Set et Map. Il existe 2 familles de collections : les objets immuables et les objets non immuables. Scala encourage l&#8217;utilisation d&#8217;objets immuables, ce qui rend service lorsque nous ferrons de la programmation concurrentielle la prochaine fois. En effet, un objet qui ne peut pas être modifié, n&#8217;a pas besoin d&#8217;être synchronisé. </p>
<p>Les Collections en Scala sont disponibles en plusieurs versions. Prenons les Lists par exemple, Scala 2.8 propose :<br />
- <a href="http://www.scala-lang.org/archives/beta-api/scala/collection/immutable/List.html">scala.collection.immutable.List</a><br />
- <a href="http://www.scala-lang.org/docu/files/api/scala/collection/mutable/LinkedList.html">scala.collection.mutable.LinkedList </a><br />
(notez qu&#8217;il n&#8217;existe pas de scala.collection.mutable.List)<br />
- <a href="http://www.scala-lang.org/docu/files/api/scala/collection/jcl/LinkedList.html">scala.collection.jcl.LinkedList</a></p>
<p>Le 3ème type jcl est un wrapper de la Class java.util.LinkedList. </p>
<p>Une Map est simple à écrire, c&#8217;est même plus concis que la version Java :</p>
<pre class="brush:scala">
   val aMap = Map("Nicolas"->180,"Pierre"->172,"Jacques"->181)

   println(aMap.size)

// affiche 3
</pre>
<p>Nous pouvons commencer à utiliser quelques spécificités de Scala pour créer une deuxième Map de type String,String où la taille de chaque personne est convertie en mètre, et ensuite transformé en chaine de caractère :</p>
<pre class="brush:scala">

object MapSample {
 def main(args: Array[String]) = {
    val aMap = Map("Nicolas"->180,"Pierre"->172,"Jacques"->181)

   println(aMap.size)

   val convertedInMeter = aMap map {kv => (kv._1,kv._2*0.01+"m")}
   println("People size in meter : "+convertedInMeter)

  }
}
</pre>
<p>L&#8217;exécution du code ci-dessus donne :</p>
<pre>

3
People size in meter : ArrayBuffer((Nicolas,1.8 m), (Pierre,1.72 m), (Jacques,1.81 m))
</pre>
<p>Nous pouvons aussi par exemple filtrer les clés ou les valeurs de la map, afin de créer une deuxième map ne contenant que les personnes qui font 1.80 mètre ou plus :</p>
<pre class="brush:scala">

   // Personne qui font plus de 180cm
   val tallPeople = aMap filter {kv =>  kv._2 > 180 }
   println("People taller than 180cm "+tallPeople)

  // Execution -> seul Jacques dépasse les 180 cm
  People taller than 180cm Map(Jacques -> 181)
</pre>
<p>Il existe un grand nombre de fonctions que l&#8217;on peut utiliser sur les collections :<br />
 &#8211; def drop (n: Int) : Collection[A] permet de retirer les n premiers éléments d&#8217;une itération, ou retourne vide sinon<br />
 &#8211; def dropWhile( p : (A) => Boolean) : Collection[A]  permet de supprimer d&#8217;une collection ses éléments tant que la condition de test retourne true.<br />
 &#8211; def exists(p: (A) => Boolean) : Iterable[A] permet de vérifier qu&#8217;un prédicat p se vérifie sur l&#8217;un des éléments de la collection<br />
 &#8211; def filter(p: (A) => Boolean) : Iterable[A] permet de filtrer la collection comme vu dans l&#8217;exemple ci-dessus<br />
 &#8211; def find(p: (A) => Boolean) : Option[A] permet de trouver le premier élément dans l&#8217;iterable qui satisfait le prédicat p<br />
 &#8211; def findIndexOf(p: (A) => Boolean) : Int permet de trouver le premier emplacement de l&#8217;élément qui satisfait le prédicat p, sinon retourne -1<br />
 &#8211; def forAll(p: (A) => Boolean) : Boolean permet d&#8217;appliquer un prédicat p à chacun des éléments de l&#8217;iterable et retournera true si le prédicat a retourné true pour chacun des éléments. C&#8217;est très pratique pour itérer une collection et effectuer un traitement à la volée.<br />
 &#8211; def indexOf [ B > A](elem : B) : Int retourne la position du premier élément qui correspond à l&#8217;objet spécifié<br />
 &#8211; def partition(p : (A) => Boolean) : (Iterable[A], Iterable[A]) permet de découper cette Iterable en 2 Iterables selon le prédicat spécifié<br />
 &#8211; def sameElements [B >: A](that : Iterable[B]) : Boolean permet de vérifier si un autre Iterable contient les éléments du premier Iterable<br />
 &#8211; def take(n : Int) : Collection[A] permet de prendre uniquement les n premiers éléments d&#8217;un Iterable, ou sinon retourne l&#8217;objet lui-même s&#8217;il est trop petit<br />
 &#8211; def takeWhile(p : (A) => Boolean) : Iterable[A] enfin permet de parcourir l&#8217;Iterable et d&#8217;accumuler dans une nouvelle Iterable les éléments tant que le prédicat est vrai. </p>
<p>Il y a d&#8217;autres méthodes pour les Set et pour les Maps. Nous constatons qu&#8217;il existe un ensemble de fonctions prêtes à l&#8217;emploi. </p>
<p><strong>Folding et Reducing</strong><br />
L&#8217;opérateur foldLeft permet de parcourir une List et de retourner soit une collection plus petite, soit parfois une seule valeur. Prenons le cas le plus simple (mais pas le plus représentatif) : vous souhaitez calculer la somme d&#8217;une liste d&#8217;entier. Je créé une liste de 1 à 10 puis j&#8217;applique la fonction foldLeft :</p>
<pre class="brush:scala">
object FoldingSample {
  def main(args: Array[String]) = {
    val shortList = 1 to 10 toList

    val result=shortList.foldLeft(0)((b,a) => b+a )
    println(result)  // will output 55

  }
}
</pre>
<p>foldLeft comme foldRight est ce que l&#8217;on appelle une &laquo;&nbsp;curried function&nbsp;&raquo;. Cette fonction prend 2 paramères (z et f) dans 2 ensembles de parenthèses. Ici z vaut 0 et f est une fonction d&#8217;addition. La définition Scala de la fonction est la suivante :</p>
<pre class="brush:scala">
def foldLeft[B](z: B)(f: (B, A) => B): B
</pre>
<p>z est de type B, n&#8217;importe quel type. f est une fonction qui prend B et A et retourne une valeur de type B. A sera en fait chacun des éléments de la collection sur laquelle nous appliquons la fonction foldLeft. Donc ici nous prenons un objet de type B, en l&#8217;occurrence 0 qui est un Int, nous effectuons l&#8217;addition de la valeur courante de la liste avec la valeur précédemment stockée, et nous retournons l&#8217;ensemble</p>
<p>Ici pour le premier élément de la liste, la fonction additionne 0 et 1, ce qui donne 1. Ensuite nous évaluons le deuxième élément de la liste qui est 2. Nous ajoutons l&#8217;ancien résultat 1 à 2, ce qui donne 3. Nous avançons au 3ème élément de la liste qui est 3. Nous évaluons la fonction avec l&#8217;ancienne valeur de 3, et cela donne 6. Peut-être que le détail vous aidera à comprendre ce qui se passe:<br />
(0+1)=1<br />
(1+2)=3<br />
(3+3)=6<br />
(6+4)=10<br />
(10+5)=15<br />
(15+6)=21<br />
(21+7)=28<br />
(28+8)=36<br />
(36+9)=45<br />
(45+10)=55</p>
<p>Cela vous semble peut-être un peu abstrait, mais c&#8217;est très pratique. Voici quelques exemples d&#8217;utilisation de cette fonction :</p>
<pre class="brush:scala">

// Moyenne de la série
val shortList = 1 to 10 toList
def average(list: List[Int]): Double = list.foldLeft(0.0)(_+_) / list.foldLeft(0.0)((r,c) => r+1)
println(average(shortList)) // affiche 5.5

// Produit : notez que l'on doit partir de 1 et pas de 0
def product(list: List[Int]): Int = list.foldLeft(1)(_*_)
println(product(shortList)) // affiche 3628800
</pre>
<p><strong>Conclusion</strong><br />
Scala propose donc des nouveautés et des concepts avancés comme les Traits, qui permettent d&#8217;introduire une programmation orientée fonctionnelle sans soucis. Nous n&#8217;avons pas parlé d&#8217;une dizaine de sujets, et je m&#8217;excuse auprès des 7 lecteurs qui maitrisent Scala et qui lisent le blog. Ecrire ces articles demande beaucoup de travail, entre 4  et 6 heures à chaque fois. Nous parlerons un peu de la concurrence et de la beauté de Scala dès lors qu&#8217;il s&#8217;agit de programmation multi-thread. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/11/scala-partie-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Soirée &#171;&#160;Emmanuel Bernard&#160;&#187; au Paris JUG</title>
		<link>http://www.touilleur-express.fr/2010/03/10/soiree-emmanuel-bernard-au-paris-jug/</link>
		<comments>http://www.touilleur-express.fr/2010/03/10/soiree-emmanuel-bernard-au-paris-jug/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 17:07:21 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[parisjug]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3262</guid>
		<description><![CDATA[Tu n&#8217;écris pas de compte rendu sur la soirée Emmanuel Bernard. C&#8217;est Emmanuel Bernard qui écrit le compte-rendu. Tu ne vas pas à la soirée Emmanuel Bernard, c&#8217;est lui qui t&#8217;invite (ou pas). Tu ne lis pas ce compte-rendu, Emmanuel te lit son compte rendu.
Sur le thème des ChuckNorris facts, Emmanuel a envoyé à l&#8217;équipe du Paris JUG son propre pitch pour la soirée d&#8217;hier soir. S&#8217;en est suivi plusieurs Emmanuel&#8217;s facts sur la liste de diffusion du Paris JUG, ce qui était très sympa pour donner un style fun ...]]></description>
			<content:encoded><![CDATA[<p><strong>Tu n&#8217;écris pas de compte rendu sur la soirée Emmanuel Bernard. C&#8217;est Emmanuel Bernard qui écrit le compte-rendu. Tu ne vas pas à la soirée Emmanuel Bernard, c&#8217;est lui qui t&#8217;invite (ou pas). Tu ne lis pas ce compte-rendu, Emmanuel te lit son compte rendu.</strong></p>
<p>Sur le thème <a href="http://www.chucknorrisfacts.fr/">des ChuckNorris facts</a>, Emmanuel a envoyé à l&#8217;équipe du Paris JUG <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100309">son propre pitch</a> pour la soirée d&#8217;hier soir. S&#8217;en est suivi plusieurs Emmanuel&#8217;s facts sur la liste de diffusion du Paris JUG, ce qui était très sympa pour donner un style fun pour une très bonne soirée.</p>
<p>Encore 210 personnes ce soir, sans problèmes. Quelques nouveaux sponsors pour le Paris JUG, comme <a href="http://www.ippon.fr">Ippon Technologies</a> qui devient sponsor Gold par exemple. Le buffet de ce soir est offert <a href="http://www.drims.fr/">par la société DRiMS</a>. Ils ont organisé un tirage au sort entre les 2 présentations afin de faire gagner quelques cadeaux aux juggeurs, ainsi que leur aide pour le buffet. Drims intervient dans différents secteurs sur les pôles MOA, MOE et le décisionnel. Nous sommes toujours content d&#8217;avoir de l&#8217;aide ponctuellement pour les Buffets, ce qui permet de recevoir 200 personnes et d&#8217;animer la soirée.</p>
<p><strong>JDuchess</strong><br />
<a href="http://www.touilleur-express.fr/wp-content/7dd0c98e918451724c38317bf0099881-bpfull.jpg"><img src="http://www.touilleur-express.fr/wp-content/7dd0c98e918451724c38317bf0099881-bpfull.jpg" alt="" title="jduchess" width="150" height="150" class="alignleft size-full wp-image-3263" /></a>La soirée débute avec l&#8217;arrivée sur scène <a href="http://jduchess.org/groups/duchess-france">des JDuchess France</a>. A l&#8217;initiative de Mathilde Lemée (Indépendante/blog <a href="http://java-freelance.fr/">Java-Freelance.fr</a>) et d&#8217;Ellène Dijoux (<a href="http://blog.xebia.fr/">Xebia France</a>) qui avaient rencontré lors de Devoxx 2009 les JDuchess hollandaises, elles se sont regroupées avec Laure Némée  (<a href="http://www.leetchi.com">Leetchi</a>[Updated]) et Claude Falguière (<a href="http://www.valtech.fr">Valtech</a>).</p>
<p>L&#8217;objectif du groupe JDuchess France est de proposer un groupe de rencontre aux femmes dans la communauté Java. Mesdames, que vous soyez développeur, architecte, ou autre, vous pouvez venir aux soirées du Paris JUG et être assurée d&#8217;être accueillie par une communauté sympa. Mathilde explique que le groupe JDuchess compte 158 membres dans le monde. Pour rappel, il y a 15 user groups en France, plus de 440 dans le monde. Et l&#8217;initiative de proposer un site communautaire, et des événements pour les femmes est une très bonne idée.<br />
<a href="http://www.touilleur-express.fr/wp-content/IMG_05701.jpg"><img src="http://www.touilleur-express.fr/wp-content/IMG_05701-300x200.jpg" alt="" title="IMG_0570" width="300" height="200" class="alignnone size-medium wp-image-3269" /></a><br />
L&#8217;équipe de JDuchess a organisé un Avant-JUG au restaurant le Vavin à 18h30 auxquelles 10 femmes ont participé. C&#8217;est aussi la possibilité de parler Java, de parler du métier entre elles, d&#8217;assurer une meilleure représentativité de Java auprès des femmes, qui motive le groupe. </p>
<p>Enfin c&#8217;est encore un succès pour la communauté et pour les Users Groups. Donc si vous êtes une femme intéressée par Java, et que vous êtes sur Paris, n&#8217;hésitez pas à vous inscrire <a href="http://jduchess.org/groups/duchess-france" target="new">sur le site communautaire de JDuchess</a>. Il y a 8 membres pour l&#8217;instant, j&#8217;espère que cet article fera venir du monde dans le groupe. </p>
<p><strong>Hibernate Search</strong><br />
<a href="http://www.touilleur-express.fr/wp-content/IMG_0575.jpg"><img src="http://www.touilleur-express.fr/wp-content/IMG_0575-300x212.jpg" alt="" title="IMG_0575" width="300" height="212" class="alignnone size-medium wp-image-3271" /></a><br />
Emmanuel Bernard prend ensuite la parole pour nous présenter Hibernate Search. Il travaille chez JBoss RedHat à Paris après un parcours aux USA pendant quelques temps. Emmanuel est un membre de l&#8217;équipe de développement d&#8217;Hibernate. Il intervient souvent dans différentes conférences, et nous sommes très content qu&#8217;il participe régulièrement au Paris JUG. Je pense qu&#8217;il a trouvé rapidement sa place depuis septembre dans la communauté parisienne. C&#8217;est aussi l&#8217;un des auteurs du Podcast sur Java &laquo;&nbsp;<a href="http://lescastcodeurs.com/" target="new">Les CastCodeurs</a>&laquo;&nbsp;, donc le prochain sujet sera sur Oracle et SUN avec la participation d&#8217;Alexis Moussine-Pouchkine. </p>
<p>Emmanuel a présenté Hibernate Search ce soir. J&#8217;avais vu cette présentation à Jazoon, je vous invite à relire <a href="http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-hibernate-search/">ce que j&#8217;écrivais à l&#8217;époque</a>. J&#8217;ai revu et réécouté celle-ci avec plaisir, Emmanuel ayant ajouté quelques points intéressants. </p>
<p>Sur la présentation, je pense que la partie code a satisfait ceux qui regrettent parfois le niveau trop général des présentations du JUG. Ce soir nous avons vraiment mis le nez dans le moteur. Pendant une heure, tout le monde a découvert la notion de recherche, l&#8217;indexation, la construction et l&#8217;interrogation des indexes Lucene. </p>
<p>J&#8217;aurai aimé un peu plus tard entendre Emmanuel sur le positionnement d&#8217;Hibernate Search par rapport au Cloud et JPA. Sur Google App Engine pour mon projet-toujours-pas-terminé &laquo;&nbsp;<a href="http://touilleur.appspot.com/">Geek Date</a>&nbsp;&raquo; j&#8217;avais utilisé <a href="http://www.compass-project.org/">Compass</a>. Cela me permet d&#8217;indexer les événements à la création et de proposer une zone de recherche full-text multi-critère sur la page d&#8217;accueil. </p>
<p><strong>Et le Buffet !</strong><br />
Une soirée JUG c&#8217;est 2 conférences et bien entendu, le Buffet. Au sondage pour l&#8217;anniversaire du Paris JUG, vous aviez été 70 personnes à répondre, et la place du buffet est très importante pour vous. Charles pourra vous détailler les chiffres, mais voici 2 indicateurs intéressants :<br />
<a href="http://www.touilleur-express.fr/wp-content/parisjug_buffet.jpg"><img src="http://www.touilleur-express.fr/wp-content/parisjug_buffet.jpg" alt="" title="parisjug_buffet" width="612" height="440" class="alignnone size-full wp-image-3266" /></a><br />
C&#8217;est un moment où chacun se rencontre, les discussions s&#8217;ouvrent, et où nous sommes content de nous voir. </p>
<p>Si je vous parle du buffet c&#8217;est pour vous faire passer une information. Ce soir encore, quelqu&#8217;un m&#8217;a dit qu&#8217;il cherchait un nouveau boulot. Fraichement arrivé à Paris, il lit régulièrement les différents blogs. Il m&#8217;a confié qu&#8217;il a envoyé son CV aux différents sponsors du Paris JUG car pour lui, ces boîtes représentent les entreprises où il souhaite travailler. C&#8217;est-ti pas beau comme histoire ?<br />
Moi je dis +25 points de <em>Bisounours</em> pour le Paris JUG qui contribue à un meilleur monde. </p>
<p><strong>Travailler sur l&#8217;écriture d&#8217;une API</strong><br />
<a href="http://www.flickr.com/photos/fredart/"><img src="http://www.touilleur-express.fr/wp-content/3418199118_583174b8a1_m.jpg" alt="Crédit Photo FredArt Licence Commons Creatives" title="3418199118_583174b8a1_m" width="240" height="159" class="alignright size-full wp-image-3287" /></a><br />
Emmanuel Bernard présente ensuite un sujet intéressant, et pas forcément évident au premier abord : quelles sont les difficultés et les particularités à prendre en compte lorsque l&#8217;on écrit une API ? </p>
<p>Il nous fait partager son expérience tirée du travail en tant que Spec Lead sur la JSR-303 (Bean Validation) et de ses années sur Hibernate Search. L&#8217;objectif est de présenter la notion d&#8217;API, les difficultés rencontrées, et de nous faire partager son boulot. Ce fut très intéressant, pour une présentation qu&#8217;il donnait pour la première fois. </p>
<p>Ecrire une API est un travail de longue haleine. Il y a toujours des personnes mécontentes, et apporter un changement à posteriori est difficile. Lorsqu&#8217;il explique ceci, nous prenons tout de suite conscience qu&#8217;il s&#8217;agit d&#8217;un travail à part entière, bien distinct de l&#8217;écriture de sa bonne grosse appli de gestion (BGAG). La difficulté de figer à un instant T un ensemble de méthodes et d&#8217;objets force celui qui écrit à travailler 5 fois plus qu&#8217;un projet classique. C&#8217;est donc non pas le volume, mais la qualité du code que l&#8217;on recherche ici.</p>
<p>Emmanuel explique que le temps passé est important aussi car une API est destinée&#8230; à des êtres humains. Elle doit donc être orientée utilisabilité. Le développement TDD ne suffit pas à assurer une qualité et une cohérence. Il semble que l&#8217;itératif soit obligatoire pour réussir. </p>
<p>Ecrire une API vous force à monter en compétences. La notion de DSL apparaît rapidement dans la présentation d&#8217;Emmanuel. Il s&#8217;agit bien d&#8217;utiliser l&#8217;expressivité de Java pour décrire comment faire quelque chose. D&#8217;ailleurs, la gymnastique sur les Annotations dans Hibernate Search en a surpris plus d&#8217;un. </p>
<p>J&#8217;ai demandé à Emmanuel s&#8217;il avait regardé Scala plus tard dans la soirée. En effet, il parle à la fin de sa présentation de l&#8217;avantage des classes Abstraites par rapport aux interfaces. C&#8217;est justement la notion de Trait que l&#8217;on trouve dans Scala. Le temps de terminer mon deuxième article, vous verrez cela d&#8217;ici à la fin de cette semaine. </p>
<p>Pour revenir en arrière, écrire une API est un exercice sportif. Il parle de chuter plusieurs fois pour progresser, comme en Snow board. Il faut mettre en place une stratégie pour proposer à l&#8217;utilisateur de nouvelles fonctions, tout en gérant le cas où vous n&#8217;êtes pas certain de vous&#8230; ce qui arrive souvent. Il faut donc prévenir le développeur que vous êtes susceptible de modifier certaines fonctions. </p>
<p>En fait, c&#8217;est l&#8217;inverse du @deprecated utilisé pour indiquer qu&#8217;une méthode ne doit plus être utilisée dans votre code. Emmanuel tu devrais proposer une annotation comme @candidate, @proposed ou @ChuckNorris.<br />
<a href="http://www.flickr.com/photos/9801617@N06" target="new"><img src="http://www.touilleur-express.fr/wp-content/1298334790_05a65235a5-199x300.jpg" alt="" title="1298334790_05a65235a5" width="199" height="300" class="size-medium wp-image-3273" /></a><br />
<em>Crédit photo : <a href="http://www.flickr.com/photos/9801617@N06/">Rolf Hiker</a></em></p>
<p>Emmanuel présente ensuite quelques exemples de patterns utilisés lors de l&#8217;écriture d&#8217;API. La partie sur l&#8217;utilisation des annotations a certainement comblé le geek le plus obscurantiste de la salle. Il a cependant évité l&#8217;effet jantes-alliages tuning avec &laquo;&nbsp;<em>regardez mes belles annotations</em>&laquo;&nbsp;. Les explications sur le changement des APIs de Mapping étaient vraiment intéressantes. On retient que l&#8217;écriture d&#8217;API reste un sport de haut niveau, où la maîtrise de Java est vraiment importante. </p>
<p>Emmanuel termine sa présentation en donnant quelques bonnes pratiques. Tout d&#8217;abord, si vous écrivez une API sur un projet, il est indispensable de la faire vivre sur des exemples d&#8217;intégration. Les tests unitaires ne suffisent pas. </p>
<p>Lors des choix des verbes et des noms de méthodes ou d&#8217;objets, travaillez à plusieurs sur vos choix de mots. Car une fois ceux-ci à l&#8217;intérieur de l&#8217;API, il est difficile de changer. Je pense que sans le savoir, Emmanuel parle de Domain Driven Design. Dans cette pratique, nous travaillons sur la définition de <a href="http://domaindrivendesign.org/node/132">l&#8217;Ubiquitous Language</a>. C&#8217;est un exercice qui permet de créer une langue commune entre les gens du métier et les développeurs. Dans le cadre du travail sur une API, il faudrait lister les verbes, les noms, dessiner une MindMap de ce que fait l&#8217;API. Cela permettrait de s&#8217;assurer que les mots sont correctement choisis. </p>
<p>Emmanuel encourage l&#8217;utilisation de DSL interne afin de rendre plus facile l&#8217;utilisation de l&#8217;API. A propos de DSL externe, le plus connu que vous avez tous utilisé sans le savoir est&#8230; le langage SQL. Il nous montre l&#8217;enchainement de verbes d&#8217;actions et d&#8217;adjectifs pour la définition de la configuration dans Hibernate Search. Je crois qu&#8217;il s&#8217;agit du pattern Builder si je ne dis pas de bêtises. Plus facile à mettre en oeuvre avec Groovy que Java. </p>
<p>Une astuce aussi pour l&#8217;API est de penser &laquo;&nbsp;comportement par défaut&nbsp;&raquo;. Ne demandez pas à vos utilisateurs de déclarer trop de paramètres qui ne changent pas ou peu. Il montre un exemple avec Hibernate Search où l&#8217;API s&#8217;arrange pour se configurer avec un comportement par défaut, afin d&#8217;alléger la quantité de code. Cela rend l&#8217;API plus Agile.</p>
<p><strong>Conclusion et 3ème mi-temps</strong><br />
Emmanuel a bien animé la soirée. Les 2 sujets étaient intéressants. C&#8217;est un bon speaker qui fait passer son message, sans fioritures. Il a même répondu aux questions posés<a href="http://thecodersbreakfast.net/index.php?post/2010/03/06/Paris-JUG-Emmanuel-Bernard"> sur la Wave d&#8217;Olivier Croisier</a> lorsque nous étions au restaurant. C&#8217;était vraiment sympa de sa part.<br />
<a href="http://www.touilleur-express.fr/wp-content/IMG_0576.jpg"><img src="http://www.touilleur-express.fr/wp-content/IMG_0576.jpg" alt="" title="IMG_0576" width="640" height="480" class="alignnone size-full wp-image-3283" /></a></p>
<p>Si j&#8217;avais un truc à demander à Emmanuel, ce serait d&#8217;ajouter quelques images dans ses slides pour appuyer ses idées.</p>
<p><strong>Documentez l&#8217;utilisation de votre API</strong><br />
<a href="http://www.touilleur-express.fr/wp-content/344687059_33b56dfc89.jpg"><img src="http://www.touilleur-express.fr/wp-content/344687059_33b56dfc89-300x225.jpg" alt="" title="344687059_33b56dfc89" width="300" height="225" class="alignnone size-medium wp-image-3281" /></a><br />
<em>Crédit photo : penguin http://www.flickr.com/photos/48600074504@N01/</p>
<p><strong>Pensez au pattern Adaptor</strong><br />
<div id="attachment_3278" class="wp-caption alignnone" style="width: 310px"><a href="http://www.touilleur-express.fr/wp-content/2969264395_0db28f9b94.jpg"><img src="http://www.touilleur-express.fr/wp-content/2969264395_0db28f9b94-300x199.jpg" alt="" title="2969264395_0db28f9b94" width="300" height="199" class="size-medium wp-image-3278" /></a><p class="wp-caption-text">Crédit photo : DeaPeaJay http://www.flickr.com/photos/deapeajay/2969264395/</p></div></p>
<p><strong>Votre API doit être simple à utiliser</strong><br />
<a href="http://www.touilleur-express.fr/wp-content/3858965355_4e4123201d_m.jpg"><img src="http://www.touilleur-express.fr/wp-content/3858965355_4e4123201d_m.jpg" alt="" title="3858965355_4e4123201d_m" width="240" height="240" class="alignnone size-full wp-image-3284" /></a><br />
</em><em>Crédit photo 1D110 http://www.flickr.com/photos/22297595@N02/</em></p>
<p>Note : les photos de cet article sont en licence Commons Creatives, trouvées sur FlickR.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/10/soiree-emmanuel-bernard-au-paris-jug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scala, partie 1</title>
		<link>http://www.touilleur-express.fr/2010/03/08/scala-partie-1/</link>
		<comments>http://www.touilleur-express.fr/2010/03/08/scala-partie-1/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 08:51:54 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3237</guid>
		<description><![CDATA[
Je profite d&#8217;un peu de temps entre 2 missions pour me former à Scala depuis quelques temps. J&#8217;ai vraiment beaucoup de plaisir à apprendre et à travailler avec ce nouveau langage. Proche de Java, il est pourtant bien différent, et vraiment intéressant comme nous allons le voir ensemble. 
James Gosling, l&#8217;un des inventeurs de Java, a dit à propos de Scala la phrase suivante :
&#171;&#160;If I were to pick a language to use today other than Java, it would be Scala&#160;&#187; 
Plus suprenant, James Strachan qui a initié le langage ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/csb13/"><img src="http://www.touilleur-express.fr/wp-content/103419156_c365a7e71b-300x199.jpg" alt="Crédit Photo : Chris Blakeley" title="machine à café" width="300" height="199" class="alignleft size-medium wp-image-3241" /></a><br />
Je profite d&#8217;un peu de temps entre 2 missions pour me former à <a href="http://www.scala-lang.org" taget="mw">Scala</a> depuis quelques temps. J&#8217;ai vraiment beaucoup de plaisir à apprendre et à travailler avec ce nouveau langage. Proche de Java, il est pourtant bien différent, et vraiment intéressant comme nous allons le voir ensemble. </p>
<p>James Gosling, l&#8217;un des inventeurs de Java, a dit à propos de Scala la phrase suivante :</p>
<blockquote><p>&laquo;&nbsp;If I were to pick a language to use today other than Java, it would be Scala&nbsp;&raquo; </p></blockquote>
<p>Plus suprenant, <a href="http://en.wikipedia.org/wiki/James_Strachan_(programmer)">James Strachan</a> qui a initié le langage Groovy en 2004, a dit aussi à propos de Scala :</p>
<blockquote><p>&laquo;&nbsp;I can honestly say if someone had shown me the Programming in Scala book by by Martin Odersky, Lex Spoon &#038; Bill Venners back in 2003 I’d probably have never created Groovy.&nbsp;&raquo;</p></blockquote>
<p>Le langage a été initié en 2003. Scala (pour <strong>Sca</strong>lable <strong>La</strong>nguage) a été pensé pour la programmation multi-threads, avec un niveau de qualité assez impressionnant. J&#8217;aime ce langage car au final, ce sera toujours du bytecode dans une machine virtuelle Java.<br />
C&#8217;est un langage orienté objet avec une teinte de programmation fonctionnelle. Créé en 2003 par Martin Odersky, Scala est  supporté par l&#8217;EPFL (Ecole Polytechnique Fédérale de Lausanne). Typé statiquement, il propose par exemple une inférence de type très puissante, qui rend la programmation Java &laquo;&nbsp;old-school&nbsp;&raquo; dès lors que l&#8217;on débute en Scala. </p>
<p><strong>Scala est concis</strong><br />
Le langage est très concis. Prenons par exemple un BVOJTP (<em>Bon Vieil Objet Java Tout Pourri</em>) et voyons ce que cela donne dans sa version Scala. Je prends par exemple un simple Bean &laquo;&nbsp;Person&nbsp;&raquo; avec quelques attributs.</p>
<p>La version Java</p>
<pre class="brush:java">
public class PersonInJava {
    private String firstName;
    private String lastName;
    private Date dateOfBirth;

    public PersonInJava(String firstName, String lastName, Date dateOfBirth) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.dateOfBirth = dateOfBirth;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
}
</pre>
<p>La version Scala :</p>
<pre class="brush:scala">

class PersonInScala(val firstName: String, val lastName: String, val dateOfBirth: Date) 
</pre>
<p>Et oui&#8230; par défaut il n&#8217;est pas nécessaire de déclarer les getters/setters, ni de constructeur par exemple. </p>
<p><strong>Inférence de types</strong><br />
Scala  est capable de deviner les types associés à des expressions automatiquement (voir la définition de<a href="http://fr.wikipedia.org/wiki/Inférence_de_types">l&#8217;inférence de types</a>). Cela permet de conserver un type fort en interne, tout en allégeant le code source.</p>
<pre class="brush:scala">
var year: Int = 2010
var anotherYear = 2010 

var helloBuddy = "Salut !" 

var builder = new StringBuilder("Bonjour")

println(builder.getClass())
</pre>
<p>La première variable est définie comme étant de type Int. Remarquez ensuite que la variable <em>anotherYear</em> est définie sans spécifier de type. Scala infère le type en Int automatiquement grâce à la valeur que nous avons assignée à cette variable. Ce type est définitif, il s&#8217;agit bien d&#8217;un type statique.</p>
<p>Si par exemple j&#8217;essaye d&#8217;affecter une String un peu plus tard à ma variable <em>anotherYear</em> alors Scala me signale à la compilation qu&#8217;il y a un souci : </p>
<pre class="brush:scala">
var anotherYear=2010
anotherYear="This is a String"

(je compile le code...)

!!!
discarding <script preamble>
(fragment of TypeInference.scala):7: error: type mismatch;
 found   : java.lang.String("Test")
 required: Int
anotherYear="Test"

</script></pre>
<p>Pour revenir un peu plus haut, la variable <em>helloBuddy</em> est inférée en java.lang.String automatiquement, et la variable <em>builder</em> en StringBuilder. Dans la pratique, pour un développeur Java il n&#8217;y a pas grand chose à faire. Il reste possible de typer ses variables, mais cela ne devient plus indispensable. Enfin la vérification à la compilation nous épargne les soucis de transtypage à la Java et certainement quelques soucis comme avec un langage dynamique.</p>
<p><strong>Programmation fonctionnelle</strong><br />
Je ne vous donnerai qu&#8217;un aperçu car c&#8217;est un sujet vaste. En Scala il est possible de créer des fonctions à l&#8217;intérieur de fonctions, de passer des méthodes en paramètres à d&#8217;autres méthodes, bref les fonctions en Scala sont des Objets à part entière. Nous retrouvons la notion de pointeur de fonctions en quelques sortes. </p>
<p>La programmation fonctionnelle sera présenté en Avril au Paris JUG, ainsi que Scala d&#8217;ailleurs. Cela vous donnera l&#8217;occasion de voir un peu ce que cela peut vous apporter en tant que vieux Java-iste. </p>
<p>Prenons un exemple tiré du livre &laquo;&nbsp;<a href="http://www.pragprog.com/titles/vsscala/programming-scala">Programming Scala</a>&nbsp;&raquo; écrit par V.Subramaniam. Ecrivez une fonction qui effectue la somme d&#8217;une suite de nombre sur une plage passée en argument. Voici la version Java :</p>
<pre class="brush:java">
public int sum(int number) {
  int result = 0;
  for(int i = 1; i < = number; i++) {
         result += i;
  }
  return result;
}
</pre>
<p>Comment feriez-vous si je vous demande maintenant de faire l'addition des nombres pairs uniquement ? En Java vous feriez une copie de cette méthode, pour en créer une nouvelle, avec votre algo. En Scala, il est possible de passer une méthode en paramètre. Nous allons donc extraire la logique de la sélection des valeurs, et la définir à l'extérieur.<br />
Des fonctions qui prennent en paramètre d'autres fonctions sont appelées "<em>higher-order function</em>". En Scala vous pouvez créer des fonctions à l'intérieur d'autres fonctions, les passer en paramètre et les assigner à des références. </p>
<p>Voici une version en Scala pour itérer sur une plage de valeur. Pour chaque valeur nous allons appeler la fonction référencée par <em>codeBlock</em> qui retourne un Int. </p>
</pre>
<pre class="brush:scala">

def totalResultOverRange(number: Int, codeBlock: Int => Int) : Int = {
 var result = 0
 for (i < - 1 to number) {
     result += codeBlock(i)
  }
  result
}
</pre>
<p>Donc pour effectuer la somme de valeur, nous pourrons appeler la fonction en spécifiant une fonction d'addition très simple :
</pre>
<pre class="brush:scala">
// Sum up to 10
println(totalResultOverRange(11, i => i))
</pre>
<p>Le premier argument, 11, est la limite supérieure de notre série. Le second argument est une fonction anonyme qui prend en argument un type et qui le retourne sans modification. Notez qu&#8217;ici nous ne précisons pas le type Int, il sera inféré par Scala au moment voulu en examinant la signature de la méthode <em>totalResultOverRange</em>.</p>
<p>Si je vous demande maintenant d&#8217;effectuer la somme des nombres pairs uniquement dans la série, voici comment nous écrirons en Scala cet appel:</p>
<pre class="brush:scala">
println(totalResultOverRange(11, i => if (i % 2 == 0) 1 else 0))
</pre>
<p>Si le modulo 2 du compteur courant est égal à 0, alors nous retournons 1 pour vrai, sinon 0. </p>
<p>Il est bien entendu possible de définir des <strong>Closures</strong>. Ici nous définissons une variable <em>closure</em> qui sera un pointeur vers une méthode. </p>
<pre class="brush:scala">
def loopThrough(number: Int)(closure: Int => Unit) {
  for (i < - 1 to number) {
     closure(i)
   }
}
</pre>
<p>Voici un exemple d'utilisation :
</pre>
<pre class="brush:scala">
var result = 0
val addIt = { value:Int => result += value }
</pre>
<p>Dans ces quelques lignes ci-dessus je crée une variable &laquo;&nbsp;addIt&nbsp;&raquo; qui est un bout de code pour effectuer l&#8217;accumulation de deux valeurs. Notez que la variable <em>result</em> n&#8217;est pas définie dans ce bloc ni comme paramètre. En fait cette variable est branchée à la variable <em>result</em> en dehors du bloc de code. Je pense qu&#8217;un exemple sera plus parlant pour expliquer cette subtilité :</p>
<pre class="brush:scala">
var result = 0
val addIt = { value:Int => result += value }

loopThrough(10) { addIt }
println("Total of values from 1 to 10 is " + result)

result = 0
loopThrough(5) { addIt }
println("Total of values from 1 to 5 is " + result)

// Execution
Total of values from 1 to 10 is 55
Total of values from 1 to 5 is 15
</pre>
<p>Comprenez qu&#8217;une Closure est un bloc de code qui s&#8217;exécute dans un contexte, tout en étant capable de modifier des variables externes. Lorsque j&#8217;appelle la méthode loopThrough() en spécifiant une closure, la variable result est vue comme une variable globale. Lorsque je remet à 0 la variable, la closure le &laquo;&nbsp;voit&nbsp;&raquo; aussi et débute à nouveau l&#8217;itération de 0. Il est possible aussi de n&#8217;utiliser que des variables locales pour ne pas avoir cet effet bien entendu.  C&#8217;est la vraie notion de Closure, où les variables d&#8217;une portée plus importante sont vues localement au sein de la fonction. </p>
<p><strong>Conclusion de cette première partie</strong><br />
Scala est donc un langage fortement typé, capable de faire de l&#8217;inférence de types, avec une manipulation des fonctions très puissante, et la possibilité d&#8217;utiliser des Closures.</p>
<p>En Scala, tout est objet. Un nombre comme &laquo;&nbsp;2&#8243; est un objet sur lequel il est possible d&#8217;appeler une fonction. Les fonctions sont des objets, que vous passez en paramètre, afin d&#8217;exécuter des traitements fonctionnels. </p>
<p>Nous verrons la prochaine fois les Traits et les Collections, puis nous parlerons de programmation concurrente avec les Actors. </p>
<p>Je vous recommande la lecture de   &laquo;&nbsp;<a href="http://www.pragprog.com/titles/vsscala/programming-scala">Programming Scala</a>&nbsp;&raquo; écrit par V.Subramaniam. Ce livre a été pensé pour des développeurs Java qui souhaitent apprendre rapidement Scala.</p>
<p>Je pense qu&#8217;il ne faut que quelques semaines pour être opérationnel. Il y a le risque de faire du &laquo;&nbsp;Java-like&nbsp;&raquo; avec Scala, comme nous faisions du C à la place du C++. Mais je pense cependant que vu la maturité du langage, la quantité de documentations et de livres disponibles, nous pouvons éviter de tomber dans ce piège. </p>
<p><a href="http://www.parisjug.org/xwiki/bin/view/Speaker/BertailsAlexandre">Alexandre Bertails</a> a préparé la version Scala de <a href="http://www.touilleur-express.fr/2010/02/14/traitement-du-xml-en-groovy/">mon article sur le XML et Groovy</a>. Vous verrez différentes versions d&#8217;ici quelques jours, le temps de terminer les 2 autres articles sur Scala.</p>
<p>Bon, je pose le crayon deux secondes, j&#8217;ai besoin de toute votre attention. Eteignez Twitter, fermez Gmail, écoutez-moi : vous allez apprendre Scala. C&#8217;est un ordre. Si vous ne voulez pas être sur le côté de la route lorsque les petits jeunes roulant en Scala Bac+5 passerons à côté de vous, bougez-vous. Achetez un livre, prenez le temps de vous former à nouveau.</p>
<p>Etre bon en Spring, Hibernate, GWT c&#8217;est bien. Maintenant ce qui va faire la différence, ce sera la capacité à proposer sur le marché d&#8217;autres langages pour répondre aux clients. N&#8217;oubliez pas ce que j&#8217;ai dit au début : Scala c&#8217;est du bytecode qui tourne dans une JVM. Donc pas d&#8217;excuses, vous me ferez 2 séries d&#8217;abdos, et ensuite vous filez en formation Scala. </p>
<p>Non mais !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/08/scala-partie-1/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>KawaCampParis 1 le mardi 23 mars, notez cela sur vos iPad</title>
		<link>http://www.touilleur-express.fr/2010/03/04/kawacampparis-1-le-mardi-23-mars-notez-cela-sur-vos-ipad/</link>
		<comments>http://www.touilleur-express.fr/2010/03/04/kawacampparis-1-le-mardi-23-mars-notez-cela-sur-vos-ipad/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 16:10:02 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>
		<category><![CDATA[barcamp]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3233</guid>
		<description><![CDATA[Le KawaCampParis 1 est prévu le mardi 23 mars à partir de 19h00 au Quigley&#8217;s Point à Paris. Les inscriptions s&#8217;effectuent via le Wiki directement, après avoir créé un compte. Si vous n&#8217;avez pas vécu l&#8217;expérience BarCamp au moins une fois, venez voir ce que cela donne. C&#8217;est l&#8217;occasion de débattre de sujets à la mode dans notre monde de Geek Java en ce moment. Le mot HTML 5 semble être le sujet le plus demandé pour l&#8217;instant. 
Rendez-vous le mardi 23 mars 2010 à 19h00.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.touilleur-express.fr/wp-content/quigleys.jpg"><img src="http://www.touilleur-express.fr/wp-content/quigleys.jpg" alt="" title="quigleys" width="300" height="265" class="alignleft size-full wp-image-3234" /></a>Le KawaCampParis 1 est prévu le mardi 23 mars à partir de 19h00 au <a href="http://dismoiou.fr/p/fra/paris/5Fb7sM/quigley-s-point">Quigley&#8217;s Point</a> à Paris. Les inscriptions s&#8217;effectuent <a href="http://barcamp.org/KawaCampParis1">via le Wiki directement</a>, après avoir créé un compte. Si vous n&#8217;avez pas vécu l&#8217;expérience BarCamp au moins une fois, venez voir ce que cela donne. C&#8217;est l&#8217;occasion de débattre de sujets à la mode dans notre monde de Geek Java en ce moment. Le mot HTML 5 semble être le sujet le plus demandé pour l&#8217;instant. </p>
<p>Rendez-vous le mardi 23 mars 2010 à 19h00.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/04/kawacampparis-1-le-mardi-23-mars-notez-cela-sur-vos-ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J&#8217;ai besoin de vous pour un sondage</title>
		<link>http://www.touilleur-express.fr/2010/03/04/jai-besoin-de-vous-pour-un-sondage/</link>
		<comments>http://www.touilleur-express.fr/2010/03/04/jai-besoin-de-vous-pour-un-sondage/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 15:40:29 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>
		<category><![CDATA[Startup]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[sondage]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3229</guid>
		<description><![CDATA[[Edit: 11 mars 2010 j'ai 281 réponses ! Merci à ceux qui ont déjà répondu]
Salut, 
Voilà je m&#8217;appelle Nicolas, je prépare une présentation sur les communautés et les tribus dans le monde informatique, plus particulièrement dans notre univers à nous, les Geeks.
Là c&#8217;est là que tu entres sur scène, car j&#8217;ai besoin de toi. Je cherche à faire un maximum de bruit afin de diffuser ce sondage à des développeurs, à des salariés de SSII, à des équipes logicielles chez des éditeurs, afin d&#8217;évaluer les attentes de chacun par rapport ...]]></description>
			<content:encoded><![CDATA[<p>[Edit: 11 mars 2010 j'ai 281 réponses ! Merci à ceux qui ont déjà répondu]</p>
<p>Salut, </p>
<p>Voilà je m&#8217;appelle Nicolas, je prépare une présentation sur les communautés et les tribus dans le monde informatique, plus particulièrement dans notre univers à nous, les Geeks.</p>
<p>Là c&#8217;est là que tu entres sur scène, car j&#8217;ai besoin de toi. Je cherche à faire un maximum de bruit afin de diffuser ce sondage à des développeurs, à des salariés de SSII, à des équipes logicielles chez des éditeurs, afin d&#8217;évaluer les attentes de chacun par rapport à l&#8217;esprit communautaire. </p>
<p>Je n&#8217;en dis pas plus pour ne pas vous influencer, mais je vous ferai part des résultats du sondage bien entendu. </p>
<p>Donc voici ce que je te demande : peux-tu exceptionnellement diffuser cet article à tes connaissances afin qu&#8217;elles y répondent ? Alors je ne parle pas de tes copines sur Facebook, mais bien de tes VRAIS amis, ces barbus avec un teeshirt Linux qui codent jusqu&#8217;au petit matin, un carton de Pizza Hut posé sur le bureau. </p>
<p>Je compte sur toi, </p>
<p>Nicolas Martignole</p>
<p>URL du formulaire : <a href="https://spreadsheets.google.com/viewform?hl=fr&#038;formkey=dGstcFg2bE9WVGE4eU5vbl9wSGt4bWc6MA" target="new">https://spreadsheets.google.com/viewform?hl=fr&#038;formkey=dGstcFg2bE9WVGE4eU5vbl9wSGt4bWc6MA</a><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<h3>Répondre en ligne directement</h3>
<p>Tu peux aussi répondre en ligne directement ci-dessous : </p>
<p><iframe src="https://spreadsheets.google.com/embeddedform?formkey=dGstcFg2bE9WVGE4eU5vbl9wSGt4bWc6MA" width="760" height="3431" frameborder="0" marginheight="0" marginwidth="0">Chargement&#8230;</iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/04/jai-besoin-de-vous-pour-un-sondage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Esprit es-tu là ? Guide de survie du développeur</title>
		<link>http://www.touilleur-express.fr/2010/03/04/esprit-developpeur/</link>
		<comments>http://www.touilleur-express.fr/2010/03/04/esprit-developpeur/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 09:11:02 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Perso]]></category>
		<category><![CDATA[communaute]]></category>
		<category><![CDATA[humeur]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=3217</guid>
		<description><![CDATA[Aaaah l&#8217;Esprit d&#8217;équipe.
Cet ingrédient vendu dans toutes les bonnes boutiques de formation en Managment. Des coachs déversent des litres de savoir stéréotypés, en vous promettant monts et merveilles&#8230; Mais après avoir cramé vos 30 jours de DIF, le constat est amère : vous n&#8217;êtes pas fichu de motiver votre équipe. En fait vous avez même un fichu mal à comprendre comment motiver vos développeurs.    
Ce qui frappe aujourd&#8217;hui c&#8217;est avant tout le changement de génération dans le monde du développeur. Je pense qu&#8217;il y a eu un ...]]></description>
			<content:encoded><![CDATA[<p>Aaaah l&#8217;Esprit d&#8217;équipe.<br />
Cet ingrédient vendu dans toutes les bonnes boutiques de formation en Managment. Des coachs déversent des litres de savoir stéréotypés, en vous promettant monts et merveilles&#8230; Mais après avoir cramé vos 30 jours de DIF, le constat est amère : vous n&#8217;êtes pas fichu de motiver votre équipe. En fait vous avez même un fichu mal à comprendre comment motiver vos développeurs.    </p>
<p>Ce qui frappe aujourd&#8217;hui c&#8217;est avant tout le changement de génération dans le monde du développeur. Je pense qu&#8217;il y a eu un creux sur le nombre de développeurs en France il y a quelques années. J&#8217;ai entendu que le développement était sale, que les jeunes diplômés délaissaient la voie sacrée du Développeur pour prendre d&#8217;autres chemins. Cela donne, et moi le premier, de jeunes trentenaires dans la force de l&#8217;âge, aveuglé comme des moustiques autour d&#8217;un lampadaire, d&#8217;un néon où il y aurait marqué &laquo;&nbsp;Chef de Projet&nbsp;&raquo;. Passé les quelques mois, combien d&#8217;entre vous découvrent la dur réalité de cette tâche ? Gérer un projet c&#8217;est facile. Gérer des hommes, ça c&#8217;est amusant. </p>
<p>La difficulté du jeune manager, et qui veut piloter une équipe, c&#8217;est avant vous, les 25-35 ans, que l&#8217;on appelle &laquo;&nbsp;<a href="http://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9ration_Y">Génération Y</a>&laquo;&nbsp;. Or je me demande si les méthodes de gestion et de management ont évolué aussi vite que nous.</p>
<p>La génération Y est cette tranche d&#8217;âge de 25-35 ans, qui débarque dans le monde du travail, bien déterminé à faire sa place. Basé sur la méritocratie, cette génération ne respecte ses pères que lorsque ceux-ci sont légitimes. Que ce soit avec un charisme, de l&#8217;expérience, ou une réelle capacité à mener des personnes, il n&#8217;est pas rare de voir quelques oiseaux capable de gérer correctement une équipe.<br />
Et puis il y a les autres&#8230;</p>
<p>Alors disons qu&#8217;il y a ceux qui se sont pris un coup de foudre. Un matin je me réveille et je décide de grimper dans la chaîne alimentaire de l&#8217;entreprise. Les motivations les plus diverses font que les gens veulent devenir &laquo;&nbsp;chef de&#8230;&nbsp;&raquo;. C&#8217;est parfois pour masquer un lourd handicap et une réelle incompétence technique. C&#8217;est parfois pour payer le crédit du Citronault Picasso. C&#8217;est parfois une fuite en avant&#8230; Mais sont-ils heureux pour autant ? </p>
<p>Le management de premier niveau, les premiers &laquo;&nbsp;chefs&nbsp;&raquo;, sont parait-il les responsables du Stress de premier niveau (<a href="http://www.capital.fr/carriere-management/actualites/le-stress-au-travail-releve-du-management-selon-un-rapport-478717">source</a>). A quand en effet, non pas un Bonus indexé sur votre capacité à délivrer un logiciel, mais un bonus social voté par votre équipe selon votre performance de manager ? Mince alors. Après tout, délivrer un logiciel, c&#8217;est ce pour quoi vous êtes payé. Ensuite, être capable de gérer des personnes, de les aider sans les stresser, c&#8217;est sacrément plus dur que de faire mumuse avec Microsoft Project non ? A quand une nouvelle application dans Microsoft Office pour suivre le stress de vos collaborateurs ? </p>
<p>L&#8217;Esprit d&#8217;équipe&#8230; Si chaque équipe avait un budget illimité, bien entendu que la vie serait plus facile. Mais pourtant il existe un bon nombre de moyens simples pour transformer une équipe qui dort en une équipe qui s&#8217;amuse, qui se marre et qui avance. </p>
<p>Prenez les méthodes Agiles. Il y a ceux qui hésitent à changer et qui veulent d&#8217;abord comprendre si l&#8217;Agilité est faite pour eux. Et il y a les autres, qui changent de méthode, et qui ensuite comprennent qu&#8217;il fallait changer pour avancer. C&#8217;est l&#8217;exemple type où il faut se jeter dans le grand bain, boire une bonne tasse, et ensuite seulement commencer à avancer et à reconstruire quelque chose. Mettre en place une nouvelle méthode c&#8217;est bien. Mais si vous n&#8217;avez pas d&#8217;Esprit d&#8217;équipe, c&#8217;est dangereux. </p>
<p>J&#8217;avais parlé il y a longtemps de la difficulté à créer une équipe de développement. Il est important de mélanger <a href="http://www.touilleur-express.fr/2007/11/07/10-profils-de-developpeurs-psychopathes-ou-comment-on-se-soigne/">les types de développeurs</a>. Dans la réalité il faut composer avec un existant, avec un capital humain. Allez je le dis&#8230; il faut gérer le &laquo;&nbsp;<em>Legacy Humain</em>&laquo;&nbsp;. Mais cela n&#8217;empêche pas d&#8217;apprendre quelques techniques pour qu&#8217;une équipe marche. </p>
<p>Trouver de bons développeurs c&#8217;est d&#8217;abord la cooptation. Donnez 3000 EUR si l&#8217;un de vos gars trouve la perle rare, et que celle-ci passe le cap de la période d&#8217;essai. Ce n&#8217;est que 5 semaines d&#8217;annonces sur un site de recherche d&#8217;emploi&#8230; Une paille. </p>
<p>Le développeur est un animal grégaire, qui migre de sociétés en sociétés tous les 3 ans en moyenne. Des personnes avec 10 ans d&#8217;expérience en Java ont au moins fait 2 voir 3 sociétés. Elles ont rencontré du monde. Et elles ont des amis. Une sorte de FaceBook, mais en vrai. Et ce qui devient intéressant, c&#8217;est aussi leur capacité à vous proposer de bons profils. Un peu comme une équipe où chacun connaît ses points forts et ses faiblesses, les +10 ans se baladent avec un réseau de connaissance assez important.<br />
C&#8217;est un réseau qui dort. Si vous n&#8217;êtes pas inscrit sur Viadeo ou LinkedIn, je ne peux rien pour vous. Comme un bon petit jardinier, vous devez cultiver votre réseau d&#8217;amis. N&#8217;acceptez pas non plus le tout venant. Ces réseaux professionnels ne sont pas des réseaux de &laquo;&nbsp;copains&nbsp;&raquo; comme FaceBook ou &laquo;&nbsp;Copains d&#8217;avant&nbsp;&raquo;. Avoir 13450 amis c&#8217;est stupide. En avoir aucun, c&#8217;est dommage. </p>
<p> Là où je voulais en venir au départ, c&#8217;était de vous parler d&#8217;Esprit d&#8217;équipe car je prépare un sujet de conférence sur les Communautés, comme catalyseur pour l&#8217;Entreprise. Comment les groupes d&#8217;utilisateurs dynamisent le marché ? Comment un esprit communautaire peut-il se créer entre les consultants d&#8217;une entreprise ? Comment les développeurs Java d&#8217;un éditeur de 650 personnes peuvent-ils créer une communauté ? </p>
<p>Esprit es-tu là ? </p>
<p>Es-tu quelqu&#8217;un ou non ? </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2010/03/04/esprit-developpeur/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
