eric.lemerdy

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

Métier

Tous les billets ayant un rapport avec mon métier : le logiciel. o Technologies o Infos professionnelles o etc.

Fil des billets - Fil des commentaires

mercredi 28 mai 2008

Travaillez-vous mieux sous pression ?

La pression exercée sur une équipe permet parfois de la stimuler ou de garder un bon niveau de motivation. Mais quand cette pression devient trop grande, la contre-productivité augmente... Voici un graphique issu de la pensée "lean" qui m'est apparu très clair lorsque Bent Jensen nous l'a exposé il y a quelques semaines.
agile_team_pressurepressure.png(src)
Ce que je remarque surtout, ce sont les gaspillages engendrés par des délais de livraison trop long. La pression en début de phase est insuffisante, on risque de pas assez bien utiliser un temps pourtant précieux. Avec des livraisons plus rapprochées, on conserve une pression quasi constante proche d'un niveau toujours acceptable.
Je pense qu'avec des arguments simples mais percutants comme celui-ci, on peut débattre sans choquer avec son équipe trop habituée au rythme "industriel à la française".

mardi 29 avril 2008

Découvrir Windows PowerShell

powershell.png
Petit sondage :
Qui travaille sous Microsoft Windows ?
- tout le monde ?
Qui a besoin de cmd.exe ?
- tout le monde (maven, scripting, etc.) ?
Qui trouve l'invite de commande facile à utiliser ?
- personne ?
C'est par ce rapide sondage qu'a commencé la démonstration de Cédric Rup sur la nouvelle console de Microsoft : le PowerShell.

En effet, en novembre 2006, Microsoft réagit en sortant la première version de sa nouvelle interface d'administration ultime. Il ne s'agit pas d'une interface graphique très recherchée, mais bien d'un nouvel interpréteur de commandes.

Pour télécharger la dernière version, vous devez posséder le framework .NET installé sur votre machine, et télécharger l'installation du PowerShell. Juste après cette installation, vous pourrez tester l'exécution de ces commandes bien connues :
dir
cd
ls
Surprise, les alias des commandes unix fonctionnent !
Pour avoir de l'aide en ligne sur la commande dir par exemple :
dir -?
Avec PowerShell, une commande s'appelle une commandlet. C'est l'unité de base du scripting. Il y en a 129 de base. La syntaxe est une convention : VERBE-NOM -argument param. Par exemple, la commande dir est un alias de : Get-ChildItem -Path ..

Fonctionnalités

  • Complétion sur les arguments (tab)
  • Trouver les alias d'une commande. Ex. : Get-Alias dir
  • Gestion des variables.
    Ex. :
    $dir = Get-Children
    $dir // évalue la variable
    
  • Tout est objet (là où tout est chaîne de caractère en shell unix.
    Ex. :
    $dir.* // <- utiliser la complétion pour lister les
              variables d'instance de l'objet (ses pro-
              priétés)
    $dir.getType() // on a bien affaire à un objet .NET
                      !!! avec l'accès a ses méthodes
  • Le pipe est un flux d'objets.
    Ex. :
    $dir | Get-Member // permet de lister les variables
                         d'instance de l'objet en les
                         faisant passer à travers le
                         pipe.
    // démarrer plusieurs instances de notepad
    Get-Process -Name no*
    (Get-Process -Name no*).Kill() // termine les pro-
                                      cessus notepad par
                                      appel de la mé-
                                      thode kill.
    Get-Process no* | Stop-Process // termine tous les
                                      processus notepad
                                      en passant par le
                                      pipe.
    
    Avantage : Le pipe crée un flux d'objets et n'attend pas que la liste soit totalement instanciée. Alors que l'instanciation d'une variable stocke l'objet en mémoire.
    On peut passer du code dans un pipe (inspiration perl) : c'est une méthode anonyme. Ex. :
    Get-ChildItem | Where-Object { $_.Length -gt 1Mb }
    // La variable $_ est l'object considéré lors de
       l'itération sur les résultats.
    
    On peut trier avec Sort-Object
    On peut grouper sur une propriété avec Group-Object Par exemple pour afficher les fichiers groupés par extension.
  • Il y a un certain nombre d'arguments en commun sur les objets .NET donc auquels on a naturellement accès par Power Shell:
    verbose, debug, ErrorAction (que faire en cas d'échec, voir la variable $ErrorActionPreference), ErrorVariable, WhatIf (simulation de l'éxécution, très utile), ? (aide), etc.
  • En regardant de plus près les possiblités des arguments de commande, on observe :
    • Une notion de position d'argument par défaut (si l'argument n'est pas spécifié, on présume que l'argument est daonné dans cette position dans la liste d'args)
    • Une notion d'acceptation d'argument paar le pipe...
    • Une notion de paramétrage de l'acceptaiton des wildcards.
  • La gestion des droits ext supportée par la commande : Get-Credentials. Elle permet d'acquérir une identité et de s'en servir pour l'éxécution sous une autre identité que celle du lanceur de la commande.
Pour toujours s'y retrouver, n'hésitez pas à utiliser ces commandlet "point d'entrée" : Get-Command, Get-Help, Get-Member. On peut aller plus loin en filtrant les résultats : Get-Command -Noun Item (cherche les commandes qui contiennent Item)

La puissance du Shell

On a accès à TOUT .NET. Notamment les classes du framework :
[TYPE] <- accès au type .NET
On peut donc accéder aux méthodes statiques d'une classe. Ex. :
[System.DateTime]::Now // La date actuelle.
Mais on peut aussi instancier un objet .NET. Ex:
$webclient = New-Object System.Net.Webclient // un client web !
$string = $webclient.DownloadString("http://eric.lemerdy.free.fr/dotclear/index.php?feed/atom") // on télécharge un flux rss...
$string.ToString() // ...qu'on peut afficher à l'écran !
Les variables non typées par défaut, on peut stocker un entier puis une chaîne par exemple :
$a = 12
$a.GetType()
$a = 'Eric'
$a.GetType()
Par contre, on peut forcer le typage d'une variable
[Int32]$x = 12
$x = 'YES' // Error
$x = 12 // ok
On peut donc "caster" notre chaîne xml :
[XML]$xml = $string
$xml.rss.channel.item | Select-Object title
Et accéder directement au contenu du XML !!! Ici, rss, channel et item sont des éléments (au sens XML) du contenu XML.

Extension du shell

On peut charger ses propres classes en constituant une assembly. C'est l'unité packagée de code éxécutable, l'équivalent d'un jar en java. Ex. :
[Reflexion.assembly]::loadFile(myfile)
Cette extensibilité permet de créer des API pour vos applications .NET et d'y accéder par PowerShell.
Pour ajouter des commandlet, on va constituer un snappin. C'est simplement une assembly qui contient des commandlets.
Pour l'installer : InstallUtil.exe. C'est un utilitaire également utilisé pour déclarer un service Windows.
Get-PSSnapin -Registered // les snapins installés
                   mais pas enregistrés
Add-PSSnapin  // enregistrer les snapins
On bénéficie donc des même services qu'une commandlet du package de base, comme la complétion sur les commandes par exemple.

Une uniformité fournie grâce aux providers et aux drives

Un provider est le moyen uniforme de parcourir des objets organisés hiérarchiquement. Depuis le début de l'article, on on travaille avec le provider du filesystem.
Pour connaître les providers disponibles :
Get-PSProvider // Variables d'environnement, filesystem, registre Windows, etc.
Alors que les drives sont les éléments parcourables par leur provider.
Pour connaître les drives disponibles :
Get-PSDrive // Env, C:, D:, HKLM (HKEY_LOCAL_MACHINE)
Chaque drive est donc associé à son provider. Il existe d'autre providers de la communauté : LDAP, S3 (amazon), etc.
Pour changer le drive courant :
Set-Location variable: // choisit le drive des variables
dir // liste les variables !

Instrumentation

L'instrumentation est fournie par WMI pour Windows Management Instrumentation. C'est l'équivalent de JMX sur la JVM. On peut tout savoir sur une machine : l'heure, les users loggés - en lecture/écriture ! On peut donc éditer un point de configuration du poste à partir de Powershell sans problème à condition d'avoir le niveau de droit suffisant.
Il est possible de lancer des service : Start-Service

Gestion des scripts

L'extension est : *.ps1.
Pour exécuter un script : Get-Cat | & .\out-grid.ps1
On peut appeler du Windows Forms dans powershell ce qui permet d'afficher un tableau d'objets dans une interface graphique en cinq lignes de code.
Bien-sûr, l'éxécution de scripts étant une fonctionalité convoitée par de nombreux virus, Microsoft était attendu sur l'aspect sécurité de la chose. Pour adresser ce besoin fort de sécurité, il existe la notion d' : Execution policy (politique d'éxécution).
Get-ExecutionPolicy
Set-ExecutionPolicy
Niveaux :
unrestricted : tous ok
all signed : tous signés
RemoteSigned : tous les scripts externes doivent être signés
Le niveau par défaut ne permet pas l'éxécution du tout !
Tout objet qui n'est pas "utilisé" (affectation dans une variable ou utilisé par une fonction) sort du script (console). Pour éviter ça, on redirige vers null : macommande >$null; Sinon, ça resort dans le pipe externe. Cela peut être un avantage car tout ce qui sort du pipe est traîté immédiatement par la commande suivante comme nous l'avons vu plus haut.

L'avenir

Microsoft semble prêt à ouvrir les API de ses logiciels serveurs à travers PowerShell (Exchange par exemple). Cela sera d'autant plus facilité si ces logiciels sont écris en .NET. En tant que développeurs d'applications .NET, il est aussi bénéficiable de profiter de cette ouverture qui peut faciliter la configuration et l'administration de son logiciel.
Le produit évolue. Les nouvelles fonctionnalités attendues sont : les aspects éxécution à distance, l'éxécution en parallèle, une nouvelle interface graphique, de nouveaux snappins.
Sous Linux, le projet Mono, le portage de .NET, permet à l'initiative "pwash" de ne pas repartir de zéro dans son intention de porter la ligne de commande sous Linux.
Au cours de cette petite démonstration des possibilités de la nouvelle console de Microsoft, nous avons tous été impressionés par l'expressivité de la platte-forme. Les concepts de pipe objet et d'accès à la platte-forme .NET sont des apports inconstestables à la productivité et l'efficacité du scripting.

Notons pour conclure que ce produit marque un tournant dans la démarche Microsoft qui constituait auparavant à tout doter en interfaces graphiques. Cédric nous a d'ailleurs révéllé que les développeurs de PowerShell n'avaient pas très bonne presse au sein des équipes Microsoft qui ne comprennaient pas alors le changement de stratégie de la société.
Ce changement permet à Microsoft d'élargir sa cible d'administrateurs Windows en adressant aussi les adeptes de la ligne de commande. C'est donc une attaque en règle des serveurs *nix en dotant son système d'exploitation d'une console plus puissante qu'un bash unix ?

jeudi 10 avril 2008

Le ParisJUG parle anglais avec Kirk Perperdine

C'est le "Java Champion" de la performance qui est venu se présenter devant les utilisateurs Java de Paris avant hier soir. Le moins que l'on puisse dire, c'est que Kirk Pepperdine sait de quoi il parle. A travers une présentation dynamique et pleine d'humour, il nous a fait part de sa vision sur le monde de l'IT sous le prisme de l'optimisation des programmes. Je ne vais pas paraphraser ici David, dont le billet résume parfaitement l'essence de l'intervention du Canadien.
J'ai bien aimé son explication basée sur sa théorie "The Box", sur les différences entre le développeur et le profileur de problèmes de perfo. thebox Il pense que le développeur reste trop focalisé sur la brique application (le code) tandis que le profileur aura une vision plus globale qui l'aidera à trouver la vrai source du problème. Evidemment, ça peut être la même personne mais cela demande une culture plus approfondie sur la JVM ou même le hardware. Combien de développeurs java connaissent bien leur JVM (je connais des questions pièges à l'embauche sur la JVM) ? Le point de vue de Kirk permet effectivement de prendre conscience de l'importance de la JVM et des optimisations de compilation. Sans nous demander d'aller plonger dans l'étude d'architecture physique de la machine, il nous a conseillé de toujours prendre en compte la plate-forme d'éxécution cible et de ne jamais totalement abstraire le hardware.
Pour aller plus loin :
The Box (via InfoQ)
Le post de Kirk sur la soirée Galerie photos
ParisJUG - Présentation 08/04/2008

mardi 25 mars 2008

Coding Dojo Ruby

Pourquoi ces trois mots apparemment sans lien ? Pour vous parler d'une séance dont le dojo était Valtech et l'objectif était de découvrir par la pratique le langage Ruby. La première partie de la séance fut un...

Kata Randori

Les postes de développement Ruby ont été constitués sur le vif (l'environnement Ruby pour Windows mis en place à l'aide d'un installeur). Le moins que l'on puisse dire, c'est que les configurations hétérogènes nous ont quelque peu pimenté la tâche : MacBook, PC sous XP et Linux !
Nous avons ensuite choisi le kata (i.e. l'énoncé de l'exercice) à effectuer : "Missing word in dictionnary". Un exemple vaut mieux qu'un long discours ici :

dictionnaire : ["a", "big", "white", "cat"]
entrée : "a tiny black cat"
sortie : ["tiny", "black"]

Le principe retenu fut de positionner deux rôles par poste : un développeur (à gauche) et un copilote (à droite). Il est possible d'ajouter un troisième rôle : l'observateur dont la fonction est juste d'observer... sans communiquer.
Le "Time-boxing" requiert un décalage de rôle toutes les cinq minutes. Le copilote devient développeur et le développeur devient copilote sur le poste de gauche ! On passe donc cinq minutes sur chaque poste.

coding-dojo-time-boxing.png
(src)

Bien entendu, cette mobilité contraint la méthode de développement :

coding-dojo-tdd-babysteps.png
(src)

C'était la première fois pour une majorité d'entre nous : Ruby, coding dojo, pair programming et dans une moindre mesure, TDD (Test Driven Development). Pour moi, cela a changé la façon de voir le TDD car en "solo programming", je n'appliquais pas les baby tests. J'avais toujours tendance à vouloir implémenter l'algorithme que j'avais dans la tête, et pas celui induit par les tests. Le pair force à ne pas brûler les étapes et réduit le gaspillage en implémentant le strict nécessaire aux tests.
Au final, au cours de la rétrospective qui a suivi, on a pu faire le point pour trouver de meilleures façons de travailler. Le point crucial pour terminer une implémentation correcte fut la connaissance des API du langage Ruby qui permet évidemment de raccourcir le code à écrire.
Cette forme de développement abolit de manière assez spectaculaire la propriété du code. Une chose amusante à constater est la diversité des solutions choisies de poste en poste. Cependant, le niveau de test et leur complétude est comparable car tout le monde avance en parallèle sur le sujet, ce qui est troublant et donne un côté magique... On a tellement l'habitude de trouver un code au même stade où on l'a laissé.
Après une discutions a posteriori, nous avons tout de même laissé de côté une phase préliminaire : la spécification des tests. En effet, au lieu que chaque binôme définisse incrémentalement les tests, une liste de tests ou une "spécification" peut être préparée pour savoir où on veut en venir...

Kata Préparé

coding-dojo-prepared.png
(src)

La rétrospective ayant fait remarqué notre méconnaissance de Ruby, la deuxième session fut un kata préparé effectué par celui qui connaissait le mieux le langage, Etienne Charignon. Ce fut l'occasion de choisir un sujet riche en apprentissage : le comptage du nombre de lignes de code dans un programme Java (hors commentaires et lignes vides).

Pour conclure, je dirais que le coding dojo permet de pratiquer, une très bonne façon de comprendre et d'assimiler la méthode et les concepts sous-jacents. Il est une chose d'en parler mais le vivre est encore mieux. On apprend aussi sur soi-même pendant le codage en pair. Ce n'est pas un moment où on est jugé par son pair mais bien une façon d'avancer ensemble et de tirer le meilleur parti des deux "cerveaux"... C'est un challenge à la fois amusant et instructif qui peut permettre de souder une équipe très rapidement.


Liens : les slides coding dojo.

mercredi 12 mars 2008

ParisJUG - Selenium

Pour la première rencontre du ParisJUG, Zouheir Cadi a présenté à un auditoire de bonne humeur le produit open-source Selenium.
Voici un résumé de ce que l'on a pu en retenir. Paris Jug

Selenium est à placer dans la catégorie des "web testing tools".
Il est décomposé en plusieurs modules :

  • Selenium Core[SC] : c'est un composant (HTML + Javascript) côté serveur dont le but est d'exécuter des jeux de tests d'interface sur une application web à tester sur le même serveur.
    Plusieurs instructions de test formatées dans un tableau HTML forment un jeu de test exécutable. Exemple :
    1. ouvrir l'url http://localhost/monApplication/
    2. cliquer sur le lien "contact"
    3. vérifier que la page contient un bouton "envoyer"

    Ces tests sont écrits dans la syntaxe Selenese[SE]. L'inconvénient rappelé par l'intervenant est que cela nécessite de déployer ce Framework de test sur le serveur qui héberge l'application web à tester.
  • Selenium IDE[SI] : c'est un plug-in firefox qui permet de charger et d'exécuter des jeux de test et de capturer une séquence utilisateur en "live" tout en offrant la possibilité d'éditer les instructions en intercalant des assertions de vérification. De nombreux formats d'export sont supportés, citons un format natif HTML (avec des tableaux) ou une classe java (dépendante de JUnit).
    Zouheir nous a détaillé la forme d'une instruction qui peut être une Action agissant sur un élément du DOM de la page HTML repéré à l'aide d'un Accessor. L'autre type d'instruction est l'Assertion qui permet de vérifier un postulat dans une page.
  • Selenium Remote-control[SR] : c'est un serveur java (un jar ! ) qui embarque Selenium Core et qui permet d'exécuter les jeux de test dans un langage cible plus expressif que Selenese (Java, Ruby, pyton...) en lançant un navigateur préalablement configuré avec le proxy de Selenium Remote-control. Le navigateur sera alors "contrôlé" (d'où le nom du composant) en recevant les requêtes HTTP de Selenium Remote-control.

Au delà de cette présentation en règle du Framework, la valeur ajoutée incontestable de cette session fut l'interactivité avec l'auditoire et les démonstration : Selenium IDE, Selenium Remote-control, l'intégration de Selenium à Maven[MV], le passage des tests Selenium dans Continuum[CO].
Cette partie concrète a soulevé de nombreuses questions et permis d'aborder l'intégration continue. Voilà les conseils donnés par l'intervenant :

  • Si on utilise Selenium IDE, télécharger aussi l'extension XPather[XP] qui permet de faciliter l'édition des Accessors de type XPath.
  • Attention, l'export en classe Java Junit d'un test Selenium IDE contraint l'arbre d'héritage de cette classe à l'intérieur de l'API Selenium (com.thoughtworks.selenium.SeleneseTestCase)
  • Attention, toutes les dépendances Selenium Remote-control ne sont pas hébergées par le repository central de maven, il faut configurer un repository tiers (http://maven.openqa.org)
  • Les instructions Selenese sont portées en java pour l'écriture des tests JUnit (à l'exception des assertions - déjà présentes dans JUnit)
  • Faire fonctionner Selenium Remote-control avec maven permet de l'intégrer à bas coût dans le cycle d'intégration continue, dans un serveur Continuum par exemple (démo brillante)

Les débats ont rapidement migré vers la testabilité en général : Comment bien tester une application ? Jusqu'où aller dans la précision du cas de test ? Qui doit tester l'IHM ?
Zouheir a conclu sa présentation de l'outil en rappelant que Selenium n'était pas la solution miracle pour des sites "compliqués" (ajax) en s'adressant dans ce cas à un utilisateur avancé, voire un développeur. Mais cette solution reste très efficace pour tester les interfaces des sites "simples".

Pour terminer, les réflexions suivantes sont issues de quelques discutions avec les participants.
Pourquoi mettre en place des tests unitaires IHM de non régression ?

  • parce que notre client nous fait part de régressions
  • parce que l'automatisation des tests répétitifs en fin d'itération permet de gagner du temps
Quelles bonnes pratiques pour un tel outil ?
  • Un long test Selenium est compliqué à maintenir
  • Ecrire des tests très ciblés, de faible granularité, se concentrant sur un seul enchaînement d'écran
    avantages : de proche en proche, par succession de cette suite de petits tests, on teste le cheminement global dans l'application, la maintenabilité du test est augmentée
  • Adopter un pragmatisme continu en se posant aussi souvent que possible la question : "jeter le test et le recommencer ou maintenir le script ?"
  • Comment mesurer les gains apportés par les tests IHM ? Mesurer l'évolution du nombre de régressions, du temps de validation usine (0 avec l'intégration continue ?), du temps pour faire une recette.
  • [Con$eil] Si on démontre qu'on fait gagner du temps aux testeurs/recetteurs de la maîtrise d'ouvrage au fil des itérations, on peut se faire financer l'écriture et la maintenance des tests au même titre que n'importe quelle fonctionnalité.
  • Tests et données : éviter de tester l'interface contre des données métier affichées à l'écran - d'autres Frameworks sont peut-être plus efficaces pour les tests fonctionnels (FIT[FI] ou FITNesse[FS])

Selenium est un outil efficace. Il apporte une valeur ajoutée en terme d'efficacité de l'écriture et la maintenance des tests IHM.
Cette présentation a permis aux "Java Users" présents d'avoir un aperçu exhaustif des fonctionnalités de Selenium pour pouvoir prendre les bonnes décisions dans leur choix de stratégie de test appliquée à leur projet.
Avec cette présentation, le Paris JUG a vraiment transformé sa première rencontre en un moment utile et rempli de bonne humeur.

Sinon, le selenium est un bon anti-oxidant prévenant le cancer, par contre, à forte dose, il peut être toxique. Ne pas en abuser.


[SC] : Selenium Core
[SE] : Selenese
[SI] : Selenium IDE
[SR] : Selenium Core
[MV] : Selenium + Maven = selenium-maven-plugin
[CO] : Continous web testing with Selenium, Maven and Continuum
[XP] : XPather
[FI] : FIT
[FS] : FITNesse

vendredi 15 février 2008

Du code temporaire qui devient définitif

Cette réflexion vient d'un retour qu'on m'a fait sur un programme écrit pour un client. La consultante fonctionnelle qui connaît bien les tables relationnelles de son produit me demande les logs des requêtes SQL éxécutées par mon programme.

Le problème

Le log transmis, elle observe une curiosité du type : select * from table where table.col1 = 'x' (...) and table.col1 = 'x' (...)
La requête est valide mais cela m'intrigue aussi. Comment en arrive-t-on à écrire un tel ordre et comment éviter que cela ne se reproduise ?
La bonne nouvelle c'est que grâce à la gestion de configuration, la tracabilité est assurée. La modification incriminée est apparue entre le 30/07/2007 14:00 (version 1.2) et le 01/08/2007 11:55 (version 1.3) :
v1.2
select * from table2 where /* table.col1 = 'x' and*/ (...) and table2.col1 = 'x' (...)
remplacement de table2 par table
select * from table where /* table.col1 = 'x' and*/ (...) and table.col1 = 'x' (...)
v1.3 : suppression du commentaite
select * from table where table.col1 = 'x' and (...) and table.col1 = 'x' (...)

Remonter aux origines

C’était l’époque où il y avait une incertitude sur la table source. J’ai donc introduit un commentaire dans la requête SQL sur la première condition (pour me souvenir qu’il serait probable qu'à terme, on filtrerait sur cette table source) avant de rajouter une autre condition que je considérais comme non définitive sur la table2… Après précision du nom de la table à requêter, j'ai supprimé le commentaire sur ma condition 1 sans relire la requête en entier après l’effacement de ces commentaires dans le SQL. Voilà pourquoi il existe aujourd’hui les deux conditions dans la même requête.

Leçons à retenir

  • La gestion de configuration permet de tracer très efficacement les modifications dans le code. Je n’aurais donc pas du mettre la condition en commentaire mais bel et bien l’effacer ! Seulement un commentaire dans le code est plus « visible » qu’une historisation de version. Or, le problème avait vocation à être résolu un jour. Dans ce cas, le commentaire n’agit pas comme une mémoire mais comme un marqueur de problème à résoudre. Et lorsqu’on agit mécaniquement (remplacement en masse), que les tests unitaires passent et que le programme se comporte correctement après résolution, on peut introduire ce genre de bizarerie !
    Typer son commentaire (de type TODO dans eclipse par exemple) est donc préférable car cela permet de :
    • Marquer visuellement dans le code qu’il y a un problème à résoudre
    • Retrouver, le cas échéant, la version historisée à l’aide de l'historisation car ce n'est plus du code en commentaire mais une explication du problème. Si c'est une autre personne qui dépile les tâches TODO, elle saura quoi faire alors que devant un code en commentaire, on ne sait pas quoi faire. Moi, en général, je supprime ce code...
  • Appliquer un principe d'ergonomie : rapprocher visuellement ce qui est lié, car du code est destiné à être relu, c'est donc aussi une représentation graphique ! En effet, pourquoi la seconde condition a-t-elle été placée si loin de la première alors que je savais que la seconde était temporaire et devait disparaître ?
  • Ecrire un commentaire pour se souvenir qu'il faudra changer la condition est du gaspillage. Mon programme n'en avait pas besoin pour fonctionner, je devais donc le supprimer. Le refactoring qui allait suivre serait donc plus simple et donc moins soumis à l'erreur.

jeudi 10 janvier 2008

How to evaluate a technology adoption ?

By comparing each others among time using the following methods :

lundi 7 janvier 2008

Passer à Subversion

1. Architecture

svnarchitecture.png J'ajoute mon schéma à la déjà longue liste des schémas d'architecture de Subversion.

2. Dépendances (obligatoire - facultatif)

svndependancies.png
libapr et libapr-util (client et serveur)
Apache Portable Runtime, une librairie de services multi-plate forme offrant cette qualité à SVN qui s'appuie sur cette librairie.
libz (client et serveur)
permet de compresser les contenus échangés à travers le réseau.
SQLite (client et serveur)
base de donnée légère et embarquée utilisée pour garder la trace des fusions (merge).
libneon ou libserf (client)
utilisé par le client pour envoyer des requêtes HTTP.
OpenSSL (client et serveur)
accès aux URL encryptées avec SSL.
Berkeley DB (client et serveur)
l'une des implémentations possibles de stockage (avec le système de fichier : FSFS).
libsasl (client et serveur)
ajoute le support de l'authentification SASL lorsque le protocole snvserve est utilisé.
Python, Perl, Java, Ruby (optionnel)
ces langages pourront utiliser les API de Subversion.

3. Migration de CVS

Utilisation de l'outil cvn2svn :
  • Convertit un repository CVS en un SVN. Or, CVS ne couvre pas toutes les fonctionalités. Par exemple, CVS ne gère pas l'atomicité des commits. C'est donc le script qui va recomposer les commits par des connections succèssives et des recoupements.
  • Outil de migration en une fois
  • S'éxécute sur la machine qui héberge le repository CVS à convertir
  • Ecrit en Pyhton (requiers la version 2.2)
  • Requiers Apache Portable Runtime (comande co) ou cvsclient (commande cvs)
  • Fiable
  • Facile à paramétrer

4. Client Eclipse

Deux plugins :
  • Subclipse (développé par l'équipe Subversion)
  • Subversive (en gestation dans l'incubateur Eclipse)
Lequel choisir ? A défaut d'avoir testé les deux, on peux quand même noter ces quelques arguments :
  • Comprendre eclipse en profondeur est plus dur pour les développeurs de Subversion que comprendre Subversion ne l'est pour les développeurs de la fondation eclipse
  • Un projet qui se trouve en incubation va sûrement être releasé dans la prochaine version.
  • Ratings sur eclipseplugincentral.com : Subclipse 6.8 - Subversive 7.7
  • Mon frère utilise Subversive
  • Date de la dernière version : Subclipse 18 décembre 2007 - Subversive 27 août 2007
  • Google fight : Subclipse 402,000 résultats - Subversive 4,350,000 résultats
Attention, il se peut que des arguments peux fiables se soient glissés dans cet argumentaire. Je pense qu'il faut essayer les deux pour se faire une idée correcte.


Références:

mardi 20 novembre 2007

Groovy

GroovyJ'ai eu envie hier soir de tester ce langage dont des échos résonnent très positivement depuis presque un an maintenant. Et grâce à un tutoriel exceptionnellement bien fait sur le site officiel de Groovy, j'ai pu rapidement évaluer la chose. Première impression : c'est rapide et fun de taper trois mots et de voir tout ce qu'on peut faire avec. Ca m'a immédiatement rappellé mes ébats avec la console d'Ocaml au temps béni où on est un jeune fou qui délaisse les maths pour l'info.
Je resitue juste le contexte de Groovy. Le constat est que Java a su faire la synthèse du meilleur de ce qui existait à l'époque en termes de développement objet. Or, aujourd'hui, de nombreux développeurs sont adeptes de langages dynamiques (scripting) aux syntaxes plus flexibles. C'est donc dans cette volonté que Groovy est né profitant de l'expérience acquise par la pratique de Java, Perl ou autres Python.
On découvre donc des concepts comme la closure qui considère le code comme des données. Cela m'a fait tout de suite penser au javascript "moderne" (post framworks du web 2.0 comme Ext Js voir mon précédent post) qui embrace cette approche. On peut donc réaliser une affectation d'une suite d'instruction ("closure") à une variable afin de la passer en entrée à une fonction :
square = { it * it }
square(9)

résultat : 81
[ 1, 2, 3, 4 ].collect(square)
résultat : [ 1, 4, 9, 16 ]
Comme vous pouvez le constater, la syntaxe s'en trouve grandement allégée par rapport au code java équivalent.

Avantages:

  • Syntaxe allégée = augmentation de la productivité
  • Mode script ou compilé : intégration forte au JDK = déploiement aisé
  • Intégration des meilleures librairies open-source

Inconvénients, problèmes posés :

  • La productivité est-elle vraiment améliorée si on est un minimum agile avec son IDE ?
  • Flexibiliser le langage n'est-il pas une façon de rendre le code moins maintenable ? -moi j'ai toujours eu du mal avec les langages de script je préfère la programmation rigide et structuréé "à l'allemande" (avez-vous déjà lu du code open-source allemand ?), quitte à agiliser la méthode de développement, mais je m'égare-
  • Est-ce toujours aussi facile de tester une classe qu'un script (oui je sais, un script Groovy est une Classe) ?

jeudi 25 octobre 2007

SOP Service Oriented People

L'orientation service peut être une façon d'architecturer un logiciel afin qu'il produise des services qui répondent aux besoins de l'utilisateur. Mais ce dont je voudrai parler est plutôt applicable aux organisations et même aux individus.
ryanlerch_worldlabel_manface2.png Quand je suis sorti de ma formation initiale, j'avais une vision très technique du métier de production de logiciel et assez idéalisée. Mais ces derniers temps, par l'expérience et en se documentant, j'en suis venu à constater qu'il est essentiel de faire plaisir - professionnellement - à son client. Malheureusement (ou heureusement), il ne verra jamais une seule ligne du code que vous avez produite avec amour du développement pour lui. Donc il est essentiel qu'il ait une bonne image de vous et de la qualité de votre travail. Cela demande une bonne compréhension de son besoin et une nette orientation client
Un bon moyen d'arriver à cet objectif est de transformer sa façon de travailler pour accepter et prendre en compte au plus tôt les demandes des clients. Cela passe aussi par une mise en perspective constante du code que vous produisez : "S'il me demande de changer ça, la modification va-t-elle est très compliquée ?". C'est une "pragmatisation" de la production du logiciel qu'il faut arriver à mettre en œuvre. Me percevant puriste, je change peu à peu mon état d'esprit pour gagner en efficacité tout en essayant de me montrer ouvert, souriant et réactif. Au bout d'un certain temps, vous allez commencer à anticiper les changements, mettre au point une technique personnelle pour augmenter encore votre réactivité et votre maîtrise face au changement.
Consacrer du temps à gérer son image peut finalement sembler superficiel. Cependant, c'est la visibilité et la satisfaction de vos utilisateurs/clients qui permettent de juger votre travail et en tirer les retombées positives. Le plus fort, c'est que ça ne transforme pas notre satisfaction à spécifier, tester, coder, qualifier. C'est juste un état d'esprit "service" dans lequel se reconnaître.

- page 2 de 4 -