07 octobre 2011

Maven WishList

Certains sont surpris de voir que j'ai écrit un livre sur Maven et qu'en même temps je le critique. Et oui, je ne suis pas un évangéliste tout blanc tout noir, pour moi Maven a apporté des choses très positives mais n'est pas l'outil parfait, loin s'en faut.

Les points principaux apportés par Maven sont (ahma) :

  • la standardisation de la structure des projets, rappelez vous le plaisir de greffer des morceau de build Ant d'un projet à l'autre ...
  • le concept de dépôt de bibliothèques et de gestion des dépendances, avec la construction progressive de central, aujourd'hui incontournable,
  • le mécanisme de plugins pour enrichir un build, avec une isolation des plugins (ce que ne faisait pas maven 1)
Mais ... Maven c'est aussi des points qui me déplaisent :

Le cycle de vie est extrêmement rigide et très, très compliqué à modifier (nécessite un nouveau packaging). Or il m'est souvent arrivé de regretter qu'il manque une phase pour y greffer un plugin, ce qui aboutit souvent à déclarer le plugin sur une phase inadaptée comme contournement. Exemple type : le compresseur JavaScript placé en phase "test" pour que le war soit construit avec des scripts optimisés (depuis est arrivé prepare-package, mais vous avez l'idée générale). On en arrive à hacker l'ordre d'exécution des plugins pour obtenir ce qu'on désire.

Le déploiement n'est pas atomique, loin s'en faut. C'est même pire que ça, il a lieu de manière morcelée lors d'un build multi-module. Si ça plante au milieu, une partie des artefacts est déjà déployée. Les connaisseurs auront reconnu le rôle tenu par le RedeployPublisher de Jenkins ... Alors bien sûr, Nexus pro comme Artifactory (peut être même Achiva ;P) proposent des solutions de contournement. On compense une défaillance de l'outil par un autre outil.

La gestion "one-shot" des métadonnées. Combien de bibliothèque ont été publiées avec un POM tout pourri ? Si les choses ont un peu progressé, il aurait été plus efficace d'avoir un mécanisme de version sur ces méta-données, en plus de la version de l'artefact, quitte à figer cette version lors de la release. De ce point de vue, héberger un repo maven sous forme de dépôt svn n'aurait pas été idiot, et lors de la release on aurait juste indiqué qu'on fait référence au méta-données du dépôt @révision1234.

Le POM sert à la fois de méta-données et de support du build. Combien de POM déployés contiennent des profils, des paramètres liés au développement ou aux environnements de test. A cumuler ces deux rôles, le POM se tire une balle dans le pied. Il faudrait découpler le build (profils, plugins, etc) des méta-données (dépendances, license, pré-requis, ...)

L'identification du dépôt d'un artefact. Si aujourd'hui je dépends de Hibrenate 4, que j'obtiens depuis le dépôt jBoss, dans 6 mois en voulant reconstruire mon projet, peut être aura t-il été publié sur central, ou sur l'un des (nombreux ?) autres repos que je déclare dans mon POM. Qu'est ce qui me garantit que c'est bien le même ? Deux options pour cela :

  • indiquer explicitement, via un attribut supplémentaire sur dependency, le repo d'où je désire obtenir l'artefact, ce qui accessoirement éviterait d'interroger 36 dépôts
  • fournir le hash SHA de l'artefact que je veux utiliser. Ca pourrait d'ailleurs complètement remplacer le groupId:artifactId:version, bien que ce ne serait pas super pratique.


Non, Maven n'est pas la panacée, mais il faut reconnaitre que les alternatives viables ne sont pas légions. Chacun ira de son commentaire sur Gradle, Rake, BuildR, ou truc-chose, si des choses intéressantes sont proposées elles sont très loin d'atteindre la maturité et le support par l'outillage qu'à Maven.

Wait and See ... peut être un jour un petit nouveau dans la cours des grand pour bousculer tout ça ?


  ________              ____   ____                 
 /  _____/_______ _____ \   \ /   / ____    ____    
/   \  ___\_  _ \ \__  \ \   Y   /_/ __ \  /    \   
\    \_\  \|  | \/ / __ \_\     / \  ___/ |   |  \  
 \______  /|__|   (____  / \___/   \___  ]|___|  /  
        \/             \/              \/      \/   
                                                        v 0.0.0.2 



02 octobre 2011

Play Framework Cookbook

Packt a sorti un ouvrage consacré à Play! framework, et me l'a proposé en relecture dans le cadre de la bibliothèque du BreizhJug. Détail amusant, la même bibliothèque est en train de s'outiller d'une application web sur mesure, développé par Sylvain ... en Play!

J'ai donc ouvert ce livre sans rien connaître de Play! en dehors de quelques essais express et de la présentation faite par Guillaume Bort au BreizhJug

Le format  cookbook consiste à découper le livre en cours chapitres qui présentent un objectif et sa mise en oeuvre avec le framework, accompagné de quelques liens ou idées pour aller plus loin. L'avantage de cette formule est qu'on peut rapidement piocher les réponses à un problème qu'on rencontre, par contre l'inconvénient est souvent que le livre est assez peu abordable pour le novice, sautant un peu du coq à l'âne. Et bien, pour cet ouvrage, je salue le talent de l'auteur qui a su ordonner ses recettes et leur donner un niveau de détail progressif qui permet tout aussi bien de lire le livre de manière séquentielle pour découvrir Play! et pratique rapidement l'utilisation du framework sur une application.

Bon bouquin en résumé pour prendre Play! en main, quelque soit votre niveau de connaissance du framework. On pourra juste (?) regretter l'absence de recettes sur l'utilisation de Scala, déjà très bien intégré dans Play! 1.x et qui sera au centre de Play! 2.

20 septembre 2011

JugSummerCamp 2011

Pour ceux qui n'y étaient pas, et bien vous avez raté un grand moment de geekitude : 
le JugSummerCamp 2011 était un très, très bon cru !

Malgré le grand pavois qui a tenté de nous voller la vedette (et 90% des chambres d'hotel), le PoitouCharentesJug a démontré sa totale maîtrise de l'organisation de ce qui devient un rendez-vous annuel incontournable. Les speakers sont chouchoutés, avec un gite qui leur est dédié et qui permet de discuter jusqu'à très, très tard des sujets les plus variés, dans une ambiance bon-enfant qui fait du bien, autour d'un verre de pineau et d'une raclette (il parait que c'est un plat traditionnel).

Après une courte nuit à refaire le monde et à dire du mal des absents (niarc niarc), direction le vieux port dont le cadre magnifique illumine cette journée conférence. Petit café et viennoiseries nous attendent, l'occasion de retrouver quelques connaissances de la grande famille java-geek, et on attaque cette journée qui va être dense.

Keynote 
Antonio Goncalves a passé sa nuit la veille à peaufiner ses slides, entre deux verres de pineau, et le résultat est réussi (est-ce grâce au pineau ?). Antonio retrace l'évolution de l'information, depuis les débuts de l'humanité jusqu'au chiffres hallucinants des datacenter Google. Son discours nous amène à réfléchir sur la maturité de notre domaine technique, et donc sur la nécessité de normes pour aller plus loin comme l'ont fait les autres activités humaines. Le Cloud est dont le buzz-word mais ne pourra devenir une option d'avenir qu'avec des standards, et JavaEE a son mot à dire. Antonio admet qu'il peut très bien se tromper, comme tant d'autres avant lui, mais nous promet un JavaEE @Cloud, même si le groupe d'expert qui pilote la norme n'est pas spécialement très pointu sur le sujet en dehors d'Oracle qui pousse fort dans ce sens et de la contribution de Spike Washburn (CloudBees). Pour conclure, Antonio continue dans l'esprit fresque temporelle pour remettre le cloud à l'échelle de l'histoire de l'univers (soit 23:59.999999999 rapporté à une journée de 24h) et nous encourage à faire la fête - philosophie simple mais bien accueillie par le public ;)

Architecture des applications de demain 
J'ai suivi la session de Michaël Figuière sur les nouvelles architectures. Je suis très content qu'il ai insisté d'abord sur les nouveaux usages, l'ergonomie, la valeur d'une application dans un milieu où il existe toujours un concurrent. Exemple poignant : les cercles de Google+ qui ont bluffé tout le monde et fait un buzz impressionnant, alors que le back-end doit lui aussi valoir le détour ... mais n'intéresse qu'une poignée de hard-core-nerds. Pensez donc d'abord aux usages et aux utilisateurs, à Mme Michu devant son écran, avant de vous lancer dans des bench noSQL. 
Michaël insiste ensuite sur la nécessité de profiter du buzz quand il vient enfin : deux mots à propos de votre site web sur Capital et c'est 100.000 visites sur le site dans les minutes qui suivent, iPad sur les genoux, juste par curiosité. Le site tombe ? Vous venez de rater la plus belle opportunité de votre vie !
La solution, c'est évidemment de profiter de l'élasticité du Cloud, et j'ai beaucoup apprécié que Michaël se démarque du discours évangéliste sur le 100% Cloud en nous montrant l'exemple du Guardian : le site principal (la charge nominale) est hébergé sur des plateforme privées. Amazon EC2 et Google App Engine sont mis à contributions pour les pics de charge (attentat en Norvège ou lancement de la tournée de Britney Spears). Une solution hybride très pragmatique et qui sera - amha - l'avenir proche pour le Cloud en entreprise.

Inspection Continue / développement Cloud
J'ai séché cette session, le temps de préparer ma démo de l'après midi qui avait quelques défauts. Je me rattraperais en invitant Olivier Gaudin à Rennes pour une soirée Sonar

La pause déjeuner est un nouveau moment de convivialité, l'occasion de discuter avec des personnes de tous horizons. Comme toujours, l'équipe organisatrice fait un sans faute, on est tellement habitués que ça parait banal. 

Quickies
J'ai embarqué Arnaud dans un sketch qui ne sera pas diffusé sur Parleys, afin de nous éviter un procès en diffamation, mais qui a été un bon moment de rigolade et l'occasion d'offrir quelques exemplaires de notre livre. Nous l'avons donc eu entre les mains au moins un instant, je pense que vous l'aurez tous avant que je reçoive mes exemplaires auteur...

Ma forge on the Cloud
C'est le moment pour moi de vous présenter une suite à ma session de l'an dernier. On reprend ma jolie forge logicielle avec tout ce qu'il faut dedans, et on voit comment mettre ça en place de manière efficace. Entre les délais, les coûts, l'intégration et le manque de souplesse, une forge "faite main" est une solution bien lourde. 
On passe alors à la démo : partant d'Eclispe (désolé) et d'un compte CloudBees, nous poussons une application web sur SVN (encore plus désolé), elle est buildée automatiquement par Jenkins, déployée sur RUN@Cloud et mise sous la surveillance de NewRelic. Ce que j'ai voulu démontrer, c'est la force de l'intégration de ces outils/services qui donne un ensemble très fluide, en quelques clics seulement.

CDI-OSGi
OSGi ne fait pas beaucoup rêver, vu la complexité et la remise en cause que cela implique. Mathieu Ancelin nous présente donc CDI-OSGi, une extension qui permet de développer des composants OSGi en utilisant le bon vieux @Inject, annotation qui va devenir universelle. 
La démo est très sympa, il reste regrettable que les démos OSGi passent toujours par cette immonde console qui liste les dizaines de bundles en mode texte. Malgré ce point qui doit rebuter tout novice, j'ai vraiment aimé l'outil qui rapproche (enfin) OSGi des développements traditionnels. 
Par contre, l'aspect dynamique de ces injections de dépendances reste difficile à assimiler pour le développeur, et découvrir qu'une dépendance n'est pas satisfaite au moment de l'appel de méthode est très perturbant. J'aurais préféré une approche bloquante, ce qui est peut être supporté, il faudra creuser la question.

Hibernate vs le Cloud
Sujet présenté au BreizhCamp, Julien Dubois remet à plat l'accès aux données persistantes en épluchant le catalogue des options existantes : Hibernate + base de donnée relationnelle, base de données hors de prix répartie/répliquée, caches, caches distribués, ou bien stockage noSQL qui fait revenir par la fenêtre le pattern DAO que nous avions sorti à coup de pieds par la porte JPA. Julien détaille avantages et inconvénients de chaque solution, et fait voter la salle. 
Cette session est l'occasion de prendre un peu de recul sur nos habitudes de développement, où on est tenté de rajouter un outil pour compenser les défauts de ceux déjà en place. L'approche relationnelle ACID, rend les choses simples mais limite la scalabilité. Les solutions dédiées coutent un bras sans réellement résoudre le problème. Les caches apportent une solution en sacrifiant un peu de la pertinence de nos requêtes, et les solutions noSQL se focalisent sur une utilisation spécifique des données pour choisir leur mode de stockage. 
La morale de l'histoire, c'est que la solution à tout faire n'existe pas. La solution de stockage dépendra de notre utilisation des données, alors que le modèle relationnel nous encourage à penser avant tout structuration fiable puis à greffer nos requêtes dessus en fonction des besoins. 

Keynote de cloture
Donnez les commandes à Nicolas Martignole, il vous emmène en 2021 pour regarder la Touilleur TV. Complètement déchaîné malgré une santé un peu fragile, Nicolas démontre sa capacité à étonner et à faire passer un message très sérieux dans un écrin d'humour.
Nicolas nous prédit donc de nouvelles fusions/rachats entre les grands de ce monde, un métier de développeur qui touche le fond, laminé par la masse de diplômés qui sortent des écoles indiennes et chinoises, mais avec comme espoir que les quelques développeurs talentueux qui tiennent bon gagnent des salaires de joueur de foot. Dans ce monde virtuel, Antonio écrit un nouveau livre "comment arrêter le développement" et on passe une certification chef de projet en deux jours.
Comme tout message de ce type, la réflexion se fait après la session, quand les images reviennent à vitesse normale. Bravo Nicolas, le prochain aura une sacré pression pour faire aussi bien ;)

Rendez-vous l'an prochain !


En attendant la diffusion sur Parleys, voir aussi les blogs de Claude et Michel :
http://cfalguiere.wordpress.com/2011/09/17/le-jug-summer-camp-cest-fini-pour-cette-annee/
http://mimah35.blogspot.com/2011/09/jugsummercamp.html

08 septembre 2011

Apache Maven II - la revanche

Mon bouquin Apache Maven est sorti fin août sous une nouvelle robe avec un contenu révisé :

 

Une fois encore, j'ai réussi à embarquer Arnaud Héritier dans cette aventure, son oeil aiguisé n'ayant pas d'équivalent pour trouver la faille dans ma prose parfois désarticulée. Petite particularité de cette seconde édition : vous l'aurez peut être entre les mains, vu que nous n'avons pas encore reçu nos exemplaires "auteur" et que, si Amazon ne nous l'avais pas dit, nous ne saurions même pas qu'il est déjà disponible en librairie (pan, ça c'est pour Pearson) :P

Au programme de cette seconde édition :
  • reprise du texte pour les boulettes qui nous avaient été signalées;
  • une mise à jour générale pour Maven 3. Les parties spécifiques sont signalées, ce livre couvre donc aussi bien le bon (?) vieux Maven 2 que son remplaçant;
  • un nouveau chapitre sur OSGi - pour lequel je remercie Pascal Leclercq - et Java modules, pour lequel nous avons sorti la e-boulle de cristal;
  • une reprise du chapitre sur les alternatives à Maven, où nous tappons moins sur Gradle et laissons (un peu) la parole à Grégory pour défendre son protégé;
  • une mise à jour notre vision des rapports Apache / Sonatype d'après les rebondissement récents, moins angélique que pour la première édition. La difficulté ici a été que le discours de Sonatype a pas mal bougé pendant la rédaction;
  • nous avons sans scrupule gardé la préface que Jason a plus ou moins relue, ou fait relire, a défaut de l'écrire;
  • une couverture orange. C'était un gros défaut de la première version.


Si vous avez déjà la première édition, faut-il acheter celle-ci ? 

Oui, évidemment ! D'une part parce que cela me rapportera 1€50, d'autre part parce qu'elle est vraiment beaucoup mieux, et enfin parce que nous refusons désormais de dédicacer la précédente édition !

Tous chez votre libraire !

C'est la rentrée !

Ok, ce n'est sans doute pas une nouvelle de première fraîcheur pour tout ceux qui ont abandonné les plages ensoleillées (?) du mois d'août pour déposer les gosses à l'école lundi et retourner au taf, mais

c'est la rentrée !


C'est surtout la fin du calme relatif de cet été qui fait que ce blog etait bien silencieux et que je suis resté douillettement chez moi à bosser peinard loin des tumultes de la vie moderne. Mais ce monde de cinglé qui vit à 100 à l'heure me rattrape, aussi la rentrée va être chargée; jugez vous-même :

Le 16 septembre, rendez-vous au JugSummerCamp. Ne me dites pas que vous ne savez pas ce que c'est ou que vous avez oublié de vous inscrire, c'est la conférence à ne pas louper.


Le 22 septembre Ippon (en la personne de Julien Dubois) m'invite pour un IppEvent consacré à la forge logicielle, à la maison et dans le cloud, comprenez un condensé de mes sessions du JugSummerCamp 2010 et 2011 avec une démo si le Net fonctionne. Dépêchez-vous les places partent vite.
Ippon Technologies

Le 23 septembre, tant qu'à être sur Paris me direz-vous, c'est l'OpenWorldForum qui m'accueille pour un talk sur Jenkins et son modèle open-source "à part". Si vous étiez au BreizhCamp vous connaissez ce sujet que j'avais préparé un peu à l'arrache, j'ai eu l'occasion depuis de le peaufiner en discutant avec Kohsuke.
Open word office

Semaine 39, rien - non ? si !

Le 3 octobre, c'est la rentrée et l'anniversaire du BreizhJUG, avec une soirée Jenkins User Meeting. Au programme : des pipelines de build, des tests Selenium, un peu de CloudBees (!) et un cours de développement de plugin live ! Pour plus d'infos, inscrivez-vous à la liste de diffusion du JUG.
Logo

Le 6 octobre, hop hop on enchaine avec l'Agile Tour Rennes (les gars, faudra penser à changer de logo, on croirait une conf JBoss !). Encore du Jenkins, mais cette fois vu sous l'angle de l'agilité : adaptation, processus légers, cycles courts, et quelques réflexions dont j'aimerai débattre avec vous.

Le 20 octobre, en espérant avoir un peu de soleil - ce qui commence franchement à manquer; s'il ne pleut paraît-il que sur les cons, il faut croire que j'en tiens une couche - petit tour à Nice pour le RivieraDev. Cette fois je sors le grand jeu puisque je présenterais GWT2, CloudBees et que j'irais donner un coup de main à Grégory pour vous convaincre d'utiliser Gradle (ou pas).



Le 27 octobre, un petit tour à Lyon pour présenter Jenkins au FOSSa, selon un axe un peu différent : open-source et business, présentation de l'offre commerciale de CloudBees basée sur Jenkins et de la synergie avec la communauté.


Heureusement, en novembre j'aurais droit à une semaine de repos (?) à Devoxx.


Bref, vous l'aurez compris, si vous voulez me croiser pour avoir un autographe sur votre exemplaire de Apache Maven - seconde édition tout fraîchement sorti des presses que même moi je ne l'ai pas encore, ce n'est pas l'occasion qui manquera !

Apache Maven





03 août 2011

recrutement 2.0

Les temps changent.
Lorsque je travaillais en SSII, mon CV était comme des milliers d'autres basé sur un ronflant titre d' "Expert Java EE confirmé" et incluait tous les mots clés (Spring | Hibernate | GWT | Maven, ...) qu'on retrouve aujourd'hui même sur les CV de débutants. Je pouvais me targuer de plus de 10 ans d'expérience, et bien sur appuyer mon expertise sur la publication de mon bouquin. Cependant, lorsque j'ai quitté Cap j'ai été surpris de voir que, malgré tous les points différenciateurs que j'essayais de mettre en avant, l'équation habituelle s'appliquait :

Salaire = f( Diplôme, Ancienneté ) +/- 1%

Lorsque j'ai postulé chez CloudBees, j'ai poussé le même CV. Etant rédigé en Français, je ne pense pas qu'il ait été transmis en interne (j'aurais du prendre le temps de le traduire mais c'est allé très vite). Arrivant pile au moment où un besoin se faisait sentir, les grandes lignes de mon expérience autour de Maven et de la forge logicielle ont suffit pour passer un entretien sur skype avec le responsable technique de DEV@Cloud. Autrement dit, j'aurais presque pu postuler par twitter :P

Lors de cet entretien, qui servait aussi à vérifier que mon niveau d'anglais scolaire ne poserait pas de problème par la suite, on m'a demandé si je connaissait les API Amazon, Ruby et si j'avais développé des plugins Jenkins. Trois réponses négatives, avouez que ça ne part pas très bien. Cependant, le contact est très bien passé et la question suivante était nettement plus intéressante :

"peux tu m'envoyer un exemple du code que tu as produit ?"

Voilà un élément de différenciation qu'aucun CV ne peut remplacer. Vous pouvez être un expert de classe internationale de Hibernate+Spring, 1000 autres CV prétendront la même chose. Par contre, le code que vous rédigez est votre marque de fabrique. Dans mon cas, le plugin gwt-maven et Fonzie sont deux projets dont je suis fier et qui ont fait mouche. Ils sont avant tout la preuve de mon autonomie et de ma capacité à assimiler Amazon, Ruby, Jenkins et tout le reste lorsque le besoin se fera sentir.

Peut-on extrapoler ce cas particulier au contexte du recrutement en France ?

Le succès de l'express-board en est la preuve. Les candidats ne veulent plus être harcelés par les recruteurs des grandes SSII parce qu'ils ont mis "Java" sur leur profil Monster. Les recruteurs qui cherchent un profil pointu et passionné ne veulent pas perdre 4 mois à enchaîner les entretiens. D'autres critères sont nécessaires.

Ippon avait ouvert le bal en proposant un recrutement sur GitHub. Il fallait donc savoir faire un clone de leur repo, builder l'appli Maven pour avoir accès à l'adresse de recrutement. Ce filtre qui peut paraître simpliste a eu deux effets bénéfiques : d'une part le buzz (indispensable) d'autre part un premièr niveau de sélection.

Je citerais ici Kohsuke sur le mode de "recrutement" de Jenkins :
"Etre contacté par des développeurs qui arrivent à passer un build maven multi-module complexe et proposent un patch, c'est déjà la preuve qu'on a affaire à des personnes de qualité"

Le filtre est certes assez léger mais il n'est pas aussi insignifiant que vous autres, lecteurs de ce blog, pourriez le croire (savoir s'informer via les blogs est aussi un mode de filtrage qui sélectionne beaucoup).

Plus récemment, Pod-Programming (start-up Rennaise pleine d'avenir) a posté une annonce sur l'Express-Board qui va plus loin : il ne s'agit pas juste de passer les difficultés techniques que le projet github proposé nous impose pour obtenir l'email de recrutement, cette fois il faut le forker et démontrer son talent. Pas exactement la page blanche, mais presque. Au final, seulement une poignée de candidats, mais avec un excellent niveau. Le recrutement a finalement permis de sélectionner Michel, co-organisateur du BreizhJug, vainqueur du concours Rennes OpenData, développeur de l'appli Android BreizhCamp, autrement dit un très bon choix :)

Du point de vue de la rentabilité du recrutement on ne peut espérer mieux. Du point de vue des candidats, on fait mieux que le CV anonyme : pas de diplôme ou de niveau d'expérience à prouver pour passer un entretien, il faut "juste" montrer qu'on est capable de faire le job.

Je ne crois pas que ces deux cas deviennent une généralité, mais il est clair qu'une façon de se démarquer est de devenir un développeur "public" : le code que vous produisez pour votre entreprise/client est

  1. rarement publiable
  2. dicté par des règles qui ne vous sont pas propres
  3. généralement pas fondamentalement passionnant

a contrario, un projet open-source même insignifiant cumule les avantages d'être :

  1. public et librement diffusable (par définition)
  2. le reflet de vos capacités, niveau d'exigences
  3. directement lié à ce qui vous plait

Ca tombe bien, de nombreuses "plateformes" proposent des mécanismes de plugins qui permet de proposer de la plus-value très ciblée sans devoir investir un temps fou à comprendre les rouages internes : plugin Jenkins, Maven ou Eclipse selon vos habitudes, il y a matière à s'exprimer.

S'exprimer, justement, c'est aussi un élément de différenciation. Avec l'explosion des JUGs en France (19 à ce jour), il devient presque "facile" de trouver un public pour présenter quelque chose. N'hésitez donc pas, ça aussi c'est un élément de différenciation et ça peut intéresser un recruteur : quelqu'un qui s'exprime en public peut évidement aider à vendre mon produit et à communiquer avec mes clients ;)

Le BreizhJug organisera par exemple en octobre un Jenkins User Meeting, sous forme de quickies : 15 à 20 minutes pour proposer un plugin, une utilisation, une réflexion, ce-que-vous-voulez autour de Hudson/Jenkins. 15 minutes c'est vite passé, et c'est l'occasion de présenter en public son savoir faire même si on est pas un caïd du sujet. Si ça vous intéresse, proposez un sujet à team@breizhjug.org

Moralité :

Nous verrons encore longtemps passer les annonces sur Monster "développeur Java/EE ...". Inutile de donner dans la surenchère des "Expert Sénior Avancé" qu'on voit fleurir dans le monde Java,  ou alors faites le avec humour : "Maître Jedi" par exemple. Mon rôle de "Senior Engineer" chez CloudBees me convient très bien pour caractériser mon profil.

Si vous espérez trouver le poste de rêve, motivant, dans une boîte innovante, tout ça, n'attendez pas que ça tombe tout cuit dans les annonces de ouest-job. Il faudra le moment venu savoir vous mettre en avant parmi des centaines de candidats potentiels. Même si vous n'y voyez qu'un investissement professionnel, rejoignez le monde opensource; vous y trouverez de toute façon tant de choses que le côté "CV" passera vite au second plan. Enfin, prenez la parole, en interne (coding dojo ?), au JUG, participez aux conférences, barcap, opencoffee - bref faites partie du mouvement actuel plutôt que de vous laisser encrouter dans un poste d'expert fonctionnel sur un projet pharaonique de 4 ans (un exemple juste pris au hasard comme ça).

25 juillet 2011

BreizhCamp, le bilan

Un mois après le BreizhCamp, il est temps de faire le bilan

Vous étiez prêt de 250 à vouloir vous inscrire, pour 200 places disponibles. Pour une première, c'est une belle réussite !
Une grand majorité d'entre vous venait du monde Java, avec tout de même une participation appréciable des autres communautés. 62% d'entre vous ont d'ailleurs déclaré participer à une communauté locale, et 8% à une communauté online en mal de se concrétiser IRL. Pour ceux-là, contactez le Granit ou la Cantine Numérique pour organiser un premier meeting, histoire de tenter le coup.
communauté présentes

malgré cette domination "Java", vous avez tous joué le jeu d'aller voir si l'herbe est plus verte à côté, de découvrir ce que font les autres, de participer au brassage des connaissances :
session suivies

Faire appel à Sébastien pour la keynote a semble t-il été une bonne pioche, en rapport avec vos attentes pour cette conférences. Ceux qui ont en plus suivi son "cours du soir de Git-itude" connaissent désormais l'étonnante capacité de Mr Douche pour tenir son public pendant des heures :P

A de rares exceptions, tous les sujets proposés on trouvé leur auditoire. Le breizhCamp est aussi l'occasion de découvrir des sujets plus inattendus par pure curiosité.
Le compte rendu de chaque tranche horaire ressemble d'ailleurs au graphique ci-dessous; votre retour est globalement très positif avec peu de déçus

La pause déjeuner, malgré le temps exécrable ("breton" diront les mauvaises langues, mais ce jours là il pleuvait sur tout le monde), vous a plutôt laissé un bon souvenir, bien qu'un petit creu.
 
Enfin, sur les pistes d'amélioration, je note que vous êtes tout aussi intéressés par des sessions plus courtes, plus longues, des périodes d'échanges plus longues ... il va donc falloir réfléchir à une formule plus modulaire

Enfin, parmi vos remerciements et encouragements, de nombreuses bonnes idées sont à retenir pour un prochain événement - comme par exemple une deuxième galette-saucisse :D

Merci à tous pour vos retours, et merci surtout à nos sponsors sans qui tout ceci n'aurait jamais été possible, ainsi bien sûr qu'à l'ISTIC qui nous à accueilli gracieusement.

Bon été à tous, et rendez-vous en septembre au BreizhJUG !

21 juin 2011

Du boulot à Rennes

Pour ceux qui en ont marre de la vie en SSII, une start-up Rennaise propose un poste de Project-Lead / Guru Java, présenté sur l'express-board. Pour ce démarquer, ils ont choisi de lancer un concours, j'adore l'idée.


Je vous laisse le soin d'entrer en contact avec eux pour en savoir plus, mais pour être un peu dans la confidence (et oui, je sais tout je vois tout :P), le jeu en vaut la chandelle si vous chercher un boulot vraiment innovant et motivant.

Bonne chance !

Suivez les aussi sur @PodProg

multi-tenancy

"Java EE 7 sera Cloud"
Voilà une annonce pleine de bonnes intentions, mais qu'en est-il concrètement ?

Les démos, comme celle de Spring/VMWare lors de What's Next pour CloudFoundry ne nous montrent que l'abstraction faite sur la gestion des infrastructures, OS et middlewares : truc app dans une console, et hop j'ai une appli en ligne, truc db et hop, j'ai une base MySQL... Les utilisateurs de Heroku doivent bien rigoler de nous voir admiratifs devant ce spectacle !

Il y a un second aspect qui est nettement plus délicat à percevoir, qui du coup fait moins l'objet des démos, et qui sera - j'espère - au centre des discutions de l'expert group Java EE 7, que Spike Washburn (celui qui a conçu RUN@Cloud) va rejoindre : la gestion multi-tenant. Je fais mon savant là mais je n'ai compris ce concept que récemment lorsque mes collègues de CloudBees m'ont fait une explication de texte ;)

Pour expliquer ce concept, nous allons ensemble - virtuellement - construire un SaaS. Je vais donc dérouler les différentes variantes de ce que j'ai pu mettre en oeuvre.

1. Serveur mutualisé

Dans le but de réduire les coûts de mise en oeuvre et d'administration, c'est la première chose qu'on met en place. Dans mon cas, un proxy Internet pour les dépendances Maven. On réserve donc une bonne bécane et on installe un repository manager, Archiva dans mon cas (je participais à son développement à cette époque).

Avantage : une seule instance, c'est simple à comprendre et à administrer
Inconvénients : pollution mutuelle entre utilisateurs, qui ont tous une librairie machin à installer. En gros, on impose à tous une logique commune, ce qui fait préférer à certains d'avoir leur propre dépôt et de le gérer eux-même pour retrouver une certaine liberté même s'il faut payer le coup de mise en place.

Je ferais un parallèle avec SVN vs Git : le fonctionnement du système centralisé s'impose à tous et devient pénalisant.


2. Clonage de VM

Ici on met à disposition un environnement type qu'on est en mesure de mettre en place en quelques minutes. L'utilisateur peut alors adapter à ses besoins un canevas de base, qu'on aura éventuellement bridé si nécessaire, ou au moins préparé avec les pratiques généralement acceptées. Exemple type, une image VM Linux avec Git/svn + Nexus + Jenkins + Sonar + Java/Ant/Maven préinstallés.


Avantage : on démarre en quelques minutes, et chacun peut faire ce qu'il veut
Inconvénients : la mise à jour des instances existantes reste une tâche d'administration pénible.  Le clonage des VM ne permet pas de mutualiser / centraliser ces opérations. Lorsqu'une nouvelle version de Jenkins arrive, qui fera la mise à jour ? Qui pourra valider son fonctionnement. On s'attendrais à ce qu'une phase de qualification permette ensuite de déployer la nouvelle version sur toutes les VM clonées, avec peut être possibilité de débrayer cet update automatique. 

Le parallèle qui me vient à l'esprit ici c'est la gestion du parc de PC, souvent basée sur le clonage d'image système puis création du compte utilisateur à la main. Sauf que nos administrateurs disposent de Windows Update pour assurer la maintenance, sans quoi il faudrait toutes les semaines venir faire la queue à la logistique pour obtenir les correctifs adéquats.




3. Création automatisée des VM

On monte d'un cran et on exploite les outil de déploiement continu pour construire nos images de VM à partir de "recettes" (pour reprendre le vocabulaire de Chef). La mise à jour d'une recette se traduit par une mise à jour de toutes les instances, et l'élimination de la redondance dans les tâches d'administration. Autre avantage par rapport au clone, il est possible d'utiliser un OS différent vu qu'on a scripté l'installation.


Avantage : gestion centralisée et automatisée
Inconvénients : sur-consommation de ressources. Je ne l'ai pas évoqué ci-dessus, mais nos VM par projet consomment de nombreuses ressources sur la machine physique de notre data-center. Même si l'hyperviseur fait de son mieux pour répartir la charge, chaque instance "up" consomme mémoire, cpu et I/O. 

La tarification d'Amazon EC2 en est d'ailleurs le reflet : on paye certes à la minute, mais une instance de serveur web qui reste démarrée est facturée pour un temps plein, car un serveur web qui ne fait rien ... consomme tout de même cpu, mémoire et I/O ! Ceux qui ont démarré une instance EC2 pour faire un test et ont "oublié" de l'éteindre en ont eu pour leurs frais :P La virtualisation a cet effet pervers qu'on a tendance à laisser tourner des VM sans réaliser ce qu'elle coûtent réellement, et par voie de conséquence d'obliger à surdimensionner les machines physiques (ou la facture).

Le parallèle cette fois ce serait un serveur sur lequel on fait tourner 100 instances de Tomcat avec le war Jenkins déployé, consommant 100 fois la mémoire nécessaire malgré les effort de l'OS pour swapper les processus inactifs, et obligeant l'admin à commander quelques Go de mémoire supplémentaire.

Imaginons à présent la même machine avec un seul Tomcat musclé et 100 webapps déployées dans des contextes dédiés. On économiserait au moins l'empreinte mémoire du serveur et de la JVM. Le problème serait alors d'assurer l'indépendance, la performance et l'étanchéité de chaque webapp pour qu'elle ne voit pas "par erreur" les données de sa voisine. Sans parler de l'empreinte mémoire de nos 100 instances de la même webapp qui pèse tout de même 80Mo à grand coup de Spring+Hiberante+CXF+<votre-framework-préféré>. D'où le concept de ...

4. Application mutli-tenant

Le cas le plus connu de multi-tenant c'est la notion de virtual-host dans Apache HTTPD : le même serveur web gère les requêtes de plusieurs sites web (du point de vue de l'utilisateur) et détermine ce qu'il doit faire en fonction du nom de serveur invoqué.

Imaginons que notre serveur JavaEE soit étendu pour proposer une fonctionnalité bien spécifique : une seule application jenkins.war est déployée, mais en fonction du virtualhost par lequel les requêtes HTTP arrivent "monAppli.serveur.com", il va basculer dynamiquement les ressources vers un répertoire dédié /var/lib/jenkins/monAppli. Il va faire de même pour notre DataSource qui pointera vers jdbc/monAppli, nos files JMS, nos fichiers de log, etc.

Ce serveur JavaEE++ magique, c'est un serveur prêt pour le Cloud ! En installant une instance de ce type en frontal nous serons en mesure de gérer la diversité de nos instances du même service, puis de distribuer la charge de travail sur un pool de machines (ce que propose déjà Jenkins via ses esclaves, et qui du coup le rend particulièrement éligible à cette évolution, comme le prouve DEV@Cloud).

C'est cela qu'on attend de la norme Java EE 7 lorsqu'on parle de "multi-tenancy". 

Pour le développeur, cela signifiera très probablement quelques aménagements. aussi il est important de comprendre ce concept si vous voulez suivre les débats du JCP sur le sujet (la liste de discussion est accessible en lecture seule à tous ceux qui veulent prendre le temps de la suivre).

Si ce sujet vous intéresse, poursuivez la lecture via cette série d'articles :

16 juin 2011

Jenkins au JugSummerCamp

Le BreizhCamp est déjà commencé avec l'atelier Git que Sébastien Douche anime en ce moment même, avec comme objectif simple de sauver le monde.

Surprise de la programmation des conférences de demain, et je vous jure que je n'y suis pour rien, j'animerais en fin de journée une session en concurrence avec celle de Julien Dubois, ce qui nous rappèle d'excellents souvenirs du JugSummerCamp 2010 !

Aura t-on droit à la revanche de Julien ? J'en doute, car sincèrement, qui irait voir une n-ième session barbante sur Hibernate, NoSQL et le Cloud, alors que vous pourriez conclure la conférence sur une présentation sur la gestion de projet atypique de Jenkins et quelques clés de son exceptionnel succès.

La réponse de Julien sur son blog ne devrait pas tarder ;)

02 juin 2011

CloudBees @ Jax

CloudBees sera présent à la conférence JAX, fin juin à San José.


San José, c'est beau, mais c'est loin (comme dirait un ex-président bien connu), aussi ce n'est pas de la conférence que je vais vous parler mais du vote que les organisateurs proposent aux internautes sur http://vote.jax-awards.com/, destiné à élire la technologie, la compagnie et la personne la plus innovante de l'année dans le microcosme Java. Je n'ai aucune idée de la façon dont a été faite la short-list qui nous est proposée, mais je suis fier d'y trouver CloudBees, au côté de pointures comme Atlassian et RedHat.

Le système de vote n'utilise pas d'authentification des utilisateurs et pourrait donc faire l'objet de truandages  divers, mais il permet de voter sans laisser votre eMail dans une liste de spam. Votez si possible pour une société sympa, innovante et bourrée de mecs cools, mais bon je ne voudrais pas vous influencer ;)

Si vous n'arrivez pas à vous décider, vous pouvez aussi rejoindre Sacha Labourey lors d'un webinar mercredi prochain pour une présentation de CloudBees et une démo de la chaine code -> build -> tests -> run "dans le cloud". C'est en anglais, mais avec ce petit accent Frenchie si particulier que le monde entier nous envie :P

Plus que 10 jours pour moi avant de rejoindre l'équipe CloudBees, je trépigne d'impatience ! Des chantiers passionnants à affronter, mais sans doute le plus beau challenge qu'il m'ait été offert de relever.

29 mai 2011

Merci Zenika!

Cette semaine, vous n'avez pas pu y échapper, c'était What's Next. Je n'ai pas pris le temps de blogger sur le sujet parce que j'étais bien trop occupé à profiter à plein de ce grand moment organisé de main de maitre par Zenika, et à discuter avec les nombreux Geeks de notre microcosme. Si vous voulez en savoir plus lisez le blog de l'autre Nicolas, moi la nuit j'ai besoin de dormir au moins un peu ;)

Autant les conférences que les échanges très fertiles qu'on a lors de ces rencontres sont une véritable mine.
Il y a bien sur les aspects techniques : J'y ai, entre autre, découvert la commande Git ReReRe (j'ai d'abord cru que Benoît Courtine se foutait joyeusement de moi avant d'aller vérifier) qui m'a obligée à modifier en urgence ma présentation (voir plus bas).
Il y a aussi les aspects sociaux, avec toutes ces personnalités connues et moins connues qui font la richesse de notre milieu. Une idée d'ailleurs pour les prochaines conférences : en plus des noms , mettez le compte twitter des participants sur les badges, nous sommes nombreux à nous connaitre par ce biais sans le savoir.

Moralité : si vous n'y étiez pas, dites vous bien que vous avez raté un grand moment de geekitude et de techno-remise à niveau. Si j'ai du poser deux jours de congé pour en profiter je suis très loin de les regretter !

J(enkins)UG
Non content de participer activement, comme toute l'équipe Zenika, à l'organisation (irréprochable) de What's Next, Grégory Boissinot nous a offert en cette fin de semaine un concentré de Jenkins. A peine remis de ces 2 jours de conférence plutôt denses, nous avons attaqué par un Jenkins User Meeting vendredi soir, en petit commité dans les locaux de Zenika. Sous forme de mini-conf nous avons ainsi pu présenter notre utilisation de Jenkins, nos bonnes pratiques, voir nos contributions pour certains. Un moment d'échange riche et plein d'enseignements.

Une idée sympa et ouverte à tous, à retenir pour des événements locaux.

Pour ma part j'ai présenté mon approche de l'intégration continue couplée aux multiples branches Git, en tentant une démo qui a été un vrai massacre à la bonaldi (sans quoi ce ne serait pas une démo me direz vous).  Mais l'événement de cette rencontre c'était la présence de Kohsuke Kawaguchi de passage à Paris, un gars étonnant, qui du haut de son mètre 90 vous parle d'une voix ultra grave, pas vraiment le Japonais des images d'épinal.

Après une courte nuit de repos, nous enchaînons par un hackathlon dans les locaux de Zenika. Le hackathlon, c'est quelques "hackers"ou apprentis-hackers (9 dans notre cas, on a perdu du monde en route semble t-il) qui se regroupent pour travailler sur des sujets communs et surtout s'entraider. En une petite journée j'ai appris de nombreux détails du développement Jenkins, avec les explications très précises de Kohsuke, tandis qu'Arnaud s'attaquait à une amélioration de l'intégration Maven, enchaînant les Pull Request, que Gregory et Frédéric discutaient sur la complémentarité de leurs plugins respectifs de gestion de configuration et que Dimitri prenait un cours particulier de développement Jenkins avant de se lancer dans une amélioration de l'usabilité (oh le joli mot) de l'outil.

Chacun à son niveau a beaucoup de chose à apprendre des autres et autant à leur apporter. J'ai ainsi aidé Dimitri à configurer son compte GitHub et à monter sa Pull Request tandis qu'il m'a déplombé la configuration i18n de mon editeur de Ressources sous Intellij Idea. Kohsuke était évidemment un acteur précieux de cette journée; accessible, toujours agréable et très ouvert à toute forme de discussions, il nous a ouvert les portes de son bébé tout en nous laissant une complète liberté de notre sujet.

Le modèle de gestion de la communauté Jenkins, unique à ma connaissance, à cette particularité : même le premier newbie venu (tiens, moi par exemple) peut demander les droits sur GitHub et voir où sa contribution pourrait être bénéfique. La plateforme Jenkins à un tel potentiel que chacun y trouve rapidement de quoi faire, quelque soit sont niveau technique. Etant donné le public déjà très limité prêt à se lancer dans l'exercice, nous donner ainsi carte blanche est finalement peu risqué car chacun de nous se sent alors responsabilisé et ne prend pas le risque de modifier quelque chose qu'il ne comprend pas sans demander un avis. C'est ainsi que Jenkins a monté sa très large communauté de plugins et de contributeurs, bien loin du modèle de nombreux autres projets opensource pour lequel le billet d'entrée est très sélectif et en décourage beaucoup. Et après tout, par définition le SCM permet au besoin de revenir en arrière et d'éliminer une maladresse, régression, indélicatesse ou grosse boulette.

En sortant de cette journée, on a la sensation d'appartenir pleinement à une communauté, avec des
liens étroits - twitter peut en témoigner - une grande complicité et des valeurs fortes; on a les réponses à de nombreuses questions, et surtout l'envie d'aller plus loin; on en arriverait presque à penser qu'un monde meilleur est possible :P

Conclusion
Chacun de nous a en tout cas apprécié ces moments étonnants et d'une richesse incroyable. Un grand merci à Zenika d'avoir organisé ce beau rassemblement, à Kohsuke pour sa disponibilité alors qu'il accumule le décalage horaire, et bien sur à tous les geeks qui font de notre communauté Java française un terreau fertile.

Rendez-vous au breizhCamp pour certains, au JugSummerCamp et/ou à Devoxx pour les autres, en tout cas ne laissez plus passer ce type d'événement "juste" parce que ca tombe avant un week-end et qu'il y a un barbecue de prévu chez tonton André. Remontez-vous le moral et le niveau technique après une journée de m... sur un projet en TMA en développant sur quelques minutes de temps libre votre propre plugin jenkins/maven/graddle/idea/Androïd ou que sais-je, au moins pour être fier d'un truc sympa, dans une techno innovante, et qui pourrait même vous mettre faire entrer dans ce qu'on commence à appeler la  "french Mafia" (terme que l'on doit à @olamy il me semble), avec son accent inimitable quand elle s'exprime en anglais - soyons en fiers et faisons la grossir.

09 mai 2011

Bzzzzzz

D'ici quelques semaines, je quitterais mon poste au sein d'Orange Business Services (date non encore fixée). J'y ai rencontré des gens passionnés et passionnants, mais je vais donner une tournure nouvelle à ma carrière professionnelle en m'installant dans les nuages.


"2011, l'année du Cloud" entend-on un peu partout. Pour ce qui me concerne, ce sont les sirènes de CloudBees qui m'ont séduit. Une équipe d'exception, une entreprise ultra dynamique, un projet enthousiasmant, et un challenge à relever, de quoi me motiver à bloc !


Pour ceux qui ne connaissent pas, CloudBees est l'un des acteur du PaaS Java, techno en core émergeant mais promise à un très bel avenir (on parle d'une normalisation dans JavaEE 7...).


  • Avec DEV@Cloud, CloudBees propose de virtualiser la forge logicielle. Son produit phare, articulation de la forge, c'est l'intégration continue Jenkins "as a Service". Des plugins spécifiques permettent de tirer parti de la virtualisation (exécuteurs à la demande par exemple) et des partenariats permettent de l'enrichir avec des offres d'inspection continue Sonar "as a Service" ou des tests Selenium (SauceLabs) "as a Service", et bien plus encore à l'avenir. 

  • Enfin, une offre commerciale plus classique pour un Jenkins custom enrichis de plugins maison (Nectar) maintenu par Kohsuke Kawaguchi en personne, en concurrence directe avec le Hudson Profesionnal de Sonatype.


Je vais donc muter mon Chocobo en Choco-Bee, pour rejoindre ce projet ambitieux et les milles-et-une idées qui sont encore en murissement.

 --> 
Mon poste sera majoritairement focalisé sur le support, en contact direct avec l'engineering, mais aussi avec de nombreuses autres casquettes dans le développement (le temps de rentrer dans le code), du consulting, de l'assurance qualité, de la formation ... bref, un poste "couteau suisse" qui colle très bien à mon passif.

Particularité de CloudBees, la société elle même est dans le nuage : je travaillerais donc à domicile la majorité du temps, en collaboration avec mes collègues répartis de la west coast jusqu'en nouvelle zélande - l'occasion aussi de renforcer mon Anglais qui manque cruellement de pratique.


J'espère avoir le plaisir de vous rencontrer comme client, partenaire, lors du BreizhCamp, de What'sNext ou Devoxx, ou simplement à l'occasion d'un JUG sur un sujet "forge logicielle", qui devient donc définitivement ma marque de fabrique ;)

05 mai 2011

Hudson/Jenkins, episode V : l'empire contre attaque

Dans l'épisode précédent, Sonatype s'était allié à Oracle pour supporter Hudson, tandis que la rébellion s'organisait pour développer Jenkins avec le succès qu'on a pu constater.

Aujourd'hui, Oracle annonce vouloir donner Hudson à la fondation Eclipse (avec le soutien de Sonatype et VMWare), acceptant ainsi au final les conditions qui étaient réclamées par la communauté lors de la "crise" :
  • disposer d'un modèle de gouvernance sans prédominance d'une société
  • libérer le nom "hudson" de toute emprise en le léguant à un organisme indépendant

Ces conditions, à l'époque, se sont heurtées à un "non" sans appel de la part d'Oracle. Aujourd'hui, sans doute calmé par le succès de Jenkins fàce à un Hudson qui a du mal à exister autre part que sur le blog de Sonatype qui met en avant sa version "pro", Oracle change son fusil d'épaule.

On pourrait presque imaginer les deux branches fusionner à nouveau dans un grand moment de réconciliation, mais c'est assez peu probable.

D'une part, cette décision arrive bien tard. Jenkins a évolué depuis la scission, la communauté a pris ses aises et choisi son modèle de gouvernance. Il n'est pas du tout évident que celui de la fondation Eclipse soit aussi souple :P

D'autre part, la querelle avec Oracle a laissé des cicatrices; s'il ne s'agit pas de régler ses comptes, les principaux acteurs se voient mal travailler main dans la main comme si de rien n'était.

Enfin, passer le code de Hudson dans la fondation Eclipse ne se fera pas en deux minutes. Le processus d'incubation de la fondation est très strict (pour ne pas dire lourdingue), en particulier sur les aspects propriété du code et compatibilité des licences. C'est pour cela d'ailleurs que l'IDE Eclipse n'a pas de support SVN natif, l'implémentation Java SvnKit étant sous licence LGPL. Sans parler d'ailleurs du code pour lequel Oracle n'a pas a priori la propriété intellectuelle (pensez aux contributions de Kohsuke après qu'il ai quitté Oracle).

L'idée de voir Jenkins hébergé par la fondation Apache a été évoqué à un moment pour donner plus de visibilité au projet et lui assurer un cadre juridique solide. De la même façon, Jenkins devrait passer par l'incubateur Apache et résoudre les mêmes soucis de propriété intellectuelle et de licences.

Au final, cette contre-attaque est délicate à pronostiquer. Avec les moyens de Oracle + Sonatype + VMWare et la force de communication liée à l'aura de la fondation, Hudson peut rester sur les rails et progresser de manière intéressante. Dans le même temps, Jenkins démontre sa capacité à avancer vite et bien, avec :

  • un nouveau processus de release à deux vitesses, avec une version "stabilisé" par tranche de 3 mois n'incluant que les corrections majeures
  • plus de soin dans la gestion de la compatibilité, avec un mécanisme de test des plugins sur la version N+1 (action menée par notre compatriote Frédéric Camblor)
Il nous reste à attendre le prochain épisode. Je ne pense pas que le Jedi veuille bien revenir pour détruire l'étoile noire, et les deux outils continueront probablement à vivre côte à côte pendant longtemps. En tout cas, nous aurons assisté à un formidable gâchis depuis l'intervention de l'empire et de son allié dark vador (je vous laisse mettre des noms en fàce par vous même).

01 mai 2011

Portes ouvertes

C'est aujourd'hui que s'ouvre l'inscription du BreizhCamp

La salle qui nous accueille étant strictement limitée à 200 places, nous sommes contraints de mettre en place un système d'inscription. Si les Rennais ne sont pas coutumiers de ce principe, nos amis Parisiens savent que les places pour ce type d'événement partent très très vite, aussi ne trainez pas trop ...

Et si votre employeur rechigne à vous libérer une journée, vous pouvez faire valoir votre D.I.F pour nous rejoindre.

infos et programme : http://www.breizhcamp.org/
inscription : http://jugevents.org/jugevents/event/36125

19 avril 2011

JPA, et après ...

Ceux qui suivent ce blog connaissent déjà Fonzie, mon petit hack pour éliminer l'écriture de toute la couche persistance d'une application JavaEE dans le cas des requêtes simples, qui constituent d'après le projet sur lequel il a été utilisé plus de 90% des cas d'utilisation.

Avec une API puissante, JPA nous permet de construire des requêtes et du code d'accès à la base pour quasiment tous les cas de figure (bien sûr il reste quelques exceptions, sinon le groupe de travail JPA 2.1 serait au chômage). Seulement, cette API est parfois surdimensionnée pour des requêtes simples, de la forme select * from Truc where bibi = 'foc'

Fonzie était inspiré par Grails (GORM), mais n'est pas, loin s'en faut, la seule tentative de simplifier le codage des accès à la base de données. Il y avait déjà Hades, présenté il y a deux ans à Devoxx, qui permet de déclarer un Repository sous forme d'interface et de laisser le framework analyser les noms de méthodes pour en déduire les requêtes. Il y a depuis peu Spring-Data et son module JPA qui reprend la même idée avec la force de frappe de SpringSource/VMWare.

C'est bien, mais certains (j'en suis) regretterons que tous ces facilitateurs ne valident pas les requêtes définies par les programmeurs. Il faut attendre l'exécution pour que le framework nous indique qu'une méthode ne peut être interprétée. Un refactoring de trop et hop, tout plante.

Pour répondre à cette attente il y a donc, depuis JPA 2.0, l'API Criteria. Contrairement à Hibernate Criteria, celle-ci est totalement type-safe et valide la construction des requêtes dès la compilation. C'est donc une très bonne chose a priori. Sauf que ... Criteria s'impose de couvrir 100% des capacités de JPQL, et aboutit à une syntaxe extrêmement lourde et très peu lisible; jugez plutôt, pour la même requête pourtant triviale :

CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<truc> query = cb.createQuery(Truc.class);

        Root<truc> truc = query.from(Truc.class);
        query.where(cb.eq( truc.<string>get( Truc_.bibi ), "foc" ));

        TypedQuery<truc> tq = em.createQuery(query);

L'informatique semble avoir horreur du vide, aussi un framework se propose de combler ce manque de lisibilité. L'idée est de générer (avec un annotation processor Java6) un métamodel qui soit spécifique aux requêtes QueryDSL (les classes Q*), et pas juste le métamodel "neutre" défini par JPA (mais qui par contre pourait servir à d'autres frameworks ... si l'API était sortie du package javax.persistence). QueryDSL, qui d'ailleurs peut accéder à bien plus que JPA, propose de construire des requêtes avec une excellente lisibilité, et 100% type-safe :

import static QTruc.truc;

   public List<Truc> getBibiFoc() {
        return from( truc )
              .where( truc.bibi.eq( "foc" ) )
              .list( truc );
   }

C'est pas beau ça ? Aux parenthèses près, on se croirait sous .Net en train de coder avec LINQ !
Alors, évidemment, il est probable qu'en creusant un peu queryDSL ne supporte pas 100% de JPQL, et ne permette pas de faire un LEFT OUTER JOIN sur une Map d' Embeddable, mais en même temps, le jour où j'aurais vraiment besoin de ça, ce n'est pas de coder le Repository qui exécute cette requête qui va me coûter mais plutôt de comprendre comment on a pu pondre un modèle pareil...

01 avril 2011

deloof++

Si vous me suivez sur twitter (@ndeloof) vous savez que je suis papa pour la troisième fois. Oui, annoncer une naissance sur twitter c'est bien un truc de geek, je suis d'accord avec vous, mais je me sens moins seul quand je vois vos messages de félicitation. Celui de Laurent m'a bien fait rire :

public class HuitiemeMerveilleDuMonde implements Bebe {
 
    @Override
    public String getNom() { return "DE LOOF"; }
 
    @Override
    public String getPrenom() { return "Mat :-)"; }
 
    @Override
    public Sexe getSexe() { return Sexe.GARCON; }
 
    @Override
    public double getTaille() { return 53.0d; }
 
    @Override
    public double getPoids() { return 3.400d; }

    @Override
    public String getFelicitations() { 
        return "BRAVO au papa et bon repos à la maman..."; 
    }
 }

Ceci dit, nous sommes ici sur un blog technique, et Laurent se désole de ne pouvoir faire de l'héritage multiple. Je lui propose donc d'utiliser l'AOP !

@Aspect
public class Nananere {

    @Before(" execution( +Parent.dormir() )" )
    public void ouin_ouin() {}
}

Merci à tous

PS: non, très bizarrement, nous ne l'avons pas appelé "Jason"...

UPDATE:
J'apprend à l'instant que ce billet n'est qu'un vague réchauffé de celui-ci. Désolé, je n'ai pas pris le temps de vérifier mes sources pour une fois

23 mars 2011

"à la Facebook"

Mon twitter (1) me pousse cet article très intéressant : http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/

On y découvre le mode de fonctionnement de Facebook, ou comme le géant du web utilise la culture geek pour piloter ses développements. Ce que je note, c'est l'importance et la liberté données aux ingénieurs, et la contrepartie : l'engagement qu'on leur réclame.

Je vais tenter de résumer l'article en quelques lignes (en tout cas, les points qui on retenu mon attention...)

 
Facebook ce sont des ingénieurs, triés sur le volet, qui bossent en totale autonomie sur le sujet qui leur plait, avec éventuellement un Product Manager qui essaie de leur souffler des idées. Un PM pour 7 à 10 développeurs, ça me laisse rêveur - on aurait presque l'inverse en France parfois. Chaque développeur a une semaine pour monter son truc, de l'UI au backend. Les premières semaines dans la boite, le "bootcamp", leur permet de découvrir tous les rouages du site et d'être autonome par la suite - pour ceux qui arrivent à suivre. Quand on vous dit "triés sur le volet"...

Cette liberté totale et le manque d'emprise des PM sur le projet est à contre courant de tout ce que j'ai pu rencontrer jusqu'ici :) D'un autre côté, avec un cycle de release très rapide, ça ne doit pas être aussi anarchique qu'on pourrait le croire a priori. Sur des projets de 6 mois évidemment ce serait ingérable, mais si on compte en jours ?

La contre-partie de cette très grande liberté est que les développeurs sont ici partie prenante du projet avec une très lourde responsabilité. Sans doute facilité par une connaissance de l'ensemble du SI et pas juste d'une brique isolée, les ingénieurs assurent le reporting, ils sont le contact direct pour toutes les questions relative au projet. Autrement dit, ils incarnent implicitement le rôle de PM. D'autre part, il y a le mardi.

Le mardi, c'est le jour de la mise en prod - oui, une par semaine, ça surprend toujours tant cette notion  est lourde dans nos contextes traditionnels. Tout les développeurs qui ont introduit du code doivent être présents sur site et disponibles. Ne pas répondre aux demandes des Ops et/ou ne pas supporter un bug détecté dans son code est un motif de licenciement. Et avec 60.000 serveurs à mettre à jour, il doit y en avoir quelques unes des demandes de la part des Ops !

On rentre dans une logique différente, un esprit de responsabilité que la culture MOA/MOE, forfait, prestataire nous a fait perdre : on ne développe pas juste du code, on développe du code qui doit tourner en production. La logique DevOps semble particulièrement mise en pratique chez Facebook.

Pourrait-on appliquer cela ailleurs ? 

Je vous vois venir, je ne parlerais pas de mon cas personnel. Par contre, globalement il y a des lessons à retenir :

  • On ne motive pas des développeurs en les infantilisant. Les ingénieurs ont besoin de créer quelque chose, d'en être fier, et de le porter au yeux de leurs pairs. Arrêtons de leur affecter des tâches, de leur imposer des roadmaps à plusieurs mois. Evidemment, cela passe par un raccourcissement des cycles de production. Compter en mois (voir en années) cela impose une planification. Compter en semaines cela permet de tenter des choses, de laisser une part d'inconnu, d'expérimenter sans faire de gros frais.
  • La culture DevOps a encore du chemin à faire. On ne crée pas de l'engagement en les mettant dans des silos. On pourra faire toute l'agilité qu'on veut, si le développeur n'est pas directement responsable des bugs constatés en production et du client qui gueule au bout du fil, il continura à délaisser sa stratégie de test pour passer à quelque chose de plus "intéressant".

Pour moi, le premier point à traiter est notre cycle de release. Il ne s'agit pas juste de créer tous les 30 jours un "logiciel potentiellement livrable" comme nous le suggère Scrum, il s'agit de mettre à l'épreuve toute notre chaine de production aussi souvent que possible. Le liens vers DevOps est alors évident et rapidement indispensable.

Comment vendre cette évolution à nos Managers ? 

Un seul argument à vous proposer (je vous laisse trouver les vôtres) : combien de temps faut-il pour fournir une évolution ou un correctif sans désorganiser l'équipe (je ne parle donc pas du gros bug critique "stop the line") ? Avec un cycle tel que celui de Facebook, cela peut être juste une semaine, sans créer le moindre stress supplémentaire. Avec une approche traditionnelle, en 13 ans, je n'ai connu aucun projet qui faisait des mises en production à moins de quelques mois d'intervalle. Le time-to-market est le nerfs de la concurrence, et de ce point de vue tous les CMMi du monde n'ont rien à nous proposer.

(1) pour ceux qui en doutent, twitter est aussi un outil de veille technologique et de support. Comme tout réseau social, il peut porter des choses totalement futiles ou des infos pertinentes, le tout est de mettre en place les bon filtres.

22 mars 2011

BreizhCamp, c'est parti


Il y avait le BreizhJUG, et ses soirées Java.
Il y avait AgileRennes, et ses soirées agiles.
Il y avait alt.Net, et ses rencontres .Net
Il y avait Rennes-on-Rails, et ses rencontres Ruby.
Il y avait le club .Net-ouest, et ses sujets .Net
Il y avait aussi les Flex-istes, Python-istes, PHP-istes, JavaScript-istes, pas spécialement structurés mais bien présents

Maintenant, il y a le BreizhCamp, une rencontre "par des techos, pour des techos", inter communautés. Une journée complète de conférence, 4 tracks sur des sujets d'actualité, 27 sessions par des speakers de tous horizons.

Les inscriptions ne sont pas encore ouvertes, et le programme pas encore finalisé, mais préparez vous pour rafler l'une des 200 places disponibles.

C'est le 17 juin, toutes les infos sur www.breizhcamp.org

07 février 2011

Objectif : Mars

Je serais cette semaine à Marseille pour une formation Maven. J'en profite pour faire un petit tour au MarsJUG mercredi 9, pour une présentation de GWT et les nouveautés de la version 2.x. 

Non, je ne parlerais pas de Maven  (ou alors, juste un petit peu) vu qu'Arnaud a déjà fait le nécessaire et a abreuvé l'assistance de sa bonne parole pendant plus de 2h. Par contre, on pourra aussi parler un peu de Jenkins, ou de tout un tas d'autre sujet. Bref, soirée à la carte ;)