samedi 31 juillet 2010

Evaluation de charge : jouez au poker avec les points de fonction


( Stefen Hawking jouant au poker avec Einstein (Jim Norton) et Newton (John Neville). Extrait de la série "Star Trek, The Next Generation", au début de l'épisode "Descent", Part I. Documents Paramount Pictures, 1993.)


Question lancinante, récurrente , incontournable , posée aux développeurs, responsables de projet et autres: A combien de jour/homme estimez vous cette tâche ?.
Cette question universelle contient les deux incongruités qui pèseront lourdement sur la justesse de la réponse: jour/homme et tâche.

Le contexte.


Imaginons 3 chauffeurs engagés pour conduire un client de Paris à Marseille.

Concernant les Jours/hommes:

La question sur l'estimation serait traduite en :

Combien de temps il vous faut pour faire Paris Marseille . ?
Avec 3 chauffeurs , vous obtiendrez 3 réponses DIFFÉRENTES et elles seront toutes justes... (un chauffeur va rouler à 120 km/h , un autre s'arrête toute les heures etc.)

En revanche à la question suivante : Combien de kilomètre entre Paris et Marseille ? Les trois chauffeurs vont arriver à un chiffre proche.

Ainsi avec les jours/hommes on cumule deux approximations: La quantité de ce qui est à faire et la vitesse de réalisation.






Concernant l'unité utilisée.

L'unité jour/homme est elle même une aberration : qu'est ce qu'une journée idéale ?

Gardons en tête cet exemple plein de bon sens :

1 femme peut faire un enfant en 9 mois mais jamais 9 femmes feront un enfant en 1 mois.

Quand les chiffres annoncés sont du type 300 j/h pour réaliser une tache , j'ai toujours envie de dire : ok on va embaucher 300 personnes et le truc sera terminé après-demain.
Réponse immuable à cette remarque: Ce ne sont pas des mêmes j/h (Pourquoi les additionner alors ?)




Concernant les tâches

La commande passée au chauffeur serait:
a) Aller chercher la voiture au garage
b) Vérifier la pression des pneus
c) Faire le plein
d) rouler 700 km
etc..

Or quelle est la demande du client ? : se rendre de Paris à Marseille tout simplement . En se focalisant sur les tâches et non pas sur les fonctions (vision client) , notre pauvre client se retrouvera soit largué en pleine campagne bretonne soit coincé sur le périphérique.


Les points de fonctions et les méthodes agiles

Au commencement ..

Il existe d'autres unités de mesure des taches, comme les points de fonction utilisés par la méthode éponyme : (ici un très bon lien sur le sujet) . Ici, l'évaluation se place du coté de l'utilisateur. Peu importe si la fonction est réalisée par une usine à gaz (SOA, machine de Rude GOLBERG ) ou un progiciel.

Cette méthode du siècle dernier a été détournée et remise à la mode pour les besoins des méthodes agiles.

La métrique.
On utilise une suite numérique discontinue pour quantifier des charges.

On va s'attacher à évaluer des 'fonctions utilisateurs' et non pas des taches.

Un exemple de bonne suite est celle de Fibonacci :

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ...


Étrangement: en demandant moins de précision, on va en obtenir plus.

  • Paradoxe 1: La précision d'une évaluation est une fonction en forme de cloche. A partir d'un certain stade, plus on cherche à affiner les évaluations ( plus on passe de temps dessus) et moins on sera efficace dans les estimations.





  • Paradoxe 2: Une personne isolée estimera mieux qu'un groupe.

  • Paradoxe 3: Un expert relevant du domaine à estimer est le plus à même à faire une bonne estimation. Ainsi,il faut préférer les dires d'experts aux pseudo-méthodes d'évaluation basées sur le nombre d'écran, le nombre de contrôle etc. (§machine de Rude GOLBERG )


L'évaluation par le Poker:


Cette technique arrive à concilier toutes les contraintes de l'évaluation.
Chaque membre de l'équipe dispose d'une série de carte, chaque carte reprenant un nombre de la suite.

Le maitre du jeu détaille la fonction à évaluer (maximum 15 minutes) , puis chaque joueur compose son estimation avec ses cartes. Au signal tout le monde retourne ses cartes.

Une discussion s'engage sur les écarts des estimations (max 15 minutes)

Ainsi , on obtient une liste de fonctionnalité avec leur poids.

Voir le lien wikipedia planning poker.

Détermination de la vitesse de réalisation de l'équipe.

L'itération initiale va donner une première estimation de la vitesse de l'équipe. Plus on réalisera des itérations et plus cette vitesse sera affinée.

Ainsi dans des méthodes agiles, ce qui est important c'est la planification en elle même plus que le plan. La planification est réalisée a chaque itération et non pas de façon macro en début de projet.

Au départ, on peut dire que l'estimation par point est aussi imprécise qu'en jour homme. En revanche par le mécanisme des itérations courtes, l'estimation sera de plus proche de la réalité. L'estimation devient même marginale par rapport au projet. L'équipe ne s'engage que pour des courtes périodes.

Un client voulant aller de Paris à Pékin , se verra proposer avec les méthodes agiles une série d'étape l'amenant vers son point d'arrivée. A tout moment en fin d'étape, le client peut dire stop. Il ne sera pas obligé de rebrousser chemin.

En informatique , le client s'engage pour 1 mois , il pose sa mise sur la table. L'équipe informatique livre en fin d'itération un produit avec une fonctionnalité de base. Le client peut décider de continuer sur un autre cycle avec une nouvelle fonction ou simplement d'arrêter les frais.
Si au bout d'un mois le client n'est pas satisfait, il ne perdra que sa mise de départ, mais il aura une application minimale en état de marche..

mercredi 28 juillet 2010

5 astuces pour #rails


1) La mise au point.
Le debug du code en Rails est très facile.
Il faut tout d'abord avoir installé le gemme ruby-debug.
Puis on peut ajouter "debugger" aux endroits stratégiques . "debugger" qui va provoquer un point d'arrêt dans le code.
Le lancement du serveur se fera avec l'option script/server --debugger

Avec cette option le serveur va exécuter le code jusqu'au point d'arrêt et vous rend la main. Vous pouvez alors examiner les variables, faire du ligne à ligne.

Sans utiliser le debug , il est parfois utile d'accéder aux paramètres d'une transaction, il suffit d'insérer dans le code du contrôleur l'instruction "raise" pour provoquer un plantage et un affichage de toutes les variables de la requete.

Enfin , dans les vues la fonction "debug(nom_de_variable") affiche le contenu des objets, des lignes d'un tableau etc.

2) Les observateurs.

Le design pattern 'observer' permet d'introduire une dépendance souple entre deux classes.
Ce motif sert de lien entre deux classes en observant les évènements des instances d'une classe.
Le cas d'utilisation simple est le déclenchement de la journalisation à la suite d'un évènement sur un objet. Par l'utilisation des observers, on évite de polluer le code d'une classe avec des opérations qui ne sont pas directement dans le périmètre d'un objet.

Je m'en sert pour tenir à jour des compteurs de lignes.
Exemple: j'ai deux classes , une pour 'projet' et une autre pour 'tache_annuelle'. Je souhaite avoir une variable d'instance qui pour chaque projet retrace le nombre de ligne de la table des taches. Cette opération peut etre réalisée en SQL mais l'affichage de 60 projets avec pour chacun une requête SELECT COUNT plomberait les performances.

J'ai utilisé un observer qui scrute deux évènements : la création et la suppression des lignes de la table tache.

(Zeya:/usr/local/projetsawd# emacs app/models/auditeur_observer.rb)



class AuditeurObserver < ActiveRecord::Observer
observe Lignepaatec

def after_create(ligne)
@projet= Projet.find(ligne.projet_id)
@projet.paa+=1
@projet.save
end
def after_destroy(ligne)
@projet= Projet.find(ligne.projet_id)
@projet.paa-=1
@projet.save
end


end

Le fichier auditeur_observer.rb doit se trouver dans le répertoire des modèles et chargé au démarrage du serveur par l'ajout de cette ligne dans le fichier config/environment.rb

config.active_record.observers = :auditeur_observer

J'ai appris depuis qu'il est possible de générer automatique les fichiers pour les observers par la commande: script/generate observer


Zeya:/usr/local/projetsawd# script/generate observer essai_eric
exists app/models/
exists test/unit/
create app/models/essai_eric_observer.rb
create test/unit/essai_eric_observer_test.rb



3) La meta-programmation au service du DRY.

Le Don't Reapeat Yourself doit commencer à s'appliquer à soi. Ainsi , je suis parfois amené à saisir plusieurs fois la même chose ou avec quelques nuances.
J'ajoute aux formulaires de modification (action => edit) un bouton nommé 'clone' . Quand je veux obtenir une entrée qui diffère légèrement d'une autre, j'édite l'entrée servant de modèle et après quelques ajustements, je soumet le formulaire avec le bouton 'clone'. J'obtiens ainsi une nouvelle entrée avec peu de saisie.
La procédure update est chargée de propager les modifications ou de cloner, elle récupère les paramètres du formulaire et instancie un nouvel objet avec.

def update
@paatec = Paatec.find(params[:id])

if params[:commit] == 'Clone' then
@paatec_clone= Paatec.new
cle= params[:paatec].keys
cle.each do |k|

@paatec_clone.send "#{k}=" , params[:paatec][k.to_sym]
end
@paatec_clone.save
respond_to do |format|

format.html { redirect_to(@paatec_clone) }
format.xml { render :xml => @paatec_clone, :status => :created, :location => @paatec_clone }
end
else
....


La ligne magique est celle ci :
@paatec_clone.send "#{k}=" , params[:paatec][k.to_sym]

Elle illustre la puissance de la meta-programmation :
Elle appelle successivement tous les 'setter' par la méthode send. La méthode send attend en paramètre un nom de méthode: exemple objet1.send("libelle") est équivalant à objet1.libelle qui est un 'getter'. Activer un 'setter' de cette manière est plus difficile car il faut ajouter le '=' à la fin du nom de la méthode.

ps : ici la notion de 'clone' n'a pas de rapport avec la la méthode clone ou dup de ruby.





4) L'export CSV.
J'ai aussi des exports CSV à faire. Il y a plusieurs techniques , j'ai choisi celle-ci:
A ajouter dans  un contrôleur
...
require 'csv'
....

def export_csv

cond= params[:cond]
tab =cond.split ('%')


@projets= Projet.find_select(tab[0],tab[2],tab[1])
# @projets =Projet.find(:all)
report = StringIO.new
CSV::Writer.generate(report, ';') do |csv|
csv << ['Projet','Libelle','domaine','diDEV','diPROD','MOA','Filiere','Techno']
@projets.each do |projet|
csv << [projet.nom,projet.libelle,@template.sauf_null(projet,'domaine','libelle'),@template.sauf_null(projet,'didev','libelle'),@template.sauf_null(projet,'diprod','libelle'),
@template.sauf_null(projet,'moa','libelle'),@template.sauf_null(projet,'filiere','libelle'),@template.sauf_null(projet,'techno','libelle')
]
end
end
report.rewind
send_data(report.read,
:type => 'text/csv; charset=iso-8859-1; header=present',
:filename => 'report.csv',
:encoding => 'utf8'
)
end


end



Dans le code on peut constater l'utilisation de la variable @template. Cette astuce permet de réutiliser les méthodes écrites pour les vues (helpers). La variable globale @template, contient tous les helpers.

5) Le bridage de l'application.

Protéger son application par un user/password est parfois un peu lourd pour une application basique. Je désire seulement pouvoir contrôler les périodes de mise à jour. Pour cela j'utilise un filtre callback 'before_save' et before_destroy dans le modèle :

############ bloquer tout ################
before_destroy :periode
before_save :periode
#########################
def periode
errors.add_to_base("la mise a jour est interdite")
return false
end


Pour afficher l'origine de l'erreur dans les messages flash , quelques lignes dans la méthode destroy du contrôleur suffisent :


if !@lignepaatec.destroy then
flash[:notice] ="Mise a jour interdite"
end



En bonus une 6 eme astuce :

La commande: rake routes affiche toutes les url reconnues pas l'application.


portable:/usr/local/projetsawd# rake routes
(in /usr/local/projetsawd)
statuts GET /statuts(.:format) {:controller=>"statuts", :action=>"index"}
POST /statuts(.:format) {:controller=>"statuts", :action=>"create"}
new_statut GET /statuts/new(.:format) {:controller=>"statuts", :action=>"new"}
edit_statut GET /statuts/:id/edit(.:format) {:controller=>"statuts", :action=>"edit"}
statut GET /statuts/:id(.:format) {:controller=>"statuts", :action=>"show"}
PUT /statuts/:id(.:format) {:controller=>"statuts", :action=>"update"}
DELETE /statuts/:id(.:format) {:controller=>"statuts", :action=>"destroy"}




Good hacking.

samedi 24 juillet 2010

jeudi 8 juillet 2010

Le choix difficile d'un navigateur d'entreprise #IBM #firefox

IBM vient de faire une petite vague sur le Net révélant que Firefox serait le navigateur officiel installé par défaut sur les postes de travail de la firme.

La date de la sortie de cette information n'est pas un hasard. En effet, les entreprises sont face à un véritable dilemme : quel navigateur choisir pour leurs postes de travail ? . Des enjeux stratégiques forts se cachent derrière cette question. En effet le choix du navigateur IE de Microsoft était la réponse la plus raisonnable et confortable: c'est le navigateur le plus répandu du marché même si ce n'est pas le meilleur. Hélas, les versions de IE et de l'OS windows viennent troubler ce compromis.

L'échec de Vista et son remplacement anticipé par Windows Seven (7) ont perturbé la ligne de produit des navigateurs.
La version 8 de Internet Explorer (IE8) devait a la fois gommer les gros défauts de l'ancêtre IE6 et fonctionner sur toutes les versions OS de windows dont l'inusable windows XP. La duré de vie de IE8 devait être longue. Or Microsoft accélère les sorties des versions de test de IE9. Ce dernier n'est pas une simple nouvelle version de IE8 car il embarque un tout nouveau moteur de rendu. Toute son architecture a été repensé. Les progrès sont considérables si on en croit les résultats du test acid3 : ce test permet de mesurer la la compatibilité d'un navigateur vis à vis des standards du web.

Test acid3 pour mon IE6:




Test acid3 pour IE8:



Le test acid3 pour les versions Beta de IE9:



A l'heure où le javascript avec jquery et HTML5 sont en passe de proposer enfin des solutions robustes et standardisées, il est dangereux de lié la version d'un navigateur avec la version de l'os.





Les solutions alternatives pour découpler le navigateur et l'OS existent et sont efficaces:

Firefox :




Et google chrome




IBM utilise le plugin : CCK wizard pour fabriquer une version personnalisée du navigateur d'entreprise.

Cette extension permet (entre autres choses)
  • Verrouiller les plugins disponibles
  • Fixe la barre de titre et les icones
  • Ajoute les signets de l'entreprise
  • Désactive la configuration en ligne (about:config)
Cet outil est un véritable outil de déploiement et de gouvernance de son composant web le plus important : la partie cliente.

lundi 5 juillet 2010

Microsoft sur la mauvaise pente: quelle stratégie ?




Il y a du mou dans les voiles de Microsoft. La firme américaine recule dans les secteurs de ses nouvelles activités. 2010 sera une année décisive et Microsoft fait des gros paris sur un avenir incertain.

Le cœur de métier de Microsoft est son activité d'éditeur avec deux piliers: Le système d'exploitation et la suite bureautique. Après avoir raté deux virages : les PC en réseau et Internet , Microsoft peine à reprendre la main. D'où sa stratégie de diversification avec :

La musique : avec le lecteur Zune : Gros échec , noyé au milieu des IPOD


Le moteur de recherche : bing


Il n'a pas réussi à s'imposer comme un concurrent sérieux de google.



  • La messagerie instantanée MSN: c'était le produit d'appel de Microsoft auprès des jeunes, avec l'espoir qu'il devienne un point d'accroche vers les produits complémentaires. Hélas non seulement, Microsoft à perdu la bataille des serveurs de messagerie d'entreprise, mais c'est maintenant le tour de MSN d'être attaqué par la messagerie instantanée de facebook.

  • La gamme .NET : positionnée comme un concurrent de Java et JEE, ce n'était pas vraiment une révolution. .NET s'adresse au entreprise ayant déjà du Microsoft et ne s'adresse donc pas à des nouveaux clients. D'autant que JEE et .NET sont dans le même bateau qui coule, bientôt submergé par la vague des frameworks légers ou agiles ET pas chers.



  • Les OS de smart-phone: L'OS de Windows à destination des smart-phone perd des parts de marché face aux concurrent comme Android.





  • Le domaine du jeux: très dur de ne pas devenir numéro 1 avec une console bourrée de technologie et une usine de fabrique de jeux. Alors que Nintendo vend des WII basées sur des architectures anciennes, comme des petits pains.


  • Le décisionnel ! Là aussi, Microsoft possède avec excel , un point d'accroche très diffusé. Hélas , la firme de Redmond n'a pas réussi à capitaliser sur Office/Décisionnel . Sur le marché du décisionnel grand public (PME) , Oracle , SAP mais surtout Google sont tous prêts à se jeter dans la bataille.



Les paris de Microsoft.

  • Les OS pour portable

La prochaine version de l'OS pour smart-phone: C'est soit une réussite soit Microsoft arrêtera certainement les OS de ce type.


  • Une nouvelle console de jeux: Un système avec plusieurs caméras et des détecteurs de mouvements. Plus besoin de manette.
  • Windows 7


Le fonds de commerce:

  • L'OS pour PC.

L'échec de VISTA a traumatisé les ingénieurs de la firme et le meilleur OS de la firme reste l'indémodable windows-XP. Là aussi Google attend son heure et est prêt avec un WEBOS.


  • La suite office.

Les suites bureautiques sur des clouds sont l'avenir et google a déjà plusieurs longueurs d'avance sur tout les concurrents.


L'avenir

  • Les clouds : Avec azure , microsoft colle au mouvement irréversible et incontournable des 10 prochaines années. Une course à la puissance est lancée et google a déjà plusieurs longueurs d'avance sur tout les concurrents. (je fais du copier collé avec cette phrase)



Conclusion.

Le bilan est un peu triste d'autant que Microsoft à développé et ouvert des technologies sans avoir su en tirer des avantages:
Exemples :le protocole SOAP ou les bases d'AJAX (XMLHTTPRequest).
La solution pourrait venir d'un retournement stratégique déjà amorcé mais encore timide : que Microsoft participe activement au mouvement opensource et logiciel libre. En espérant encore voir lontemps les 'fenetres bleues' de windows.

dimanche 4 juillet 2010

Travailler moins pour en faire plus avec #pomodoro

La méthode Pomodoro a été inventée par Francesco Cirillo. Cette méthode de gestion de temps tire son nom de l'accessoire indispensable pour mettre en pratique cette technique: un minutier de cuisine.


Cette technique repose sur deux constats :

Nous ne sommes pas multitâche.
Les études démontrent que non seulement le cerveau humain à du mal à se concentrer sur plusieurs sujets à la fois, mais qu'en plus , ses performances se dégradent de manière forte en présence de plusieurs taches. Plus on devient multitache , plus on croit que l'on est multitache et moins on réalise complètement des choses.

On se laisse distraire facilement

Avant d'appliquer cette méthode, j'avais un indicateur de reception de mail , souvent je zappais sur le mail , puis sur le web pour enfin revenir à ma tache principale , mais sans grande efficacité.

Principes de base de la méthode.


  • Travailler par tranches de 25 minutes en respectant deux règles fortes :
  • Utiliser un minutier pour fixer le temps de la tranche et ne pas faire plus ou moins de 25 minutes.
  • Ne pas se laisser distraire par les sollicitations de son environnement et ainsi gérer les interruptions.

Les règles secondaires sont :

  • Faire une pause de 5 minutes (strictement ) entre deux sprints
  • Faire une pause plus longue au bout de quatre sprints
  • Tenir un journal de ses journées (bilan, nb de sprint ,sujets etc. )

Ce site en francais ici donne le détail de la méthode.

Un livre électronique gratuit est disponible sur le site de la méthode.


Après 3 mois d'utilisation...

L'utilisation d'un minutier semble secondaire mais c'est le coeur du système. Le tic-tac est au début un facteur de tress mais rapidement le temps devient un allié et non pas un ennemi. Le tic-tac devient un métronome qui régule notre énergie.




Les distractions:
Le mail est la première source de perturbation, meme sans cette méthode , il faut le plus rapidement adopter une stratégie de gestion de ses mails : ne plus les relever au fil de l'eau mais toutes les deux heures par exemple. avec cette règle d'or : NE PAS LIRE SES MAILS MAIS LES TRAITER. On prend un mail entrant et il doit etre traiter jusqu'au bout. (voir les méthodes mailbox zéro) .
La réponse type au téléphone doit être : je suis occupé pour le moment est ce que je peux vous rappeler ? Et prévoir une tranche pour tous ces appels à traiter.

Chaque interruption est dénombrée dans la page bilan de la journée.

La règle qui fait mal : Tout pomodoro commencé mais non terminé (interruption non gérée) est nul.

A la fin de la journée, on comptabilise les pomodoros (sprints) , terminés , annulés et on donne une évaluation de sa journée.

D'après des études , dans une journée de travail seulement 20% de son temps est consacré vraiment à des taches 'principales' , le reste est de la dispersion sur des taches 'secondaires'.

Avant de connaitre cette méthode, je reportais les taches fastidieuses. Maintenant , je sais que je vais passer 25 minutes et que 25 minutes dessus. Et le travail se fluidifie.

J'ai associé Pomodoro avec la méthode du calendrier de l'acteur humoriste seinfeld.
On verra ca dans un prochain post.

samedi 3 juillet 2010

Pourquoi #jquery va révolutionner et dominer le #web


Jquery est lentement mais surement en train de devenir un composant incontournable dispensable dans les applications web.

Les 4 raisons d'adopter jquery sont:

La prise en charge de la compatibilité des navigateurs.

Avec l'ouverture des applications aux partenaires ou avec l'apparition de nouveaux supports (smartphone), le traitement de la compatibilité en IEn, firefox , safari ou opéra reste une tache lourde , complexe et indispensable. Jquery se charge d'assurer cette compatibilité a votre place.
Ce qui fonctionne avec jquery sous IE8 fonctionnera sous Firefox 3.

Ajax devient un jeu d'enfant

Jquery rend l'intégration de fonctionnalité Ajax facile et garantie un traitement identique du moteur de requete XMLHttpRequest quelque soit le navigateur.
Ainsi, cela vous permet d'intégrer des fonctions qui vont rendre vos applications plus ergonomiques et vos utilisateurs plus efficaces. Exemple drag and drop , menus , onglets.

Découplage entre le langage de programmation et votre application WEB.

Avec Jquery et Ajax , la partie frontale de l'application devient indépendante de la dorsale.
On pousse jusqu'au bout la séparation en 3 Tiers d'un modèle MVC.
Le javascript et AJAX simplifient radicalement les CGI ou Servlet chargés de l'interface utilisateur.

Un gestion de contexte plus simple.

Le protocole HTTP et le HTML ne sont pas fait à l'origine pour fabriquer des applications métiers.
Il faut des cookies et des serveurs de session pour gérer la persistance du contexte. Le passage des données d'une page à l'autre doit se faire par les cookies et des champs cachés. Bref , pas des choses très simples. Avec Jquery et Ajax , vous affichez une page principale et chaque interaction avec l'utilisateur se fait dans le cadre de cette page principale donc dans le même contexte.

Mais surtout ..

Vos applications deviennent plus belles , sont moins chères à développer et sont appréciées par vos utilisateurs.


AVANT jquery :




APRES Jquery




Terminé le Java et les EJB , passez au Javascript ,Jquery , AJAX et HTML5.

Site de demonstration de jquery ici.