Note de lecture : Peopleware: Productive projects and teams (2nd edition), par Tom DeMarco & Timothy Lister

Note : 10 ; De la gestion de projets à la création de communauté : une aventure humaine. Book of the year 2001 !

J’aurais pu ranger ce livre dans la catégorie “méthodes agiles”, tant le propos développé dans cet ouvrage est proche de l’extrême programming. Ce livre concerne le management, ou plutôt la gestion de projets mais dans le sens où la gestion d’un projet est d’avantage une question de faciliter la synergie de groupe que de méthodologies formelles. Qu’ont donc en commun les projets ayant abouti à des succès remarqués ? Une gestion du projet et des ressources particulièrement méticuleuse ? Parfois. La formation d’un groupe d’experts hautement qualifiés ? Pas toujours. L’utilisation d’un processus élaboré distribuant tâches rôles et responsabilités de façon rigoureuse et détaillée ? Rarement. Peopleware expose les traits communs de ces projets : la formation d’une équipe soudée, volontaire, complémentaire. Mais aussi la fierté d’appartenir à un groupe d’excellence, d’évoluer dans un environnement où la contribution individuelle et collective est reconnue.

Parler de la dynamique humaine dans les organisations ou les projets est presque devenu un lieu commun, que peu de personnes nient. Toutefois, cet aspect essentiel est presque immédiatement mis de coté au démarrage des projets, car « cela n’est pas applicable aux réalités du terrain ». Ce texte n’est pas une théorie sur les relations humaines, mais une suite d’essais adressant des aspects particuliers du sujet et s’appuyant sur des exemples concrets issus de la longue expérience de consulting des deux auteurs. Même si ils n’en ont pas la forme, ces essais sont pratiquement des patterns, ce qui en fait un ouvrage en avance sur son temps, car publié en 1987 pour la première édition. D’avant-garde, ce livre l’est encore d’avantage car il pose tout les fondements des méthodes agiles tels que l’extreme programming ou le lean development, par exemple.

Le livre est découpé en 6 parties totalisant 34 chapitres (ou essais). Le total n’étant que de 226 pages vous comprendrez que chaque chapitre n’excède pas quelques pages, ce qui renforce encore leur analogie avec les patterns. Les thèmes abordés au long de ces 6 parties sont : gestion des ressources humaines, l’environnement du bureau, le choix des bonnes personnes, la croissance des équipes productives, l’épanouissement dans le travail et quelques sujets connexes regroupés en dernière partie.

Il n’y a pas de recette miracle au succès des projets ou des organisations : la réussite passe par l’utilisation intelligente de la matière première principale : les hommes. Si vous souhaitez mieux appréhender cette dimension, ce grand classique est pour vous. Attention toutefois, le style un peu littéraire rend la lecture en anglais légèrement plus ardue que celle des autres ouvrages américains à finalité technique que nous avons d’avantage l’habitude de croiser.

peopleware

Référence complète : Peopleware: Productive projects and teams, 2nd edition – Tom DeMarco & Timothy Lister – Dorset House 1999 – ISBN: 0-932633-43-9

Peopleware: Productive Projects and Teams


http://www.goodreads.com/book/add_to_books_widget_frame/0932633439?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Professional Software Development, par Steve McConnell

Note: 8; Comment faire du développement logiciel une profession… et une carrière!

L’informatique constitue-t-elle une véritable profession d’ingénierie ? C’est à cette difficile question que tente de répondre Steve McConnell dans ce livre. Le constat initial est plutôt sévère, c’est l’objet de la première partie du livre. Les pratiques d’usage les plus répandues sont encore et toujours le « code and fix » et le noyau de connaissances universellement partagé par les professionnels reste considérablement plus faible que dans les disciplines d’ingénierie classiques établies de longue date. Ce constat amène l’auteur à considérer deux dimensions à la mesure de maturité de la profession :

  • Le corpus de connaissance : il se décline en un noyau stable (pour lequel la demi-vie des connaissances est de 50 ans) et un « body of knowledge », plus large, dont la demie-vie est de 10 ans.
  • Les éléments statutaires de la profession : certification, code d’éthique, sociétés professionnelles (telles que IEEE et ACM), développement professionnel, licences et accréditations.

Le second thème développé par l’auteur est le « professionnalisme individuel », où comment, à titre individuel, s’engager dans une voie de développement personnel. Là encore l’auteur présente ce développement en étapes, depuis le « mode héros », auquel succède la prise de conscience, le partage au sein de communautés, l’étape la plus haute étant le partage par la publication de textes.

Après le professionnalisme individuel, viennent les organisations professionnelles : comment structurer, favoriser la montée en compétence et la reconnaissance du professionnalisme des membres d’une organisation ? Plutôt que de passer en revue les chapitres de cette partie, intéressons-nous plutôt au « Construx Professional Development Program ». Dans ce programme de développement que l’auteur a mis en place dans sa propre société, les consultants sont évalués et évoluent sur des échelles de compétences par discipline d’ingénierie. Ces disciplines d’ingénieries sont définies au sein d’un organisme, le Swebok (Software Body Of Knowledge, émanation de l’IEEE). Il définit une échelle allant de 9 à 15, 10 “knowledge area” déclinés en 4 niveaux (introduction, compétence, leadership et maitrise). Chaque étage de l’échelle définit le nombre de KA pour lesquelles il faut avoir l’un des 4 niveaux. Cette échelle permet de définir des plans de progression professionnelle, définissant les actions à mener, les formations à suivre, etc..

Si cet ouvrage est surtout une source de réflexion plus profonde sur ce que veux dire ou devrait vouloir dire être un professionnel de l’informatique. Il établit les bases de ce que devrait être une véritable reconnaissance de l’informatique en tant que profession. Et c’est là une réflexion que devraient mener toute société de service informatique. Il est clair que nous en sommes loin.

prof-sofware-dev-mcconnell

Référence complète : Professional Software Development – Steve McConnell – Addison Wesley 2004 – ISBN: 0-321-19367-9

Professional Software Development: Shorter Schedules, Higher Quality Products, More Successful Projects, Enhanced Careers


http://www.goodreads.com/book/add_to_books_widget_frame/0321193679?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

2.0, I me mine

En ce début d’année, j’ai voulu faire le point sur les outils du Web 2.0 que j’utilise, ceux que j’utilise de plus en plus et ceux que j’utilisent moins. Ainsi que ceux que finalement je n’utilise pas ou plus du tout !

DropBox (http://www.dropbox.com/) : Certes, ce n’est pas vraiment nouveau, mais j’y met de plus en plus de choses. Je suis d’ailleurs passé au plan 50 Go cette année ! Ce fut d’abord le moyen le plus simple de partager des fichiers entre un MacBook et un PC sous Windows. C’est maintenant entre 2 PCs, un MacBook et un iPhone ! C’est aussi un moyen de partager des fichiers avec des personnes de mon équipe. C’est vraiment devenu un outil quotient cette année.

Evernote (http://www.evernote.com/) : Encore un outil avec lequel je suis monté en puissance cette année, je l’utilise réellement au quotidien aujourd’hui. Il y a de nombreuses choses que j’apprécie sur Evernote:

  • La simplicité: Quand on veut prendre des notes en réunion, jeter 2/3 idées sur la papier (pardon, sur le clavier), il n’y a presque rien à faire ! Les possibilités de formatages sont assez basiques (mais elles existent), mais simples d’emploi et parfaitement adaptées à la prise de note. On ne se met à utiliser les différentes possibilités (carnets multiples, tags) que progressivement. J’apprécie aussi la recherche “full texte” dans les notes … y compris sur les photos où Evernote applique un traitement OCR plutôt convainquant !
  • Le mode déconnecté: Comme plus de 80% des utilisateurs, j’utilise l’application “stand alone” plutôt que le Web. Ainsi je peux prendre mes notes sur mon portable sans me soucier de la connexion et les retrouver sur mes autres machines plus tard en laissant Evernote synchroniser quand il le peut. Aujourd’hui j’utilise Evernote sur Mac, sur PC et sur iPhone.
  • Le pricing plan: On peut aller très loin avec la version gratuite. En fait, il faut vraiment être un gros utilisateur d’Evernote pour devoir passer au plan payant. Aujourd’hui j’utilise le plan gratuit, mais si un jour je dois passer à la version payante, je ne pense pas que je me demanderais si cela en vaut le coût ! Ici, on ne paie pas pour voir, on ne paie qu’arrivé à un stade où on est de toute façon convaincu !

Plus j’utilise Evernote, plus je lui découvre de nouveaux usages, avec Evernote Clearly, par exemple, mais aussi avec le partage de carnet de notes.

Producteev (http://fr.producteev.com/) : Je ne sais pas encore dire si c’est une application que je vais garder, mais elle est suffisamment simple d’usage pour que je finisse par lâcher ma todo liste papier, à laquelle je tenais pourtant ! des étoiles, des tags et des échéances, je n’ai besoin de rien d’autre. Encore à l’essai pour l’instant ! Il existe une application iPhone qui se synchronise avec l’application Web, mais si je l’ai bien installée, j’avoue que je ne l’utilise pas.

Trello (https://trello.com/) : J’ai essayé, et j’ai délaissé … mais j’y reviendrais peut-être ! Honnêtement, j’aime beaucoup le principe (type Kanban) et l’interface intuitive et fluide. Mais Trello convient surtout pour traiter les projets, petits ou moyens. Pour gérer une todo liste de tâches au jour le jour, Producteev me semble plus adapté. J’ai un ou deux projets personnels dans mes cartons pour 2012, dont je ferais certainement le suivi avec Trello !

Meetup (http://www.meetup.com/) : Ce n’est pas vraiment un outil de productivité personnel, mais plutôt le point de rencontre principal des membres du French Scrum User Group (http://www.meetup.com/frenchsug/). Je l’utilise par conséquent dans le cadre de l’association ! 

Yammer (https://www.yammer.com/) : Encore un outil que l’on utilise dans le cadre du SUG, mais cette fois entre les membres du bureau. L’outil est bien fait pour gérer les échanges. Mais il lui manque une certaine polyvalence, pour gérer des projets, par exemple. Mais la gestion des fils de discussions, la création de groupes et la gestion de réunions sont très bien, y compris la gestion des pièces jointes, des tags, etc… Le manque de polyvalence de l’outil nous amènera cependant peut-être à déménager !

Il y a une application Adobe Air pour travailler en mode déconnecté, je la trouve franchement moins bien que l’application Web. L’application iPhone n’est pas terrible non plus, mais à avoir quand même, pour disposer de tout en offline.

Podio (https://podio.com/) : Peut-être le successeur de Yammer, au sein du bureau du SUG ? Il semble permettre la même chose que Yammer en terme de fil de discussions, avec en plus une gestion de projets ! Podio semble aussi disposer d’un ensemble de plugins permettant de l’étendre ou de le faire interagir avec d’autres outils. Toutefois, l’IHM a parfois des comportements hasardeux et j’ai été incapable de faire fonctionner le plugin Evernote par exemple. Bref, bien dans le principe mais semble manquer de fini en pratique. On verra ce que l’on fera en 2012 !

Tumblr (http://www.tumblr.com/) : Le blogging facile. J’ai laissé tomber le reste pour ne plus poster qu’ici. Il manque comme même la possibilité de laisser des commentaires ! Plutôt fait pour les posts courts, j’y met quand même des posts (très) longs. L’appli iPhone pour suivre les autres blogs est un plus, mais je m’en sers peu.

GMail (https://mail.google.com/) : pas nouveau, c’est le moins que l’on puisse dire (ça fait 7 ans que j’y suis), mais terriblement efficace. La nouvelle interface est abominable (je suis retournée à l’ancienne), mais l’intégration avec Google Docs et Google plus est redoutable. J’utilise la version Web essentiellement au bureau, l’universalité de ce mail fait qu’il se configure en un clin d’oeil sur le Mac ou l’iPhone, ce que j’ai fait. 

Google Doc (https://docs.google.com/) : Je sais que c’est la honte de dire ça, mais je n’utilise pas Google Docs. Je veux pouvoir travailler en ligne ou hors ligne, et surtout hors du browser, ce que Google Docs ne permet pas ! Donc je vais surtout sur les docs réalisés par d’autres, mais c’est tout. Je rêve d’un Google Doc qui serait en fait Office en “mode Evernote” ! Pour moi, aujourd’hui c’est Microsoft Office + DropBox !

Diigo (http://www.diigo.com/index) : Un outil de bookmarking. Encore un, allez-vous dire ? Personnellement, je suis bien plus à l’aise avec celui-ci qu’avec http://delicious.com/ ! Plusieurs petites fonctionnalités me plaisent:

  • Outre le tagging, on peut ranger ses bookmarks dans des listes ou des groupes, privés ou publics.
  • Les groupes, justement, permettent de partager des bookmarks sur des thèmes pointus. On peut même y commenter les bookarks des autres, en fait initier de véritables discussions.
  • Le pluggin pour Chrome permet non seulement de bookmarquer, mais aussi d’annoter ou de surligner le texte d’un site ! Franchement, c’est bluffant.

J’utilise Diigo depuis peu, je ne saurais dire si je vais persister dans son usage, mais franchement, c’est bien parti !

Tweeter (https://twitter.com/) : On ne présente plus Tweeter. Je tweet assez peu. Cela me sert à signaler du contenu que je trouve intéressant (technologies, agilité, développement informatique très essentiellement), pour signaler des évènements ou pour indiquer des posts que j’ai pu faire par ailleurs.

Dans l’autre sens, cela me permet de rester informer essentiellement sur des tendances langages de programmation, frameworks, bases de données, etc…

Je ne pratique pas le Twitter “live”, trop chronophage et perturbant en journée, j’ai tendance à différer mes lectures en fin de journée.

LinkedIn (http://www.linkedin.com/) : Je mentirais en prétendant passer beaucoup de temps sur LinkedIn. Mais il reste mon outil de prédilection pour mes contacts professionnels, plus que Viadeo. Clairement, le “Web social” n’est pas mon truc. 

Google Plus (https://plus.google.com/) : Je ne suis pas sur Facebook ! Ou plutôt, si j’ai un compte, je suis ce qu’on appelle généralement un “log down”. Mon niveau de post sur G+ … frise le zéro absolu. Je fais parfois des commentaires sur les posts des personnes que je suis mais sans plus, et même ce suivi est pour le moins très irrégulier. Au risque de me répéter, le “Web social”…

IFTTT (http://ifttt.com/) : Pluôt inattendu, ce service est une sorte de gros routeur entre différents services de premier rang: Facebook, Twitter, Google+, Instapaper, Diigo, Evernote, Google reader, Tumblr, Google mail, etc… Il permet d’effectuer certaines actions sous certaines conditions. Comme l’indique son nom “If This Then That”. J’y ai configuré quelques canaux, essentiellement pour envoyer vers Evernote des choses que je marque en favori dans Google reader ou Twitter afin de lire cela en différé et/ou hors ligne.

github (https://github.com/) : D’accord, je ne suis pas encore un gros utilisateur de github ! Vais-je le devenir un jour ? Quoi qu’il en soit, il arrive bien en tête pour moi par rapport aux solutions plus ou moins équivalentes comme Google Code…

Quora (http://www.quora.com/) : Comme beaucoup, j’ai là-dessus cédé à l’effet de mode. J’y ai passé un certain temps au début, mais je n’y retourne plus guère. En fait, j’ai répondu à bien plus de question que je n’ai lu de réponses utiles. J’ai pour ma part posté que très peu de question, mais jamais reçu de réponse en retour. Bref, un théoriquement un bon outil pour se construire une réputation, mais c’est tout. Je vais certainement continuer à y aller de temps à autre pour cette raison. Eh oui, j’ai quand même Jeff Sutherland parmi mes followers !

Stackoverflow (http://stackoverflow.com/) : Quora est peut-être trop généraliste pour être un site de référence pour les questions / réponses ? Ce n’est pas le cas de stackoverflow qui est clairement solide pour tout ce qui est du développement logiciel, et là on y trouve presque toujours une réponse valable, si ce n’est LA réponse. Pourtant je dois l’avouer … je n’a pas de compte sur stackoverflow !

Voilà, je pense avoir passé en revu le principal ! Rendez-vous dans un an pour faire le point.

Note de lecture : Collaboration Explained, facilitation skills for software project leaders, par Jean Tabaka

Note: 7; Tout pour devenir le facilitateur de compétition!

Cet étonnant ouvrage compte 360 pages, uniquement pour développer les techniques collaboratives au sein des équipes de développement. Le cœur du sujet est bien entendu le meeting. L’auteur développe les différents types de meetings, comment les organiser, établir un agenda et des objectifs. Il est très agréable de constater que l’auteur a le sens du détail: Jean nous proposes des listes de matériels à utiliser, des astuces comportementales et souligne les points importants.

Ce livre n’est pas une lecture légère: si le nombre de pages le classe dans une bonne moyenne, le texte est pratiquement dépourvu de toute illustration, et c’est dommage! La lecture aurait gagné en clarté avec quelques diagrammes bien pensés, mais surtout avec des photos illustrant l’organisation des meetings telle qu’elle est décrite. Ceci est d’autant plus dommage que Jean fait cela très bien Durant ses présentations. Pour nous autres, pauvres français, il y a aussi une autre difficulté: le texte est écrit dans un anglais assez élaboré, avec des phrases assez longues. Pour en finir avec les reproches, disons que le propos est parfois un peu abstrait et gagnerai en facilité d’abord avec des exemples concrets. Fort heureusement, les “anecdotes” de l’auteur compensent au moins en partie cette lacune, en plus d’être agréables à lire.

Collaboration Explained est une réelle somme de connaissance sur le sujet, sans nul doute la référence sur le sujet. C’est pour cela que je le conseille sans réserves. Soyez toutefois conscient qu’il ne s’agit pas là d’une lecture légère !

collaboration-explained

Référence complète : Collaboration Explained, facilitation skills for software project leaders – Jean Tabaka – Addison Wesley / ASD series 2006 – ISBN: 0-321-26877-6; EAN: 978-0-321-26877-8

Collaboration Explained: Facilitation Skills for Software Project Leaders


http://www.goodreads.com/book/add_to_books_widget_frame/0321268776?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Scrum Day 2012 : appel à orateur

Le Scrum Day 2012 Arrive, ce sera le 27 mars à l’espace CAP 15 !

http://www.frenchsug.org/display/FRSUG/Scrum%2BDay%2C%2B27%2Bmars%2B2012

Vous pouvez dès à présent soumettre vos propositions de présentations via le formulaire en ligne prévu à cet effet :

https://docs.google.com/a/frenchsug.org/spreadsheet/viewform?hl=en_US&formkey=dG43VHNhLUNkcmVUWFp6N1EySTdqRmc6MQ#gid=0

Vous avez jusqu’au 22 février pour soumettre vos propositions, la sélection finale des sujets retenus s’opèrera fin février, les orateurs seront notifiés à ce moment là et le programme du Scrum Day mis à jour au même moment sur le site.

Les inscriptions à la conférence elle-même seront ouvertes très bientôt, vous en serez prévenus par les canaux habituels.

Si vous avez des questions concernant la soumission de sujets, merci de de les envoyer à orateur@frenchsug.org

Note de lecture : 97 Things Every Project Manager Should Know, Barbee Davis edt.

Note : 4 ; Hétéroclite et peu convaincant

Ce livre qui fait partie de la collection « 97 things » n’est guère marquant. On y trouve des conseils de chefs de projets ou personnes apparentées, venus de tous horizons. C’est là que le bât blesse : il n’y a aucune cohérence entre les différentes interventions. Certaines viennent du monde « commande & contrôle » nous avisant de mieux définir les rôles les frontières et de rendre le processus plus définis, tandis que d’autres nous guident vers des processus agiles. Il en va de même pour les aspects évoqués : depuis la vision jusqu’au suivi d’avancement en passant par les estimations, la collaboration avec les utilisateurs. Tous ces sujets méritent d’être traités, mais ici on a plus un patchwork d’intervention avec des conseils parfois contradictoires que la couverture du sujet !

Certaines interventions sont toutefois très pertinentes. Si l’on prend cet opuscule pour ce qu’il est, une sorte de menu à la carte où l’on retient ce que l’on veut, on peut retirer disons 10% à 20% de matière donnant à réfléchir. Ce n’est pas sensationnel, mais on a vu pire.

97-things-PM-oreilly

Référence complète : 97 Things Every Programmer Should Know – Kevlin Henney edt. – O’Reilly 2010 – ISBN : 978 0 596 80948 5

97 Things Every Programmer Should Know: Collective Wisdom from the Experts


http://www.goodreads.com/book/add_to_books_widget_frame/0596809484?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Peer Reviews in Software, a practical guide, par Karl E. Wiegers

Note : 7 ; Une approche qualité “à la CMM”, toutefois claire et efficace. Mais le livre n’atteint pas la qualité des autres livres de l’auteur!

Que cela soit bien clair: Karl Wiegers est un auteur remarquable. C’est pour cela que je dirai que ce n’est pas le livre le plus remarquable de cet auteur, mais cet ouvrage assez court donne toutefois une bonne idée d’une approche “processus ” (mais alors vraiment processus !) De la revue de pairs. Le propos est un peu moins concret que ce que l’auteur a l’habitude de nous livrer, mais il faut bien dire qu’écrire un livre sur la revue de pairs est probablement un exercice difficile.

Du coté positif, l’auteur a une connaissance et une vision exceptionnellement large du sujet, et il est capable de synthétiser très efficacement cette vision. Coté négatif, je regrette que l’ouvrage se focalise exclusivement sur une approche “processus lourd”, à la CMM, ce qui ne conviens guère à toute les organisations, et surtout aux plus petites qui ont quand même des besoins de revue. J’ai aussi été un peu gêné tout le long de l’ouvrage par l’absence de cas d’étude concret. Cela dit, le livre est assez bien complété par des artéfacts disponibles sur le site Web.

Ce livre pourra vous convenir, si vous savez ce que vous allez lire, c’est à dire un livre très orienté processus. Vous apprécierez alors la capacité de l’auteur à s’exprimer efficacement en moins de 200 pages.

peer-reviews-software

Référence complète : Peer Reviews in Software, a practical guide – Karl E. Wiegers – Addison Wesley / I.T. series 2002 – ISBN: 0-201-73485-0

Peer Reviews in Software: A Practical Guide


http://www.goodreads.com/book/add_to_books_widget_frame/0201734850?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

3 décennies de « book of the decade »

J’ai posté il ya quelques jours une liste de mes “book of the year”. Voici une autre liste que j’entretiens: les “book of the decade”

Quels sont les livres qui ont vraiment fait changer votre façon de voir votre métier ? ceux qui ont réellement fait évoluer vos pratiques et peut-être même votre carrière ?

En découpant par tranche de 10 ans, j’ai relevé un livre qui fut chaque fois marquant. J’ai bien un peu triché dans mon découpage, mais que diantre: ce sont MES “books of the decade” ! On retrouve ces titres dans la liste des “book of the year”. C’est assez logique, mais en fait ce n’est pas un critère !

1981-1990 : Gödel, Escher, Bach: Les brins d’une guirlande éternelle – Douglas Hofstadter – InterEdition

1991-2000 : Design Patterns, Elements of reusable object oriented software – Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides

2001-2010 : Extreme Programming Explained: Embrace Change – Kent Beck – Addison Wesley

La quatrième décennie a déjà commencé. Rien n’émerge, mais il me reste 9 ans pour trouver cette perle rare.

Note de lecture : Balancing Agility and Discipline, A guide for the perplexed par Barry Boehm & Richard Turner

Note : 6 ; Une vue pragmatique et construite du processus combinant les les avantages des approches agiles et planifiées.

Il était temps qu’un auteur dépasse le cantonnement des approches prescritives et agiles, chacune prétendant sauver le monde avec sa propre vision intégriste du processus. Boehm et Turner analysent avec beaucoup d’acuité les avantages et faiblesses de chacune des approches (dont ils ont une bonne connaissance), et font une analyse assez correcte des bénéfices que l’on peut tirer de leur combinaison, comment le faire et en quelles circonstances. Cela est illustré par 2 cas d’études « avant et après » sur des projets destinés à être soit plutôt agile, soit conduit par un plan.

Il reste à espérer que cette première pierre soit le début d’une tendance où l’ouverture d’esprit dominera sur l’esprit partisan. En ce qui me concerne, j’avoue y porter un réel intérêt. Néanmoins, l’ouvrage en lui-même est un peu frustrant, car les 160 pages du texte principal ne font guère office que d’introduction à cette approche convergente. Certains outils proposés comme le « home groud polar chart », ou le « sweet spot chart », sont assez intéressants, mais je suis plus perplexe face à la « risk based method », destinée à déterminer la combinaison d’agilité et planification à appliquer.

On notera également le volume particulièrement important des annexes (70 pages). Cela reste insuffisant pour conseiller sans réserve cet ouvrage qui renferme cependant un incontestable savoir-faire.

balancing-agility-discipline

Référence complète : Balancing Agility and Discipline, A guide for the perplexed – Barry Boehm & Richard Turner – Addison Wesley 2003 – ISBN: 0-321-18612-5

Balancing Agility and Discipline: A Guide for the Perplexed


http://www.goodreads.com/book/add_to_books_widget_frame/0321186125?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Réponse à « Test-Driven Development: un pacte diabolique »

On a attiré mon attention il y a quelque temps sur un article présentant les tests comme un “pacte diabolique”. Ce texte, accessible ici a été publié par le théoriquement très sérieux “Comité Français des Tests Logiciels”.

Imbécile un jour, imbécile toujours ?

Après le pathétique papier publié par Anne Aussem dans le Journal du Net, voici un nouvel exemple d’article diffusant de fausses vérités. Mauvaise foi ou manque d’information ? Je constate simplement qu’avec la rapide diffusion de l’approche agile ce genre d’article de désinformation se multiplie. C’est clairement un phénomène récent, on n’en voyait pas trace il y a quelques années. S’agit-il en d’une stratégie de défense de la part des promoteurs des approches classiques ?

De toute manière, seules deux raisons peuvent amener à commettre un tel texte: (1) la stupidité ou (2) la désinformation volontaire. Je vais partir du principe que l’auteur est honnête, ce qui me dirige vers l’hypothèse (1). Qualifier cela de stupidité peut sembler fort, mais pour moi pour attaquer un sujet, il faut commencer par être bien informé (je vais bientôt revenir là-dessus). Ce n’est clairement pas le cas ici. Avant de développer, je livre aussi deux petites réflexions:

  • Avec l’article d’Anne Aussem, je pensais que notre cher pays était déjà bien équipé en imbéciles (une idée en fait antérieure à l’article en question). Drôle d’idée d’avoir en plus besoin d’un produit d’importation…
  • L’auteur fait valoir son doctorat et sa chaire de professeur. Cela confirme une conclusion à laquelle j’étais arrivé depuis longtemps: le diplôme n’est pas synonyme d’autorité et de qualité. C’est aussi une conclusion rassurante. Par ailleurs faire valoir sa notoriété voir son autorité dans la signature d’un article hausse le niveau d’exigence que l’on peut avoir par rapport au texte. Ce texte n’est pas digne d’une chaire de professeur. Il n’est pas digne de grand chose, en fait. Voyons cela.

TDD, un processus ?

Ma première remarque concerne l’appellation “processus TDD” employé par l’auteur. TDD n’est pas un processus, mais une pratique. Une technique faite pour améliorer certains aspects du développement logiciel, à savoir s’assurer que le code écrit fonctionne bien suivant l’intention de l’auteur. C’est une technique qui vient en compléter d’autres venant du monde agile, comme les “acceptante tests”, le pair programming, etc… et pourquoi pas d’autres issues de l’ingénierie classique. On parle bien de pratique, donc de quelque chose qui est mis en oeuvre conjointement avec d’autres choses. TDD n’impose rien d’autre. Et même si TDD est souvent associé avec d’autres pratiques comme les “user stories” et le “refactoring”, le fait qu’il y ait des facteurs convergents (surtout avec le refactoring) n’en font pas des éléments obligatoires de la mise en oeuvre de TDD !

Ainsi non seulement cette première section diffuse une contre-vérité, mais la figure (1) est également fausse: on écrit pas un ensemble de cas de tests avant de coder la tâche, mais on écrit UN cas de test, puis du code, puis du refactoring si nécessaire, puis UN nouveau cas de test, etc. (cf “Test-Driven Development” par Kent Beck).

Viennent ensuite les fameux 12 points.

La montée en échelle de TDD

Comme je l’ai dit, TDD est une pratique en elle-même. Si pour un projet de grande taille ou critique, l’approche User Stories ne semble pas la bonne (bien que contrairement à l’affirmation de l’auteur, les user stories puissent être gérées de manière hiérarchiques cf “Scaling Lean & Agile Development” par Larman & Vodde), utilisez-en une autre mieux adaptée à votre contexte. Cela n’empêche pas de faire du TDD ! Non, car TDD est fait pour tester le code que l’on écrit.

Les pratiques et outils à utiliser sur un projet doivent être adaptées au contexte du projet. En fait de nombreux outils existent dans la boite à outil agile (epics, story map, release plan, design session, 5 niveaux de planification, requirements area), mais on peut aussi aller les chercher hors de l’univers agile. Et on peut toujours pratiquer TDD dans tous les cas ! L’approche agile nous apprend surtout à nous adapter et à utiliser ou ne pas utiliser certains outils en fonction du contexte. Bref, elle nous apprend à travailler avec notre intelligence, un concept visiblement étranger à l’auteur. Exit le point numéro 1.

Une (avant) dernière chose, pour ce qui est des applications critiques: TDD est la seule pratique, à ma connaissance, qui garantit que du test pertinant correspondant à du code. En effet avec TDD vous n’avez pas le droit d’écrire du code si le test correspondant n’existe pas préalablement. A ce titre, TDD devrait être une pratique obligatoire lors du développement des systèmes dits critiques, n’est-ce pas ?

Enfin, bien sûr, Mr Jorgensen a raison quand il dit qu’il y a une limite à ce qu’un développeur peut garder à l’esprit à un moment donné. C’est un des points que TDD traite avec succès: quand on développe quelque chose, on se focalise dessus avec le test accompagnant la chose. Une fois terminé, je peux l’oublier ! Si par malheur ce que je fais ensuite impact une réalisation précédente, mes tests vont me le rappeler en échouant. Je n’ai pas besoin de garder à l’esprit les dépendances entre objets ou fonction, mes tests unitaires font cela à ma place. Au contraire de l’affirmation de l’auteur, sans TDD je serais obligé de tout garder à l’esprit !

Comment TDD traite-t-il de la complexité applicative ?

Ah ! Je vais devoir rappeler que TDD n’est pas un processus, n’est-ce pas ? Il y a en fait plusieurs points à adresser ici.

Le premier points concerne la façon dont TDD adresse effectivement la complexité applicative: elle ne l’adresse pas. Ce n’est pas son rôle. Mais il y a de nombreux éléments de projet qui n’adressent pas la complexité applicative. Le document de Vision (ou elevator statement, quel que soit le nom que vous lui donnez), il n’adresse pas la complexité applicative, est-il mauvais pour autant ? Mais je vais revenir sur ce point en parlant d’une autre pratique: le refactoring.

Le second point concerne la matrice d’incidence dont l’auteur semble friand. Je connais un peu ce genre de technique, avec UML nous appelions cela des “use case realizations”. J’avoue que d’un point de vue intellectuel et académique, ce genre de référentiel croisé est très attrayant. C’est sans doute pour cela que je me suis efforcé de mettre cela en oeuvre, il y a une douzaine d’année. Finalement sans grand succès, hélas. Ce genre d’approche souffre de deux ou trois faiblesses:

1 – Avoir une matrice juste et à jour est un vrai challenge. On est toujours en retard sur le développement, pour autant que l’on soit juste ! Il faut sans relâche traquer l’évolution du développement pour être à jour.

2 – Difficulté d’automatiser cette matrice. Ce point fait suite au précédent. Mais à mon avis le seul moyen d’être à jour est de faire en sorte que ce genre de matrice s’entretienne automatiquement à partir du code. Hélas en l’absence de lien formalisé entre le code et les cas d’utilisation, ce n’est guère possible. Ce genre de lien se matérialiserait très bien à l’aide de tests d’acceptante automatisés (ATDD), mais visiblement le TDD, c’est l’antre du mal, donc oublions…

3 – Ca ne sert à rien. Certes les matrice éparses permettent de constater un design “diffus”. mais c’est juste une constations, qui intervient après coup. Idéalement il faudrait alors corriger le tir … en refactorant. Oui mais, en l’absence d’un harnais de sécurité mis en place grâce aux tests, c’est bien trop dangereux !

En fait, la boite à outil agile offre d’autres outils pour traiter cette fameuse complexité applicative. Ce sont juste des outils complémentaires de TDD ! Et finalement, si vous aimez les matrices d’incidence et pensez qu’elles peuvent apporter à votre projet: faites-les ! Il n’y a aucune contre-indication avec TDD !

Comment TDD traite-il la compréhension du système ?

Un petit éclaircissement d’abord: l’auteur amène ici les termes “projet TDD” et même “projet purement TDD”. Une telle chose n’existe pas. TDD est une pratique, parler de “projet TDD” est vide de sens.

TDD n’a pas pour objet de documenter un système de manière globale. Il a le double objectif de tester le code lui-même et de le documenter par l’exemple.

Contrairement à une croyance largement répandue, les projets agiles ne sont pas réfractaires à la documentation (cf “agile modeling” de Scott Ambler, ou “agile documentation” d’Andreas Rüping). Mais ils mettent l’accent sur la documentation “juste à temps” dont l’écriture vient d’un besoin de transmettre un niveau de compréhension du système ou d’éclairer un aspect particulier du système. Il est vrai que l’on ne réalise pas un type de document simplement parce que cela est demandé par la méthode. Au final, ce type de documentation (comme les documentations “générées”) finissent par être des documents en “write only”.

L’approche agile nest pas non plus hostile aux commentaires dans le code, à certaines réserves près:

  • Un commentaire ne doit pas être une excuse à du code mal écrit et difficile à lire par lui-même. Il faut toujours privilégié le code clair. Si celui-ci se lit naturellement, alors cela diminue ou élimine la nécessité d’écrire un commentaire à ce sujet. A ce titre, on peut souvent considérer la nécessité d’écrire un commentaire comme un aveu d’échec à l’écriture d’un code clair !
  • Le commentaire ne doit pas paraphraser le code ! Il doit apporter une information et un éclairage particulier.

Le commentaire amène avec lui un danger réel: celui de ne pas être à jour par rapport au code auquel il s’adosse ! En fait, en plus de 30 ans, je n’ai jamais vu, même sur les projets les plus disciplinés, un commentaire qui n’était pas, à un moment donné et/ou à un endroit particulier, divergent ou en retard par rapport au code. C’est un danger pour le mainteneur car il sera induit en erreur.

Un nommage et un design clair, de bons tests unitaires sont une forme de documentation qu’il faut privilégier. Ils ne mentent jamais et ne sont jamais en retard par rapport au code. jamais. Les développeur aguerris à la technique des tests unitaires prennent l’habitude de s’appuyer sur ceux-cis pour comprendre le code qu’ils abordent. 

Il y a-il une quelconque garantie que les cas de tests développés dans le processus TDD constituent réellement un bon test ?

Là encore, ce point en couvre plusieurs.

1 – Quelle garantie a-t-on qu’un test est vraiment un bon test ?

En fait, cette question est une bonne question ! Une réellement bonne question ! mais vous aurez  peut-être remarqué que j’ai volontairement omis la partie “TDD” dans ma reformulation ? En effet cette question se pose autant aux tests TDD qu’aux autres ! Répondons à ce premier volet complètement éludé par l’auteur

a) La pratique du “pair programming”.

Contrairement à l’idée parfois admise qu’une personne super-compétente sera quasi infaillible, la communauté agile a développé ses pratiques sur l’idée que nous sommes tous faillibles, mais que ces failles se trouvent compensées ou évitées en travaillant ensemble (cf “Pair Programming Illuminated” par Williams & Kessler). L’une des pratiques mises en oeuvre est le travaille en binôme. La revue de pair est considérée comme l’une des méthodes de vérifications les plus efficaces (cf “Peer Reviews in Software, a pratical guide” par Karl Wiegers). Pour donner à cette technique le maximum d’efficacité, le pair programming propose de faire de cette activité une pratique systématique et continue, qui s’applique à l’écriture de code et de tests ! Ce n’est pas une garantie, mais cela s’en rapproche

b) Des “workshop” de cas de tests.

Il ne s’agit pas en soi d’une pratique agile largement documentée, mais d’un exemple de mise en oeuvre que l’on peut imaginer mettre en oeuvre sur un projet agile. C’est une chose que j’ai fait en pratique. L’idée est la suivante: sur la base de besoins exprimés on réunit un petit commando regroupant différentes facettes du projet: développer, équipe de validation, utilisateur, analyste, etc… Ce petit groupe produit, par le biais de discussions et contradictions un semble de cas de tests passants et non-passants. la présence de points de vue différents permet de combler les lacunes inhérentes à une vision partielle du projet !

c) Des testeurs dans l’équipe de développement.

Les équipes agiles font grand cas de la polyvalence des membres qui composent l’équipe. Cela ne signifie pas que l’on ne puisse avoir recours à des experts. Le test du code via TDD ne constitue qu’une partie des tests que l’on va appliquer au logiciel développé. L’une des mantra des approches agiles est d’avoir du feedback le plus tôt possible. Le test est une forme de feedback, on s’évertuera à avoir ce feedback au plus tôt en incorporant les testeurs à l’équipe de développement (cf “Agile Testing” par L. Crispin & J. Gregory) qui travailleront en étroite collaboration pour développer et outiller les tests nécessaires.

2 – Qu’en est-il des différents niveaux de tests ?

TDD, comme son nom l’indique se focalise sur le test du code, donc le test “boite blanche”. Cela ne signifie pas que l’on effectue pas d’autres types de tests sur les projets agiles. Non seulement ils sont fait, mais d’une manière générale mieux faits que sur des projets classiques. Pour développer ce point, il me faudrait évoquer une autre pratique (la 4ème de ce papier, je pense): l’intégration continue. En intégration continue, le logiciel est construit de manière continuelle, à chaque “commit” dans le gestionnaire de source, et les tests automatiques (que ce soient des tests unitaires ou non) sont exécutés à la suite. Fini d’attendre de long cycles d’intégration pour savoir ce qui va mal ! A chaque changement, on obtient un feedback presque immédiat !

Revenons un moment sur les différents types de tests. Hélas, je ne suis pas un spécialiste de la taxonomie des tests, mais je vais essayer.

  • Les tests unitaires: il s’agit du focus principal du TDD. L’unité de test est la méthode. C’est le focus principel de l’approche TDD. La mise en place de ces tests s’appuie traditionnellement sur des frameworks de test de la famille xUnit (cf “xUnit Test Patterns” de Meszaros).
  • Les tests de composants: C’est un type de tests assez proche du précédent, on emploie d’ailleurs souvent les mêmes outils. C’est aussi un test de type “boite blanche”, pas très facile à décrire à mon avis, car la notion de “composant” est elle-même difficile à établir à l’aide d’une définition fermée ! De manière générale, on peut dire que ces tests s’appliquent à des groupes de classes, donc à des scénarios mettant en oeuvre l’interaction entre ces différentes classes. On peut parfois réaliser ces tests en TDD, mais dans la pratique cela s’avère plus difficile à faire que pour les tests unitaires. Beaucoup de développeurs écrivent ces tests juste après avoir écrit le code.
  • Les tests d’intégration: On peut voir d’une part ces tests comme des tests de composant à plus grande échelle, traversant toute l’architecture du système, mais souvent ces tests intègrent l’interaction avec les systèmes externes (base de données annuaires, etc…). Les agilistes essaient souvent de mener leurs tests le plus loin possible sans y intégrer de système externe, en “mockant” ces systèmes externes, puis de réaliser des tests plus ciblés adressant uniquement les couches d’interfaçage avec le système externe ! Quoi qu’il en soit, ces interactions avec les systèmes externes doivent être adressées. Je n’ai personnellement jamais vu ces tests d’intégration réalisés en TDD, mais en principe rien ne l’interdit ! Au niveau de l’outillage, on voit soit des solutions spécifiques, soit des adaptations à base de xUnit. Certains systèmes viennent aussi parfois accompagnés de librairies ou d’outils facilitant ces tests d’intégration, c’est le cas de certaines solutions open-source.
  • Les tests de performance: Il n’y a guère de différence de mise en oeuvre de tests de performance entre un projet agile et un projet non-agile. Dans un projet agile, on essaiera simplement de mettre en place ces tests au plus tôt, puis d’intégrer ceux-ci à la plateforme d’intégration continue. Les tests de charge, de par leur nature sont eux, hélas, difficile à concilier avec une logique d’intégration continue. Que ce soit pour les tests de charge ou pour les tests de performance, on est plutôt dans une logique de “test after”. Peut-être il y a-t-il là matière à progrès ? Les outils destinés à ce type de tests sont spécifiques à ces problématiques, souvent hélas un peu lourd de mise en oeuvre.
  • Les tests d’acceptance: Il s’agit de tests fonctionnels, donc de type “boite noire”. Au niveau de l’approche outillée, il y a deux courants de pensée:
    • Une approche de tests par l’IHM, comme cela est fait avec des outils tels que Selenium. La difficulté étant alors la combinaison de problématiques de comportements dynamiques d’interface avec le comportement purement fonctionnel. L’avantage est que ces tests garantissent effectivement ce qui est perçu par l’utilisateur.
    • Une approche s’abstrayant de l’IHM, testant le comportement fonctionnel au niveau de la couche sous-jacente à la couche présentation. L’avantage est une meilleure stabilité comportementale, car le comportement dynamique de l’IHM est exclu. S’il permet de se focaliser sur l’aspect métier, il ne s’agit pas ici d’un test applicatif. L’émergence de technologies telles que HTML 5 et de librairies Javascript lourdes comme JQuery mettent aussi à mal cette approche par ailleurs attrayante.

          L’une des pratiques agiles qui fait l’objet de plus en plus d’attention est l’ATDD, ou Acceptance Tests Driven Development. Il s’agit d’une pratique complémentaire au TDD, focalisé ur l’aspect fonctionnel. Dans cette approche, on perçoit les cas de tests comme une information complémentaire au recueil des besoins, lui donnant à la fois une concrétisation (une expression de besoin est par nature abstraite) et des précisions pour traiter des cas particuliers ou ambigües. L’expression des besoins est donc alors le recueil des besoins initial (les User stories ou autre chose) plus les cas de tests d’acceptante. Dans l’approche ATDD, les cas de tests sont écrits en grande partie et implémentés avant que le travail de développement commence, à l’image de ce que l’on fait pour le TDD. Ces cas de tests ne sont pas écrits par le développeur mais par toutes les parties prenantes à l’expression du besoin (le développeur peut y participer). La mesure du suivi de l’accomplissement de l’itération devient alors le suivi du passage au vert des cas de tests, permettant un suivi du projet hors pair !

  • Les tests exploratoires: Ce sont les seuls tests qui ne peuvent être automatisés, ils sont laissés au jugement humain. La découverte de cas de figure non couverts par des tests d’acceptante peut participer à la consolidation de la couverture de tests.

L’approche agile ne limite pas les tests au test du code. En fait, tout ce qui a été identifié comme nécessitant des tests doit l’aide en utilisant la technique adéquat. Que dit l’approche agile à ce sujet ? Si quelque chose a été identifié comme nécessaire, alors faites-le ! Sinon ne le faites pas (donc ne faites pas quelque chose par simple dogmatisme). Simplement, faites-le le plus tôt possible et le plus souvent possible ! C’est une question de bon sens.

Comment TDD traite-til des exigences non-fonctionnelles, telles que la performance, la fiabilité, la sécurité, la capacité de débit ou la bande passante et la maintenabilité ?

Sur ce point, l’auteur de l’article est à la fois dans l’erreur mais répond lui-même à une partie de ces questions.

1 – Performance, fiabilité et sécurité

Pour ce qui est des autres types de tests, encore une fois s’ils ont besoin d’être fait, alors il faut les faire. Je me répète mais il n’y a aucune incompatibilité ni contre-indication entre TDD et des tests de performance ou de sécurité ! Bien au contraire, ils sont complémentaires !

2 – A propos de l’analyse

Mais qu’en est-il de traiter avec succès ces points avec “une analyse rigoureuse” ? Je répondrais en deux points:

  • Qui a prétendu que l’on ne faisait pas d’analyse sur les projets agiles ? Encore une fois j’y vois une ignorance complète de ce qu’est un projet agile de la part de l’auteur !
  • Cette fameuse “analyse rigoureuse” est-elle une garantie de succès ? Ayant audit des projets, j’ai eu mon compte de modélisations malheureuses et d’analyses erronées. 

En filigrane, j’y vois une faiblesse majeure des approches classiques: substituer une description prescriptive des processus à la compétence ! Cela conduit ces équipe à construire des équipes en “optimisant les coûts” donc avec des personnes moins chères mais moins expérimentés et/ou peu brillantes en pensant que les lourds classeurs descriptifs des méthodes vont compenser cela. C’est faux ! Il n’y a pas de substitut à la compétence !

3 – Et enfin, au sujet de la maintenabilité

Le dernier point concerne la maintenabilité. Le problème majeur qui se pose lors de la manigance logicielle est: qu’est-ce que je risque de casser en modifiant le code existant ?

Sur un projet classique, on commence par lire la documentation. Puis on lit le code (souvent peu clair, car il y a peu de contraintes sur la lisibilité du code), de toute façon en fait, on ne fait pas confiance à la documentation ! Finalement, on opte souvent par l’écriture de “rustine” interagissant à minima avec le code existant, conduisant le plus souvent à de la duplication de code et de fonctionnalité. Celle-ci amplifie encore le problème de maintenance car les prochains correctifs devront agir au niveau de toutes les portions de code dupliqués !

Sur un projet mettant en oeuvre TDD, on commence aussi par lire la documentation existante (car il y en a souvent, même si elle est plus synthétique). Puis on exécute les cas de test pour comprendre le comportement du code existant. On ajoute de nouveaux cas de tests correspondant aux évolutions ou corrections à implémenter et on s’assure avant tout que ces tests ne passent pas. On effectue les évolutions / corrections dans le code existant en s’assurant que les codes préexistant ne cassent pas. On vérifie aussi qu’il n’y a pas de duplication de code et que le design est “clean” en terminant chaque cycle d’implémentation par du refactoring. On n’a aucune crainte à le faire, car contrairement à un projet sans tests unitaires, on a les garanties qu’il n’y aura pas de régression ! On s’assure régulièrement, à chaque “commit” de code que les tests d’intégration et d’acceptante passent tous, y compris les nouveaux tests d’acceptante. On s’assure que tout est au vert sur la plateforme d’intégration continue.

TDD n’est peut-être pas l’arme absolue en ce qui concerne la maintenabilité, mais c’est sans aucun doute possible ce qui s’en rapproche le plus ! Aucun autre outil ne peut nous donner de meilleurs assurances à ce sujet. L’auteur propose comme outil de l’analyse et de la modélisation rigoureuse, mais en quoi peut-on être sur que ces documents sont à jour avec le code ? Est-on certain que les évolutions ont été faites sur les deux fronts ? Y compris lors des correctifs d’urgence (ce n’est pratiquement jamais le cas) ? Et finalement en quoi ces outils aident-ils le développeur à s’assurer de la non-agression ?

En fait, c’est bel et bien l’approche classique qui ne sait pas répondre aux problématiques de la maintenabilité. En tout cas l’auteur de l’article n’y répond pas !

L’approche non-agile ne donne aucun outil réellement opérationnel par rapport à la problématique de la maintenabilité. Pire, elle occulte cette lacune avec une illusion simplement à même de tromper un management qui finira, si cette maintenance devient problématique ou trop coûteuse, par blâmer le développeur !

Vu que les cas de tests au niveau des tâches dirigent le processus TDD, que se passe-t-il si ces tests sont inadéquats, par exemple incomplets, insuffisants ou incorrects ?

C’est une question assez générale: que se passe-t-il si les tests sont inadéquats, etc… Pas seulement en TDD, mais en général ! Quelle réponse apporte les processus classiques ? Visiblement on parle de vérification croisée !

Sur ce point, TDD est utilement complété du pair programming. Si votre développement est réalisé en pair programming, vous avez l’assurance que tous les tests sont toujours revus par une autre personne, tout le temps, au moment où ils sont écrits ! Est-ce parfait ? Non ! Mais au moins a-t-on l’assurance que tous les tests sont revus contrairement aux processus de revue croisé à postériori qui ne sait garantir (à moins de coûts exorbitants) que tous est toujours revu !

ATDD complète aussi utilement cet arsenal grâce à des tests s’appuyant et complétant les spécifications. La garantie que ces tests sont “parfaits” n’existe pas. On réduit simplement le risque en faisant participer à leur écriture toutes les personnes qui peuvent être concernées. Fini l’approche taylorisme du testeur écrivant ses tests dans un coin en s’appuyant sur une lourde spécification envoyée par mails, le cahier de test étant ensuite lui-même envoyé par mail aux personnes en charge de l’exécuter ! L’approche agile croit en la collaboration et la communication.

L’affirmation d’effet tunnel est aberrante: au contraire, les projets agiles donne une visibilité idéale sur le projet: on connait à tout instant le nombre de tests unitaire qui passent, les tests d’acceptante qui sont OK, la plateforme d’intégration donne un statut sur la qualité d’intégration et souvent d’autres métriques qualité. Les projets Scrum donne aussi une visibilité en continu sur les tâches en cours et réalisées via un “kanban” des tâches. On parle ici de visibilité à l’heure, voir à la minute. Sur aucun des 4 volets que j’ai cité, les processus classiques ne peuvent prétendre donner le même niveau de visibilité et de feedback. Il y a bien un problème d’effet tunnel, mais il est du côté des processus classiques.

Les défauts qui ne peuvent être détectés que par le test de flux de données…

J’avoue ma méconnaissance de cette technique. C’est une des nombreuses choses que la communauté des tests peut enseigner à la communauté agile !

Je n’ai qu’une chose à dire: si ce type de test est utile, alors faites-les ! Il n’y a aucune incompatibilité avec la pratique de TDD.

Quel est le processus de TDD qui garanti que les composants créés et testés isolément avec succès seront sujet à une forme de test d’intégration ?

Tester l’intégration est l’affaire des tests d’intégration ! TDD est une pratique de développement, donc les tests d’intégration ont toujours lieu, comme je l’ai dit précédemment.

En ce qui concerne l’intégration, les projets agiles s’appuient sur des plateformes d’intégration continu qui jouent tôt et souvent les tests d’intégration. Ce qui dans des projets classiques correspond à une phase d’intégration pouvant durer plusieurs mois est ici littéralement réduit à zéro !

Comment la documentation délibérément parcellaire, supporte-t-elle le besoin éventuel de maintenance du programme ?

J’ai répondu à ce point précédemment. Le problème majeur de la maintenance est la non-regression. La documentation n’aide en aucune manière sur ce point.

Maintenant, il est utile d’avoir une compréhension de haut niveau, pour comprendre l’organisation des modules, le style architectural, le cinématique des services. Documenter cela de manière compréhensible et synthétique est souvent utile. Et dans ce cas, il faut le faire, tout simplement ! Certaines équipes emploient même à plein temps un “technical writer”.

Mais pour ce qui est de garantir la non-regression, la documentation n’est d’aucune aide. Les tests unitaires développés et maintenus tout au long de la vie du programme avec TDD sont le meilleur outil que je connaisse, de très loin.

La maintenabilité des projets développés avec TDD sont incomparablement plus maintenables que les projets non-agiles. En fait, ils sont simplement maintenables, alors que les projets sans tests unitaires ne le sont pas.

Comment la refactorisation répétée produit-elle une conception élégante ?

L’auteur parle de controverse. Je partage ce point de vue mais de mais de manière inverse: Je reste dubitatif sur cette affirmation que la conception émergente ne produit pas des architectures élégantes. A l’appui des dires de Mr Jorgensen, il y a une étude qu’il a mené dans son université. Mais on ne sait rien de cette étude (et l’on sait qu’on leur fait dire ce que l’on veut, aux études): sur quelles critères ? Avec qui ? Sur quelle base ? Répondre au “comment” que nous soumet l’auteur est difficile. Mais je peux soumettre des éléments de réponse !

  • Un très grand nombre de projets open-source, notamment dans la fondation Apache sont le fruit d’une conception émergente, je pense que c’est une base sur laquelle s’appuyer pour parler d’élégance.
  • La qualité d’une conception ou d’une architecture est essentiellement subordonnée au savoir-faire du développeur. Le raffinement d’une architecture par le biais de refactoring demande effectivement un savoir-faire à part entière. Au final, c’est le talent et le savoir-faire qui sont la garant d’une bonne conception.
  • Les architectures fruit d’une conception initiale “à priori” souffrent d’un manque de recul sur le sujet:
    • Des couches dont on a décidé à priori qu’elles seraient utiles s’avèrent surnuméraires et génèrent des lourdeur et de la dette technique.
    • Certains modules ou concepts n’ont pu être identifiés au départ, encore une fois par manque de recul. Les fonctionnalités correspondantes finissent sous forme de code utilitaire “rustiné” ailleurs ou pire encore sous forme de traitements dupliqué !
    • On fait fi d’une réalité du développement informatique: il s’agit d’une activité de découverte et d’apprentissage. Les idées naissent et murissent en travaillant sur le sujet. Il ne faut pas hésiter à remettre en cause des idées premières à la lumière de ce que l’on a appris.
  • En commençant petit, avec le niveau et la complexité de conception correspondant à ce que l’on fait sur le moment, on s’assure de ne pas faire de “sur-conception”, on ne fait pas d’hypothèse sur des évolutions futures dont on ne sait pas si elles auront lieu et enfin on écrit uniquement du code qui sert, que l’on peut tester, et non pas un dette technique et peut-être même une bombe à retardement.

Ayant répondu à ce point, j’attire maintenant l’attention sur le fait que TDD et refactoring s’ils sont complémentaires et se marient bien ensemble, sont deux pratiques différentes ! TDD n’a pas pour but de traiter la qualité de la conception.

Par contre, une constatation que j’ai pu faire au début des années 2000, c’est que le noyau dur de la communauté agile s’est construit à partir de la communauté “design patterns” donc des personnes particulièrement affutées en conception et qui ont voulu mettre en place des méthode de travail permettant l’émergence de conceptions de qualité !

Comment une “vision tunnel” générée par TDD peut-elle amener une conception qui traite efficacement de la performance

Ce point nest pas un nouveau point, car l’auteur a déjà évoqué ces points en (4) et en (5). La réponse reste la même: TDD est une pratique de développement, elle ne prétend pas couvrir les tests de performance, ni résoudre la crise économique ou établir la paix dans le monde. les projets agiles font des tests de performance dans la mesure où ces critères ont été identifiés. Et dans ce cas, ces tests sont intégrés à la plateforme d’intégration. On peut alors suivre heure par heure l’impact des évolutions ou des refactoring sur ces performances. Les projets classiques peuvent-ils prétendre la même chose ?

Je ne vais pas m’étendre sur l’accusation d’effet tunnel qui met simplement en lumière la complète ignorance du sujet auquel s’attaque Mr Jorgensen.

Comment détecter des inconsistances, même légères entre les tâches d’une user story ou entre les user stories elle-même ?

Qu’est-ce qu’un découpage en tâche dans un développement agile ? C’est simplement une façon d’organiser le travail afin de le répartir et de voir le développement progresser. Bien sûr, lorsque l’on découpe en tâches on s’évertue à donner une définition du “done” de la tâche. mais au final, quand les tâches constituant une user story sont terminées, ce sont les tests d’acceptance qui font foi du bouclage de la user story. Possédant cette indication, quelle valeur il y a-t-il à relier des incohérences “même légères” entre les tâches ? Si cela ne va pas, les tests d’acceptance sauront nous le dire, car il ne passeront pas. Si ils passent ces que ces incohérences sont sans importance, ou alors peut-être du point de vue académique … mais sur les projets agiles, on refuse de passer du temps sur des choses qui ne servent à rien.

Les incohérences entree user stories sony des choses qui peuvent arriver. Je vois deux moyens de contrer ce problème

  • Sur les user stories, la communauté agile a développé deux techniques: les “epics” et le “story zapping” afin de regrouper et analyser de manière transversales les user stories.
  • La seconde technique n’a rien de novatrice mais elle marche toujours très bien: le peer-review.

L’utilisation des “user story” est indépendante de TDD. Même si cette technique est très répandue dans la communauté agile, elle n’est pas “obligatoire”. Et si elle est utilisée, elle peut être complétée par nombre de formalismes ou techniques qui peuvent s’avérer pertinentes sur le projet. 

L’heure du bilan ?

Le premier point que que l’on retiendra est la méconnaissance totale du sujet par Mr Jorgensen. Il présente TDD comme un processus alors qu’il s’agit d’une pratique. Une erreur qu’il n’aurait pas faite s’il avait lu quelque ouvrage sur le sujet ! On comprend maintenant pourquoi il n’y a aucune référence bibliographique à l’appui de ses observations.

Ma réponse est beaucoup plus longue que l’article d’origine. J’ai voulu étayer chaque point d’explications et non asséner des affirmations. Pourtant j’aurais aimé développer encore plus !

Cette approche éronée explique pourquoi certains points ne sont pas “traités par TDD”. Dans un projet agile on utilise un ensemble de technique pour couvrir ces différents aspects, comme une plateforme d’intégration pour vérifier en permanence la qualité d’intégration. On voit alors que les points en questions sont adressés de manière pertinente et efficace.

Pour ce qui est des points sur lesquels TDD présente une plus-value, on a vu que, contrairement aux affirmations de Mr Jorgensen, TDD donne une réponse de très bonne qualité, bien supérieure aux approches classiques. Est-ce un manque d’information, une erreur de jugement ou une volonté délibérée de tromper qui ont conduit Mr Jorgensen à ces conclusions ?

Les dangers de juger sans savoir

Vous aurez surement noté que j’ai appelé l’auteur “Mr Jorgensen” et non “Professeur Jorgensen”. A la lumière de cette oeuvre édifiante, il ne mérite pas ce titre. Il y a de réels dommages qui naissent de la diffusion de la désinformation et de la diffusion de contre-vérités auprès d’un public non encore au fait du sujet. Cela est encore aggravé lorsque cela est fait en s’appuyant sur une soi-disante autorité !

Et pourtant !

Pourtant, il y a beaucoup à gagner d’un véritable dialogue. Il est utile que des pratiques ou des approches nouvelles soient critiquées, challengées. Parfois, effectivement, de nouvelles idées s’avèrent de mauvaises idées et les bonnes idées sont améliorées car elles ont été poussées dans leurs retranchements ! Ces débats, cette stimulation est importante ! Mais elle doit se faire intelligemment, en connaissant le sujet, avec un esprit d’ouverture. Avec la confrontation constructive d’experts, et même en mettant face à face experts, moins experts et débutants !

Utiliser intelligemment les richesses d’une communauté vers une autre

De nombreux domaines d’ingénierie possèdent une très grande richesse de pratique et d’expérience, forte de décennies de travaux, de publications. La communauté des tests fait partie de celle-ci ! La communauté agile a beaucoup à apprendre de cette richesse et de cette expérience, sans devoir renoncer à ses conviction.

Dans l’autre sens, la communauté des tests a certainement des idées à emprunter au jeune courant agile. On a souvent besoin d’idées disruptives pour ortie du carcan des idées reçues ! De cette rencontre devrait naitre un renforcement mutuel.