vendredi 17 décembre 2010

GWT : premiers contacts

Introduction

Depuis pas mal de temps, et notamment depuis la présentation de Didier GIRARD à Grenoble (voir cet article), je voulais tester GWT (Google Web Toolkit) avec un petit développement. C'est chose faite et je vais donc partager ici mes premières impressions et remarques.

N'hésitez pas à réagir et à commenter pour que nous puissions échanger sur le sujet !

GWT, c'est quoi ?


Extrait Wikipédia :
Google Web Toolkit (GWT) est un ensemble d'outils logiciels développé par Google, permettant de créer et maintenir des applications web dynamiques mettant en oeuvre JavaScript, en utilisant le langage et les outils Java. C'est un logiciel libre distribué selon les termes de la licence Apache 2.0.

GWT met l'accent sur des solutions efficaces et réutilisables aux problèmes rencontrés habituellement par le développement AJAX : difficulté du débogage JavaScript, gestion des appels asynchrones, problèmes de compatibilité entre navigateurs, gestion de l'historique et des favoris, etc.
Source et détails : http://fr.wikipedia.org/wiki/Google_Web_Toolkit

Contexte et objectif

Pour expérimenter la techno, j'ai profité d'un besoin simple pour l'association de parents d'élèves dont je fais partie. Il s'agit de permettre aux parents d'élèves lambda de remonter facilement des incidents, et de stocker ces données pour mémoire et pour d'éventuelles statistiques d'ici quelques mois.

J'ai donc développé un formulaire simple composé de textes, de champs de saisie libres, de liste de choix, et d'un bouton "Envoyer" :


J'ai également ajouté un "mode avancé", activable par un paramètre dans l'URL, me permettant de visualiser les données saisies sous forme de tableau.

Google App Engine

J'en ai profité pour utiliser GAE (Google App Engine) que j'avais déjà testé par ailleurs. Le besoin étant d'avoir un formulaire "en ligne" et provisoire (quelque mois), le cloud computing (PaaS) est tout à fait adapté, et notamment GAE bien intégré avec GWT.

Installation de l'environnement de développement et démarrage

Comme bon nombre de plug-ins pour Eclipse, les informations sont faciles à trouver sur internet et l'installation est rapide.

Pour le démarrage du projet, les outils intégrés à Eclipse permettent de créer très rapidement un squelette d'application basique mais contenant l'essentiel, et prêt à l'emploi.

Création de l'IHM et gestion des événements

C'est évidemment le point fort de GWT puisqu'on écrit du code Java très proche de AWT et Swing. J'ai donc très rapidement créé une première version du formulaire avec des libellés et des champs de saisie. Extrait :

  FlexTable table = new FlexTable();

  int row = 0;
  table.setText(row, 0, "Prénom et Nom :");
  field = new TextBox();
  table.setWidget(row++, 1, field); 
  ...
  name = field.getText();
  ...

Une liste de choix permet de choisir un type d'incident. Si l'utilisateur choisit "Autre", un champ de saisie est activé pour permettre à l'utilisateur de préciser. Extrait :

  typeList.addChangeHandler(new ChangeHandler() {
      @Override
      public void onChange(ChangeEvent event) {
          otherTypeField.setEnabled(isOtherTypeSelected());
      }
  });

Par rapport à une solution Javascript manuelle, la gestion des événements de l'IHM est vraiment plus simple, instinctif, agréable, rapide, ... Bref, le pied !

Tests de l'IHM

Pour tester son développement, il y a essentiellement 2 possibilités :
  • en tant que GWT application : je n'ai pas réussit à utiliser ce mode, NoSuchMethodError dans org.mortbay.*, je n'ai pas voulu perdre trop de temps sur ce problème ... mais je suis preneur d'une solution !
  • en tant que WEB application : j'ai donc utilisé ce mode, extrêmement pratique, les modifications d'IHM sont immédiatement visibles avec un rafraichissement dans le navigateur, un système de base de données est en place (et permet le stockage et la visualisation des données), etc ...
La partie mise au point du rendu est donc rapide et efficace : encore un bon point !

Extension de l'IHM (modules)

Mon formulaire devait permettre à l'utilisateur de saisir la date de l'incident. Ahh ... les dates et leurs formats : toujours un problème ... J'ai donc cherché un DatePicker, et j'ai trouvé gwt-datepicker développé par Zenika.

Après le téléchargement et une petite recherche internet, l'intégration du module dans le projet est rapide et facile. Finalement, pour l'utilisation, on a juste à écrire ce genre de lignes pour créer l'objet et récupérer la date :

  datePicker = new DatePicker();
  ...
  Date selectedDate = datePicker.getSelectedDate();
  ...

J'ai regardé rapidement le contenu du module téléchargé : essentiellement du Java, un peu de CSS et bien sûr l'XML GWT pour le module lui-même. Le tout multi-langue, une utilisation facile, un résultat efficace. Cette solution de modules semble donc très puissante !

Échanges avec le serveur

L'assistant de création de projet met en place le mécanisme de communication avec le serveur grâce à un système de service à base d'interfaces et une implémentation. Pour chaque service, il y a effectivement 2 interfaces :
  • la première est "classique" et décrit le service et ses méthodes
  @RemoteServiceRelativePath("recordissue")
  public interface RecordIssueService extends RemoteService {
      IssueResponse recordIssue(Issue issue) throws IllegalArgumentException;
    
      Issue[] retrieveIssues() throws IllegalArgumentException;
  }
  • la seconde est un peu surprenante au départ (mais on s'y fait), elle est voisine de la 1ère, doit avoir le même nom avec l'extension Asynch, elle doit contenir les mêmes méthodes ou presque (void pour le retour, et un paramètre de callback), le tout pour permettre une utilisation asynchrone du service (ajax) depuis la page HTML (le tout toujours écrit en Java !)
  public interface RecordIssueServiceAsync {
      void recordIssue(Issue issue, AsyncCallback<IssueResponse> callback)
              throws IllegalArgumentException;

      void retrieveIssues(AsyncCallback<Issue[]> callback) throws IllegalArgumentException;
  }

J'ai renommé le service initialement généré. J'y ai ajouté quelques méthodes (recordIssue, retrieveIssues, ...). J'ai créé un bean Java IsSerializable pour encapsuler les données. Et voilà, en quelques minutes, mon serveur me traçait les données reçues du formulaire ! Là encore : simple, rapide, pratique !

Stockage des données

L'étape suivante était donc de stocker ces données sur le serveur. J'ai rendu le bean de données persistant grâce aux annotations JDO. Extrait :

  @PersistenceCapable(identityType = IdentityType.APPLICATION)
  public class Issue implements IsSerializable {

      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Long id;

      @Persistent
      public String name;

      @Persistent
      public Date date;

      @Persistent
      public String type;

      ...
  }

Côté serveur, j'ai complété le service avec un DAO pour stocker les nouveaux incidents dans la base Bigtable de Google App Engine :

  public class IssueDao {

      private static final PersistenceManagerFactory PMF = JDOHelper
              .getPersistenceManagerFactory("transactions-optional");

      public static void store(Issue issue) {
          PersistenceManager pm = getPersistenceManager();
          try {
              pm.makePersistent(issue);
          } finally {
              pm.close();
          }
      }

      private static PersistenceManager getPersistenceManager() {
          return PMF.getPersistenceManager();
      } 

      ... 
  }

C'est pas plus long que ça, et encore une fois .... (vous aurez compris !)

Déploiement

Le plug-in Google App Engine ajoute 3 boutons dans Eclipse dont un pour le déploiement. Avec avoir renseigné l'ID de l'application (préalablement créée sur le cloud de GAE) et le N° de version, on saisie les identifiants de compte et le déploiement se déroule : compilation, envoi des fichiers, activation, vérification.

Une fois l'application en ligne, elle est accessible par une URL assez simple, et la console Google App Engine permet de contrôler plein de paramètres, ainsi que la consultation des données en base. Très pratique !

Bilan

Vous l'avez vu, plein de points positifs, et en très peu de temps, j'avais un formulaire opérationnel, hébergé sur internet, avec stockage des données dans une base.

Néanmoins, je dois mentionner quelques problèmes ou difficultés rencontrés.

Mise en page de l'IHM
Une fois la première version du formulaire réalisée, j'ai voulu aller un peu plus loin : mise en page, onglets, alignements, etc ... J'ai alors un peu plus galéré. Comme pour AWT et Swing, et notamment le puissant mais délicat GridBagLayout, il faut pratiquer un peu pour comprendre la logique de GWT légèrement différente des layouts de AWT. Il faut également faire attention aux mélanges avec CSS. J'ai donc l'impression qu'il faut découper son IHM en panels, encore plus qu'en AWT.

(Trop) Grand nombre de permutations
La force de GWT est sa compatibilité entre les navigateurs. Pour cela (et pour le multi-langue), le compilateur démultiplie les fichiers Javascript générés : c'est ce qu'on appelle les permutations. Je ne sais pas pourquoi, mais je me suis retrouvé avec ... 90 permutations ! J'ai essayé d'en diminuer le nombre en spécifiant mon navigateur dans mon fichier *.gwt.xml :
<set-property name="user.agent" value="gecko" />

Je n'avais alors plus que 15 permutations, mais le gwt-datepicker ne fonctionnait plus ... Je n'ai pas voulu perdre de temps pour l'instant sur ce point, mais je suis preneur d'idées et suggestions ...

Boite noire
Pour le problème ci-dessus, autre inconvénient de GWT, difficile de trouver la piste pour debugger, voir le code JavaScript, y mettre des points d'arrêt, etc ... C'est forcément l'inconvénient d'une telle technologie qui fonctionne un peu en "boite noire", pas facile ensuite de mettre les mains dans le canboui. Néanmoins, il me semble qu'il doit y avoir des moyens pour mettre des points d'arrêt dans le code Java, à creuser ...

Module ("Entry Point")
Pour visualiser mes données, j'étais initialement parti sur la création d'une autre page HTML. Mais apparemment, qui dit autre page, dit autre module. Le résultat attendu n'a pas été immédiat (ou aussi rapide que les étapes précédentes). En plus, ma seconde page ne comportait qu'une table, mais à l'affichage, sous la table, je me retrouvais avec le formulaire de la première page sans vraiment comprendre pourquoi. Je n'ai vraiment pas passé trop de temps sur cette piste, je suis vite revenu à un module unique, et une page avec des onglets "cachés". Il est vrai que je suis allé vite, sans trop lire de littérature sur GWT et ses concepts (c'était un peu mon but, tenter une entrée rapide dans le vif du sujet), il faudra donc que je creuse un peu plus de ce côté !

Conclusion

Sans hésiter, GWT est une solution extrêmement intéressante, surtout me semble-t-il pour du RIA (Rich Internet Application) en "single page interface". Par contre, je ne sais pas si GWT est approprié pour des applications comportant de nombreuses pages HTML simples, type formulaires de saisies et tables de consultations. Certains frameworks WEB, en MVC, sont vraiment pratiques, rapides et productifs (promis, bientôt un article sur Play! framework). Je n'ai pas non plus exploré la génération de pages avec des données, comme en MVC : la table de ma seconde page est remplie par une requête asynchrone à chaque fois que l'onglet est affiché.

L'intégration avec Google App Engine est vraiment impressionnante par sa simplicité et sa rapidité, notamment pour mon cas d'un besoin simple, en ligne, provisoire, gratuit, ...

Pour la suite, il me faudra jeter un coup d'oeil aux difficultés évoquées ci-dessus pour mieux comprendre le fonctionnement et rentrer plus en détails dans cette techno.

Il faudra également que je me penche sur la conception par UIBinder permettant la description du contenu des pages dans un XML, mais avec mon expérience et ma pratique de AWT et Swing, je ne suis pas sûr d'être convaincu par cette approche de description de l'IHM par XML ... A moins que GWT Designer soit la bonne alternative. A creuser également ...

Donc, une techno très intéressante et puissante, à creuser. Pas forcément la meilleure pour tous les besoins, mais à utiliser à bon escient ...

Et vous ? Que pensez-vous de GWT ? Quelles sont vos expériences ? Selon vous, quelques sont les points forts et les points faibles de GWT, et quelles sont les alternatives ? ...

mercredi 1 décembre 2010

Retour Agile Grenoble 2010

Mardi 23 novembre 2010, j'ai assisté à Agile Grenoble 2010 organisé par le CARA. La journée s'est déroulée à guichet fermé avec 450 participants ! En voici un petit retour avec les points forts que j'ai noté et mes réactions.

Après un accueil efficace et sympa autour d'un café et de viennoiseries, la journée a débuté dans l'amphi par une keynote de Claude Aubry, suivie par 2 créneaux de 1h pour des sessions 7 sessions en parallèle. Après le déjeuner, une keynote de Aslak Hellesoy, suivie de 3 créneaux de sessions.

Mon programme de la journée a donc été le suivant :
  • Matin :
    • Keynote : Claude Aubry : Le petit Scrum illustré
    • Adoption d’Extreme Programming à Kelkoo
    • Atelier Story Map, là où tout commence...
  • Après-midi :
    • Keynote : Aslak Hellesoy : Les nouvelles tendances de l'agilité 
    • TDD et Legacy
    • Kata Robozzle en Haskell
    • Exigences Exécutables Efficaces : "Doing the Right Software"
Ami lecteur, n'hésite pas à me contacter ou laisser un commentaire (remarque, question, correction, etc ...), je souhaite réellement pouvoir échanger sur ces sujets !

Keynote : Claude Aubry : Le petit Scrum illustré

Après une introduction et une présentation, Claude a articulé son intervention sur 9 pratiques de Scrum. J'ai bien aimé cette organisation qui permet de résumer l'agilité et Scrum, ce qui n'est pas toujours facile lorsqu'on veut présenter ces concepts à un novice. De plus, cette approche permet de couvrir de nombreux aspects drainés par l'agilité. Voici ces 9 pratiques :
  • Itératif et incrémental
    Des sprints de 2-3 semaines, un rythme soutenable, une implication de toutes les activités, la notion d'incrément, sans oublier de céléber !
  • Un représentant du client dans l'équipe
    Point souvent négligé. Un Product Owner par produit, et qui soit disponible et réactif
  • Une équipe auto-organisée
    Le Scrum Master ne dirige pas mais facilite, les post-its améliorent la communication et augmentent la gestion collective, éviter les doublons d'outils (ex : post-its + logiciel de suivi)
  • Une liste unique de choses à faire
    C'est évidemment le backlog, qui doit impérativement être priorisé, les items étant décomposés au fur et à mesure que leurs priorités augmentent (i.e. qu'ils "montent" dans le backlog)
  • Un planification à 2 niveaux
    • Le Plan de Release :
      Le Planning Pocker permet de mieux comprendre et communiquer, les estimations doivent être collectives, en points relatifs, elles sont souvent difficiles, ce n'est pas une science exact
    • Le Plan de Sprint :
      Les histoires sont découpées en tâches, l'équipe s'engage, il faut "garder du mou" pour pouvoir réagir aux changements
  • Un point quotidien
    Également appelé Daily Standup Meeting, doit être rapide et efficace, le burndown chart permet de suivre le "reste à faire" et donc la tendance du projet
  • Une démo pour la revue
    Permet un feedback rapide et l'estimation de la vélocité. Cette dernière n'est pas une mesure individuelle de productivité, elle n'est pas censée augmenter tout le temps, et sert à planifier (la suite)
  • Une amélioration continue
    Grâce notamment aux rétrospectives
  • Finir les choses avec qualité
    Bien définir les critères de fin (Done), notion de dette technique
En marge, Claude a évoqué l' "Esprit rock" pour imager la capacité à dire "non".

Il a également précisé un point intéressant qui est que le backlog d'un produit n'est jamais vide. Il en découle un point fort : c'est la date de fin du projet qui est fixe ! Cette approche me semble très importante !!

Claude conclue sur le fait que Scrum est un cadre, que cette approche ne garantie pas le succès d'un projet, et qu'il faut compléter notamment par de l'ingénierie agile.

Une phrase retenue : L'agilité est un voyage, un apprentissage permanent...

Adoption d’Extreme Programming à Kelkoo

Par : Johan Martinsson, Kevin Creix et Jonathan Bonzy

Pourquoi cette session ? : parce que j'avais rencontré des personnes travaillant à Kelkoo, j'avais donc entendu parler de leur approche de l'agilité et de XP, et que j'étais intéressé pour avoir un retour de mise en œuvre pour compléter mes expériences personnelles.

Les présentateurs ont fait un rapide rappel sur XP et quelques pratiques, notamment le TDD et le BDD (composé de plusieurs cycles de TDD). Ils ont expliqué les raisons ayant motivé le passage à XP (remettre de la confiance dans les équipes de développements, diminuer le cout des bugs, et profiter d'un CEO convaincu), et ont présenté la stratégie (proof of concept sur 1 projet + formations + recrutements de personnes expérimentées).

Ensuite, la présentation a été axées sur l'évolution chronologique au sein de l'entreprise. J'ai noté les points intéressants suivants :
  • Début par un état des lieux. Peu de TDD, un peu de tests unitaires sur les parties faciles
  • Ce qui aide : présence d'un évangéliste, TDD en sa présence, pair-programming
  • Le BDD a donné de meilleurs résultats malgré un cout d'entrée important
  • Ne pas brader la qualité pour rattraper le retard (ça ne marche pas !)
  • "Lottery learning" : un nouveau concept pour moi, a l'air très intéressant, à creuser !!
  • Être attentif pour repérer les maillons faibles dans la chaine de production (ex : les scripts)
  • Difficultés "classiques" : PO distant (Londres), réunion trop longues, etc ...
  • Amélioration des revues avec une démo faite par le PO : intéressant ...
  • Observations actuelles : trop de BDD et tests trop longs, et pas assez de tests unitaires "bas niveaux" : image de la pyramide avec beaucoup de TU à la base et moins de TF vers le haut (et non l'inverse)
  • Constat : seulement 50% de TDD et 50% de "tests after" : solution : pair "ying-yang" (complémentaires et niveaux différents)
Pour conclure, les présentateurs nous ont donné les différents points de vues des managers, des équipiers, et des présentateurs eux-même. Points retenus :
  • Les managers sont rassurés : code testé, documenté, plus de compétences dans l'équipe, motivation, time to market
  • Grand intérêt pour le pair-programming qui coute mais présente de nombreux aspects positifs : moins de blocages des développeurs, formations, échanges de compétences, ...
  • Les freins avancés par les développeurs : manque de pratique, code legacy, pression de livrer
  • Néanmoins, 2/3 des développeurs rapportent que ces approches sont efficaces en ~ 2 mois
Je retiens qu'une telle migration est favorisée par :
  • Un message clair (et expliqué)
  • Le soutien du business, des managers, des PO
  • La présence de personnes expérimentées, capable d'évangéliser et d'aider au quotidien, notamment par le pair-programming
La session s'est terminée par la proposition par les présentateurs de faire des petits groupes pour échanger autour de questions/réponses avec des membres de Kelkoo. Cette initiative est intéressante, mais sa mise en place pratique, dans une petite salle pleine de 50 personnes, n'a pas été facile ...

Pour conclure, une présentation bien préparée, très intéressante, vivante notamment par l'alternance entre 3 présentateurs, et un contenu avec de nombreux points à retenir !

Atelier Story Map, là où tout commence...

Par : Olivier Pizzato et Emmanuel Etasse

Pourquoi cette session ? : J'avais eu un aperçu de Story Map lors de ma formation de Scrum Master, ça m'avait interpellé et semblé efficace pour le démarrage d'un projet qui est cruciale et doit être réussit !

La session a débuté par une présentation rapide de la Story Map :
  • Objectif : avec tous les acteurs, définir les fonctionnalités essentielles
  • Principales étapes :
    • Partager la vision du produit
    • Lister les acteurs et leurs besoins
    • Lister les activités
    • Lister les cas d'utilisation, les fonctionnalités
    • Répartition sur un "graphe" temps/confort
    • Grouper par lots
    • Vérifier l'ensemble et trouver le chemin critique (le + difficile)
  • Format interactif géré par des boites de temps
La suite de la session s'est déroulée par une mise en pratique, les présentateurs ont proposé de faire 4 groupes de 4 personnes, les autres participants pouvant observer. J'ai été un peu déçu par cette partie, car là encore, nous étions environ 50 personnes dans une petite salle. La proposition d'une mise en pratique est certainement excellente pour bien comprendre le principe, le tester et l'éprouver, mais peut-être pas adaptée à un tel effectif et à ce contexte.

Néanmoins, les présentateurs étaient disponibles pour échanger et répondre aux questions. J'ai noté chez les participants la difficulté pour faire la distinction entre activités et cas d'utilisation, ainsi que pour établir et maintenir les liens avec les acteurs. L'approche présentée ici était finalement assez différente de celle que j'avais expérimenté 1 an auparavant, comme quoi les outils peuvent et doivent être adaptés à ses besoins.

Keynote : Aslak Hellesoy : Les nouvelles tendances de l'agilité

Aslak est sympa, attachant, et, norvégien d'origine, parle très bien le Français ! Son intervention sur les nouvelles tendances de l'agilité était très intéressante, mais très difficile à retranscrire ici ...

J'ai noté ses remarques sur le business qui est fait autour et avec l'agilité, notamment les certifications et certains organismes dont le but, maintenant, semble être de gagner de l'argent ...

Plus concrètement, Aslak a évoqué le découpage d'un produit en histoire et l'importance de toujours préciser le pourquoi, ainsi que la définition du "fini" (Done, encore une fois) ! Également, l'importance des critères d'acceptation, et les tests d'acceptation (Cucumber par exemple, dont Aslak est à l'origine).

Il a également évoqué l'approche Outside in qu'il traduit par Verlan (je vous passe les détails ;-) ....) avec l'idée de partir de l'IHM.

Aslak a prôné l'abandon des métriques absurdes.

Pour les délais, il nous a présenté la loi de Little, imagée par les graphes CFD (Cumulative Flow Diagram) qui permettent de bien visualiser l'avancement pour chaque étape. Un tel graphe met en évidence que le délai pour la réalisation d'une histoire est en lien direct avec le nombre d'histoires en attente et en cours, d'où l'idée de travail à flux plus tendu et l'approche Kanban.

Aslak a terminé son intervention avec quelques références au mouvement DevOps ...

TDD et Legacy

Par : Bernard Huguet, Luc Jeanniard, Cyrille Roy et Johan Martinsson

Pourquoi cette session ? : Le TDD est évident et relativement facile sur du code neuf, mais reprendre du vieux code est toujours une affaire compliquée, j'étais intéressé pour avoir de nouveaux points de vue sur ce sujet, et les confronter à mes expériences dans ce domaine.

Après de rapides rappels sur le TDD, les présentateurs ont montré par l'exemple comment reprendre du code Legacy pour :
  • Corriger un bug
  • Ajouter une fonctionnalité
Cette session m'a semblé évidente, même si le code à reprendre (développé spécifiquement pour la présentation) n'était pas si "horrible" que ça : j'ai vraiment connu pire et beaucoup plus compliqué à reprendre.

Les présentateurs ont bien montré l'intérêt du TDD, que ce soit pour l'ajout d'une nouvelle fonctionnalité ou la correction d'un bug (que j'appelle TDC, Test Driven Correction, Correction Pilotée par les Tests). Ils ont également bien insisté sur la phase Refactoring, la phase bleu, dans le cycle TDD, phase très importante et souvent négligée.

La présentation était bien ficelée, vivante (notamment grâce à l'alternance entre les présentateurs, et l'alternance entre diaporama et code), et assez didactique. Les niveaux des participants étant extrêmement différents, il n'est évidemment pas facile de faire une présentation pour tous, et celle-ci en aura certainement interpellé plus d'un, et peut-être convaincu quelques-uns, pourquoi pas ? Moi, je l'étais déjà ... ;-) ... TDD sur du code legacy, c'est toujours possible !

Kata Robozzle en Haskell

Par : Emmanuel Gaillot

Pourquoi cette session ? : ces dernières semaines, lors de différentes rencontres, j'ai entendu parler de Haskell à 2 reprises. J'avais déjà regardé un peu sur internet cette notion totalement inconnue pour moi de "langages fonctionnels". Je voulais donc en savoir plus, et une approche par la pratique me tentait bien !

Haskel, c'est quoi ? C'est un langage de programmation fonctionnelle. Ça ne vous avance pas ? Voici ce que nous précise Wikipedia :
Les fonctionnalités les plus intéressantes de Haskell sont le support des fonctions récursives, l'inférence de types, les listes en compréhension et l'évaluation paresseuse. Ces fonctionnalités, surtout si on les combine, facilitent l'écriture des fonctions.
Et oui, c'est un autre monde !

Pour sa présentation, Emmanuel est parti du jeu Robozzle, qui consiste, en résumé, à définir une suite d'actions de déplacements pour un vaisseau sur une grille (avancer, tourner à gaucher, tourner à droite) pour passer, en un minimum de coups, par des points précis (étoiles). Emmanuel a proposé de s'intéresser plus particulièrement au moteur du jeu, permettant de vérifier si le joueur a gagné, à partir de la position des étoiles et de la séquence d'actions proposées, représentées par des lettres ("a" pour avancer, "d" pour tourner à droite, etc ...).

Emmanuel a été assez pédagogue, en expliquant bien l'enchainement de ses approches, de ses raisonnements, de ses étapes, du code écrit puis ré-écrit, puis simplifié, etc ... Globalement, j'ai réussit à suivre, mais j'avoue avoir frôlé le mal de tête ... Je trouve que le code final est assez illisible. Ça va peut-être mieux avec une meilleure maitrise des concepts et du langage, ça semble très puissant, mais ..... Wouf !

Je crois ne pas être assez mathématicien et logicien ... mais j'en connais qui seront intéressés ... ;-)

Conclusion : une présentation intéressante, bien organisée (la forme Kata s'y prête bien), et qui me permet d'avancer (un peu) sur le sujet (dommage que Emmanuel ait manqué de quelques minutes pour finir sa dernière fonction et donc l'algorithme entier).

Exigences Exécutables Efficaces : "Doing the Right Software"

Par : Bruno Orsier et Remy Sanlaville

Pourquoi cette session ? : les exigences ou spécifications exécutables est un sujet qui m'intéresse parmi tous les outils de l'ingénierie agile, et c'est encore une partie que je ne maitrise pas au mieux. Une présentation concrète et axée surtout sur la méthode me semblait donc intéressante.

La session a débuté par quelques rappels, et notamment l'opposition intéressante entre contractualisation (méthodes classiques) et collaboration (méthodes agiles).

Ensuite, Bruno et Rémy nous ont fait une présentation alternant explications et petites scène théâtrales, scènes jouées 2 fois, pour l'approche classique puis l'approche agile. Trois scènes pour 3 thèmes différents :
  • L'incompréhension, notamment fonctionnelle, entre ce que le client veut et ce qui est réalisé
  • Dans l'arène du code, pour obtenir un code propre et compréhensible, avec un développement piloté par les exigences, le tout en évitant les régressions
  • L'effet tunnel ou les alternatives permettant à tous un meilleur suivi de l'avancement
Pour chaque scène, Bruno et Rémy ont mis en avant les avantages des méthodes agiles, et plus précisément l'approche basée sur les exigences exécutables.

Je m'attendais à une session plus orientée pratique avec l'utilisation d'un ou plusieurs outils. Mais finalement, le choix de mettre en avant les méthodes est très intéressant. Je n'avais pas besoin d'être convaincu, mais ça fait toujours de bien de voir et revoir les avantages des approches agiles et de leurs différents outils. De plus, je vois un peu mieux comment "vendre" ces approches au client ou à l'utilisateur, les arguments à mettre en avant, etc ...

La présentation était extrêmement vivante, avec une alternance entre diaporama, simulation de séance de travail, et surtout, des petites scènes théâtrales très bien jouées et pleines d'humour, de quoi bien faire passer le message. J'ai passé un très bon moment, idéal pour une fin de journée : Bravo !!!

Conclusion


Une journée bien remplie, très enrichissante, un beau programme, des sessions intéressantes et bien préparées, des intervenants de qualité, des rencontres et discussions à poursuivre, .... bref, un ROTI positif !

Mais comme pour l'Agile Tour à Marseille,je reviens un peu déçu de ne pas en avoir appris plus. Mais le côté positif, c'est que je dois commencer à bien intégrer l'approche agile, ses valeurs, ses concepts, etc ...

Je retiens tout de même que l'agilité est en mouvement, en mutation, qu'elle s'adapte (le propre de l'agilité), qu'elle a encore du chemin à faire, mais que son infiltration au sein des mœurs, des pratiques et des organismes est en bonne voie, et que son extension est favorisée par des moyens simples : un minimum de personnes convaincues, des acteurs expérimentés et capables d'évangéliser, des pratiques au quotidien permettant les échanges, l'auto-formation, l'expérimentation, etc ...

Merci aux organisateurs et aux présentateurs pour cette bonne journée.
Merci à Xavier pour le covoiturage.

vendredi 19 novembre 2010

Rencontre "Logiciels libres pour la gestion d'entreprise"

Ce matin, invité par Apitux, j'ai assisté à la rencontre "Petit déjeuner" organisée par Libertis chez Xsalto à Digne-Les-Bains.

Le but était d'échanger sur le thème "Gérer son entreprise ou son association avec des logiciels libres", notamment les logiciels d'ERP ("Enterprise Resource Planning" en Anglais, ou PGI pour "Progiciel de Gestion Intégrée" en Français) permettant, selon les besoins, la gestion d'achats, de stocks, de ventes, de devis, de facturations, de commandes, de ressources, de compta, etc ...

La séance a débuté avec Christophe CRIER d'Héonium, partenaire/intégrateur d'OpenERP à Aix et sur toute la France, par une présentation rapide d'OpenERP : architecture, installations, extensibilités, modules, etc ... OpenERP a la plus grande couverture fonctionnelle. Christophe a expliqué les possibilités d'ajout de modules développés spécifiquement pour un besoin. Il a également détaillé les possibilités d'utilisation, notamment en interne ou sur le cloud en SaaS (Software As A Service).

Ensuite, c'est Boris POUGNET, brasseur, qui a témoigné de l'utilisation de Dolibarr dans son entreprise : sa solution précédente (tableur), ses besoins, son passage à Dolibarr pour une première utilisation, l'ajout de modules au fur et à mesure pour compléter l'utilisation. Boris a pas mal insisté sur la simplicité de Dolibarr, et le grand intérêt de la modularité permettant de commencer en douceur, puis de compléter son installation.

Enfin, Yann AUTISSIER d'Internethic a présenté les 3 utilisations qu'il fait d'OpenERP :
  • En tant que trésorier pour la gestion de l'association Libertis (adhésions notamment)
  • Au sein d'Internethic pour la gestion d'entreprise
  • Et en intégration avec d'autres produit pour leur solution de développement de site WEB (e-commerce)
J'ai assisté à cette rencontre pour différentes raisons :
  • Découvrir les possibilités de logiciels libres pour la gestion d'entreprise
  • Rencontrer des acteurs de PACA intéressés ou actifs dans le domaine du logiciel libre
  • Voir et mieux comprendre les possibilités et enjeux du logiciel libre
  • Satisfaire ma curiosité technique pour le développement logiciel (et oui, toujours ...)
Pour ce dernier point, Dolibarr est développé en PHP dont je ne suis pas fan, et OpenERP est développé en Python, à creuser évidemment !

Un grand merci aux organisateurs, partenaires, intervenants, et participants pour ce moment intéressant et riche !

jeudi 21 octobre 2010

Retour Agile Tour Marseille

Jeudi 14 octobre 2010 avait lieu, à Marseille, une étape de l'Agile Tour (http://www.agiletour.com/fr/node/964).

Le programme (http://wiki.agiletour.org/files/Marseille/AT2010ProgrammeMarseille.pdf) proposait 3 séries de conférences en parallèle. Toujours difficile de choisir, et un peu frustrant : au final, on aimerait pouvoir en suivre plus ...

J'espère que les diaporamas seront mis en ligne, que je puisse me replonger dans chaque exposé (certains le sont déjà sur http://www.esprit-agile.com/). En attendant, je vous mets ici quelques points forts retenus, et quelques réactions personnelles.

Bonnes et mauvaises pratiques du daily meeting - Céline Stauder

J'ai choisit cette présentation, car en tant que Scrum Master, je considère le Daily (standup) Meeting comme un des points importants de la réussite de Scrum, mais également une étape pas si facile à réussir au quotidien ...

Pour commencer, Céline a rappelé quelques éléments clé pour le daily meeting : pour les pigs (= ceux qui sont impliqués dans le sprint), 15' max et timeboxé, les 3 questions, etc ... J'aime bien le concept Par l'équipe pour l'équipe qui me semble très important.

Ensuite, Céline a donné quelques conseils d'organisation auxquels j'adhère :
  • rester debout pour éviter que ça ne dure, 
  • mettre des sonneries (à 10 et 15'), 
  • couper court aux discussions de problèmes de fond et les reporter à un autre moment de la journée (planifier une réunion si nécessaire), 
  • toujours le même lieu et le même horaire, 
  • plutôt en début de journée, 
  • commencer à l'heure, 
  • équipe intégralement présente (s'organiser pour avoir des infos concernant les absents), 
  • se mettre en cercle avec le SM à l'extérieur, 
  • organiser le tour de parole, 
  • personne n'est avec un ordi ou à son poste de travail, 
  • se regrouper devant le Scrum Board, 
  • mettre en avant les questions 2 et 3, 
  • présence du PO souhaitable (mais sans interventions spontanées !), 
  • etc ...
J'adhère moins à certaines idées ou pratiques, comme les pénalités pour les retardataires. Mais bon, ça doit dépendre de l'équipe, de son implication et sa motivation, et je n'ai jamais eu ce genre de problème ...

Lors de questions, Céline a évoqué des tâches d'une durée de 1 à 2h max ... Personnellement, par expérience, je m'étais plutôt orienté vers de tâches de quelques heures à 2 jours maxi. Je comprends l'idée de tâches courtes de 2h, permettant d'avoir un rythme motivant, une bonne visualisation de l'avancement, etc ... Par contre, je trouve que le temps nécessaire à un tel découpage est souvent excessif, avec souvent, au final,  un découpage maladroit et inefficace. Mais là encore, c'est probablement lié au contexte métier, à l'équipe, à son rodage des pratiques agiles, etc ...

Concernant les questions, j'aime bien l'idée de changer les libellés en intégrant un lien avec le done (terminé) :
  1. Qu'est-ce que tu as terminé hier ?
  2. Qu'est-ce que tu vas terminer aujourd'hui ?
Cela me semble très intéressant pour la 1ère question, mais un peu moins pour la seconde. Selon la taille des tâches, une personne peut prévoir d'attaquer une tâche qui ne sera pas finie aujourd'hui, mais c'est intéressant de le savoir et de le mentionner. Donc peut-être rester sur la question classique : Qu'est-ce que tu vas faire aujourd'hui ? ...

Une autre idée que j'ai noté est la suivante. Lorsqu'une tâche est terminée, l'équipier la déplace sur la droite de la colonne "en cours", en la laissant dans cette colonne. Ainsi, on peut déplacer les post-its lors du daily meeting dans la colonne "Fait". Par contre, l'équipe est parfois intéressée pour avoir un workflow plus détaillé pour les tâches, avec notamment des colonnes "à vérifier", "à réceptionner (PO)", etc ... Dans ce cas, il peut être dommage de "ralentir" le cycle de vide des tâches en attendant le daily meeting pour les faire avancer. Encore une fois, ce sont certainement des idées à retenir et à proposer à l'équipe qui choisira le mode qui lui covient le mieux !

Concernant la 3ième question et les points bloquants, on rappelle que rendre les problèmes visibles, au plus tôt, est un des objectifs de Scrum. Céline propose 2 choses intéressantes :
  • sur le Scrum Board, avoir une case "problème" pour pouvoir y mettre des post-its à évoquer lors du daily meeting
  • par contre, lors du tour de parole, éviter de s'attarder sur ces problèmes : pour cela, se mettre rapidement d'accord sur un lieu, une heure et les personnes à réunir pour en parler
Ensuite, Céline a évoqué les signaux d'alerte montrant un dysfonctionnement du daily meeting et de Scrum en général (indispensable à identifier pour s'améliorer) :
  • les participants parlent au Scrum Master
  • trop longues discussions sur les problèmes
  • intervention du PO ou d'autres personnes non membres de l'équipe
  • problèmes de présence de certains participants
  • le Scrum Master doit répéter tous les jours les 3 questions
  • le Scrum Board n'est pas à jour, voir "abandonné"
Parmi les questions-réponses qui ont suivi, j'ai retenu les remarques sur la durée d'un sprint, préconisée entre 2 et 4 semaines, dans la pratique plutôt 2-3 semaines. C'est à l'équipe de trouver son "bon" rythme. Mais l'important est d'avoir une durée fixe, au moins pendant quelques sprints, pour que l'équipe puisse s'adapter à cette durée et évaluer au mieux si elle lui convient.

En s'élargissant, le débat a amené le point concernant le temps à prévoir ou pas, dans un sprint, pour les imprévus comme le support, la correction de bug, etc ... avec une idée intéressante : prévoir un volume temps dans le sprint, et s'il n'est pas utilisé, en profiter pour de l'auto-formation de l'équipe ! Cool ! A condition de réussir à "vendre" cela pour avoir le "budget" ...

En conclusion, cette session m'a permis de revoir les principes de base, de confirmer mon approche et mes idées sur le daily et, plus largement, l'agilité et Scrum, et de noter quelques idées complémentaires intéressantes.

Comment concilier agilité et projet au fordait ? - Jean-François Jagodzinski

Ce sujet m'intéressait car c'est une question qui revient souvent, sur laquelle je m'interroge régulièrement, et pour laquelle je n'ai pas encore trouvé d'éléments de réponse. Elle rejoint d'ailleurs un peu la question d'un fonctionnement agile en interne, au niveau de l'équipe de développement, par rapport au reste de l'entreprise (mais ça n'est pas du tout le sujet ici).

La présentation de Jean-François est intéressante sur la forme puisqu'il a présenté 2 cas concrets, 2 leçons, où il a essayé de proposer une approche agile, sur des appels d'offre "classiques".

Pour commencer, JF a fait quelques rapides rappels sur l'approche agile. J'ai noté ce comparatif intéressant :

Approche classique Approche agile
Méthodes Pratique
Jeu d'échec Jeu de cartes
Qualité des procédures Qualité des relations et des échanges
Approche par la théorie Approche par la pratique

J'ai bien aimé l'analogie avec une comparaison Jeu d'échec / Jeu de carte, pour laquelle il faut imaginer la suite de la partie si un joueur change :
  • dans le premier cas, tout est sur l'échiquier, si le joueur a le même niveau, la partie peut continuer
  • dans le 2ième cas, le nouveau joueur n'a pas l'historique de ce qui s'est déjà passé, des cartes déjà tombées, il aura du mal à bien reprendre la suite de la partie ....
Cette analogie permet de mettre en évidence la particularité de l'agilité, énormément basée sur les échanges et la pratique.

Une phrase retenue : l'agilité c'est changer son point de vue ! ..... Et comment !  Non seulement pour les membres de l'équipe Scrum (PO, SM, équipiers), mais également pour toute l'entreprise, l'agilité est une révolution culturelle de toute l'entreprise !

A noter qu'ici encore la question de la durée des sprints a été abordée avec une remarque évidente mais intéressante de JF : les itérations courtes permettent une feedback client plus rapide. Mais personnellement, je trouve qu'une durée de 2 semaines est un minimum pour prendre en compte les différents meetings de Scrum, et permettre à l'équipe de bien rentrer dans le sprint.

Pour la leçon 1, il s'agissait de répondre à un appel d'offre pour la mise en ligne d'un site pour les certifications, en relation avec la parution à court terme d'une loi. Les specs et les maquettes écran étaient là, mais globalement, le projet ne s'est pas bien passé, pas mal de retards, d'échecs de livraisons en court de projet, et un dépassement de délai conséquent.

Au final, le bilan est le suivant :
  • un client plutôt satisfait malgré les retards (mais la loi est sortie plus tard que prévue ... ;-) ....)
  • une équipe en demi-teinte, satisfaite par l'ambiance, mais déçu du résultat pour le travail fourni
  • une qualité mauvaise
  • et les financiers fournisseurs mécontents (retards, bugs, avenants)
L'approche brute n'est pas la bonne ...

La leçon 2 est dans un contexte différent puisqu'il s'agissait de refaire et considérablement étendre un outils existant (mesures et contrôles techniques d'onduleurs). Il n'y avait donc pas de cahiers des charges, à part le logiciel existant et les expériences utilisateurs sur ce logiciel.

L'idée retenue est intéressante puisqu'il a été proposé au client une période de calibrage, c'est-à-dire de mesure de la vélocité pendant 3 sprints. Un backlog produit a été commencé, avec des estimations en points, pendant la mise en place technique de l'équipe qui a ensuite attaqué ses 3 itérations pendant la fin de la décomposition fonctionnelle.

L'équipe est alors capable d'estimer sa vélocité et donc sa capacité à produire pour les sprints et releases suivants. A ce stade, le client avait la possibilité de tout stopper, en ne payant que la moitié du temps passé, et en partant avec un début de logiciel et les sources.

Cette étape ne semble pas facile, elle comporte l'étude de plusieurs pistes, solutions, moyens d'actions (puisque les prévisions étaient revues à la hausse), mais elle a le mérite de permettre à chacune d'avoir une bonne vision sur la situation, et de meilleures cartes en main pour décider.

Le client a décidé de continuer. Un planning a donc été mis en place, avec des releases planifiées, comportant chacune 2 à 7 sprints, et avec la possibilité pour le client de stopper à chaque release, moyennant compensation financière (donnant-donnant).

Le bilan de cette leçon est bien plus positif :
  • une client satisfait malgré une augmentation de budget, mais une bonne collaboration, et surtout, un logiciel adapté
  • une équipe également satisfaite, notamment par cette collaboration, mais également une bonne ambiance et un rythme soutenable
  • une bonne qualité logicielle
  • et les financiers fournisseurs contents grâce à des couts maitrisés
JF fait quand même remarquer que dans les 2 cas, le contexte était favorable, avec notamment des personnes motivées par l'agilité, une direction décidée, des clients ouverts, etc ...

La meilleure réussite de la leçon 2 est probablement dûe à un meilleur équilibre dans le triptique périmètre-budget-délai ! Mais également d'autres points importants :
  • une préparation basée sur une vision et du fonctionnel
  • un budget orienté sur l'essentiel et des releases intermédiaires
  • une organisation basée sur un début de développement, une acceptation du changement, etc ...
En conclusion, je pense que l'approche agile sur des contrats au forfait est possible, mais encore délicate. Il faut quand même faire attention, et profiter d'opportunités, de contextes favorables. Et espérer un développement fort des approches agiles dans les esprits ...

Informaticiens agiles, les agents du changement - Thierry Montulé

Thierry devant prendre un train sans trainer (grèves), la présentation a été ... express ! ;-)

Au début, j'ai eu un peu de mal à accrocher, à voir où il voulait en venir. Mais j'ai finit par comprendre !

La société est en changement permanent, avec de nombreux impacts à tous les niveaux et dans tous les domaines, notamment celui du logiciel et de la SI. On tombe vite dans un cercle vicieux entre changements, difficultés d'adaptation, stress, réactions, changements, etc ... Parmi les solutions : l'agilité (bien sûr !) où les développeurs font partie des principaux acteurs !

Une phrase retenue : "Le changement ? C'est faire ce que l'on ne sait pas faire !" ....

Thierry nous donne quelques pistes pour conduire le changement :
  • accompagner plutôt que subir
  • les problèmes d'ingénierie logicielle sont plus sociologiques que techniques
  • il faut mobiliser les acteurs en leur apportant satisfaction et motivation
  • "rendre possible de faire ce que l'on ne sait pas faire"
  • mais .... pas de recette miracle !
En tant que Scrum Master, je me retrouve bien dans ces idées bien orientées vers l'humain !

Thierry nous explique que dans l'organisation, l'humain se retrouve dans différentes couches. En résumé:
  • couche physique, technique : changements les plus faciles et les plus visibles
  • couche régulation (mesures, reconnaissances, salaires, ....)
  • couche des valeurs (notamment de l'entreprise) : changements les plus difficiles et les moins visibles
Quelques obstacles observés au changement :
  • une pression à court terme, pas le temps d'apprendre
  • nostalgie, doutes, inquiétude
  • pourquoi changer ?
  • les objectifs du changement ne sont pas clairs
  • manque de leadership, de crédibilité
  • saut culturel et technique trop important
  • manque de compétences
  • ...
La liste de témoignages qu'il nous donne ensuite me fait penser à l'effet vert dont m'avait parlé François Beauregard : plus on remonte la hiérarchie, et plus les voyants sont au vert (tout va bien) ...

Thierry nous a présenté un schéma qui m'a beaucoup parlé. Je ne sais pas s'il a un nom. L'idée est de montrer les étapes par lesquelles on va passer lors d'un changement, avec un axe du temps et un axe de "refus". Une petite recherche internet me montre que ce sujet est souvent traité. Il faudra que j'y consacre un billet ...

Il faut donc communiquer avec les acteurs, et cela commence par : écouter, s'adapter à l'interlocuteur, expliquer, prouver, succiter les envies, célébrer les réussites, ...

La fin de la présentation s'est malheureusement faite au pas de course, mais un nouveau sujet m'a interpellé concernant les différents types de réactions, de profiles. Un nouveau schéma très intéressant (pareto ?), et quelques remarques à noter :
  • trouver des alliés et s'y attacher
  • identifier les opposants et les ignorer
  • et tous les cas intermédiaires ...
En conclusion, une présentation interpellante, avec des retours intéressants sur les aspects humains ! Et encore une fois, le fait que l'agilité nécessite le changement (de point de vue) et implique d'accepter le changement (valeur de base) : tout cela n'est évidemment pas facile !

Vers le chemin de l'amélioration : Sprint rétrospective - Céline Stauder

Pour finir, j'avais choisit cette présentation, à nouveau avec Céline. Par expérience, je sais maintenant l'importance de ces rétrospectives qui peuvent réellement apporter de l'amélioration à l'équipe !

Comme pour le daily, Céline a rappelé quelques éléments de base importants :
  • pour les pigs, c'est-à-dire ceux qui sont engagés dans le sprint
  • en fin de sprint
  • une durée d'environ 1/2 journée pour un sprint de 30 jours (~ 45' par semaine de sprint)
  • environnement adapté aux échanges, en toute confidentialité, pourquoi pas "hors cadre" (dans un café, dehors, ...), climat de confiance, pas de jugements l'idée étant l'amélioration
  • 2 objectifs :
    1. s'exprimer, donner son ressenti
    2. monter un plan d'action
  • timeboxer les 3 étapes :
    1. collecter les informations
    2. rechercher des solutions
    3. définir un plan d'action
Pour l'environnement "hors cadre", je me souviens d'une rétrospective animée dans le train (2h de TER) avec les posts-its collés sur les vitres, ça avait très bien fonctionné, avec des échanges sincères entre les équipiers (hors contexte quotidien ?).

Pour la phase de collecte d'informations, Céline a rappelé un point important, souvent oublié : il y a des sources existantes comme :
  • un backlog de problèmes (s'il existe et a été renseigné en cours de sprint, pratique pour éviter d'oublier les difficultés), 
  • les compte-rendus et résultats des précédentes rétrospectives
  • ainsi que tous les métriques intéressants (vélocité, ...). 
Concernant la collecte auprès des équipiers, Céline a évoqué le tour de table orale, avec l'animateur (le Scrum master à priori) qui crée et colle des post-its sur le tableau dans 2 colonnes + ou -.
Personnellement, j'ai testé et je privilégie une autre solution qui consiste à donner à chacun une pile de post-its et un stylo en se donnant un temps fixe de réflexion (par exemple 6'). Certains vont écrire des posts-its tout au long de ce temps. Mais j'ai observé d'autres personnes qui écrivent quelques post-its en rafale puis pose le stylo et croise les bras du genre "j'ai finit". Mais il reste encore plusieurs minutes, et finalement, ces personnes finissent par reprendre leur stylo pour créer de nouveaux post-its. Comme quoi il y avait encore des choses à dire !

Ensuite, je demande à chacun d'aller coller ses post-its au tableau selon un axe +...-, certains post-its se retrouvant au milieu. J'ai constaté que cette façon de collecter permet une expression plus riche et plus intense de tous en éliminant pas mal les blocages dus à la timidité ou autre !

Ensuite, tous ensemble devant ce tableau, nous parcourons les post-its pour les découvrir ensemble, demander des précisions pour bien les comprendre, enlever les doublons et les regrouper par thème pour dégager les points importants. Puis chacun a droit à un certain nombre de vote (3, 4 ...) ce qui permet de dégager les points les plus importants à traiter.

Céline a également parlé de ce regroupement par thème qui, accompagné par les discussions spontanées, fait parfois ressortir des causes différentes de celle initialement exprimées.

La dernière étape, qui consiste à mettre en place un plan d'action, est évidemment indispensable, et Céline a insisté sur les points suivants :
  • retenir quelques points (on ne peut pas tout traiter)
  • se concentrer sur des choses simples
  • disposer d'indicateurs mesurables pour évaluer le résultat
  • pour chaque point, nommer 1 garant qui veillera à l'application et le respect de ce point par toute l'équipe
Ce qui m'a interpellé c'est que c'est exactement ce que j'avais spontanément mis en place, aux indicateurs mesurables près : certains points sont plus difficiles à mesurer, surtout lorsqu'il s'agit de ressentis humains.

En conclusion, là encore, cette présentation m'a permis de me conforter dans l'idée que je me fais des rétrospectives, et l'importance qu'elles ont dans un processus Agile, pour l'amélioration continue de l'équipe, à condition de mettre en place un plan d'action, de le suivre, et de l'évaluer.

Conclusion

Comme je l'ai mis dans ma fiche d'évaluation en fin de conférence, je n'ai pas regretté le déplacement, au contraire. Globalement, j'ai ré-entendu pas mal d'informations que j'avais déjà, mais cela m'a permis de confirmer que pour moi, l'agilité est maintenant incontournable pour une production logicielle de qualité, dans un contexte positif.

Je constate tout de même, vu le public présent et les questions posées, que l'agilité a encore du chemin à faire, mais la curiosité, ou plutôt l'intérêt d'un nombre croissant d'acteurs, permet d'espérer un développement intéressant de ces valeurs, développement auquel j'espère pouvoir contribuer.

Un grand merci aux organisateurs et aux intervenants pour ce bon moment, bien organisé, bien sympathique et très enrichissant !

mardi 12 octobre 2010

DSL pour les tests unitaires

J'ai lu plusieurs articles sur la notion de D.S.L. (Domain Specific Language), et notamment pour les tests unitaires. L'idée étant de développer son propre "langage" pour améliorer la lisibilité du code.

L'utilité des tests unitaires ne fait plus aucun doute, du moins pour moi ... Mais je me suis aperçu qu'il n'est pas évident, pour tous les développeurs, que le code pour les tests unitaires doit être aussi soigné que le code de prod : écriture, présentation, conception, etc ... Pourtant, pour garder leur intérêt, les tests unitaires doivent évoluer en même temps que le code de prod. Ce code de test doit donc être très facilement accessible et compréhensible par un développeur qui le découvre et doit le maintenir, sinon c'est ... @Ignore assuré ! ... :-(

Partant de là, le DSL me semble intéressant et rien de tel qu'un exemple. Désolé pour cet article un peu long, mais je souhaite être précis et explicite.

Utilisation d'une API immutable


Imaginons que j'ai à utiliser une API pour une gestion de système de son. Cette API, qui m'est imposée, contient des descripteurs immutables. Tout passe par les constructeurs :

/** Descripteur du système sonore dans son ensemble */
public class SoundSystemDescriptor {

    public SoundSystemDescriptor(SoundDeviceDescriptor... soundDevices) {
        this.soundDevices = soundDevices;
    }

    // attributs, set, get ...
}

/** Descripteur d'un périphérique */
public class SoundDeviceDescriptor {

    public SoundDeviceDescriptor(String id, SoundChannelDescriptor... soundChannelDescriptors) {
        this.id = id;
        this.soundChannelDescriptors = soundChannelDescriptors;
    }

    // attributs, set, get ...
}

/** Descripteur d'un canal */
public class SoundChannelDescriptor {

    public SoundChannelDescriptor(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // attributs, set, get ...
}

Maintenant, je dois implémenter la classe suivante me permettant de construire un SoundSystem à partir d'un SoundSystemDescriptor :

public class SoundSystemBuilder {
    public SoundSystem build(SoundSystemDescriptor soundSystem) {
        ...
    }
}

Premier test unitaire


Voici la première version de test unitaire que je pourrais écrire :

public class SoundSystemBuilderTest {

    private SoundSystemBuilder soundSystemBuilder;

    @Before
    public void setUp() throws Exception {
        soundSystemBuilder = new SoundSystemBuilder();
    }
 
    @Test
    public void testBuild() {
        SoundChannelDescriptor soundChannelDescriptor1 = new SoundChannelDescriptor("ch1", "ch1");
        SoundChannelDescriptor soundChannelDescriptor2 = new SoundChannelDescriptor("ch2", "ch2");
        SoundChannelDescriptor soundChannelDescriptor3 = new SoundChannelDescriptor("ch3", "ch3");
        SoundDeviceDescriptor soundDeviceDescriptor1 = new SoundDeviceDescriptor("d1", soundChannelDescriptor1 , soundChannelDescriptor2);
        SoundDeviceDescriptor soundDeviceDescriptor2 = new SoundDeviceDescriptor("d2", soundChannelDescriptor3);
        SoundSystemDescriptor soundSystemDescriptor = new SoundSystemDescriptor(soundDeviceDescriptor1, soundDeviceDescriptor2);
        SoundSystem soundSystem = soundSystemBuilder.build(soundSystemDescriptor);
        Assert.assertNotNull(soundSystem);
        Assert.assert...(...);
        Assert.assert...(...);
        ...
    }
}

Ce code est correct mais pas très lisible : le code de préparation est long, verbeux et pas très intéressant, la ligne correspondant au test est noyée dans la masse, etc ...

Premières améliorations


Mon premier réflexe dans une telle situation est de mettre toutes ces créations de descriptors dans des méthodes, elles-même regroupées dans une Factory. En plus, par expérience, je sais qu'une telle Factory sera très vite réutilisée dans d'autres tests unitaires, mon produit étant bâti autour du SoundSystem.

Je ne donne pas de code en exemple pour ne pas surcharger l'article, mais pour avoir une factory réutilisable, on voit bien qu'il va falloir mettre plein de paramètres aux méthodes, avec des difficultés pour hiérarchiser les paramètres de Device et ceux des Channels contenus dans des Device etc ...

DSL à la rescousse


En fait, je pars du code que j'aimerai avoir au final, un code minimaliste, explicite et évolutif. Mon idée est de créer un SoundSystemDescriptor avec un minimum de code, par exemple comme ça :

@Test
public void testBuild() {
    SoundSystemDescriptor soundSystemDescriptor = 
         prepareSoundSystemDescriptor()
         .addDevice("d1", channel("ch1", "ch1"), channel("ch2", "ch2"))
         .addDevice("d2", channel("ch3", "ch3"))
         .build();
    SoundSystem soundSystem = soundSystemBuilder.build(soundSystemDescriptor);
    Assert.assertNotNull(soundSystem);
    Assert.assert...(...);
    Assert.assert...(...);
    ...
}

Ensuite, je complète le code pour faire comprendre à Eclipse ce que je veux faire, notamment en ajoutant SoundDescriptorsFactory aux bons endroits, et en les faisant à nouveau disparaitre ensuite grâce aux import static :

SoundSystemDescriptor soundSystemDescriptor = 
    SoundDescriptorsFactory.prepareSoundSystemDescriptor()
        .addDevice("d1", SoundDescriptorsFactory.channel("ch1", "ch1"), channel("ch2", "ch2"))
        .addDevice("d2", channel("ch3", "ch3"))
        .build();

Ensuite, je "suis" le compilateur en créant les méthodes nécessaires (je m'aide du CTRL+1 très utile), avec les paramètres souhaités.

Le principe consiste à créer un Helper dans la méthodes prepareSoundSystemDescriptor(), et de créer les "vrais" descripteurs dans la méthode build(). Voici le code final de SoundDescriptorsFactory :

public class SoundDescriptorsFactory {

    public static SoundSystemDescriptorHelper prepareSoundSystemDescriptor() {
        return new SoundSystemDescriptorHelper();
    }

    public static SoundChannelDescriptor channel(String id, String name) {
        return new SoundChannelDescriptor(id, name);
    }
 
    // Inner classes ---------------------------------------------
 
    public static class SoundSystemDescriptorHelper {

        private List<SoundDeviceDescriptor> soundDeviceDescriptors = new ArrayList<SoundDeviceDescriptor>();

        public SoundSystemDescriptorHelper addDevice(String id, SoundChannelDescriptor... soundChannelDescriptors) {
            soundDeviceDescriptors.add(new SoundDeviceDescriptor(id, soundChannelDescriptors));
            return this;
        }

        public SoundSystemDescriptor build() {
            return new SoundSystemDescriptor(soundDeviceDescriptors.toArray(new SoundDeviceDescriptor[soundDeviceDescriptors.size()]));
        }
    }
}

Conclusion


Le code de la classe SoundDescriptorsFactory n'est pas trop complexe, mais peut vite le devenir selon les besoins, avec notamment d'autres inner class Helper. Néanmoins, à peu de frais, on obtient un code de tests unitaires répondant aux objectifs : minimaliste, explicite et évolutif.

jeudi 7 octobre 2010

Soirée "Google et les technologies connexes" à Grenoble (17/09/2010)

Vendredi 17/09/2010, l'Alpes JUG (http://www.alpesjug.org/) organisait une soirée, chez Orange Labs à la ZIRST de Meylan, avec une présentation par Didier GIRARD (http://www.application-servers.com/) des technologies Google.

Au-delà des retrouvailles avec Didier (pas vu depuis ... 16 ans), j'ai beaucoup apprécié sa présentation qui m'a éclairé sur certains points et convaincu sur certaines technos. Je voulais donc y consacrer mon premier billet, pour partager certaines idées fortes retenues, avec mes collègues qui n'ont pas pu venir avec moi, et inciter ceux qui le peuvent à aller voir une telle présentation (si l'occasion se représente).

Introductions

Avant de rentrer dans le détails des technos, Didier a fait quelques "rappels" en commençant par le cloud. et les différentes solutions :
  • IaaS = Infrastructure as a Service : location de matériel [voir : Amazon, Salesforce, EC2, ES3, ...]
  • PaaS = Platform as a Service : hébergement d'application [voir : Google App Engine, Amazon, Salesforce, VMWare, ...]
  • SaaS : Software as a Service : location de logiciels [voir : GMail .... et oui, vous consommez déjà du SaaS ... ;-) ... ]
Didier : "Nous entrons dans un monde d'abondance, notre 'carburant' (CPU, stockage) ne coute rien, de nouvelles opportunités sont là !

[NDLA : ce sujet du "cloud" est vraiment passionnant (*)]

Didier a également parlé des RIA (Rich Internet Application) en évoquant GWT, Flex, JQuery, Silverlight, ... et en présentant succinctement quelques éléments de comparaison, toujours bon à entendre !

Sans oublier la mobilité, secteur en plein expansion, explosion, avec notamment ... Android, évidemment !

Google App Engine

Les mot clés que je retrouve dans mes notes : hébergement d'application, gratuit (quotas), mail, batch, XMPP, base NoSQL (Bigtable), namespace (partitionnement des données entre utilisateurs), MapReduce, déploiement en 1 clic, import/export Bigtable, ...

Didier nous a fait une démo. Grâce au plugin Eclipse, la création d'une application avec un squelette basique, puis le déploiement "sur le cloud" sont vraiment faciles.

Ensuite, Didier a longuement expliqué et insisté, démos à l'appui, sur les quotas et les "hors quotas" (quand on dépasse) avec les possibilités de paiements, la gestion de son "budget", les suivis très détaillés dans le tableau de bord, etc ... GAE est vraiment bien pensé, et surtout très bien outillé, autant côté développement que console d'administration.

Une des principales difficultés, peut-être, est la base Bigtable, de type NoSQL, ce qui peut surprendre. Mais des frameworks existent pour pouvoir faire du développement plus type JPA, comme par exemple Objectify.

Je connaissais déjà un peu GAE, la création facile, le déploiement en 1 clic, la "surprise" de Bigtable, les aides de Objectify, etc ... mais certains précisions apportées par Didier m'ont bien éclairé, et surtout, encore plus convaincu de l'intérêt du cloud !!!

Didier nous a montré pas mal de choses en se basant sur son application pour Android http://www.abonentendeur.com/ (petite pub au passage ... ;-) ...). Dans la console GAE, il était intéressant de voir la courbe de fréquentation monter au fur et à mesure de la soirée, puisque nous étions un vendredi, soir de départ en week-end (et les automobilistes s'intéressent au bouchons et autres radars ...).

GWT

Les mot clés que je retrouve dans mes notes : compatibilité tous navigateurs, très bon pour "touch Web" (smartphones), très facile pour le développement (langage Java), très "open source" (avec les avantages de la communauté), coûts réduits, Javascript optimisé (en taille) et téléchargé 1 fois, mode "offline" possible, gestion i18n, possibilité de debug (points d'arrêts), outils et plugins de "design" (GWT Designer rendu public la veille de la soirée), ...

Je dois l'avouer, j'étais plutôt "GWT-septique", mais Didier m'a vraiment convaincu, surtout par les avantages (voir ci-dessus).

A noter que Didier anime un blog dédié à GWT : http://www.ongwt.com/.

Android

Didier étant bavard, il n'a plus eu beaucoup de temps pour nous parler d'Android. Il nous a quand même fait une démo, avec à nouveau la création simple et rapide d'une application basique, avec test dans un simulateur, puis test dans son smartphone. Une plateforme très prometteuse et très porteuse, à saisir !

Conclusion

Une soirée vraiment intéressante et enrichissante. Didier ma surpris par son enthousiasme communicatif.
Merci à l'AlpesJUG pour l'organisation et l'accueil.
Et Didier .... à bientôt ... ;-)



(*) J'ai également regardé la vidéo de la présentation Opportunités du cloud pour la Direction des Etudes par Arnaud Héritier et Julien Jakubowski à l'USI 2010, excellent !

Introduction

jeudi 7 octobre 2010 : un jour particulier ! Une grande page se tourne dans ma vie professionnelle, avec beaucoup de changements en perspective, et de nombreuses nouveautés, dont ce nouveau blog, pour un nouveau départ.

Mon objectif ici sera de bloguer sur les sujets qui me passionnent, dans 2 domaines :
  • le développement logiciel et toutes ces nouvelles technos et frameworks
  • l'agilité au sens large : Scrum, Lean, XP, ingénierie agile, etc ...
La liste des sujets que je souhaite évoquer est déjà longue, je vais les prioriser et les traiter ici, un par un, au fil du temps. Je souhaite ainsi partager mes connaissances, mes expertises, acquises tout au long de ces années, et surtout ces derniers mois qui m'ont permis de découvrir des choses passionnantes !

Cliquer ici pour accéder au blog et aux derniers articles.