insideIT.fr : le blog des architectes IT de SFEIR

Aller au contenu | Aller au menu | Aller à la recherche

lundi 29 mars 2010

Outils du Product Owner pour maximiser le ROI

Mercredi dernier, j'ai passé la soirée dans les bureaux de Zenika pour assister à la conférence "outils du Product Owner pour maximiser le ROI" animée par Michel Goldenberg.

Malheureusement, car le sujet m'intéresse beaucoup, la discussion a divergé vers l'intérêt des estimations.

Ci-dessous, les exercices que Michel Goldenberg a eu le temps de nous présenter.

Comment arriver à une vision commune et obtenir un consensus ?

  1. définir le sujet de questionnement ;
  2. demander à chaque participant d'écrire sa réponse sur un post-it ;
  3. former des binômes ;
  4. demander à chaque binôme d'échanger leurs points de vue ;
  5. demander à chaque binôme de noter, d'un commun accord, leurs deux post-its pour arriver à une somme de cinq (cinq étant la meilleure note i.e. la définition remportant l'adhésion des deux membres du binôme) ;
  6. demander à chaque binôme d'échanger leurs post-its ;
  7. réitérer l'exercice à partir de l'étape trois jusqu'à ce que les post-its aient le même nombre de notes que de participants ;
  8. additionner les notes pour donner une note globale à chaque post-it.

La note globale d'un post-it révèle le degré d'adhésion des participants à ce qui est écrit dessus.

Durant cet exercice, nous avons vue se dégager un post-it particulièrement bien noté. Il s'agit du consensus. Puis un peloton de post-its un peu moins bien notés. Il s'agit de la vision commune. Et pour finir, deux post-its avec des notes très faibles. Il s'agit des visions marginales.

Comment déterminer l'intérêt d'une vision marginale ?

Les visions marginales ne sont pas nécessairement inintéressantes. Il est possible qu'elles soient seulement mal comprises. Pour répondre à cette question, nous avons utilisé l'exercice suivant :

  1. demander à chaque participant de marquer physiquement son adhésion ou non à la vision marginale, par exemple en divisant la salle de réunion en deux ;
  2. demander à une personne du groupe minoritaire, ceux adhérant à la vision marginale, d'expliquer son point de vue ;
  3. demander à chaque personne du groupe majoritaire si les éclaircissements apportés lui fait réviser sa position ;
  4. réitérer l'exercice à partir de l'étape deux jusqu'à ce que toutes les personnes du groupe minoritaire se soient exprimées ;
  5. conclure en fonction des migrations entre le groupe majoritaire et le groupe minoritaire.

Comment interviewer un client ?

L'objectif de l'interview est d'aider le client à définir et prioriser son besoin. Le client doit être acteur de l'interview. L'interviewer n'est là que pour aider le client à structurer son expression de besoin.

  1. demander au client d'écrire sur des post-its jusqu'à 5 fonctionnalités essentielles de son produit ;
  2. demander au client de prioriser les post-its en répartissant 15 points, une note élevée indiquant une priorité forte ;
  3. réitérer l'exercice jusqu'à atteindre la granularité souhaitée.

L'étape deux n'est pas toujours évidente. J'en ai fait l'expérience en mettant cet exercice en pratique le vendredi suivant la conférence. Le rôle de l'interviewer est alors de challenger le client pour qu'il sépare son besoin entre l'essentiel et le facultatif à force de questionnement.

Dernier conseil

Le PO doit également pousser l'équipe de développement à lui expliquer les stories ayant une forte complexité. Il pourra ainsi détecter les tâches ayant une forte complexité à cause d'un détail technique (e.g. : drag and drop, …). Le cas échéant, ils pourront étudier ensemble les alternatives envisageables.

Maximiser le ROI, c'est minimiser le travail inutile !

lundi 15 mars 2010

Séance d'estimation

Suite à des séances d'estimation s'éternisant sur le projet sur lequel je travail actuellement je suis venu à me poser des question sur cet exercice.

Pour quelle raison faisons-nous des séances d'estimation ? Je pense que les objectifs sont doubles :

  • échanger afin d'avoir une vision commune sur les items du backlog ;
  • estimer la complexité des items afin d'avoir de la visibilité sur l'avancement du projet.

Une fois ces objectifs bien en tête, vient la question suivante : Qui est concerné par cette réunion ? Toutes les personnes apportant des éléments permettant de clarifier la vision des items du backlog et toutes les personnes qui auront à réaliser ces items.

Maintenant, nous connaissons les enjeux et les acteurs de cette réunion. C'est bien, mais pas top. Les séances d'estimation ne sont pas plus efficaces. Pourquoi ? Retour aux définitions :

Estimation : évaluation approximative fondée sur des données incomplètes ou de nature imprécise.

Une estimation est une évaluation approximative !

Si votre équipe prend plus de 10 minutes pour se décider entre une complexité de 5 ou 8, je vous propose d'essayer la méthode décrite ci-dessous.

Les objectifs de la réunion étant double, découpons la réunion en deux temps

  • comprendre les nouveaux items ;
  • estimer les complexités.

La compréhension des nouveaux items passe par la discussion entre les acteurs du projet. C'est le temps fort d'une séance d'estimation. La vision commune du projet issue de ces échanges facilitera les communications futures.

L'estimation des complexités est plus pertinente et plus rapide une fois que les items sont compris. Pour faciliter encore la démarche, j'aime procéder de la manière suivante :

  • imprimer les intitulés des items sur des cartes en papier ;
  • disposer ces cartes sur une table en fonction des complexités relatives ;
  • associer chaque groupes d'items à une complexité chiffrée.

lundi 8 mars 2010

Révision Scrum : le backlog produit

Le backlog produit est la liste des fonctionnalités du produit à développer. Chaque élément de cette liste est composé au minimum de trois attributs :

La finalité du backlog produit est d'avoir de la visibilité sur l'état du projet et de prioriser les développements.

Le backlog produit est de la responsabilité du product owner.

Valeur métier

La valeur métier d'un item est estimée par le product owner.

C'est la valeur métier des items qui doit diriger la priorisation des développements. Pour aider à la mise en perspective entre l'accessoire et le fondamental, il est conseillé d'utiliser la suite de Fibonacci en s'efforçant d'utiliser des valeurs très disparates.

Effort ou complexité

L'effort nécessaire à la réalisation d'un item est estimé par les personnes qui seront en charge de la réalisation. Cette valeur est fixe dans le temps.

Plus un effort est important, plus son estimation est imprécise. C'est pourquoi il est conseillé d'utiliser la suite de Fibonnaci pour estimer les efforts.

Métriques

Les métriques issues des données du backlog produit donnent de la visibilité sur l'état actuel du projet et aide à définir les prochaines étapes.

Le backlog produit est un outil évolutif (ajout, suppression, modification d'items). Par conséquent, il est souvent intéressant de suivre ces métriques en points et en pourcentage.

Ci-dessous, deux exemples de métrique que nous pouvons extraire du backlog produit.

Vélocité

La vélocité est l'effort qu'une équipe peut adresser en un sprint. Cette mesure s'affine au fil des itérations.

La vélocité ne doit pas être utilisé pour assurer le suivi de la productivité d'une équipe mais pour réaliser des projections (e.g. estimer la date de fin du projet). Une mauvaise utilisation de cette métrique entraine une inflation des points d'effort et/ou une "course à la vélocité" au détriment de la qualité.

Il est également déconseillé de comparer les vélocités de deux équipes du fait des estimations réalisées sur des échelles différentes. Les estimations sont relatives, pas absolues.

Par contre, il est intéressant de suivre l'évolution de la vélocité d'une équipe. Une diminution de la vélocité traduit souvent un manque d'évolutivité du produit développé ou l'apparition de nombreux bugs.

Valeur métier acquise

Cette métrique détermine la valeur des développements réalisés.

Si le backlog est correctement priorisé, l'évolution de la valeur métier acquise doit diminuer au cours des itérations car les items de plus grande valeur sont traités en premier.

Quelques liens

Dans SCRUM mon backlog de produit est DEEP
Le backlog produit
Des user stories de qualité
Valeur métier en pratique
Comment mieux prioriser en agile
Suite de Fibonacci

vendredi 26 février 2010

Révision Agile : ScrumMaster ? C'est quoi déjà ?

La semaine prochaine, le ScrumMaster du projet sur lequel je travaille sera en vacance. Étant donné que je vais assurer son remplacement, j'en profite pour réviser le rôle du ScrumMaster.

Alors, qu'est-ce qu'un ScrumMaster ?

Un facilitateur

L'une des missions du ScrumMaster est de s'assurer que les autres membres de l'équipe restent concentrés sur le véritable objectif du projet : la livraison de valeur pour le client.
Il écarte les obstacles qui jonchent le parcours menant à la livraison et si possible avant même qu'ils ne surviennent.

Un coach

Dans le processus d'amélioration continue, le ScrumMaster joue le rôle du coach.
Il aide l'équipe à prendre conscience de ses qualités et faiblesses. Puis il fait en sorte de conserver les acquis tout en travaillant les points faibles.

Un animateur

Il organise et anime les activités Scrum tel que sprint planning, daily Scrum, sprint review et rétrospective.
Il fait en sorte que tous les membres de l'équipe se sentent impliqué et libre de s'exprimer.
Autant que faire se peut, le ScrumMaster s'assure que tous les membres de l'équipe sont contents de travailler.

Le garant des pratiques Scrum

Un ScumMaster, comme l'indique son nom, a une bonne connaissance de Scrum. De par cette connaissance, le ScrumMaster s'impose comme le garant de la bonne utilisation des pratiques de Scrum.

Quelques liens

Le rôle de ScrumMaster
Peut-on à la fois être ScrumMaster et développeur sur un même projet ?
Mon ScrumMaster en fait trop !

jeudi 4 février 2010

Le Paris JUG a 2 ans !

juggyannif02

Le Paris JUG fêtera son 2ème anniversaire mardi 9 février. Pour célébrer l'événement, l'équipe organise une soirée spéciale consacrée à l'Open-Source en France. Sacha Labourey, ancien CTO de JBoss fera la keynote. Jean-Michel Doudoux sera également présent afin de nous présenter les différentes licences permettant la diffusion libre de documentations.

Les inscriptions sont ouvertes, rendez-vous mardi au 108 boulevard Malesherbes !

Sfeir est sponsor de l'événement : c'est également l'occasion de venir nous rencontrer pendant la pause-buffet !

vendredi 15 janvier 2010

Evénement : Conférence "Jump Camp 4 IT" jeudi 21 janvier à 19h

Jeudi prochain aura lieu le premier opus du Jump Camp 4 IT.

Alors Jump Camp 4 IT, c'est quoi ?

Jump Camp 4 IT est une mini conférence en soirée sur Paris mêlant présentations et ateliers de coding, destinés aux passionnés des technologies de l'information.
Ainsi, ce qui est intéressant dans ce format, c'est que cela vous permet de mettre un premier pied à l'étrier sur le framework présenté, et non pas juste d'écouter une présentation théorique. Il est donc conseillé de venir avec son ordinateur portable pour profiter pleinement des présentations ;)

Ah, et petit détail qui ravira tout le monde : c'est gratuit.

Le premier opus de la série aura lieu jeudi prochain, soit le 21 janvier, de 19h à 21h.
Au programme, 6 présentations/séances de coding live autour des dernières technologies/tendances web du moment :

  • Surprise... : une présentation/annonce surprise par Didier Girard
  • Atmosphere :  un framework permettant de faire des applications web asynchrones (Comet) à partir de simples POJO (https://atmosphere.dev.java.net)
  • HTML5 : découverte de html5 step by step
  • Robots Wave et le WadRobotFramework : un framework qui simplifie énormément la création de robots pour Google Wave (http://goo.gl/6pOC)
  • Sisyphe version GWT : une interface à refaire ? reprogrammer ? Non, utilisez dès maintenant sisyphe.
  •  gwt-mvc : Framework pour GWT permettant de structurer le code client en suivant le design pattern MVC (http://code.google.com/p/gwt-mvc/

Si vous souhaitez vous inscrire, connaître le lieu exact de la conférence, ou avoir plus de détails sur les présentations, c'est par ici.

vendredi 18 décembre 2009

La communication, entre efficacité et complétude : L'échelle d'humanité

Communiquer pour le projet.

Dans des projets où parfois les acteurs sont distants, la communication est un facteur déterminant de succès ou d'échec. C'est même l'élément essentiel du projet. Mais de quelle communication parle-t-on ? Dans le cadre d'un projet, la communication doit couvrir :

  1. La Connaissance.
  2. Les Statuts.
  3. Le Ressenti.


Le formel et l'informel

Le DDD introduit la notion d'Ubiquitous Language, ce langage défini et partagé par les différents acteurs du projet. Je voudrais ici mettre l'accent sur l'optimisation des échanges. Comment fait-on pour être sûr que l'information est bien partagée, qu'elle l'est dans son entier et qu'elle l'est à temps ? Sachant que dans la communication, il y a des données intangibles, certes, mais aussi des données informelles où rentre le subjectif, le ressenti. Le daily scrum permet d'échanger cette seconde catégorie d'information. Et c'est indispensable. Par exemple, si on ne communique pas, on ne perçoit pas les frustrations à temps et on se retrouve face à des problèmes de turn-over.


L'acteur et son texte

Vous préférez voir un film ou lire son scénario ?

On est tous d'accord pour dire qu'un projet n'irait pas très loin si les gens se contentaient d'en discuter autour d'un café, sans jamais échanger autre chose que des impressions, des bons mots et des généralités. Mais à l'inverse, parieriez-vous sur l'avenir d'un projet, où les acteurs ne se voient jamais mais s'envoient des tonnes de fichiers Word ? Personnellement, je n'y mettrais pas un Euro.

La communication informelle, qui profite de la complicité s'installant entre l'émetteur d'une information et ceux auxquels elle s'adresse, passe par le visuel et l'auditif. Il y faut un peu de spectacle, pour que l'essentiel soit retenu. On parle alors du Body Language, on y retrouve les notions d'empathie, de synchronisation. Je préfère dix fois aller voir David Chappell dans sa présentation sur Azure et sur le Cloud, que lire son livre-blanc sur le même sujet. Je préfère aussi traverser le bâtiment, et aller échanger avec un collègue, de vive voix, plutôt que d'attendre sa réponse à mon mail. Pas un leader, aussi bon soit-il, ne fera passer sa vision dans un mail, un article, une news. Ce sont de bons supports, pour tracer et conserver mais ce ne sont que des supports. Et la communication sans le communiquant, c'est un peu le plat sans le cuisinier. C'est du Picard. Ce n'est pas forcément mauvais mais servi comme ça, c'est froid.


Entre trop et trop peu

Il y a quelque chose qui ressort de l'observation des échanges entre personnes, c'est la relative proportion inverse entre la quantité de données échangées et la perception qui en est faite. Si je vous dis : "Le projet est mort". Le message est clair, on aura tous compris qu'on peut rentrer à la maison. Si je vous envoie un document de 758 pages de diagrammes, de tableaux, de bilans, d'analyses d'experts et si dans un élan de professionnalisme rare, vous allez jusqu'à le lire, n'allons pas jusqu'à dire "en entier", vous en sortirez confus, désorienté, partagé, vous demandant si on a juste essayé de vous beurrer les lunettes ou si votre intelligence commence déjà à décliner. Voyez, rien que cette phrase. Il vous a fallu la lire deux fois, non ?


L'échelle d'humanité

Partant du constat de cette proportion inverse, je me suis amusé à essayer de situer sur un rapport entre la quantité de données échangée et leur perception, les différents médias utilisables dans le cadre d'un projet. Et voici de que ça donne :

HumanityScale

Reprenons le diagramme, dans l'ordre de lecture.

  • Le face à face a le meilleur degré de perception possible, de partage, avec un volume utile d'informations limité.
  • Le live-meeting (écran et web-cam interposés) perd juste un peu d'humanité.
  • Le téléphone est un peu en retrait car on perd l'information visuelle donc une bonne part de la communication informelle.
  • Le chat (IM) permet d'échanger plus de données puisqu'il est écrit, tout en restant "dans la discussion" donc de garder un fort aspect humain. Il offre aussi un bon équilibre entre rapidité et pertinence dans la réponse.
  • Le mail est plus factuel, il prend note, il prend date, il permet de tracer la transmission. Mais il perd en spontanéité. Il devrait être réservé soit à des réponses plus construites ou pour les aspects intentionnellement plus formels ou officiels, souvent nominatifs, comme un bon rappel à l'ordre ou une félicitation.
  • Le blog et son flux RSS restent vivants, tout en fournissant un somme importante d'informations actuelles, à jour. Ce sera le pouls du projet. Il peuvent donner l'état des builds, les infos générales de la vie du projet, ses grandes étapes, événements ou incidents.
  • Le Wiki, outil essentiel de tout projet, devrait contenir l'ensemble des informations du projet. Et comme il est collaboratif, il garde aussi un aspect humain encore perceptible. Il décrira les pratiques et les procédures du projet. Il garde en somme tous les sujets statiques du projet quand le Blog reçoit les sujets dynamiques.
  • La documentation classique elle, est au maximum pour le volume de données mais c'est le degré zéro de l'échange humain.


J'ai omis à dessein deux outils, pourtant très prometteurs, même au niveau projet, que sont Wave et Twitter. La raison est simple, je n'ai encore aucune idée de l'endroit où les placer. Mais je ferais une petite piqure de rappel, quand j'aurai soigné cet aspect de communication virale.


Voulez-vous réussir ?

Alors, lequel de ces médias utiliser ? Si vous voulez vraiment que votre projet avance, vous n'avez pas le choix, il-vous-les-faut-tous !

Chaque média a son objectif et son cycle de vie, chacun doit avoir son cadre d'utilisation et ses limites établies. Certains sont là pour aider à s'y retrouver, d'autres favorisent l'esprit d'équipe, d'autres encore permettent de guider la troupe. Vous voulez prendre le risque de vous passer de l'un de ces médias ?
Préférez-vous alors :

  1. Que les gens soient perdus ?
  2. Qu'ils se détestent ?
  3. Ou qu'ils ne sachent juste pas où aller ?

Un camionneur peut se passer de cartes, de CB (l'éméteur radio, pas le moyen de paiement) et de GPS. Mais entre nous, c'est une économie de courte vue ! Aujourd'hui, on a tous les outils pour organiser et optimiser un flux d'informations efficientes. Et là où certains y voient des gadgets, osons y voir le panel d'outils indispensables et sinon une garantie de succès, en tout cas des alliés sûrs et fidèles sur la route qui y mène.


Think Big, Start Small

En supposant que vous avez le téléphone et un ordinateur relié au réseau (sic), installer un wiki prend 5 minutes, un blog 5 de plus. S'abonner à un flux RSS prend 30 secondes. Installer un outil de Chat prend bien 10 minutes. Alors mis bout à bout, tout ça prend donc 20 minutes et 30 secondes. Ce qui est plus long, c'est le temps d'adoption par tous les acteurs des outils et de leurs avantages. Il y en a bien encore aujourd'hui qui résistent au téléphone portable ! Faites-vous l'évangéliste de vos outils. Les convertis seront nombreux.

Bien sûr, il faudra éviter la redondance, qui est source d'incohérence. Par exemple entre la documentation classique et le Wiki projet. Mais une fois encore, ces deux médias ne visant pas les mêmes acteurs, ils ne devraient pas contenir les mêmes informations et ce, de façon naturelle. Et puis la redondance, c'est déjà un problème de riche. J'ai l'impression de conseiller à un acheteur de bateau, de faire attention à la taille du mât pour passer sous les ponts ou que le bateau ne soit pas trop grand pour entrer dans le port, quand ce qu'il veut, c'est traverser la rivière. Il sera toujours temps quand les outils seront là et utilisés, de veiller à ne pas trop les utiliser (sic).

Et puis il ne faut pas hésiter à faire "signer" une charte de bon usage des médias de communications, pour mettre d'accord tout le monde sur le périmètre de chaque média, ce qui peut y être échangé, ce qui ne le peut pas. Ne cherchez pas trop, elle est juste au dessus.

Je ne sais pas si on est déjà dans le Web 4.0 ou encore dans le Web 3.0 mais ce que je sais, c'est que les outils du Web 2.0 peuvent vous aider dans vos projets. Alors, prêts à communiquer ?

mercredi 2 décembre 2009

Petite présentation de MooTools

Pour mon premier article sur ce blog, j'ai choisi de présenter MooTools, un framework Javascript open source orienté objet distribué sous licence MIT.
Après une rapide présentation des bases, je montrerai, grâce à quatre courts exemples, quelques unes des possibilités de MooTools, en espérant vous donner l'envie d'aller plus loin par vous-mêmes.

Récupération de la librairie MooTools

La version actuelle est la 1.2.4, le core est disponible sur le site officiel en version compressée (par YUI ou JSMin) et non compressée.
Il est également possible de définir sa propre version de MooTools en choisissant les modules à intégrer au moment du téléchargement, ce qui permet d'en optimiser la taille au maximum.
Les plugins officiels sont disponibles ici.

La classe Element

Element est la classe de base de MooTools, c'est par elle que l'on doit passer pour créer ou récupérer un noeud DOM.
Des getters et setters permettent de manipuler les attributs des noeuds, les styles et les événements :

 var myButton = new Element('button');
 myButton.set('text', 'Je suis un bouton');

Ci-dessous, un exemple de création d'un bouton plus complet utilisant la syntaxe JSON :

 var myOtherButton = new Element('button', {
   'class': 'BigButton',
   'html': 'Je suis un très gros bouton',
   'styles': { 'font-size': '14px', 'font-weight': 'bold' },
   'events': {
     'click': function(){ alert('Click'); },
     'mouseover': function(){ alert('Mouseover'); }
   }
 });

Le parcours de l'arborescence

La fonction $ permet de récupérer un Element unique :

 var buttonOK = $('btnOK'); // retourne l'Element ayant l'ID 'btnOK';

La fonction $$ permet de récupérer une collection d'Element :

 var forms = $$('form'); // retourne tous les formulaires
 var inputsWithValue = $$('input[value]'); // retourne tous les inputs ayant l'attribut 'value'
 var gifImages = $$('img[src$=.gif]'); // retourne toutes les images ayant l'extension '.gif'
 var buttons = $$('button', 'input[type=button]'); // retourne tous les boutons et les inputs de type bouton
 var bigInputs = $$('#form input.BigButton'); // retourne tous les inputs de classe 'BigButton' appartenant à l'élément ayant l'ID 'form'

A noter qu'il est possible de travailler directement à partir des noeuds DOM :

 var buttonOK = $(document.getElementById('btnOK'));
 var inputs = $$(document.getElementsByTagName('input'))

Pour les recherches qui doivent s'effectuer à partir d'un élément précis, il existe les fonctions getElement() et getElements() :

 var loginForm = $('loginForm');
 var loginInputs = loginForm.getElements('input');

Exemple 1 : création d'un bouton qui change le style de la page

Nous allons commencer par créer un bouton en HTML, avec un identifiant afin de le retrouver plus facilement.
Le code Javascript se résumera à l'ajout de l'évènement 'click' sur ce bouton et à la création de la fonction à appeler.
Cette dernière se contente ici de modifier la couleur du body et de la police, et d'ajouter un padding-left à tous les paragraphes.

Code HTML :

 <button id="btnStyle">Changer le style</button>

Code Javascript :

 window.addEvent('domready', function() {
   $('btnStyle').addEvent('click', changeStyle);
 }
 var changeStyle = function() {
   $(document.body).setStyles({ 'background-color': '#000000', 'color': '#ffffff' });
   $$('p').each(function(p) {
     p.setStyle('padding-left', '20px');
   });
 }

Les évènements

L'évènement 'domready' permet de lancer l'exécution d'une fonction lorsque le DOM est prêt, c'est-à-dire lorsque l'arborescence est prête à être lue et écrite.
La différence avec 'onload' est que la vérification ne se fait que sur le DOM et non sur les ressources annexes telles que CSS, images... etc...

 window.addEvent('domready', function() {
   alert('Traitement...');
 });

Les autres évènements sont les évènements Javascript traditionnels :
- boutons de la souris (click, dblclick, mouseup, mousedown, contextmenu, mousewheel, ...)
- mouvements de la souris (mousemove, mouseover, mouseout, ...)
- clavier (keypress, keydown, keyup, ...)
- fenêtre (load, unload, beforeunload, resize, move, ...)
- éléments (focus, blur, change, reset, ...)

Il est possible de créer un évènement personnalisé grâce à table Element.Events, puis de l'appeler comme un autre évènement.

Exemple 2 : création d'un évènement pour gérer le déplacement d'un conteneur

La première étape consiste à créer un container en position absolute et de lui donner un identifiant pour nous permettre de le récupérer rapidement.
A l'intérieur nous mettons une image, un avion qui va se déplacer lorsqu'on appuie sur la flèche de droite ou sur la touche D.
Puis, nous créons l'évènement, en lui fournissant un évènement de base, keydown, et une fonction précisant les conditions pour que l'évènement soit lancé.

Code HTML :

 <div id="plane" style="position: absolute"><img src="avion.png"/></div>

Code Javascript :

 Element.Events.planemove = {
   'base': 'keydown',
   'condition': function(event) {
     return event.key == "d" || event.key == "right";
   }
 };
 $(document).addEvent('planemove', function(event) {
   var image = $('plane');
   var pos = image.getPosition();
   pos.x++;
   image.setPosition({ 'x': pos.x, 'y': pos.y });
 });

Les classes

MooTools permet de créer ses propres classes.
L'héritage se définit par Extends et Implements, le premier permettant de redéfinir les variables et fonctions de la classe mère mais pas le second.
Le constructeur correspond à la fonction initialize.

Exemple 3 : création d'une classe Square pour dessiner des carrés sur la page

Afin de présenter l'héritage, commençons par créer une classe Shape.
Celle-ci ne définit qu'un constructeur, contenant les coordonnées du point d'origine de la forme à dessiner.
Puis nous créons la classe Square, qui hérite de Shape, et qui possède une largeur.
La fonction draw() nous permet de dessiner le carré dans le body, en utilisant un div correspondant aux positions et dimensions.

 var Shape = new Class({
   'initialize': function(options) {
     this.x = options.x;
     this.y = options.y;
   }
 });
 var Square = new Class({
   'Extends': Shape,
   'initialize': function(options) {
     this.parent(options)
     this.width = options.width;
   },
   'draw': function() {
     if (this.width) {
       var element = new Element('div', {
         'text': 'Carré',
         'styles': {
           'position': 'absolute',
           'top': this.x,
           'left': this.y,
           'height': this.width,
           'width': this.width,
           'background-color': '#AA0000'
         }
       }).inject(document.body);
     }
     return this;
   }
 });
 var square = new Square({ 'x': 300, 'y': 30, 'width': 100 });
 square.draw();

Les effets

La librairie utilisée est MooFX, disponible également pour Prototype.
Les effets utilisent des transitions, une transition pouvant être linéaire, cubique, élastique... etc...
Les effets présents dans le Core sont Tween et Morph, le premier permet d'appliquer une transition sur une valeur CSS, et le second de le faire sur plusieurs.

Exemple 4 : création d'un menu simple qui apparait lorsqu'on clique sur un bouton
Attention, cet exemple requiert un plugin disponible sur le site officiel, Fx.Slide.

Le menu ci-dessous se compose d'une liste de liens affichés en colonne, et masqués (barre de menu).
Ils apparaissent et disparaissent lorsqu'on clique sur un bouton (flèche), avec un effet de glissement.
Remarque : le style (couleurs, images, marges...) doit être codé en CSS et donc ne se trouve pas ci-dessous.

 // Menus à afficher
 var menuLabels = [['Menu 1', 'http://mootools.net'],
     ['Menu 2', 'http://www.sfeir.com'],
     ['Menu 3', 'http://www.google.fr']];
 // Barre de menu
 var menuBar;
 // Classe créée pour la barre de menu
 var MenuBar = new Class({
   'initialize': function(items) {
   // Menus à afficher
   this.items = items;
   // Element de l'arborescence
   this.rootElement = new Element('div');
   if (this.items) {
     var l = this.items.length;
       for (var i = 0; i < l; i++) {
         var a = new Element('a', {
           'text': this.items[i][0],
           'class': 'Menu',
           'href': this.items[i][1],
           'events': {
             // Petit effet de rollover
             'mouseover': function() { this.set('class', 'MenuOver'); },
             'mouseleave': function() { this.set('class', 'Menu'); }
           }
         }).inject(this.rootElement);
       }
     }
   },
   // Fonction permettant d'ajouter la barre de menu à un élément parent
   // Le slide hide permet de la masquer instantanément au démarrage
   'appendTo': function(parentElement) {
     this.rootElement.inject(parentElement).slide('hide');
   },
   // Ouverture de la barre : on fait apparaître les liens avec la transition Bounce
   'open': function() {
     this.rootElement.set('slide', {duration: 'long', transition: 'bounce:out'}).slide('in');
   },
   // Fermeture de la barre : on fait disparaître les liens avec la transition Pow
   'close': function() {
     this.rootElement.set('slide', {duration: 'long', transition: 'pow:out'}).slide('out');
   }
 });
 // Bouton pour ouvrir le menu
 var opacity = 0.4;
 var openArrow = new Element('div', {
   'html': '&#9660;',
   'class': 'Arrow',
   'styles': { 'opacity': opacity },
   'events': {
     'mouseover': function() {
       this.setStyle('text-decoration', 'underline');
       this.fade(1);
     },
     'mouseleave': function() {
       this.setStyle('text-decoration', 'none');
       this.fade(opacity);
     },
     'click': function() {
       openMenu();
     }
   }
 });
 // Bouton pour fermer le menu
 var closeArrow = new Element('div', {
   'html': '&#9650;',
   'class': 'Arrow',
   'events': {
     'click': function() { closeMenu(); }
   }
 });
 // Fonction d'ouverture du menu : on change de flèche et on ouvre la barre de menus
 function openMenu() {
   closeArrow.replaces(openArrow);
   menuBar.open();
 }
 // Fonction de fermeture du menu : on change de flèche et on ferme la barre de menus
 function closeMenu() {
   openArrow.replaces(closeArrow);
   menuBar.close();
 }
 window.addEvent('domready', function() {
   // Création d'un wrapper en position absolute
   var menuWrapper = new Element('div', {
     'styles': { 'position': 'absolute', 'width': '100%', 'top': '0px', 'left': '0px', 'text-align': 'center' }
   });
   menuWrapper.inject($(document.body));
   // Création de la barre de menu
   menuBar = new MenuBar(menuLabels);
   menuBar.appendTo(menuWrapper);
   // Ajout du bouton d'ouverture
   openArrow.inject(menuWrapper);
 }

Conclusion

Cet article a présenté les bases de MooTools, c'est-à-dire comment manipuler les éléments, créer des classes et des événements.
Le framework contient d'autres outils, par exemple pour gérer les cookies, les requêtes au format XML, HTML et JSON.

La spécificité de MooTools est qu'il dispose d'un ensemble de classes qui en fait quasiment un langage de programmation complet.
Là où avec jQuery par exemple, la création d'un élément se résume à une copie de code HTML, MooTools utilise une syntaxe plus naturelle au programmeur objet, plus structurée et plus simple à maintenir.

La contrepartie est la nécessité de connaître un minimum Javascript et la programmation objet, ce qui peut rebuter ceux qui ne se sentent pas particulièrement à l'aise et qui souhaitent simplement avoir rapidement du code qui tourne.

De plus, MooTools possède une communauté moins importante que ses concurrents les plus célèbres, les principaux inconvénients étant les plugins moins nombreux, et le fait qu'on peut avoir un peu plus de difficulté à trouver des réponses à ses questions lorsqu'on se trouve face à un problème.

Le Motorola Droid (Milestone) débarque en France

Ce soir, j'ai pu assister à la soirée de présentation officielle du tout nouveau Motorola Droid (nommé Milestone en Europe), à l'occasion de sa commercialisation en France, et ce, dès ce soir.

Ce smartphone est un des plus attendus parmi les andro-phones : beaucoup y voient (espèrent) le tant attendu iphone killer. Pour preuve de sa popularité, à sa sortie aux états-unis (le 6 novembre), 250 000 exemplaires ont été vendus la première semaine...
Autre facteur faisant que ce téléphone attire l'attention (et pas des moindres) : il s'agit du premier téléphone équipé de Android 2.0.

Trêve de teasing, passons aux faits !

La présentation est lancée par Jacques Rames, président de Motorola France, qui nous annonce que :

  • Motorola a fait le choix d'Android en 2008, pour simplifier le développement multi-plateformes en interne et pour la facilité de déploiement d'applications (comparé à l'App Store d'Apple bien entendu).
  • Le Milestone est le deuxième téléphone Android de la marque et le début d'une longue série : Motorola projète de sortir pas moins de 10 smartphones Android en 2010, et souhaite devenir leader dans le domaine des smartphones (comme beaucoup me direz-vous).
Suite à cela, rueducommerce, qui sera - pour au moins les quelques semaines à venir - le vendeur exclusif du Motorola Milestone en France, nous annonce les tarifs :
  • à partir de 89 euros avec un forfait chez Bouygues Telecom ou SFR
  • beaucoup plus cher chez Virgin Mobile ou Orange (à partir de 189 euros et 219 euros !)
  • 549 euros le téléphone nu, sans abonnement
  Pour ceux qui le souhaitent, vous pouvez dès maintenant réserver ce téléphone en pré-commande chez rueducommerce. On nous a annoncé le début des livraisons mi-décembre (pour que tout le monde puisse avoir un joli Milestone sous son sapin de Noël ;)
Soit dit en passant, et ça aussi c'est Noël, jusqu'à fin décembre, pour le même prix, rueducommerce offre 60 euros d'accessoires en plus : un support multimédia (pour servir de mini-chaine hi-fi), et un support voiture (pour servir de GPS). Voir photo ci-contre.


Bien, l'aspect marketing et commercial étant passé, passons au côté technique !
Alors, qu'a t-il dans le ventre ce fameux Milestone ? Voici ses principales caractéristiques :
  • un écran très grand de 3,7 pouces (tout en restant compact)
  • le support du multi-touch
  • un processeur puissant cortex A8
  • une mémoire vive conséquente de 256 Mo (comme l'iphone 3GS)
  • un clavier physique AZERTY coulissant (pas comme l'iphone ;)
  • un appareil photo 5 MegaPixels avec flash double LED et auto-focus
  • un enregistreur vidéo (annoncé de qualité DVD !)
  • un mémoire interne de 8 Go extensible à 32 Go
  • WIFI, Bluetooth, USB 2.0, Micro-SD
  • un GPS, et un logiciel GPS développé par Motorola (malheureusement valable que 60 jours. Après, il faut passer à la caisse)
  • équipé de Android 2.0
  • équipé d'un navigateur intégrant Flash 10 (on va en reparler...)
Vous l'aurez compris, la liste des caractéristiques est plutôt alléchante, et il me tardait d'essayer concrètement l'appareil, pour voir s'il était à la hauteur de son impressionnante plaquette. Vous allez le voir, j'ai eu des bonnes et des mauvaises surprises. Petit retour d'expérience :
  • Tout d'abord, l'esthétique (c'est le premier truc qu'on voit) : on appréciera son grand écran, ses 4 boutons tactiles assez jolis, et une épaisseur assez fine pour un smartphone embarquant un clavier. Néanmoins, je le trouve un peu trop rectangulaire (peu arrondi), et le clavier est assez austère en comparaison au dernier LG GW620.
  • L'écran : l'écran est assez grand, et réagit très bien (écran capactif).
  • Le multi-touch : très fonctionnel pour le zoom sur les photos, et sur les sites internet. Par contre, ne marche bizarrement pas sur les maps (contrairement à un iphone...). Pour cela, il faut double-cliquer.
  • Le clavier : si je ne le trouve pas très esthétique, il est pour autant très efficace, le toucher est agréable et réactif.
  • La rapidité/puissance : globalement, la navigation est fluide et précise (l'écran capacitif aidant). J'ai noté toutefois quelques ralentissements lorsqu'on est sur le slideshow de photos.
  • Les photos : très bonne qualité de photo, même dans un endroit sombre, le double-flash marche très bien, et pas de flou. Les photos sont ensuite partageables sur facebook, myspace, picasa, ...
  • Les vidéos : j'ai été bluffé par la qualité des vidéos prises ! De même pour le son. C'est fluide, de bonne résolution et il y a un stabilisateur d'image. J'ai vu notamment une vidéo d'une piscine où on voit tous les détails des vagues. Par ailleurs, les vidéos sont partageables sur Youtube d'un clic.

Mais, me direz-vous, on est sur un blog technique et orienté développement/technologies, non ? Alors parlons de la star de ce Milestone, Android 2.0 :
  • La recherche : première fonctionnalité testée, la recherche intégrée dans le système d'exploitation. Le test est faussé par le fait que le téléphone est pour ainsi dire vide, mais néanmoins c'est convaincant. En quelques lettres tapées, on retrouve les contacts, les applications, les musiques de notre téléphone. Puis on le voit, dans un deuxième temps, il va chercher sur internet pour compléter la liste. Les résultats sont rapides, très pratique !
  • MySign : voici typiquement l'application qui m'a beaucoup plu. On dessine une lettre au doigt (qui peut être en fait n'importe quel geste), et il ouvre l'application paramétrée ! Très rigolo, mais aussi très ingénieux comme système de raccourci. Ce qui est particulièrement intéressant, c'est qu'on peut définir nos propres gestes, et leurs applications associées.
  • Intégration de Flash 10 dans le navigateur : il s'agit là de ma grande déception. Annoncé partout sur les plaquettes de Motorola, lorsque l'on va avec le téléphone sur un site Flash comme http://beta.parleys.com, on obtient un joli message indiquant que Flash n'est pas supporté... J'ai essayé avec d'autres sites, même problème... C'était de loin la fonctionnalité que j'attendais le plus (notamment d'un point de vue performance), et là, j'ai été très surpris et déçu de constater que ce n'est même pas fonctionnel. Les commerciaux nous ont expliqué que ce n'était pas la bonne version, mais je n'ai pas trouvé leurs arguments très convaincants.
  • Vive GWT et l'HTML 5 : Par contre, une application GWT 2.0 et HTML 5, ça marche très bien ! La preuve avec cette superbe application développée par SFEIR (^^) et qui fonctionne très bien sur le Motorola Milestone.

samedi 28 novembre 2009

Vidéo de présentation de la conférence pour le Web organisée par GET (Efrei)

Nous en avons déjà parlé sur ce blog.
Voici la vidéo très réussie pour présenter cette conférence :
Au programme :
  • Android : par Ludovic Perrier
  • GWT/Google Wave : par Didier Girard
  • Standard du Web : par Patrick Chanezon
  • Cocktail à 17h00
  • Atelier Android par le GTUG (Google Technologie User Group) à partir de 19h30
Inscrivez-vous sur le sur g-e-t.fr.

mardi 24 novembre 2009

GWT, en francais dans le texte

Le premier livre, en français, sur GWT est disponible dans toutes les bonnes librairies. Ce livre a été rédigé par Olivier Gerardin, un collègue de SFEIR Benelux.

Ce livre est le premier ouvrage intégrant un chapitre sur la nouvelle version de GWT : GWT2.

Félicitations à Olivier !

GWT – Créer des applications web interactives avec Google Web Toolkit

image

SLF4J & LOGBack : simplifiez-vous les logs


Mercredi dernier, lors de la première journée de conférences du Devoxx, Ceki Gülcü, nous a présenté deux framework de logs complémentaires SLF4J et logback.


SLF4J

Ceki Gülcü a d'abord commencé sa présentation par la présentation de SFL4J (The Simple Logging Facade for Java), qui consiste en une API (slf4j-api.jar) permettant d'harmoniser les appels de log dans le code Java quelle que soit l'implémentation choisie (log4j ou JUL par exemple). Il explique au passage la possibilité de brancher sur son application utilisant SLF4J une implémentation noop (no operation performed).

Le speaker (et créateur de SLF4J) présente ce dernier comme un potentiel doublon de commons-logging à quelques différences prêt comme le choix de l'implémentation choisie par le framework qui se fait automatiquement (dynamiquement) dans commons-logging et de manière manuelle (statique) dans SLF4J en important le jar adéquat dans le classpath :  slf4j-logj12.jar pour log4j, slf4j-jdk14.jar pour JUL (java.util.logging) ou encore logback-classic.jar pour utiliser logback.

Le speaker est ensuite passé aux choses plus concrètes en montrant quelques exemple d'appel SLF4J, il a notamment mis l'accent sur la possibilité d'utiliser des messages paramétrés qui ne seront construits (i.e. qui ne consommeront de ressources) que s'il doivent être affichés. Pour démontrer son propos il a donné l'exemple suivant :

La vieille méthode La méthode moins naïve mais verbeuse La méthode SLF4J, intelligente et concise
logger.debug("Nom="+nom);
if(logger.isDebugEnabled()){
    logger.debug("Nom="+nom);
}
logger.debug("Nom={}",nom);

Il a ensuite abordé les autres fonctionnalités offertes par SLF4J, parmis lesquelles :

  • L'accès au MDC (Mapped Diagnostic Context) qui permet d'attacher des variables de log à un Thread comme par exemple le login de l'utilisateur ayant fait la requête permettant ainsi de suivre les logs de sa session de manière triviale même au sein de logs complètement entrelacés. Les informations stoquées dans le MDC sont ensuite utilisables directement dans les patterns de log utilisés dans la configuration de la couche de logging.

  • Les Markers hiérarchisés qui permettent en quelque sorte d'affecter des tags aux différents logs. Les applications sont évidemment nombreuses mais Ceki Gülcü a donné un exemple assez simple où les Marker sont utilisés pour marquer les logs "confidentiels" et ou les différents Appender encryptent ces logs "confidentiels". Grâce aux Markers il est donc possible de créer des comportements spécifiques quelle que soit l'origine du log.

SLF4J a ensuite été abordé toujours sous l'angle d'un framework d'uniformisation des logs applicatifs mais cette fois-ci en regardant l'intégration de ce dernier sur des projets utilisant déjà un pou plusieurs systèmes de logs. Il est aisin possible de créer une véritable passerelle entre commons-logging, log4j, JUL avec SLF4J afin de centraliser la gestion et la configuration des logs d'une application. Pour cela il suffit de remplacer les jar d'implémentation du (des) système(s) utilisés (comme commons-logging.jar ou log4j.jar) par des jar d'interception de logs (respectivement jcl-over-slf4j.jar et log4j-over-slf4j.jar). Dans le cas de JUL il faut cependant faire un petit effort de paramètrage (déclaration d'un logger dans le rootLogger).

Pour ceux qui auraient simplement envie de remplacer (et non pas aggreger) le système de logs de leur application, Ceki Gülcü a créé un utilitaire simple de migration vers SLF4J : le SLF4J Migrator

Logback

La créateur du framework nous a d'abord mis dans le bain en définissant LOGBack comme le successeur de Log4J, expliquant brièvement que LOGBack est simplement une évolution de ce dernier (par de rupture conceptuelle).

LogBack est divisé en 3 modules :
  • Logback Core : Module de base étendu par les deux autres modules
  • Logback Classic : Module de log des applications Java (implémente les API SLF4J décrites précédemment)
  • Logback Access : Module d'accès aux logs du conteneur de Servlet (Tomcat, Jetty)

Logback utilise Joran en ce qui concerne la configuration des logs, ce qui signifie qu'il est possible de décrire énormément de choses dans la configuration (contrairement aux configurations sous forme de XML répondant à une DTD statique ou de fichiers properties). il est par ailleurs possible de gérer les inclusions de morceaux de configurations et ainsi rendre le paramétrage des logs extrêmement modulaires au sein d'un projet de grande taille.

Durant sa démonstration des possibilité de logback, le speaker a aussi montrer qu'il est possible de publier des MBeans spécifiques à logback dans JMX et ainsi contrôler les logs dynamiquement via une console comme JConsole (c'est d'ailleurs comme ça qu'il rafraichissait son instance de logback lors des démos).

Filters

Logback offre, à l'instar de log4j, la possibilité d'utiliser des Filtres au sein de la configuration des logs, ce qui permet de prendre (ou non) des logs en fonction de leur correspondance à un filtre. Il est possible de créer des filtres sur des expressions Java complexes (grâce à Juanino qui compile les expression java contenues dans la configuration). On peut par exemple écrire une configuration comme celle-ci avec logback : 

<
appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      
<evaluator name="myEval">
        
<expression>message.contains("contenu recherché")</expression>
      
</evaluator>
      
<OnMismatch>NEUTRAL</OnMismatch>
      
<OnMatch>DENY</OnMatch>
    
</filter>
    
<layout>
      
<pattern>
        %-4relative [%thread] %-5level %logger - %msg%n
      
</pattern>
    
</layout>
</appender>

Les expressions n'ont cependant à disposition que les informations contenues dans le LoggingEvent (dont par exemple le MDC, le timestamp de log, le logger, le marker racine ...). Pour plus d'informations sur l'utilisation des filtres, la doc se trouvent ici
Il existe aussi un tpe un peu particulier de Filtre dans logback qui sont les TurboFilter. ces filtres ne sont pas attachés à un appender particulier et sont donc appelés à chaque fois que le système doit créer une évènement de log (donc très tôt dans le processus de log). Il sont utilisés, comme leur nom l'indique, pour accélérer la prise de décision dans la gestion des filtres puisque si un appel au logger ne sera pas loggué à cause d'un TurboFilter (DENIED) alors aucun évènement ne sera diffusé dans le système. Les TurboFilter peuvent par exemple ressembler à ceci :

<
turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
    
<MDCKey>login</MDCKey>
    
<Value>bobby</Value>
    
<OnMatch>ACCEPT</OnMatch>
</turboFilter>

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    
<Marker>inutile</Marker>
    
<OnMatch>DENY</OnMatch>
</turboFilter>

Ceki Gülcü a poursuivi ses démonstrations avec le très intéressant SiftingAppender qui est capable d'encapsuler un appender paramétré (donc plusieurs appender différents au runtime) en fonction d'attributs qui peuvent provenir du MDC (ou d'une valeur par défaut). 
Grâce à ce dernier, il est par exemple possible de créer un appender par login ou par rôle dans une application de manière très simple et sans toucher ou presque au code Java. L'appender suivant définit par exemple un appender par rôle utilisateur en fonction de la valeur role (rôle de l'utilisateur exécutant la requête) contenue dans le MDC :

<configuration>
  
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
<discriminator>
      
<Key>role</Key>
      
<DefaultValue>ROLE_USER</DefaultValue>
    
</discriminator>
    
<sift>
      
<appender name="FILE-${role}" class="ch.qos.logback.core.FileAppender">
        
<File>${role}.log</File>
        
<Append>true</Append>
        
<layout class="ch.qos.logback.classic.PatternLayout">
          
<Pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</Pattern>
        
</layout>
      
</appender>
    
</sift>
  
</appender>

  
<root level="DEBUG">
    
<appender-ref ref="SIFT" />
  
</root>
</configuration>

Cette configuration stocke dans le fichier ROLE_USER.log les logs des utilisateurs n'ayant pas de rôle défini dans le MDC. On voit bien ici que plusieurs Appenders vont être instanciés avec chacun un nom différent (FILE-ROLE_USER pour l'Appender par défaut).

Ceki Gülcü a enfin terminé en soulignant une petite fonctionnalités tout à fait intéressante de logback qui permet de suffixer les lignes de logs d'une stacktrace d'erreur par le nom et la version du jar utilisé, ce qui permet lors du debug d'erreur de récupérer instantanément cette information cruciale. 

Exemple de log généré : 
java.lang.NullPointerException at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3] 
at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.5.0_06]
...

Synthèse

Pour terminer, nous pouvons dire que, étant nous mêmes utilisateurs de log4j sur nos projets quotidiens, Ceki Gülcü nous a convaincu que logback est bel et bien une évolution de Log4j (et non pas une révolution) et qu'il semble très attrayant de tenter de passer à ce nouveau framework (qui propose qui plus est nativement les API SLF4J) 
A essayer donc !

Ressources

Blog de Ceki Gulcu : http://ceki.blogspot.com/
Une présentation du Jazzon09 quasi-similaire à celle du Devoxx par le même speaker : http://beta.parleys.com/#id=357&st=5

lundi 23 novembre 2009

Silverlight 4...Encore une version?


Si Silverlight 2 était sans doute une révolution sérieuse devant Silverlight 1.0 (une révolution qui se présente dans l’utilisation du XAML, code managé, Expression Blend…), la version 3 de Silverlight reste une étape timide mais logique qui montre une certaine maturité et stabilité de cette technologie, Silverlight 3 est donc la version clé, graphiquement (avec ces nombreux contrôles rajoutées et l’amélioration de Blend) et au niveau logique (surtout avec le framework .NET RIA Services) du coup on peut finalement développer des applications riches, dignes de ce nom, avec une productivité très élevée…Mais la concurrence et la volonté de répondre par «Yes we can» à certain fonctionnalités basique comme l’impression, la gestion des photos, la webcam, etc. pousse Microsoft à « retoucher » légèrement la définition d’un principe majeur de Silverlight : La sandbox. La sandbox est l’environnement d’exécution sécurisé et sous SL2 et SL3 pas question de toucher au matériels, un idéal qui devient réalité. Et selon Laurent Ellerbach, directeur marketing de la division plate-forme et écosystème: « Silverlight reste exécuté dans une sandbox, mais pourra au besoin requérir des droits utilisateurs plus élevés pour certaines de ses actions ». Avec ce relooking on peut donc répondre « Yes we can », notamment à la partie multimédia : photos numériques, webcam, clé USB, GPU… Mais pas avant mai ou juin 2010, date de la sortie officiel le de Silverlight 4 (voir toutes les nouveautés).

Silverlight 4 ne représente pas seulement une version très puissante avec de nombreuses nouvelles fonctionnalités mais un virage intéressant dans la philosophie de cette technologie.

Site officiel Silverlight 4

Demonstration Silverlight 4 PDC 2009

La conférence "Innovation WEB" fait son retour

Le 4 décembre 2008, l'association GET (Google EFREI Technologies) organisait en association avec SFEIR une conférence sur les technologies Google.

Fort de son succès, une deuxième édition est programmée pour le 11 décembre 2009.

Cette année, il sera question d'Android, de Google App Engine, de GWT, de Google Wave et des standards du WEB (HTML5, CSS3, SVG).

Les intervenants de cette année seront Ludovic Perrier, Didier Girard et Patrick Chanezon.

Les conférences se tiendront de 13h30 à 16h30 dans les locaux de l'EFREI.


A la fin de la conférence aura lieu un cocktail, ce dernier sera suivi d'un atelier de développement Android organisé en association avec le Paris GTUG.

Pour plus d'informations, rendez vous sur le site de l'association.

Atmosphere, atmosphere


Au devoxx de cette année nous avons pu assister à la présentation du framework Atmosphere par Jean-François Arcand, créateur du framework et Paul Sandoz, contributeur sur le projet Jersey utilisé par Atmosphere en ce qui concerne les aspects REST.

Après une rapide présentation des concepts liés aux architectures PUSH pour les applications WEB. Les deux speakers sont rentrés dans le vif du sujet en développant en direct une petite application permettant de démontrer les possibilités offertes par Atmosphere.



Le PUSH ?

Dans les applications WEB, le PUSH correspond à l'utilisation des protocoles WEB pour permettre aux différents clients (navigateurs généralement) de se voir notifier des informations de la part du serveur sans avoir à faire des requêtes périodiques sur ce dernier. Comme son nom l'indique, les informations sont poussées du serveur vers le(s) client(s) et non plus tirées par chaque client désireux d'y avoir accès. L'intérêt d'une telle technique réside dans la possibilité de voir se propager rapidement une modification de l'état du serveur et atteindre ainsi un pseudo temps-réel tout en économisant des échanges réseaux inutiles. Avec le PUSH on peut par exemple dans le cas d'un tchat, propager les nouveaux messages d'une discussion du serveur vers les clients connectés de manière quasi instantanée.
Lors de cette conférence Jean-François nous a décrit les trois types de communications existantes dans les applications WEB à savoir :
  • Polling (technique traditionnelle)
  • Ajax PUSH  ou Long Polling : ce que propose Atmosphere
  • Http Streaming : Une technique idéale théoriquement mais qui souffre de problème d'intégration avec les proxys notamment.
Atmosphere est un framework (le premier) à base de POJO proposant aux développeurs d'applications PUSH une couche de programmation masquant la complexité des serveurs Java dans ce domaine.
Pour développer la partie serveur d'une application, le framework est utilisable sur de nombreux serveurs : des conteneurs legers (Tomcat, Jetty), certains serveurs d'applications comme Glassfish et Weblogic, il est même disponible pour le Google App Engine. Concernant ce dernier, on est en droit de se demander comment peut fonctionner le Long Polling avec des requêtes censées durer moins de 30s ? Jean-François nous a donné la solution en expliquant qu'Atmosphere implémente sont propre système de continuation permettant de passer outre cette contrainte. Il faut aussi noter la compatibilité d'Atmosphere avec les Servlets 3.0.

En ce qui concerne la partie cliente des applications, de nombreux frameworks sont supportés dont GWT et Wicket. 
Lors de la présentation, les speakers se sont focalisés sur une sous-partie du framework à savoir les annotations disponibles pour les POJOs et les aspects REST intégrés via Jersey.

Lors de la démo, les deux conférenciers ont pu nous démontrer la simplicité avec laquelle il est possible de créer une application WEB asynchrone utilisant le PUSH. Ils ont insisté sur le fait d'utiliser de simples POJO et de les rendre manipulables via REST. On obtient par exemple des classes ressemblant à ceci :

@Path("/{topic}")
@Produces("text/plain;charset=ISO-8859-1")
public class PubSub {
    private @PathParam("topic") Broadcaster topic;
    @GET
    @Suspend
    public Broadcastable subscribe() {
        return new Broadcastable("OK",topic);
    }
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Broadcast
    public Broadcastable publish(@FormParam("message") String message){
        return new Broadcastable(message,topic);
    }
}
L'idée principale de cette démo était d'utiliser Atmosphere pour suspendre la connection client lorsqu'il s'incrit à un topic "test" en appelant http://mon_serveur/test. Un autre client peut alors publier des messages qui seront diffusés à tous les clients connectés sur ce topic en soumettant un simple formulaire HTML contenant un paramètre "message" sous forme textuelle.

Ce que nous aurons retenu

Atmosphere simplifie effectivement le travail des développeurs en ce qui concerne la gestion du PUSH dans une application Java. Il n'est pas nécessaire de refondre entièrement une application existante pour y intégrer Atmosphere, la plupart des problèmes d'intégration sont adressés par le framework (gestion des proxys pour les connections HTTP, les limitations de chacun des navigateurs).

Resources:
Le site du projet : http://atmosphere.dev.java.net
Blogs :
Twitter : 
    @atmosphere_java 
    @jfarcand 

Ludovic Meurillon et Vincent Bostoen

Devoxx'09; un billet de plus!

Au lieu d'énumérer les présentations auxquelles j'ai assisté, je vais plutôt essayer d'en faire un petite synthèse. Pour commencer, j'aurais beaucoup aimé qu'il y ait eu quelques sujets en relation avec le mouvement 'NoSql' ou le 'Domain Driven Design', malheureusement ça pas été le cas, mais étant simultanée avec la QCon à San Fransisco, il suffirait alors de jeter un petit coup d'œil sur les speakers et le programme pour avoir la réponse (un autre coup d'œil sur les prix aussi :p).

En fait, le programme proposé traduit un peu l'année 2009 pour Java, mise a part EE6, trop peu de nouveautés et encore moins d'innovations; enfin, la encore si on considére que EE6 apporte de réelles nouveautés ou une quelconque innovation; j'aurais plutôt tendance a dire que c'est un re-mixage de quelques de-facto qui ont éclipsés la version précédente. Exception faite ce qui se passe du coté des 'NoSqlistes' avec des projets comme Hadoop et compagnie, qui n'étaient présent que par un petit BOF! Ce qui est a mon propre avis dommage car c'est un thème en pleine ébullition. Du coup, des sujets comme JDK7 ou Spring3 font encore et toujours l'actualité faute de relève mais aussi a cause du retard qu'ils ont eu par rapport a leur roadmap initiale. Seule l'annonce de adoption des 'closures' pour Java7 a créer un peu le buzz autour de ces sujets, quoi que personnellement j'en avais marre de cette histoire et la suivais plus depuis quelque temps. Autre chose qui a laissé sa trace sur cette édition, c'est la crise! Etant à ma première je pouvais pas vraiment m'en apercevoir, mais a en croire les habitués les traces sont assez flagrantes.

En ce qui concerne les présentations auxquelles j'ai assistés, j'en ai retenu spécialement celle de Cameron Puddy, intitulée 'Traditional Programming Models: Stone knives and Bearskins in the Google Age' dont je donne un aperçu a travers une citation tirée de ses slides :

« By 2021, there will be chips with 1024 cores on them. Is parallelism the tool that will make all these cores useful? John Hennessey has called it the biggest challenge Computer Science has every faced. He has credentials that might make you believe him. Allen says that it’s also the best opportunity that Computer Science has to improve user productivity, application performance and system integrity. - Phillip J. Windley ».

Je vous invite, d'ailleurs,a voir cette présentation sur Parleys soit dans les prochains jours en vous inscrivant à la chaine dédiée au Devoxx'09 ou gratuitement l'année prochaine.

Je citerais aussi le 'show' de Robert Martin dit oncle Bob pour la 2éme Keynote et vous invite de jeter un coup d'oeil sur le manifeste des 'artisants développeurs'. Et enfin, la présentation de iBeans, quoique la c'est plus le framework qui a retenu mon attention que la prestation de Ross Mason; En fait, je remarque que toutes les sessions durant lesquelles un framework était présenté par son 'créateur' étaient étrangement trop abstraites ou orientées tutoriel/document de référence, et il y avait un manque de mise en valeur des problématiques auxquelles répondait ou tentait de résoudre le produit en question.

En ce qui concerne le reste, je dirais pas qu'elles sont pas intéressantes mais plutôt que j'en espérais plus. Par exemple je suis resté sur ma faim sur un sujet qui m'intéresse beaucoup et qui était pourtant bien présent a travers trois ou quatre sessions et qui est la performance. En fait j'avais espérer retenir bien plus des Kirk Pepperdine, Dan Hardiker, Simon Ritter et Holly Cummins. Cela dit, comme mentionné par ces speakers ce problème est très difficile a présenté car trop liés aux cas concrets; la preuve, le peu d'ouvrages qui existent dessus.

Enfin, et pour conclure, je dirais que j'ai été globalement satisfait par cette participation et surtout par quelques discussions intéressantes avec d'autres participants, sans oublier les frites!

dimanche 22 novembre 2009

Paris Datageeks : premier meetup.

Cette semaine s'est déroulée la première rencontre Paris Datageeks (le 19 nov). Meeting informel qui prit place à La Karambole, convivial bar à DJ du 18ème arrondissement de Paris.

Paris Datageeks a été initié par Olivier Grisel, un passionné des technologies scientifiques touchant de près ou de loin aux données, à leur interprétation et leur compréhension. Par des machines.

Constatant un intérêt pour ces technologies autour de la capitale, Olivier Grisel prit l'initiative d'organiser cette rencontre, "juste pour voir". Un verre de vin pour les uns, une bière pour les autres, c'est de manière improvisée que se sont effectués les échanges entre les participants. "Qui fait quoi?", lance l'un d'entre nous. Le tour de table débute et la quinzaine se présente. Parmi nous, étudiants, chercheurs, ingénieurs de développement, gus de garage, entrepreneurs pour un nouveau monde numérique. Ou encore simples curieux.

On y parle linguistique appliquée, système d'information géographique (GIS), algorithmique, machine learning, intelligence artificielle, web sémantique. Très en vogue, les bases de données dites "NoSQL" sont évidemment de la partie. CouchDB, MongoDB, HBase, Redis. Traitement massif des données avec Hadoop/MapReduce. Les questions et retours d'expériences de chacun agitent les neurones d'une communauté de geeks passionnés.

Ces technologies sont encore jeunes, voir expérimentales. Parmi nous, peu ont osés les mettre en production. Mais la tendance du traitement des données en masse est belle et bien présente. Les géants de l'Internet comme Google ou Amazon ont fait leurs preuves avec ces technologies.

La soirée se passe, certains ont faim, d'autres repartent. Le meetup se termine dans un restaurant espagnol où tapas, paella et Rioja font bon ménage. J'ai vite été embarqué dans une conversation passionnée sur les Conditional Random Fields, la descente stochastique de gradient et la programmation vectorielle sur GPU.

Merci à Olivier Grisel pour l'initiative. En attendant de fixer le prochain meetup Paris Datageeks, rendez-vous à l'OpenDataCamp le 12 décembre 2009, à La Cantine.

vendredi 20 novembre 2009

Analyse de code avec maven

Intro

Maven, outil de build que l’on ne présente plus, nous rend encore un immense service en nous proposant de générer un site de présentation du projet.

J’aimerais dans cet article vous montrer les différents rapports de code que l’on peut ainsi  agréger et déployer, afin de présenter le projet ou pour en améliorer la qualité.

Je vous propose d’utiliser comme exemple un projet Open source hébergé sur googlecode, nommé gwt-mvc http://code.google.com/p/gwt-mvc/, choisi au hasard J

Voici le résultat : http://gwt-mvc.googlecode.com/svn/site/0.3/index.html


Rapports

 

Voici les différents plugins utilisés :

maven-project-info-reports-plugin http://maven.apache.org/plugins/maven-project-info-reports-plugin/

Plugin principal du site, permet de sélectionner les rapports de base

 

maven-javadoc-plugin http://maven.apache.org/plugins/maven-javadoc-plugin/

Génère la javadoc du projet.

 

maven-jxr-plugin http://maven.apache.org/plugins/maven-jxr-plugin/

Présente le code source avec des liens entre les classes, afin de pouvoir naviguer dans le code en dehors d’un IDE, pratique pour les projets Open Source.

 

maven-surefire-report-plugin http://maven.apache.org/plugins/maven-surefire-plugin/

Rapport de passage des tests unitaires.

 

maven-pmd-plugin http://maven.apache.org/plugins/maven-pmd-plugin/

Rapport de code avec PMD. Cela permet de vérifier la conformité du code avec des règles de codage prédéfinies. Ces règles peuvent être très poussées, mais la plus représentative est "Dans un  block catch, si une exception est relancées, elle doit être construite avec l'exception intiale en tant que cause". Inclus également le rapport Copy Past Duplication, mettant en avant les duplications de code. Il est même possible de bloquer le build en cas de non-respect de règle.

cobertura-maven-plugin http://mojo.codehaus.org/cobertura-maven-plugin/

Rapport de couverture de test.

 

maven-dependency-plugin http://maven.apache.org/plugins/maven-dependency-plugin/

Analyse des dépendances directes et indirectes, et distinction des dépendances : utilisée directement mais sans déclaration (directe), déclarées mais non utilisées.

 

versions-maven-plugin http://mojo.codehaus.org/versions-maven-plugin/

Rapport de mise à jour des dépendances et des plugins.

 

dashboard-maven-plugin http://mojo.codehaus.org/dashboard-maven-plugin/

Agrège les résultats de certains des rapports précédents, et les présente avec de jolis graphiques.

 

Intégration à Eclipse

Ces rapports étant éloignés de l’IDE, l’idéal est de pouvoir retrouver ces mêmes résultats au plus près du code, afin d’avoir deux outils complémentaires.

 

M2clipse http://m2eclipse.sonatype.org/ http://m2eclipse.sonatype.org/update/

Ce plugin permettra à Eclipse d’interpréter la configuration maven afin de compiler le projet.

 

JUnit

Intégré nativement à Eclipse, il vous permet de passer vos tests unitaires.

 

Eclemma  http://www.eclemma.org/ http://update.eclemma.org/

Eclemma vous permet d’obtenir votre couverture de test en utilisant emma. (Cobertura etait utilisé dans les rapports)

 

PMD http://pmd.sourceforge.net/ http://pmd.sourceforge.net/eclipse

Permet d’effectuer les contrôles du respect des règles de codage. Il est important de configurer ces outils avec le même ruleset, et de choisir avec précaution ces règles.

Ici, j’ai utilisé les règles proposées par le plugin PMD eclipse.

 

Conseils

Fixer les numéros de versions des plugins utilisés, afin d’avoir un build répétable.

Placer vos mots de passe dans les fichiers .settings, pas dans le pom, ou alors choisissez le mode interactif (vos identifiants vous seront demandés pendant l’execution).

 

Trucs et astuces

Pour afficher l’arbre des dependances de votre projet :

mvn dependency:tree

(Inclus dans le rapport « Dependencies » mais tellement pratique)

 

Pour savoir si vous utilisez la dernière version de vos plugins (y compris les rapports) :

mvn versions:display-plugin-updates

(Inclus dans le rapport « Plugin Updates Report »)

 

Problèmes rencontrés

J’aurais aimé pouvoir faire le site-deploy en une seule fois, mais wagon-svn ne fournit pas encore l’option qui permet de spécifier un fichier de configuration appellé auto-props, permettant d’associer un mime-type à une extension de fichier.

https://wagon-svn.dev.java.net/issues/show_bug.cgi?id=4

J’ai donc été obligé de générer le site dans un premier temps, puis de modifier les propriétés mime-type dans un second temps.

 

Recherche d’ artifact

Je vous conseille également les sites suivants pour « retrouver » des artifacts, leurs différentes versions, et sur quel repository ils sont disponibles.

http://merobase.com/

http://mvnrepository.com/

http://www.mvnbrowser.com/

 

Il existe des dizaines de sites proposant ce service, mais ceux-là ont un truc en plus, je vous laisse les découvrir.

 

Sources

http://beta.parleys.com/#sl=1&st=5&id=625

http://maven.apache.org/guides/mini/guide-site.html

http://blog.fastconnect.fr/?p=275

 

Bonne génératon de site.

 

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 

            <modelVersion>4.0.0</modelVersion>

            <groupId>com.googlecode.gwt-mvc</groupId>

            <artifactId>gwt-mvc</artifactId>

            <version>0.3</version>

            <packaging>jar</packaging>

            <name>gwt-mvc</name>

            <description>

                        gwt-mvc Project, an MVC layer on Google Web Toolkit

            </description>

            <url>http://code.google.com/p/gwt-mvc/</url>

            <licenses>

                        <license>

                                   <name>The Apache Software License, Version 2.0</name>

                                   <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>

                                   <distribution>gwt-mvc-repository</distribution>

                        </license>

            </licenses>

 

            <repositories>

                        <repository>

                                   <id>maven2-repository.dev.java.net</id>

                                   <name>Java.net Repository for Maven</name>

                                   <url>http://download.java.net/maven/2/</url>

                        </repository>

                        <repository>

                                   <id>gwt-maven-repository</id>

                                   <url>

                                               http://gwt-maven.googlecode.com/svn/trunk/mavenrepo

                                   </url>

                        </repository>

            </repositories>

 

            <scm>

                        <!-- http://maven.apache.org/scm/subversion.html -->

                        <connection>

                                   scm:svn:http://gwt-mvc.googlecode.com/svn/trunk/gwt-mvc

                        </connection>

                        <developerConnection>

                                   scm:svn:https://${username}:${password}@gwt-mvc.googlecode.com/svn/trunk/gwt-mvc

                        </developerConnection>

                        <url>http://code.google.com/p/gwt-mvc/source/browse/</url>

            </scm>

 

            <distributionManagement>

                        <repository>

                                   <id>gwt-mvc-repository</id>

                                   <url>svn:https://gwt-mvc.googlecode.com/svn/repository</url>

                        </repository>

                        <site>

                                   <id>gwt-mvc-site</id>

                                   <url>

                                               svn:https://gwt-mvc.googlecode.com/svn/site/${version}

                                   </url>

                        </site>

            </distributionManagement>

 

            <build>

                        <extensions>

                                   <extension>

                                               <groupId>org.jvnet.wagon-svn</groupId>

                                               <artifactId>wagon-svn</artifactId>

                                               <version>1.9</version>

                                   </extension>

                        </extensions>

                        <plugins>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-compiler-plugin</artifactId>

 

                                               <configuration>

                                                           <source>1.5</source>

                                                           <target>1.5</target>

                                                           <compilerVersion>1.5</compilerVersion>

                                               </configuration>

                                   </plugin>

                        </plugins>

            </build>

 

            <dependencies>

 

                        <dependency>

                                   <groupId>com.google.gwt</groupId>

                                   <artifactId>gwt-user</artifactId>

                                   <version>1.6.4</version>

                                   <scope>provided</scope>

                        </dependency>

 

 

                        <!-- ControllerTestCase compilation -->

                        <dependency>

                                   <groupId>junit</groupId>

                                   <artifactId>junit</artifactId>

                                   <version>4.5</version>

                                   <scope>provided</scope>

                        </dependency>

                        <dependency>

                                   <groupId>org.jmock</groupId>

                                   <artifactId>jmock</artifactId>

                                   <version>2.5.0</version>

                                   <scope>provided</scope>

                        </dependency>

                        <dependency>

                                   <groupId>org.jmock</groupId>

                                   <artifactId>jmock-legacy</artifactId>

                                   <version>2.5.0</version>

                                   <scope>provided</scope>

                        </dependency>

 

            </dependencies>

 

            <reporting>

                        <plugins>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>

                                                           maven-project-info-reports-plugin

                                               </artifactId>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>index</report>

                                                                                  <report>licence</report>

                                                                                  <report>dependencies</report>

                                                                                  <report>plugin-management</report>

                                                                                  <report>plugins</report>

                                                                                  <report>summary</report>

                                                                                   <report>scm</report>

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-javadoc-plugin</artifactId>

                                               <version>2.6</version>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>javadoc</report>

                                                                                  <!-- <report>test-javadoc</report> -->

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-jxr-plugin</artifactId>

                                               <version>2.1</version>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>jxr</report>

                                                                                  <!-- <report>test-jxr</report>-->

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-surefire-report-plugin</artifactId>

                                               <version>2.4.3</version>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-pmd-plugin</artifactId>

                                               <version>2.4</version>

                                               <configuration>

                                                           <targetJdk>1.5</targetJdk>

                                                           <rulesets>

                                                                       <ruleset>/pmd/pmd-plugin-rules.xml</ruleset>

                                                           </rulesets>

                                               </configuration>          

                                   </plugin>

                                   <plugin>

                                               <groupId>org.codehaus.mojo</groupId>

                                               <artifactId>cobertura-maven-plugin</artifactId>

                                               <version>2.3</version>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.apache.maven.plugins</groupId>

                                               <artifactId>maven-dependency-plugin</artifactId>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.codehaus.mojo</groupId>

                                               <artifactId>versions-maven-plugin</artifactId>

                                               <version>1.1</version>

                                               <reportSets>

                                                           <reportSet>

                                                                       <reports>

                                                                                  <report>dependency-updates-report</report>

                                                                                  <report>plugin-updates-report</report>

                                                                                  <!--                     <report>property-updates-report</report>-->

                                                                       </reports>

                                                           </reportSet>

                                               </reportSets>

                                   </plugin>

                                   <plugin>

                                               <groupId>org.codehaus.mojo</groupId>

                                               <artifactId>dashboard-maven-plugin</artifactId>

                                               <version>1.0.0-beta-1</version>

                                   </plugin>

                        </plugins>

 

            </reporting>

 

</project>

 

Unification reloaded

Deuxième journée de DEVOXX 2009, qui commence par une Keynote très attendue et à mon avis orientée BSBS "Be Simple Be Smart". Je m'explique : Ivar Jacobson , le père d'UML, est un personnage atypique qui n'a pas hésité pas à parler d'une réalité tout aussi controversée que la démultiplication des méthodologies où, selon ses termes, des pratiques qui ne cessent de fleurir régulièrement et qui génèrent beaucoup de problèmes d'apprentissage, de maîtrise, et bien évidemment de compréhension.

Lire la suite...

jeudi 19 novembre 2009

Devoxx 2009 : Agile Mythbusters

Scott W. Ambler, Chief Agile Methodologist chez IBM, a présenté les résultats des sondages réalisés par Ambysoft et Dr. Dobb's Journal pour faire ressortir les pratiques réelles des équipes agiles à ce jour.

Les conclusions qui ont retenu mon attention :

  • les pratiques agiles restent principalement concentrées sur la technique (Continuous Integration) ;
  • l'obtention de la certification "SCRUM Master" après seulement deux jours de formation est dépourvue de sens ;
  • des équipes de plus de 200 personnes pratiquent l'agilité ;
  • les pratiques agiles ne changent pas les besoins de chiffrage, de spécification, de modélisation, d'architecture durant l'initialisation d'un projet ;
  • la majorité des développeurs agiles suivent des conventions de codage même s'il reste une marge de progrès dans ce domaine ;
  • les équipes agiles et traditionnelles écrivent autant de documentation et cette documentation est de qualité similaire ;
  • les projets agiles connaissent plus de succès que les projets classiques.

L'intérêt principal de cette présentation a été de fournir des réponses chiffrées aux questions que peuvent se poser les personnes s'intéressant aux méthodes agiles. Cependant, il convient de considérer ces chiffres dans leur contexte avec les limitations que ça implique. Par exemple, les conditions de succès d'un projet restent sujet à discussion.

Pour la liste complète des "Mythes Agiles" et les résultats des sondages associés, se référer au post de Jevgeni Kabanov.

Pour la liste des sondages, suivre ce lien.

- page 4 de 14 -