Pages

Thursday, December 23, 2010

De retour!

J'ai délaissé un peu ce blog ces dernier temps. Ce n'est pas une volonté délibérée de ma part mais c'est plus dû à un manque de temps.

Je travaille depuis 6 mois sur un projet passionnant à Norsys où j'interviens en tant que ScrumMaster. Vous trouverez plus d'infos sur ce projet ici. Il y a deux facteurs principaux qui en font pour moi un projet très intéressant :

  • Une liberté de choix technologique : Sur ce projet, tout est centré sur le but à atteindre et non sur le comment l'atteindre.
  • "Have fun": Le facteur humain est super important. Une équipe motivée, un vrai "team spirit", la mise en oeuvre de Scrum/XP et c'est le pied! Notre Daily Scrum a même été diffusé sur M6 Capital :-).
Les idées de posts ne manquent pas sur ces différents sujets! Promis, Je m'y mets!

Monday, March 8, 2010

Intégrer un nouveau membre dans une équipe projet

On m'a récemment demandé si j'avais des suggestions ou des idées sur l'intégration d'un nouveau membre dans une équipe projet.

J'ai évidemment directement suggérer de faire du Pair programming. Le pair programming est une des pratiques de eXtreme Programming

Les bénéfices du pair programming ne sont plus à démontrer mais cette pratique est particulièrement intéressante dans le cadre de l'intégration d'un nouvel arrivant dans une équipe :
  • L'intégration se fait par l'exemple mais dans des conditions réelles.
  • Le nouveau membre a tout de suite une vision de comment faire concrètement.
  • Le risque de "laisser" le nouveau travailler seul n'existe plus. (Principe du "je ferme les yeux, ça va passer, ça va passer...")
  • Pour le membre de la paire qui fait déjà parti du projet, il va devoir reprendre du recul par rapport à ce qu'il fait pour pouvoir répondre aux questions. Prendre du recul, c'est toujours favorable.
  • Le nouveau membre se sentira membre de l'équipe beaucoup plus rapidement.
  • Le nouveau membre sera "opérationnel" beaucoup plus rapidement.
  • Cela permet de ne pas se retrouver avec le nouveau membre, le jour de son arrivée, assis à un bureau sans rien faire sans login mot de passe et sans poste de travail... (si si, je vous vois sourire, ça arrive tout le temps, il doit d'ailleurs y avoir une "loi" derrière tout ça, c'est à creuser :-)).
Le principal argument qu'on peut entendre en général pour ne pas faire du pair programming : 
"Ça va me couter du temps et donc de l'argent car ça va monopoliser un membre de l'équipe."

La réponse à cela est "c'est pas faux" pour ne pas dire "c'est pas vrai" :-) :
  • L'intégration d'un nouveau membre dans une équipe à un coût. Il faut l'accepter. Cela n'a rien à voir avec le fait de faire du pair programming.
  • Ce coût est beaucoup moins facile à quantifier quand on laisse le nouveau membre se débrouiller car il est dilué (qualité moyenne des premières réalisations, temps de "parasitage" du nouveau membre envers l'équipe lorsqu'il aura besoin de savoir quelque chose, temps passé à corriger les anomalies découvertes des premières réalisations, ...)
  • Le membre de l'équipe qui va travailler en pair programming avec le nouveau n'arrête pas de développer, il va juste développer un peu moins vite (mais à contrario c'est directement quantifiable :-)).
  • Faire du pair programming, ne veut pas dire de faire que du pair programming. Il peut être intéressant d'alterner pendant la durée d'intégration les phases de travail en paire et les phases en autonomie. Cela peut permettre au nouveau membre de monter sa plateforme de développement, de "digérer" la phase de travail en paire, de lire des documentations, de trouver une date pour payer son coup...
Pair programming se dit en français programmation en binôme.

Monday, March 1, 2010

Coding Dojo en entreprise

x
x
x
J'organise avec Thomas, Guillaume et Jay (amis, collègues et membres de la direction technique de Norsys) des Coding Dojos en interne. J'ai réalisé avec Guillaume un document descriptif / retour d'expérience sur l'organisation de ce type d'évènement. En voici une adaptation :

Un Coding Dojo, Qu'est-ce que c'est ?
Un Coding Dojo est une réunion où un ensemble de personnes se retrouvent pour travailler sur un défi de programmation de façon collective. Un défi de programmation est un problème à résoudre ou un besoin à implémenter.
Chaque coding DOJO se porte sur un sujet particulier qui est décliné en un exercice à réaliser. Il représente le challenge de programmation du DOJO.
Un Coding Dojo permet de mettre en œuvre différentes techniques de programmation notamment lié à l'extrême proggramming :
  • Pair Programming.
  • TDD.
On pourrait assimiler un Coding Dojo à un Coding party. Ce n'est pas le cas. L'objectif n'est pas de réussir à résoudre le défi de programmation mais plutôt de d'apprendre de façon collective sur la manière d'y arriver.

Un Coding Dojo, Pourquoi faire?
"Si je veux apprendre le Judo, je vais m'inscrire au dojo du coin et y passer une heure par semaine pendant deux ans, au bout de quoi j'aurai peut-être envie de pratiquer plus assidument. Si je veux apprendre la programmation objet, mon employeur va me trouver une formation de trois jours à Java dans le catalogue 2004. Cherchez l'erreur. "
Laurent Bossavit, président de l'association XP-France (Extreme Programming).

Le constat de départ est que trop de développeurs utilisent uniquement leur travail (et leurs réalisations professionnelles) comme terrain d'entraînement pour parfaire leurs techniques. Le principe d'un Coding  dojo est de proposer un espace sûr pour que les développeurs puissent expérimenter, tester et apprendre en dehors du cadre d'un projet.
Les personnes qui participent à ce type de réunion doivent le faire par envie et pour améliorer leurs compétences en programmation.

Les principales motivations qui doivent pousser les personnes à participer à un Coding Dojo sont :
  • l'envie d'apprendre.
  • l'envie de partager.
  • l'amélioration continue.

Les caractérisitiques d'un Coding Dojo
Le coding DOJO doit être "un lieu sûr " :
  • Tous les niveaux de compétences en programmation sont acceptés.
  • Seule une personne volontaire peut participer à un Coding Dojo.
  • Ce n'est pas une compétition.
  • L'erreur est humaine.
  • Il n'y a pas de jugement.
  • Le Coding Dojo doit être un moment convivial.
  • Tout le monde doit participer.
Voici un ensemble de points qui caractérisent un Coding Dojo :
  • Chacun doit pouvoir s'améliorer à son rythme.
  • Le but n'est pas de terminer l'exercice mais bien d'apprendre.
  • Il permet un apprentissage continu/régulier.
  • Il permet un apprentissage par petits pas.
Il existe 2 types de Dojos :
  • le kata.
  • le randori. 
Qu'est-ce qu'un Kata?
PRINCIPE :
Le kata est une des formes de Coding Dojo. C'est une démonstration en live de la réalisation d'un défi de programmation en partant de zéro.

image provenant de Dojo@SP (São Paulo)



Un présentateur (un seul programmeur ou un binôme) présente sa solution du défi. Il explique continuellement son cheminement et il affiche sa progression en déroulant continuellement les tests. Le défi est réalisé en entier en TDD (Test-Driven Development). L'interactivité avec le reste du groupe est primordiale.

Le but n'est pas de trouver la meilleure solution mais de comprendre la solution proposée par le présentateur.

CHARTE :
La pratique du TDD appliquée au Kata pour le présentateur (ou binôme) est la suivante :
  • Rédaction d'un test.
  • Le test est au rouge (en echec). Si le test ne passe pas, le présentateur doit expliquer aux participants la raison de l'échec. il doit mettre en œuvre le code permettant de réussir le test. 
  • Le test est au vert (réussite). Le présentateur peut souligner de bonnes ou de mauvaises pratiques. La salle peut interrompre le présentateur dans le seul cas où il ne comprend plus le déroulement de la solution.…
  • Refactoring du code.
Toute restructuration doit être expliquée
et ainsi de suite…

Qu'est ce qu'un Randori
PRINCIPE :
Le randori est l'autre forme de Coding Dojo. L'objectif est d'implémenter une solution de façon collaborative pour un défi. Le principe de base est que tout le monde effectue les rôles de pilote et co-pilote pendant la session.
 image provenant de Dojo@SP (São Paulo)

Le binôme de développement est composé d'un pilote qui a le clavier et d'un co-pilote qui implémentent une solution pour le défi en respectant la démarche TDD (Test-Driven Development). Le binôme est changé toutes les 5 à 7minutes par une rotation :
  • le pilote retourne parmi le reste du groupe.
  • le co-pilote devient pilote.
  • une personne du groupe devient co-pilote. 
CHARTE :
La pratique du TDD appliquée au randori pour chaque binôme (durée 5 à 7 minutes) est la suivante :
  • Rédaction d'un test.
  • Le test est au rouge (en echec). Le binôme de développement à la main. Si le test ne passe pas, le pilote doit expliquer aux participants la raison de l'échec. Les participants n'interviennent que si le binôme le demande. Le binôme doit mettre en œuvre le code permettant de réussir le test.
  • Le test est au vert (réussite). Les participants peuvent intervenir pour proposer des améliorations, faire des remarques, poser des questions…
  • Refactoring du code.
Toute restructuration doit être discutéé et avoir l'accord de la majorité des participants.
et ainsi de suite…

Du coté de l'organisation...
QUI PEUT PARTICIPER?
Toutes les personnes qui adhèrent aux principes d'un Coding Dojo.

QUI PEUT ORGANISER?
Toutes les personnes qui adhèrent aux principes d'un Coding Dojo qui ont envie d'organiser ce type d'évènement.

LES CONTRAINTES D'ORGANISATION :
Pour organiser un Coding Dojo, il faut :
  • Un lieu.
  • Une date.
  • Une durée fixe est définie avant le Coding Dojo.
  • Un sujet + langage de programmation.
  • Un mode de fonctionnement kata ou randori.

LA LOGISITIQUE À PRÉVOIR:
D'un point de vue logistique il faut :
  • Que les participants possèdent une adresse mail pour les communications qui précédent et suivent une session.
  • Une salle.
  • Une table (au moins).
  • Des chaises pour l'ensemble des participants
  • Un video projecteur.
  • Un ordinateur portable.
  • Un paper board ou white board.
  • Des post-its.
  • Des stylos.
  • Un appareil photo (optionnel)
  • Une Caméra (optionnelle)
Exemple : Un Dojo à Norsys
AVANT :
Il faut :
  • Choisir une date.
  • Choisir le lieu.
  • Choisir le sujet (soit par un vote public, soit par un choix au niveau des organisateurs).
  • Réserver les éléments logistiques nécéssaires (video projecteur, salle, …).
  • Préparer un système d'inscription en ligne et de choix de sandwich(doodle ou formulaire google docs).
  • Envoyer l'annonce du Dojo (date, lieu, contenu, lien vers le système d'inscription.
  • Solliciter les personnes qui doivent préparer des choses pour la session pour s'assurer qu'il n'y ai pas de malentendu.
JUSTE AVANT :
  • Envoyer un mail de rappel aux inscrits avec le choix de leur sandwich.
  • Gérer la commande de sandwich.
  • S'assurer que les éléments logistiques réservés sont bien disponibles.
PENDANT :
  • 12h00-12h30 :  arrivée progressive des participants. Préparation de dernière minutes. Distribution des sandwichs et récupération de l'argent.
  • 12h30-13h30 : Coding Dojo.
  • 13h30-14h00 : Discussion autour du Dojo. Rangement . Départ progressif des participants.
APRÈS :
  • Mettre à disposition le code de la session.

Difficultés
Un coding Dojo réprésente malgré tout un défi d'organisation :
  • Cela prend du temps.
  • Il faut résoudre les difficultés logistiques en amont d'une séance.
  • Il faut se mettre d'accord sur un sujet et ça n'est pas toujours évident.
  • Durant la séance : Ne pas oublier que l'ojectif premier est d'apprendre et non pas de terminer l'excercice. Il faut trouver un bon equilibre entre le développement l'échange.
  • 1 heure, c'est très court. Le souhait de de développer le plus possible et de faire participer tout le monde.
  • Travail collaboratif. Il faut faire des choix dans un temps restreint et dans le cadre d'une rélfexion commune.
Quelques références :
A vous de jouer :-)

Thursday, February 11, 2010

Bench de framework web service java : Axis2 vs Cxf vs Spring ws

C'est quoi un framework web service? :
Les frameworks web service java ont pour objectif de s'affranchir des problématiques techniques liées à la mise en oeuvre d'un web service pour permettre de se concentrer sur le traitement qui doit être réalisé par celui-ci et de simplifier son appel. Dans les grandes lignes, ils permettent :
  • coté client : de générer les classes à partir d'un WSDL permettant de créer une grappe d'objet correspondant au message SOAP du web service de façon transparente.
  • coté serveur : de récupérer une requête HTTP SOAP, de transformer le contenu du message en une grappe d'objets, d'appeler une méthode java correspondant à la requête puis de récupérer l'objet en retour de l'appel de la méthode et de le transformer en réponse HTTP SOAP.
Plusieurs méthodes de développement sont associées à ces frameworks :
  • Contract first : définir un contrat d'échange et ensuite de s'appuyer sur ce contrat pour développer le service à l'aide du framework.
  • Code first : développer un service java et ensuite s'appuyer sur le framework pour qu'il expose la méthode sous forme de web service.
Ces deux méthodes font débats et je ne vais pas m'attarder dessus dans le cadre de ce bench dont ce n'est pas l'objet. J'y reviendrai peut être dans un autre billet...

Les frameworks testés :
Je me suis attardé sur les frameworks les plus connus :
Objectif du bench:
L'objectif du bench est de mesurer le temps passé dans les couches techniques des frameworks web services en dehors du réel traitement que doit effectuer le web service et cela différent niveau de charge. Le tout est de pouvoir mesurer l'overhead engendré par les frameworks web services par rapport à un appel direct de méthode en java et de comparer cet overhead. Le bench se focalise sur les temps de traitements coté serveur :


Caractéristiques du bench :
  • les web services exposés :
J'ai mis en place le même web service avec les 3 frameworks dans 3 webapps indépendantes. Les temps de réponses sont mesurés coté client. Pour que les temps de réponse coté client correspondent à l'overheard technique coté serveur, le traitement métier est inexistant : Le service java ne fait que renvoyer l'objet récupérer en paramètre :


La requête en entrée ainsi que la réponse en retour sont représentatifs d'un "vrai" web service (dans le sens ou ce n'est pas un simple hello world) : 
    • 60 données unitaires
    • 3 niveaux de profondeur
    • requête SOAP de 3.75 Ko
  • Du coté du client :
J'ai mis en oeuvre un injecteur http maison multithreadé et basé sur commons-httpclient qui envoie directement la requête SOAP prédéfinies et mesure les temps de réponse. J'ai d'abord fait des tests avec SoapUI en local sur mon poste mais je ne voulais pas "pollué" les résultats en saturant le poste client et j'ai donc décidé de mesurer les temps de réponse client à partir d'un serveur plus puissant que mon poste et dédié au bench.
  • Du coté du serveur :
J'ai déployé les 3 webapps dans un JBoss 5.1.0 "out of the box" s'appuyant sur une JVM Sun 1.6.0_18. J'ai simplement augmenté la taille de la JVM.



  • procédure du bench :
J'ai monté en charge les uns après les autres chacun des web services exposés avec : 10, 50 et 100 clients (threads) simultanés effectuant chacun 2000 appels. Le test est répété 4 fois pour vérifier la stabilité des temps  de réponse sur plusieurs essais.

Résultats :




Voici le tableau détaillé : 

Dans le cadre de ce bench, CXF est donc le framework le plus performant suivi d'assez prêt par Spring ws. Axis2 est clairement moins performant indépendamment du niveau de charge coté serveur.

Conclusion :
J'ai été confronté à quelques problèmes de déploiement sur JBoss à cause de librairies utilisées à la fois par les frameworks et par JBoss avec Axis2 et Spring ws. Sur cet aspect là, la communauté et la documentation autour de Spring permettent de résoudre rapidement le problème alors que pour Axis2, il a fallu creuser un peu plus.

Tuesday, February 9, 2010

JBoss : permettre les accès distants

Depuis la version 4.2  de JBoss, la configuration de l'accès aux services réseaux est mappé sur le 127.0.0.1 (la machine en local). Cela rend JBoss complètement hermétique à toutes connexions distantes à ses services. Cette nouvelle configuration a pour objectif de sécuriser le JBoss.

Pour autoriser des accès distants au services de JBoss,  il faut alors démarrer le serveur l'option -b en précisant l'ip que vous désirez autoriser.

Voici la commande de lancement pour autoriser toutes les ips (qui est la configuration par défaut des versions antérieures de JBoss) :
run.sh -b 0.0.0.0